@evelan/jexity-widget 0.15.0 → 0.16.0
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/index.mjs +2627 -2308
- package/dist/index.mjs.map +1 -1
- package/dist/react.mjs +3294 -2975
- package/dist/react.mjs.map +1 -1
- package/dist/types/features/chat/components/magicline/ContractCreationForm.d.ts.map +1 -1
- package/dist/types/features/chat/components/magicline/formUtils.d.ts +8 -0
- package/dist/types/features/chat/components/magicline/formUtils.d.ts.map +1 -1
- package/dist/types/features/chat/components/magicline/useContractCreationState.d.ts +100 -2
- package/dist/types/features/chat/components/magicline/useContractCreationState.d.ts.map +1 -1
- package/dist/types/features/chat/hooks/useMagicline.d.ts +44 -2
- package/dist/types/features/chat/hooks/useMagicline.d.ts.map +1 -1
- package/dist/types/i18n/locales/de.d.ts.map +1 -1
- package/dist/types/i18n/locales/en.d.ts +18 -0
- package/dist/types/i18n/locales/en.d.ts.map +1 -1
- package/dist/widget.js +30 -30
- package/dist/widget.js.map +1 -1
- package/package.json +1 -1
package/dist/widget.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget.js","sources":["../../../node_modules/.pnpm/preact@10.27.2/node_modules/preact/dist/preact.module.js","../../../node_modules/.pnpm/preact@10.27.2/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../../../node_modules/.pnpm/preact@10.27.2/node_modules/preact/hooks/dist/hooks.module.js","../../../node_modules/.pnpm/preact@10.27.2/node_modules/preact/compat/dist/compat.module.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/values/base64.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/common/index.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/values/value.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/values/errors.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/values/compare_utf8.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/index.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/logging.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/udf_path_utils.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/local_state.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/request_manager.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/server/functionName.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/server/components/paths.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/server/api.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/optimistic_updates_impl.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/vendor/long.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/remote_query_set.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/protocol.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/web_socket_manager.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/session.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/vendor/jwt-decode/index.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/authentication_manager.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/metrics.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/client.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/pagination.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/paginated_query_client.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/react/use_subscription.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/react/client.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/react/queries_observer.js","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/react/use_queries.js","../../../node_modules/.pnpm/@preact+signals-core@1.13.0/node_modules/@preact/signals-core/dist/signals-core.module.js","../../../node_modules/.pnpm/@preact+signals@2.7.1_preact@10.27.2/node_modules/@preact/signals/dist/signals.module.js","../src/module/shell/shell.state.ts","../src/lib/convex-url.ts","../src/lib/widget-config.ts","../src/module/shell/hooks/useRemoteConfig.ts","../src/lib/widgetBootstrap.ts","../src/module/shell/hooks/useBootstrap.ts","../src/lib/history-patch.ts","../src/module/shell/hooks/usePathGuard.ts","../src/i18n/locales/en.ts","../src/i18n/locales/de.ts","../src/i18n/config.ts","../src/i18n/index.ts","../src/i18n/resolve-widget-locale.ts","../src/module/shell/hooks/usePreviewBridge.ts","../src/module/visitor/visitor.state.ts","../src/module/screens/screens.state.ts","../src/module/visitor/idle-lock.ts","../src/shared/theme/build-theme.ts","../src/shared/icons/BotIcon.tsx","../src/shared/ui/HeaderLeft.tsx","../src/shared/ui/HeaderTitle.tsx","../src/shared/icons/CloseIcon.tsx","../src/shared/ui/HeaderCloseButton.tsx","../src/shared/ui/HeaderActions.tsx","../src/shared/ui/Header.tsx","../src/shared/icons/ZapIcon.tsx","../src/shared/ui/Footer.tsx","../src/shared/icons/MessageIcon.tsx","../src/shared/icons/SparklesIcon.tsx","../src/shared/ui/FAB.tsx","../src/features/home/components/HomeScreen.tsx","../src/features/selection/components/SelectionScreen.tsx","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/mergeClasses.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/toKebabCase.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/toCamelCase.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/toPascalCase.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/defaultAttributes.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/hasA11yProp.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/Icon.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/createLucideIcon.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/icons/corner-up-left.js","../../../node_modules/.pnpm/marked@17.0.5/node_modules/marked/lib/marked.esm.js","../src/features/chat/components/MarkdownContent.tsx","../src/features/chat/composer/state/draft.ts","../src/features/chat/composer/state/rate-limit.ts","../src/features/chat/composer/state/attachments.ts","../../../node_modules/.pnpm/convex@1.40.0_react@19.2.4/node_modules/convex/dist/esm/server/components/index.js","../../../packages/backend/convex/_generated/api.js","../src/features/chat/composer/hooks/useSendMessage.ts","../src/features/chat/composer/hooks/useRateLimitCountdown.ts","../src/features/chat/composer/components/RateLimitNotice.tsx","../src/features/chat/state/session-error.ts","../src/features/chat/composer/components/SessionErrorNotice.tsx","../src/shared/icons/SendIcon.tsx","../src/features/chat/composer/hooks/useComposerInput.ts","../src/features/chat/composer/components/ComposerRow.tsx","../src/features/chat/composer/components/PrivacyNotice.tsx","../src/features/chat/composer/components/ChatInput.tsx","../src/features/chat/components/BotMessage.tsx","../src/features/chat/components/UserMessage.tsx","../src/features/chat/hooks/useEscalation.ts","../src/features/chat/components/FormMessage.tsx","../src/features/chat/hooks/useMagicline.ts","../src/features/chat/components/magicline/formUtils.ts","../src/features/chat/components/magicline/magiclineConstants.ts","../src/features/chat/components/magicline/buildWizardSteps.ts","../src/features/chat/components/magicline/useTrialBookingState.ts","../src/features/chat/components/magicline/TrialSessionBookingForm.tsx","../src/features/chat/components/magicline/useContractCreationState.ts","../src/features/chat/components/magicline/ContractCreationForm.tsx","../src/features/chat/components/MagiclineFormMessage.tsx","../src/features/chat/components/SourcesRow.tsx","../src/features/chat/components/TypingIndicator.tsx","../src/features/chat/components/MessageList.tsx","../src/shared/ui/LoadingScreen.tsx","../src/features/chat/hooks/useConversation.ts","../src/features/chat/components/ChatScreen.tsx","../src/features/chat/components/EscalationFormScreen.tsx","../src/features/chat/hooks/useHandoff.ts","../src/features/chat/components/HumanHandoffAction.tsx","../src/lib/refreshBootstrap.ts","../src/features/chat/hooks/useConvexSession.ts","../src/features/ticket/components/FormScreen.tsx","../src/features/ticket/components/ConfirmationScreen.tsx","../src/shared/ui/ErrorScreen.tsx","../src/module/screens/ScreenRouter.tsx","../src/module/shell/WidgetShell.tsx","../src/shared/theme/inject-styles.ts","../src/module/shell/mount.tsx","../src/module/shell/widget-instance.ts","../src/entries/esm.ts","../src/entries/iife.ts"],"sourcesContent":["var n,l,u,t,i,r,o,e,f,c,s,a,h,p={},v=[],y=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,w=Array.isArray;function d(n,l){for(var u in l)n[u]=l[u];return n}function g(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function _(l,u,t){var i,r,o,e={};for(o in u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:e[o]=u[o];if(arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(o in l.defaultProps)void 0===e[o]&&(e[o]=l.defaultProps[o]);return m(l,e,i,r,null)}function m(n,t,i,r,o){var e={type:n,props:t,key:i,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==o?++u:o,__i:-1,__u:0};return null==o&&null!=l.vnode&&l.vnode(e),e}function b(){return{current:null}}function k(n){return n.children}function x(n,l){this.props=n,this.context=l}function S(n,l){if(null==l)return n.__?S(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?S(n):null}function C(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return C(n)}}function M(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!$.__r++||r!=l.debounceRendering)&&((r=l.debounceRendering)||o)($)}function $(){for(var n,u,t,r,o,f,c,s=1;i.length;)i.length>s&&i.sort(e),n=i.shift(),s=i.length,n.__d&&(t=void 0,r=void 0,o=(r=(u=n).__v).__e,f=[],c=[],u.__P&&((t=d({},r)).__v=r.__v+1,l.vnode&&l.vnode(t),O(u.__P,t,r,u.__n,u.__P.namespaceURI,32&r.__u?[o]:null,f,null==o?S(r):o,!!(32&r.__u),c),t.__v=r.__v,t.__.__k[t.__i]=t,N(f,t,c),r.__e=r.__=null,t.__e!=o&&C(t)));$.__r=0}function I(n,l,u,t,i,r,o,e,f,c,s){var a,h,y,w,d,g,_,m=t&&t.__k||v,b=l.length;for(f=P(u,l,m,f,b),a=0;a<b;a++)null!=(y=u.__k[a])&&(h=-1==y.__i?p:m[y.__i]||p,y.__i=a,g=O(n,y,h,i,r,o,e,f,c,s),w=y.__e,y.ref&&h.ref!=y.ref&&(h.ref&&B(h.ref,null,y),s.push(y.ref,y.__c||w,y)),null==d&&null!=w&&(d=w),(_=!!(4&y.__u))||h.__k===y.__k?f=A(y,f,n,_):\"function\"==typeof y.type&&void 0!==g?f=g:w&&(f=w.nextSibling),y.__u&=-7);return u.__e=d,f}function P(n,l,u,t,i){var r,o,e,f,c,s=u.length,a=s,h=0;for(n.__k=new Array(i),r=0;r<i;r++)null!=(o=l[r])&&\"boolean\"!=typeof o&&\"function\"!=typeof o?(f=r+h,(o=n.__k[r]=\"string\"==typeof o||\"number\"==typeof o||\"bigint\"==typeof o||o.constructor==String?m(null,o,null,null,null):w(o)?m(k,{children:o},null,null,null):null==o.constructor&&o.__b>0?m(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):o).__=n,o.__b=n.__b+1,e=null,-1!=(c=o.__i=L(o,u,f,a))&&(a--,(e=u[c])&&(e.__u|=2)),null==e||null==e.__v?(-1==c&&(i>s?h--:i<s&&h++),\"function\"!=typeof o.type&&(o.__u|=4)):c!=f&&(c==f-1?h--:c==f+1?h++:(c>f?h--:h++,o.__u|=4))):n.__k[r]=null;if(a)for(r=0;r<s;r++)null!=(e=u[r])&&0==(2&e.__u)&&(e.__e==t&&(t=S(e)),D(e,e));return t}function A(n,l,u,t){var i,r;if(\"function\"==typeof n.type){for(i=n.__k,r=0;i&&r<i.length;r++)i[r]&&(i[r].__=n,l=A(i[r],l,u,t));return l}n.__e!=l&&(t&&(l&&n.type&&!l.parentNode&&(l=S(n)),u.insertBefore(n.__e,l||null)),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8==l.nodeType);return l}function H(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(w(n)?n.some(function(n){H(n,l)}):l.push(n)),l}function L(n,l,u,t){var i,r,o,e=n.key,f=n.type,c=l[u],s=null!=c&&0==(2&c.__u);if(null===c&&null==n.key||s&&e==c.key&&f==c.type)return u;if(t>(s?1:0))for(i=u-1,r=u+1;i>=0||r<l.length;)if(null!=(c=l[o=i>=0?i--:r++])&&0==(2&c.__u)&&e==c.key&&f==c.type)return o;return-1}function T(n,l,u){\"-\"==l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||y.test(l)?u:u+\"px\"}function j(n,l,u,t,i){var r,o;n:if(\"style\"==l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||T(n.style,l,\"\");if(u)for(l in u)t&&u[l]==t[l]||T(n.style,l,u[l])}else if(\"o\"==l[0]&&\"n\"==l[1])r=l!=(l=l.replace(f,\"$1\")),o=l.toLowerCase(),l=o in n||\"onFocusOut\"==l||\"onFocusIn\"==l?o.slice(2):l.slice(2),n.l||(n.l={}),n.l[l+r]=u,u?t?u.u=t.u:(u.u=c,n.addEventListener(l,r?a:s,r)):n.removeEventListener(l,r?a:s,r);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!=l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function F(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u.t)u.t=c++;else if(u.t<t.u)return;return t(l.event?l.event(u):u)}}}function O(n,u,t,i,r,o,e,f,c,s){var a,h,p,v,y,_,m,b,S,C,M,$,P,A,H,L,T,j=u.type;if(null!=u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),o=[f=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof j)try{if(b=u.props,S=\"prototype\"in j&&j.prototype.render,C=(a=j.contextType)&&i[a.__c],M=a?C?C.props.value:a.__:i,t.__c?m=(h=u.__c=t.__c).__=h.__E:(S?u.__c=h=new j(b,M):(u.__c=h=new x(b,M),h.constructor=j,h.render=E),C&&C.sub(h),h.props=b,h.state||(h.state={}),h.context=M,h.__n=i,p=h.__d=!0,h.__h=[],h._sb=[]),S&&null==h.__s&&(h.__s=h.state),S&&null!=j.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=d({},h.__s)),d(h.__s,j.getDerivedStateFromProps(b,h.__s))),v=h.props,y=h.state,h.__v=u,p)S&&null==j.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),S&&null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(S&&null==j.getDerivedStateFromProps&&b!==v&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(b,M),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(b,h.__s,M)||u.__v==t.__v){for(u.__v!=t.__v&&(h.props=b,h.state=h.__s,h.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.some(function(n){n&&(n.__=u)}),$=0;$<h._sb.length;$++)h.__h.push(h._sb[$]);h._sb=[],h.__h.length&&e.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(b,h.__s,M),S&&null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(v,y,_)})}if(h.context=M,h.props=b,h.__P=n,h.__e=!1,P=l.__r,A=0,S){for(h.state=h.__s,h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[]}else do{h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++A<25);h.state=h.__s,null!=h.getChildContext&&(i=d(d({},i),h.getChildContext())),S&&!p&&null!=h.getSnapshotBeforeUpdate&&(_=h.getSnapshotBeforeUpdate(v,y)),L=a,null!=a&&a.type===k&&null==a.key&&(L=V(a.props.children)),f=I(n,w(L)?L:[L],u,t,i,r,o,e,f,c,s),h.base=u.__e,u.__u&=-161,h.__h.length&&e.push(h),m&&(h.__E=h.__=null)}catch(n){if(u.__v=null,c||null!=o)if(n.then){for(u.__u|=c?160:128;f&&8==f.nodeType&&f.nextSibling;)f=f.nextSibling;o[o.indexOf(f)]=null,u.__e=f}else{for(T=o.length;T--;)g(o[T]);z(u)}else u.__e=t.__e,u.__k=t.__k,n.then||z(u);l.__e(n,u,t)}else null==o&&u.__v==t.__v?(u.__k=t.__k,u.__e=t.__e):f=u.__e=q(t.__e,u,t,i,r,o,e,c,s);return(a=l.diffed)&&a(u),128&u.__u?void 0:f}function z(n){n&&n.__c&&(n.__c.__e=!0),n&&n.__k&&n.__k.forEach(z)}function N(n,u,t){for(var i=0;i<t.length;i++)B(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function V(n){return\"object\"!=typeof n||null==n||n.__b&&n.__b>0?n:w(n)?n.map(V):d({},n)}function q(u,t,i,r,o,e,f,c,s){var a,h,v,y,d,_,m,b=i.props,k=t.props,x=t.type;if(\"svg\"==x?o=\"http://www.w3.org/2000/svg\":\"math\"==x?o=\"http://www.w3.org/1998/Math/MathML\":o||(o=\"http://www.w3.org/1999/xhtml\"),null!=e)for(a=0;a<e.length;a++)if((d=e[a])&&\"setAttribute\"in d==!!x&&(x?d.localName==x:3==d.nodeType)){u=d,e[a]=null;break}if(null==u){if(null==x)return document.createTextNode(k);u=document.createElementNS(o,x,k.is&&k),c&&(l.__m&&l.__m(t,e),c=!1),e=null}if(null==x)b===k||c&&u.data==k||(u.data=k);else{if(e=e&&n.call(u.childNodes),b=i.props||p,!c&&null!=e)for(b={},a=0;a<u.attributes.length;a++)b[(d=u.attributes[a]).name]=d.value;for(a in b)if(d=b[a],\"children\"==a);else if(\"dangerouslySetInnerHTML\"==a)v=d;else if(!(a in k)){if(\"value\"==a&&\"defaultValue\"in k||\"checked\"==a&&\"defaultChecked\"in k)continue;j(u,a,null,d,o)}for(a in k)d=k[a],\"children\"==a?y=d:\"dangerouslySetInnerHTML\"==a?h=d:\"value\"==a?_=d:\"checked\"==a?m=d:c&&\"function\"!=typeof d||b[a]===d||j(u,a,d,b[a],o);if(h)c||v&&(h.__html==v.__html||h.__html==u.innerHTML)||(u.innerHTML=h.__html),t.__k=[];else if(v&&(u.innerHTML=\"\"),I(\"template\"==t.type?u.content:u,w(y)?y:[y],t,i,r,\"foreignObject\"==x?\"http://www.w3.org/1999/xhtml\":o,e,f,e?e[0]:i.__k&&S(i,0),c,s),null!=e)for(a=e.length;a--;)g(e[a]);c||(a=\"value\",\"progress\"==x&&null==_?u.removeAttribute(\"value\"):null!=_&&(_!==u[a]||\"progress\"==x&&!_||\"option\"==x&&_!=b[a])&&j(u,a,_,b[a],o),a=\"checked\",null!=m&&m!=u[a]&&j(u,a,m,b[a],o))}return u}function B(n,u,t){try{if(\"function\"==typeof n){var i=\"function\"==typeof n.__u;i&&n.__u(),i&&null==u||(n.__u=n(u))}else n.current=u}catch(n){l.__e(n,t)}}function D(n,u,t){var i,r;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!=n.__e||B(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null}if(i=n.__k)for(r=0;r<i.length;r++)i[r]&&D(i[r],u,t||\"function\"!=typeof n.type);t||g(n.__e),n.__c=n.__=n.__e=void 0}function E(n,l,u){return this.constructor(n,u)}function G(u,t,i){var r,o,e,f;t==document&&(t=document.documentElement),l.__&&l.__(u,t),o=(r=\"function\"==typeof i)?null:i&&i.__k||t.__k,e=[],f=[],O(t,u=(!r&&i||t).__k=_(k,null,[u]),o||p,p,t.namespaceURI,!r&&i?[i]:o?null:t.firstChild?n.call(t.childNodes):null,e,!r&&i?i:o?o.__e:t.firstChild,r,f),N(e,u,f)}function J(n,l){G(n,l,J)}function K(l,u,t){var i,r,o,e,f=d({},l.props);for(o in l.type&&l.type.defaultProps&&(e=l.type.defaultProps),u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:f[o]=void 0===u[o]&&null!=e?e[o]:u[o];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),m(l.type,f,i||l.key,r||l.ref,null)}function Q(n){function l(n){var u,t;return this.getChildContext||(u=new Set,(t={})[l.__c]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&u.forEach(function(n){n.__e=!0,M(n)})},this.sub=function(n){u.add(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.delete(n),l&&l.call(n)}}),n.children}return l.__c=\"__cC\"+h++,l.__=n,l.Provider=l.__l=(l.Consumer=function(n,l){return n.children(l)}).contextType=l,l}n=v.slice,l={__e:function(n,l,u,t){for(var i,r,o;l=l.__;)if((i=l.__c)&&!i.__)try{if((r=i.constructor)&&null!=r.getDerivedStateFromError&&(i.setState(r.getDerivedStateFromError(n)),o=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),o=i.__d),o)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&null==n.constructor},x.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=d({},this.state),\"function\"==typeof n&&(n=n(d({},u),this.props)),n&&d(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),M(this))},x.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),M(this))},x.prototype.render=k,i=[],o=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,e=function(n,l){return n.__v.__b-l.__v.__b},$.__r=0,f=/(PointerCapture)$|Capture$/i,c=0,s=F(!1),a=F(!0),h=0;export{x as Component,k as Fragment,K as cloneElement,Q as createContext,_ as createElement,b as createRef,_ as h,J as hydrate,t as isValidElement,l as options,G as render,H as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\""\";break;case 38:f=\"&\";break;case 60:f=\"<\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,p=t;if(\"ref\"in p)for(c in p={},t)\"ref\"==c?a=t[c]:p[c]=t[c];var l={type:e,props:p,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===p[c]&&(p[c]=a[c]);return r.vnode&&r.vnode(l),l}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},p=/[A-Z]/g;function l(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(t=function(r){return null!==r&&\"object\"==typeof r&&\"function\"==typeof r.valueOf?r.valueOf():r}(t),\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var l=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(p,\"-$&\").toLowerCase()),s=\";\";\"number\"!=typeof a||l.startsWith(\"--\")||o.test(l)||(s=\"px;\"),i=i+l+\":\"+a+s}}return e+'=\"'+n(i)+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(\"\"+t)+'\"'}function s(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=s(r[e]);return r}}return n(\"\"+r)}export{u as jsx,l as jsxAttr,u as jsxDEV,s as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function p(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function d(n){return o=1,h(D,n)}function h(n,u,i){var o=p(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.__f)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=o.__c.props!==n;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),c&&c.call(this,n,t,r)||i};r.__f=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=p(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__H.__h.push(i))}function _(n,u){var i=p(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){if(\"function\"==typeof n){var r=n(t());return function(){n(null),r&&\"function\"==typeof r&&r()}}if(n)return n.current=t(),function(){return n.current=null}},null==r?r:r.concat(n))}function T(n,r){var u=p(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=p(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=p(t++,10),i=d();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=p(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,35);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,h as useReducer,A as useRef,d as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import{Component as n,createElement as t,options as e,toChildArray as r,Fragment as u,render as o,hydrate as i,createContext as l,createRef as c,cloneElement as f}from\"preact\";export{Component,Fragment,createContext,createElement,createRef}from\"preact\";import{useState as a,useLayoutEffect as s,useEffect as h,useCallback as v,useContext as d,useDebugValue as m,useId as p,useImperativeHandle as y,useMemo as _,useReducer as b,useRef as S}from\"preact/hooks\";export*from\"preact/hooks\";function g(n,t){for(var e in t)n[e]=t[e];return n}function E(n,t){for(var e in n)if(\"__source\"!==e&&!(e in t))return!0;for(var r in t)if(\"__source\"!==r&&n[r]!==t[r])return!0;return!1}function C(n,t){var e=t(),r=a({t:{__:e,u:t}}),u=r[0].t,o=r[1];return s(function(){u.__=e,u.u=t,x(u)&&o({t:u})},[n,e,t]),h(function(){return x(u)&&o({t:u}),n(function(){x(u)&&o({t:u})})},[n]),e}function x(n){var t,e,r=n.u,u=n.__;try{var o=r();return!((t=u)===(e=o)&&(0!==t||1/t==1/e)||t!=t&&e!=e)}catch(n){return!0}}function R(n){n()}function w(n){return n}function k(){return[!1,R]}var I=s;function N(n,t){this.props=n,this.context=t}function M(n,e){function r(n){var t=this.props.ref,r=t==n.ref;return!r&&t&&(t.call?t(null):t.current=null),e?!e(this.props,n)||!r:E(this.props,n)}function u(e){return this.shouldComponentUpdate=r,t(n,e)}return u.displayName=\"Memo(\"+(n.displayName||n.name)+\")\",u.prototype.isReactComponent=!0,u.__f=!0,u.type=n,u}(N.prototype=new n).isPureReactComponent=!0,N.prototype.shouldComponentUpdate=function(n,t){return E(this.props,n)||E(this.state,t)};var T=e.__b;e.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),T&&T(n)};var A=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.forward_ref\")||3911;function D(n){function t(t){var e=g({},t);return delete e.ref,n(e,t.ref||null)}return t.$$typeof=A,t.render=n,t.prototype.isReactComponent=t.__f=!0,t.displayName=\"ForwardRef(\"+(n.displayName||n.name)+\")\",t}var L=function(n,t){return null==n?null:r(r(n).map(t))},O={map:L,forEach:L,count:function(n){return n?r(n).length:0},only:function(n){var t=r(n);if(1!==t.length)throw\"Children.only\";return t[0]},toArray:r},F=e.__e;e.__e=function(n,t,e,r){if(n.then)for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),u.__c(n,t);F(n,t,e,r)};var U=e.unmount;function V(n,t,e){return n&&(n.__c&&n.__c.__H&&(n.__c.__H.__.forEach(function(n){\"function\"==typeof n.__c&&n.__c()}),n.__c.__H=null),null!=(n=g({},n)).__c&&(n.__c.__P===e&&(n.__c.__P=t),n.__c.__e=!0,n.__c=null),n.__k=n.__k&&n.__k.map(function(n){return V(n,t,e)})),n}function W(n,t,e){return n&&e&&(n.__v=null,n.__k=n.__k&&n.__k.map(function(n){return W(n,t,e)}),n.__c&&n.__c.__P===t&&(n.__e&&e.appendChild(n.__e),n.__c.__e=!0,n.__c.__P=e)),n}function P(){this.__u=0,this.o=null,this.__b=null}function j(n){var t=n.__.__c;return t&&t.__a&&t.__a(n)}function z(n){var e,r,u;function o(o){if(e||(e=n()).then(function(n){r=n.default||n},function(n){u=n}),u)throw u;if(!r)throw e;return t(r,o)}return o.displayName=\"Lazy\",o.__f=!0,o}function B(){this.i=null,this.l=null}e.unmount=function(n){var t=n.__c;t&&t.__R&&t.__R(),t&&32&n.__u&&(n.type=null),U&&U(n)},(P.prototype=new n).__c=function(n,t){var e=t.__c,r=this;null==r.o&&(r.o=[]),r.o.push(e);var u=j(r.__v),o=!1,i=function(){o||(o=!0,e.__R=null,u?u(l):l())};e.__R=i;var l=function(){if(!--r.__u){if(r.state.__a){var n=r.state.__a;r.__v.__k[0]=W(n,n.__c.__P,n.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.o.pop();)t.forceUpdate()}};r.__u++||32&t.__u||r.setState({__a:r.__b=r.__v.__k[0]}),n.then(i,i)},P.prototype.componentWillUnmount=function(){this.o=[]},P.prototype.render=function(n,e){if(this.__b){if(this.__v.__k){var r=document.createElement(\"div\"),o=this.__v.__k[0].__c;this.__v.__k[0]=V(this.__b,r,o.__O=o.__P)}this.__b=null}var i=e.__a&&t(u,null,n.fallback);return i&&(i.__u&=-33),[t(u,null,e.__a?null:n.children),i]};var H=function(n,t,e){if(++e[1]===e[0]&&n.l.delete(t),n.props.revealOrder&&(\"t\"!==n.props.revealOrder[0]||!n.l.size))for(e=n.i;e;){for(;e.length>3;)e.pop()();if(e[1]<e[0])break;n.i=e=e[2]}};function Z(n){return this.getChildContext=function(){return n.context},n.children}function Y(n){var e=this,r=n.h;if(e.componentWillUnmount=function(){o(null,e.v),e.v=null,e.h=null},e.h&&e.h!==r&&e.componentWillUnmount(),!e.v){for(var u=e.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;e.h=r,e.v={nodeType:1,parentNode:r,childNodes:[],__k:{__m:u.__m},contains:function(){return!0},insertBefore:function(n,t){this.childNodes.push(n),e.h.insertBefore(n,t)},removeChild:function(n){this.childNodes.splice(this.childNodes.indexOf(n)>>>1,1),e.h.removeChild(n)}}}o(t(Z,{context:e.context},n.__v),e.v)}function $(n,e){var r=t(Y,{__v:n,h:e});return r.containerInfo=e,r}(B.prototype=new n).__a=function(n){var t=this,e=j(t.__v),r=t.l.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),H(t,n,r)):u()};e?e(o):o()}},B.prototype.render=function(n){this.i=null,this.l=new Map;var t=r(n.children);n.revealOrder&&\"b\"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.l.set(t[e],this.i=[1,0,this.i]);return n.children},B.prototype.componentDidUpdate=B.prototype.componentDidMount=function(){var n=this;this.l.forEach(function(t,e){H(n,e,t)})};var q=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103,G=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,J=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,K=/[A-Z0-9]/g,Q=\"undefined\"!=typeof document,X=function(n){return(\"undefined\"!=typeof Symbol&&\"symbol\"==typeof Symbol()?/fil|che|rad/:/fil|che|ra/).test(n)};function nn(n,t,e){return null==t.__k&&(t.textContent=\"\"),o(n,t),\"function\"==typeof e&&e(),n?n.__c:null}function tn(n,t,e){return i(n,t),\"function\"==typeof e&&e(),n?n.__c:null}n.prototype.isReactComponent={},[\"componentWillMount\",\"componentWillReceiveProps\",\"componentWillUpdate\"].forEach(function(t){Object.defineProperty(n.prototype,t,{configurable:!0,get:function(){return this[\"UNSAFE_\"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n})}})});var en=e.event;function rn(){}function un(){return this.cancelBubble}function on(){return this.defaultPrevented}e.event=function(n){return en&&(n=en(n)),n.persist=rn,n.isPropagationStopped=un,n.isDefaultPrevented=on,n.nativeEvent=n};var ln,cn={enumerable:!1,configurable:!0,get:function(){return this.class}},fn=e.vnode;e.vnode=function(n){\"string\"==typeof n.type&&function(n){var t=n.props,e=n.type,u={},o=-1===e.indexOf(\"-\");for(var i in t){var l=t[i];if(!(\"value\"===i&&\"defaultValue\"in t&&null==l||Q&&\"children\"===i&&\"noscript\"===e||\"class\"===i||\"className\"===i)){var c=i.toLowerCase();\"defaultValue\"===i&&\"value\"in t&&null==t.value?i=\"value\":\"download\"===i&&!0===l?l=\"\":\"translate\"===c&&\"no\"===l?l=!1:\"o\"===c[0]&&\"n\"===c[1]?\"ondoubleclick\"===c?i=\"ondblclick\":\"onchange\"!==c||\"input\"!==e&&\"textarea\"!==e||X(t.type)?\"onfocus\"===c?i=\"onfocusin\":\"onblur\"===c?i=\"onfocusout\":J.test(i)&&(i=c):c=i=\"oninput\":o&&G.test(i)?i=i.replace(K,\"-$&\").toLowerCase():null===l&&(l=void 0),\"oninput\"===c&&u[i=c]&&(i=\"oninputCapture\"),u[i]=l}}\"select\"==e&&u.multiple&&Array.isArray(u.value)&&(u.value=r(t.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value)})),\"select\"==e&&null!=u.defaultValue&&(u.value=r(t.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value})),t.class&&!t.className?(u.class=t.class,Object.defineProperty(u,\"className\",cn)):(t.className&&!t.class||t.class&&t.className)&&(u.class=u.className=t.className),n.props=u}(n),n.$$typeof=q,fn&&fn(n)};var an=e.__r;e.__r=function(n){an&&an(n),ln=n.__c};var sn=e.diffed;e.diffed=function(n){sn&&sn(n);var t=n.props,e=n.__e;null!=e&&\"textarea\"===n.type&&\"value\"in t&&t.value!==e.value&&(e.value=null==t.value?\"\":t.value),ln=null};var hn={ReactCurrentDispatcher:{current:{readContext:function(n){return ln.__n[n.__c].props.value},useCallback:v,useContext:d,useDebugValue:m,useDeferredValue:w,useEffect:h,useId:p,useImperativeHandle:y,useInsertionEffect:I,useLayoutEffect:s,useMemo:_,useReducer:b,useRef:S,useState:a,useSyncExternalStore:C,useTransition:k}}},vn=\"18.3.1\";function dn(n){return t.bind(null,n)}function mn(n){return!!n&&n.$$typeof===q}function pn(n){return mn(n)&&n.type===u}function yn(n){return!!n&&!!n.displayName&&(\"string\"==typeof n.displayName||n.displayName instanceof String)&&n.displayName.startsWith(\"Memo(\")}function _n(n){return mn(n)?f.apply(null,arguments):n}function bn(n){return!!n.__k&&(o(null,n),!0)}function Sn(n){return n&&(n.base||1===n.nodeType&&n)||null}var gn=function(n,t){return n(t)},En=function(n,t){return n(t)},Cn=u,xn=mn,Rn={useState:a,useId:p,useReducer:b,useEffect:h,useLayoutEffect:s,useInsertionEffect:I,useTransition:k,useDeferredValue:w,useSyncExternalStore:C,startTransition:R,useRef:S,useImperativeHandle:y,useMemo:_,useCallback:v,useContext:d,useDebugValue:m,version:\"18.3.1\",Children:O,render:nn,hydrate:tn,unmountComponentAtNode:bn,createPortal:$,createElement:t,createContext:l,createFactory:dn,cloneElement:_n,createRef:c,Fragment:u,isValidElement:mn,isElement:xn,isFragment:pn,isMemo:yn,findDOMNode:Sn,Component:n,PureComponent:N,memo:M,forwardRef:D,flushSync:En,unstable_batchedUpdates:gn,StrictMode:Cn,Suspense:P,SuspenseList:B,lazy:z,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:hn};export{O as Children,N as PureComponent,Cn as StrictMode,P as Suspense,B as SuspenseList,hn as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,_n as cloneElement,dn as createFactory,$ as createPortal,Rn as default,Sn as findDOMNode,En as flushSync,D as forwardRef,tn as hydrate,xn as isElement,pn as isFragment,yn as isMemo,mn as isValidElement,z as lazy,M as memo,nn as render,R as startTransition,bn as unmountComponentAtNode,gn as unstable_batchedUpdates,w as useDeferredValue,I as useInsertionEffect,C as useSyncExternalStore,k as useTransition,vn as version};\n//# sourceMappingURL=compat.module.js.map\n","\"use strict\";\nvar lookup = [];\nvar revLookup = [];\nvar Arr = Uint8Array;\nvar code = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i];\n revLookup[code.charCodeAt(i)] = i;\n}\nrevLookup[\"-\".charCodeAt(0)] = 62;\nrevLookup[\"_\".charCodeAt(0)] = 63;\nfunction getLens(b64) {\n var len = b64.length;\n if (len % 4 > 0) {\n throw new Error(\"Invalid string. Length must be a multiple of 4\");\n }\n var validLen = b64.indexOf(\"=\");\n if (validLen === -1) validLen = len;\n var placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4;\n return [validLen, placeHoldersLen];\n}\nexport function byteLength(b64) {\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction _byteLength(_b64, validLen, placeHoldersLen) {\n return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nexport function toByteArray(b64) {\n var tmp;\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));\n var curByte = 0;\n var len = placeHoldersLen > 0 ? validLen - 4 : validLen;\n var i;\n for (i = 0; i < len; i += 4) {\n tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)];\n arr[curByte++] = tmp >> 16 & 255;\n arr[curByte++] = tmp >> 8 & 255;\n arr[curByte++] = tmp & 255;\n }\n if (placeHoldersLen === 2) {\n tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4;\n arr[curByte++] = tmp & 255;\n }\n if (placeHoldersLen === 1) {\n tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2;\n arr[curByte++] = tmp >> 8 & 255;\n arr[curByte++] = tmp & 255;\n }\n return arr;\n}\nfunction tripletToBase64(num) {\n return lookup[num >> 18 & 63] + lookup[num >> 12 & 63] + lookup[num >> 6 & 63] + lookup[num & 63];\n}\nfunction encodeChunk(uint8, start, end) {\n var tmp;\n var output = [];\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16 & 16711680) + (uint8[i + 1] << 8 & 65280) + (uint8[i + 2] & 255);\n output.push(tripletToBase64(tmp));\n }\n return output.join(\"\");\n}\nexport function fromByteArray(uint8) {\n var tmp;\n var len = uint8.length;\n var extraBytes = len % 3;\n var parts = [];\n var maxChunkLength = 16383;\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(\n encodeChunk(\n uint8,\n i,\n i + maxChunkLength > len2 ? len2 : i + maxChunkLength\n )\n );\n }\n if (extraBytes === 1) {\n tmp = uint8[len - 1];\n parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 63] + \"==\");\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1];\n parts.push(\n lookup[tmp >> 10] + lookup[tmp >> 4 & 63] + lookup[tmp << 2 & 63] + \"=\"\n );\n }\n return parts.join(\"\");\n}\nexport function fromByteArrayUrlSafeNoPadding(uint8) {\n return fromByteArray(uint8).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n//# sourceMappingURL=base64.js.map\n","\"use strict\";\nexport function parseArgs(args) {\n if (args === void 0) {\n return {};\n }\n if (!isSimpleObject(args)) {\n throw new Error(\n `The arguments to a Convex function must be an object. Received: ${args}`\n );\n }\n return args;\n}\nexport function validateDeploymentUrl(deploymentUrl) {\n if (typeof deploymentUrl === \"undefined\") {\n throw new Error(\n `Client created with undefined deployment address. If you used an environment variable, check that it's set.`\n );\n }\n if (typeof deploymentUrl !== \"string\") {\n throw new Error(\n `Invalid deployment address: found ${deploymentUrl}\".`\n );\n }\n if (!(deploymentUrl.startsWith(\"http:\") || deploymentUrl.startsWith(\"https:\"))) {\n throw new Error(\n `Invalid deployment address: Must start with \"https://\" or \"http://\". Found \"${deploymentUrl}\".`\n );\n }\n try {\n new URL(deploymentUrl);\n } catch {\n throw new Error(\n `Invalid deployment address: \"${deploymentUrl}\" is not a valid URL. If you believe this URL is correct, use the \\`skipConvexDeploymentUrlCheck\\` option to bypass this.`\n );\n }\n if (deploymentUrl.endsWith(\".convex.site\")) {\n throw new Error(\n `Invalid deployment address: \"${deploymentUrl}\" ends with .convex.site, which is used for HTTP Actions. Convex deployment URLs typically end with .convex.cloud? If you believe this URL is correct, use the \\`skipConvexDeploymentUrlCheck\\` option to bypass this.`\n );\n }\n}\nexport function isSimpleObject(value) {\n const isObject = typeof value === \"object\";\n const prototype = Object.getPrototypeOf(value);\n const isSimple = prototype === null || prototype === Object.prototype || // Objects generated from other contexts (e.g. across Node.js `vm` modules) will not satisfy the previous\n // conditions but are still simple objects.\n prototype?.constructor?.name === \"Object\";\n return isObject && isSimple;\n}\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nimport * as Base64 from \"./base64.js\";\nimport { isSimpleObject } from \"../common/index.js\";\nconst LITTLE_ENDIAN = true;\nconst MIN_INT64 = BigInt(\"-9223372036854775808\");\nconst MAX_INT64 = BigInt(\"9223372036854775807\");\nconst ZERO = BigInt(\"0\");\nconst EIGHT = BigInt(\"8\");\nconst TWOFIFTYSIX = BigInt(\"256\");\nfunction isSpecial(n) {\n return Number.isNaN(n) || !Number.isFinite(n) || Object.is(n, -0);\n}\nexport function slowBigIntToBase64(value) {\n if (value < ZERO) {\n value -= MIN_INT64 + MIN_INT64;\n }\n let hex = value.toString(16);\n if (hex.length % 2 === 1) hex = \"0\" + hex;\n const bytes = new Uint8Array(new ArrayBuffer(8));\n let i = 0;\n for (const hexByte of hex.match(/.{2}/g).reverse()) {\n bytes.set([parseInt(hexByte, 16)], i++);\n value >>= EIGHT;\n }\n return Base64.fromByteArray(bytes);\n}\nexport function slowBase64ToBigInt(encoded) {\n const integerBytes = Base64.toByteArray(encoded);\n if (integerBytes.byteLength !== 8) {\n throw new Error(\n `Received ${integerBytes.byteLength} bytes, expected 8 for $integer`\n );\n }\n let value = ZERO;\n let power = ZERO;\n for (const byte of integerBytes) {\n value += BigInt(byte) * TWOFIFTYSIX ** power;\n power++;\n }\n if (value > MAX_INT64) {\n value += MIN_INT64 + MIN_INT64;\n }\n return value;\n}\nexport function modernBigIntToBase64(value) {\n if (value < MIN_INT64 || MAX_INT64 < value) {\n throw new Error(\n `BigInt ${value} does not fit into a 64-bit signed integer.`\n );\n }\n const buffer = new ArrayBuffer(8);\n new DataView(buffer).setBigInt64(0, value, true);\n return Base64.fromByteArray(new Uint8Array(buffer));\n}\nexport function modernBase64ToBigInt(encoded) {\n const integerBytes = Base64.toByteArray(encoded);\n if (integerBytes.byteLength !== 8) {\n throw new Error(\n `Received ${integerBytes.byteLength} bytes, expected 8 for $integer`\n );\n }\n const intBytesView = new DataView(integerBytes.buffer);\n return intBytesView.getBigInt64(0, true);\n}\nexport const bigIntToBase64 = DataView.prototype.setBigInt64 ? modernBigIntToBase64 : slowBigIntToBase64;\nexport const base64ToBigInt = DataView.prototype.getBigInt64 ? modernBase64ToBigInt : slowBase64ToBigInt;\nconst MAX_IDENTIFIER_LEN = 1024;\nfunction validateObjectField(k) {\n if (k.length > MAX_IDENTIFIER_LEN) {\n throw new Error(\n `Field name ${k} exceeds maximum field name length ${MAX_IDENTIFIER_LEN}.`\n );\n }\n if (k.startsWith(\"$\")) {\n throw new Error(`Field name ${k} starts with a '$', which is reserved.`);\n }\n for (let i = 0; i < k.length; i += 1) {\n const charCode = k.charCodeAt(i);\n if (charCode < 32 || charCode >= 127) {\n throw new Error(\n `Field name ${k} has invalid character '${k[i]}': Field names can only contain non-control ASCII characters`\n );\n }\n }\n}\nexport function jsonToConvex(value) {\n if (value === null) {\n return value;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((value2) => jsonToConvex(value2));\n }\n if (typeof value !== \"object\") {\n throw new Error(`Unexpected type of ${value}`);\n }\n const entries = Object.entries(value);\n if (entries.length === 1) {\n const key = entries[0][0];\n if (key === \"$bytes\") {\n if (typeof value.$bytes !== \"string\") {\n throw new Error(`Malformed $bytes field on ${value}`);\n }\n return Base64.toByteArray(value.$bytes).buffer;\n }\n if (key === \"$integer\") {\n if (typeof value.$integer !== \"string\") {\n throw new Error(`Malformed $integer field on ${value}`);\n }\n return base64ToBigInt(value.$integer);\n }\n if (key === \"$float\") {\n if (typeof value.$float !== \"string\") {\n throw new Error(`Malformed $float field on ${value}`);\n }\n const floatBytes = Base64.toByteArray(value.$float);\n if (floatBytes.byteLength !== 8) {\n throw new Error(\n `Received ${floatBytes.byteLength} bytes, expected 8 for $float`\n );\n }\n const floatBytesView = new DataView(floatBytes.buffer);\n const float = floatBytesView.getFloat64(0, LITTLE_ENDIAN);\n if (!isSpecial(float)) {\n throw new Error(`Float ${float} should be encoded as a number`);\n }\n return float;\n }\n if (key === \"$set\") {\n throw new Error(\n `Received a Set which is no longer supported as a Convex type.`\n );\n }\n if (key === \"$map\") {\n throw new Error(\n `Received a Map which is no longer supported as a Convex type.`\n );\n }\n }\n const out = {};\n for (const [k, v] of Object.entries(value)) {\n validateObjectField(k);\n out[k] = jsonToConvex(v);\n }\n return out;\n}\nconst MAX_VALUE_FOR_ERROR_LEN = 16384;\nexport function stringifyValueForError(value) {\n const str = JSON.stringify(value, (_key, value2) => {\n if (value2 === void 0) {\n return \"undefined\";\n }\n if (typeof value2 === \"bigint\") {\n return `${value2.toString()}n`;\n }\n return value2;\n });\n if (str.length > MAX_VALUE_FOR_ERROR_LEN) {\n const rest = \"[...truncated]\";\n let truncateAt = MAX_VALUE_FOR_ERROR_LEN - rest.length;\n const codePoint = str.codePointAt(truncateAt - 1);\n if (codePoint !== void 0 && codePoint > 65535) {\n truncateAt -= 1;\n }\n return str.substring(0, truncateAt) + rest;\n }\n return str;\n}\nfunction convexToJsonInternal(value, originalValue, context, includeTopLevelUndefined) {\n if (value === void 0) {\n const contextText = context && ` (present at path ${context} in original object ${stringifyValueForError(\n originalValue\n )})`;\n throw new Error(\n `undefined is not a valid Convex value${contextText}. To learn about Convex's supported types, see https://docs.convex.dev/using/types.`\n );\n }\n if (value === null) {\n return value;\n }\n if (typeof value === \"bigint\") {\n if (value < MIN_INT64 || MAX_INT64 < value) {\n throw new Error(\n `BigInt ${value} does not fit into a 64-bit signed integer.`\n );\n }\n return { $integer: bigIntToBase64(value) };\n }\n if (typeof value === \"number\") {\n if (isSpecial(value)) {\n const buffer = new ArrayBuffer(8);\n new DataView(buffer).setFloat64(0, value, LITTLE_ENDIAN);\n return { $float: Base64.fromByteArray(new Uint8Array(buffer)) };\n } else {\n return value;\n }\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return { $bytes: Base64.fromByteArray(new Uint8Array(value)) };\n }\n if (Array.isArray(value)) {\n return value.map(\n (value2, i) => convexToJsonInternal(value2, originalValue, context + `[${i}]`, false)\n );\n }\n if (value instanceof Set) {\n throw new Error(\n errorMessageForUnsupportedType(context, \"Set\", [...value], originalValue)\n );\n }\n if (value instanceof Map) {\n throw new Error(\n errorMessageForUnsupportedType(context, \"Map\", [...value], originalValue)\n );\n }\n if (!isSimpleObject(value)) {\n const theType = value?.constructor?.name;\n const typeName = theType ? `${theType} ` : \"\";\n throw new Error(\n errorMessageForUnsupportedType(context, typeName, value, originalValue)\n );\n }\n const out = {};\n const entries = Object.entries(value);\n entries.sort(([k1, _v1], [k2, _v2]) => k1 === k2 ? 0 : k1 < k2 ? -1 : 1);\n for (const [k, v] of entries) {\n if (v !== void 0) {\n validateObjectField(k);\n out[k] = convexToJsonInternal(v, originalValue, context + `.${k}`, false);\n } else if (includeTopLevelUndefined) {\n validateObjectField(k);\n out[k] = convexOrUndefinedToJsonInternal(\n v,\n originalValue,\n context + `.${k}`\n );\n }\n }\n return out;\n}\nfunction errorMessageForUnsupportedType(context, typeName, value, originalValue) {\n if (context) {\n return `${typeName}${stringifyValueForError(\n value\n )} is not a supported Convex type (present at path ${context} in original object ${stringifyValueForError(\n originalValue\n )}). To learn about Convex's supported types, see https://docs.convex.dev/using/types.`;\n } else {\n return `${typeName}${stringifyValueForError(\n value\n )} is not a supported Convex type.`;\n }\n}\nfunction convexOrUndefinedToJsonInternal(value, originalValue, context) {\n if (value === void 0) {\n return { $undefined: null };\n } else {\n if (originalValue === void 0) {\n throw new Error(\n `Programming error. Current value is ${stringifyValueForError(\n value\n )} but original value is undefined`\n );\n }\n return convexToJsonInternal(value, originalValue, context, false);\n }\n}\nexport function convexToJson(value) {\n return convexToJsonInternal(value, value, \"\", false);\n}\nexport function convexOrUndefinedToJson(value) {\n return convexOrUndefinedToJsonInternal(value, value, \"\");\n}\nexport function patchValueToJson(value) {\n return convexToJsonInternal(value, value, \"\", true);\n}\n//# sourceMappingURL=value.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nvar _a, _b;\nimport { stringifyValueForError } from \"./value.js\";\nconst IDENTIFYING_FIELD = Symbol.for(\"ConvexError\");\nexport class ConvexError extends (_b = Error, _a = IDENTIFYING_FIELD, _b) {\n constructor(data) {\n super(typeof data === \"string\" ? data : stringifyValueForError(data));\n __publicField(this, \"name\", \"ConvexError\");\n __publicField(this, \"data\");\n __publicField(this, _a, true);\n this.data = data;\n }\n}\n//# sourceMappingURL=errors.js.map\n","\"use strict\";\nexport function compareUTF8(a, b) {\n const aLength = a.length;\n const bLength = b.length;\n const length = Math.min(aLength, bLength);\n for (let i = 0; i < length; ) {\n const aCodePoint = a.codePointAt(i);\n const bCodePoint = b.codePointAt(i);\n if (aCodePoint !== bCodePoint) {\n if (aCodePoint < 128 && bCodePoint < 128) {\n return aCodePoint - bCodePoint;\n }\n const aLength2 = utf8Bytes(aCodePoint, aBytes);\n const bLength2 = utf8Bytes(bCodePoint, bBytes);\n return compareArrays(aBytes, aLength2, bBytes, bLength2);\n }\n i += utf16LengthForCodePoint(aCodePoint);\n }\n return aLength - bLength;\n}\nfunction compareArrays(a, aLength, b, bLength) {\n const length = Math.min(aLength, bLength);\n for (let i = 0; i < length; i++) {\n const aValue = a[i];\n const bValue = b[i];\n if (aValue !== bValue) {\n return aValue - bValue;\n }\n }\n return aLength - bLength;\n}\nexport function utf16LengthForCodePoint(aCodePoint) {\n return aCodePoint > 65535 ? 2 : 1;\n}\nconst arr = () => Array.from({ length: 4 }, () => 0);\nconst aBytes = arr();\nconst bBytes = arr();\nfunction utf8Bytes(codePoint, bytes) {\n if (codePoint < 128) {\n bytes[0] = codePoint;\n return 1;\n }\n let count;\n let offset;\n if (codePoint <= 2047) {\n count = 1;\n offset = 192;\n } else if (codePoint <= 65535) {\n count = 2;\n offset = 224;\n } else if (codePoint <= 1114111) {\n count = 3;\n offset = 240;\n } else {\n throw new Error(\"Invalid code point\");\n }\n bytes[0] = (codePoint >> 6 * count) + offset;\n let i = 1;\n for (; count > 0; count--) {\n const temp = codePoint >> 6 * (count - 1);\n bytes[i++] = 128 | temp & 63;\n }\n return i;\n}\nexport function greaterThan(a, b) {\n return compareUTF8(a, b) > 0;\n}\nexport function greaterThanEq(a, b) {\n return compareUTF8(a, b) >= 0;\n}\nexport function lessThan(a, b) {\n return compareUTF8(a, b) < 0;\n}\nexport function lessThanEq(a, b) {\n return compareUTF8(a, b) <= 0;\n}\n//# sourceMappingURL=compare_utf8.js.map\n","\"use strict\";\nexport const version = \"1.40.0\";\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst INFO_COLOR = \"color:rgb(0, 145, 255)\";\nfunction prefix_for_source(source) {\n switch (source) {\n case \"query\":\n return \"Q\";\n case \"mutation\":\n return \"M\";\n case \"action\":\n return \"A\";\n case \"any\":\n return \"?\";\n }\n}\nexport class DefaultLogger {\n constructor(options) {\n __publicField(this, \"_onLogLineFuncs\");\n __publicField(this, \"_verbose\");\n this._onLogLineFuncs = {};\n this._verbose = options.verbose;\n }\n addLogLineListener(func) {\n let id = Math.random().toString(36).substring(2, 15);\n for (let i = 0; i < 10; i++) {\n if (this._onLogLineFuncs[id] === void 0) {\n break;\n }\n id = Math.random().toString(36).substring(2, 15);\n }\n this._onLogLineFuncs[id] = func;\n return () => {\n delete this._onLogLineFuncs[id];\n };\n }\n logVerbose(...args) {\n if (this._verbose) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"debug\", `${(/* @__PURE__ */ new Date()).toISOString()}`, ...args);\n }\n }\n }\n log(...args) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"info\", ...args);\n }\n }\n warn(...args) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"warn\", ...args);\n }\n }\n error(...args) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"error\", ...args);\n }\n }\n}\nexport function instantiateDefaultLogger(options) {\n const logger = new DefaultLogger(options);\n logger.addLogLineListener((level, ...args) => {\n switch (level) {\n case \"debug\":\n console.debug(...args);\n break;\n case \"info\":\n console.log(...args);\n break;\n case \"warn\":\n console.warn(...args);\n break;\n case \"error\":\n console.error(...args);\n break;\n default: {\n level;\n console.log(...args);\n }\n }\n });\n return logger;\n}\nexport function instantiateNoopLogger(options) {\n return new DefaultLogger(options);\n}\nexport function logForFunction(logger, type, source, udfPath, message) {\n const prefix = prefix_for_source(source);\n if (typeof message === \"object\") {\n message = `ConvexError ${JSON.stringify(message.errorData, null, 2)}`;\n }\n if (type === \"info\") {\n const match = message.match(/^\\[.*?\\] /);\n if (match === null) {\n logger.error(\n `[CONVEX ${prefix}(${udfPath})] Could not parse console.log`\n );\n return;\n }\n const level = message.slice(1, match[0].length - 2);\n const args = message.slice(match[0].length);\n logger.log(`%c[CONVEX ${prefix}(${udfPath})] [${level}]`, INFO_COLOR, args);\n } else {\n logger.error(`[CONVEX ${prefix}(${udfPath})] ${message}`);\n }\n}\nexport function logFatalError(logger, message) {\n const errorMessage = `[CONVEX FATAL ERROR] ${message}`;\n logger.error(errorMessage);\n return new Error(errorMessage);\n}\nexport function createHybridErrorStacktrace(source, udfPath, result) {\n const prefix = prefix_for_source(source);\n return `[CONVEX ${prefix}(${udfPath})] ${result.errorMessage}\n Called by client`;\n}\nexport function forwardData(result, error) {\n error.data = result.errorData;\n return error;\n}\n//# sourceMappingURL=logging.js.map\n","\"use strict\";\nimport { convexToJson } from \"../../values/index.js\";\nexport function canonicalizeUdfPath(udfPath) {\n const pieces = udfPath.split(\":\");\n let moduleName;\n let functionName;\n if (pieces.length === 1) {\n moduleName = pieces[0];\n functionName = \"default\";\n } else {\n moduleName = pieces.slice(0, pieces.length - 1).join(\":\");\n functionName = pieces[pieces.length - 1];\n }\n if (moduleName.endsWith(\".js\")) {\n moduleName = moduleName.slice(0, -3);\n }\n return `${moduleName}:${functionName}`;\n}\nexport function serializePathAndArgs(udfPath, args) {\n return JSON.stringify({\n udfPath: canonicalizeUdfPath(udfPath),\n args: convexToJson(args)\n });\n}\nexport function serializePaginatedPathAndArgs(udfPath, args, options) {\n const { initialNumItems, id } = options;\n const result = JSON.stringify({\n type: \"paginated\",\n udfPath: canonicalizeUdfPath(udfPath),\n args: convexToJson(args),\n options: convexToJson({ initialNumItems, id })\n });\n return result;\n}\nexport function serializedQueryTokenIsPaginated(token) {\n return JSON.parse(token).type === \"paginated\";\n}\n//# sourceMappingURL=udf_path_utils.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { convexToJson } from \"../../values/index.js\";\nimport {\n canonicalizeUdfPath,\n serializePathAndArgs\n} from \"./udf_path_utils.js\";\nexport class LocalSyncState {\n constructor() {\n __publicField(this, \"nextQueryId\");\n __publicField(this, \"querySetVersion\");\n __publicField(this, \"querySet\");\n __publicField(this, \"queryIdToToken\");\n __publicField(this, \"identityVersion\");\n __publicField(this, \"auth\");\n __publicField(this, \"outstandingQueriesOlderThanRestart\");\n __publicField(this, \"outstandingAuthOlderThanRestart\");\n __publicField(this, \"paused\");\n __publicField(this, \"pendingQuerySetModifications\");\n this.nextQueryId = 0;\n this.querySetVersion = 0;\n this.identityVersion = 0;\n this.querySet = /* @__PURE__ */ new Map();\n this.queryIdToToken = /* @__PURE__ */ new Map();\n this.outstandingQueriesOlderThanRestart = /* @__PURE__ */ new Set();\n this.outstandingAuthOlderThanRestart = false;\n this.paused = false;\n this.pendingQuerySetModifications = /* @__PURE__ */ new Map();\n }\n hasSyncedPastLastReconnect() {\n return this.outstandingQueriesOlderThanRestart.size === 0 && !this.outstandingAuthOlderThanRestart;\n }\n markAuthCompletion() {\n this.outstandingAuthOlderThanRestart = false;\n }\n subscribe(udfPath, args, journal, componentPath) {\n const canonicalizedUdfPath = canonicalizeUdfPath(udfPath);\n const queryToken = serializePathAndArgs(canonicalizedUdfPath, args);\n const existingEntry = this.querySet.get(queryToken);\n if (existingEntry !== void 0) {\n existingEntry.numSubscribers += 1;\n return {\n queryToken,\n modification: null,\n unsubscribe: () => this.removeSubscriber(queryToken)\n };\n } else {\n const queryId = this.nextQueryId++;\n const query = {\n id: queryId,\n canonicalizedUdfPath,\n args,\n numSubscribers: 1,\n journal,\n componentPath\n };\n this.querySet.set(queryToken, query);\n this.queryIdToToken.set(queryId, queryToken);\n const baseVersion = this.querySetVersion;\n const newVersion = this.querySetVersion + 1;\n const add = {\n type: \"Add\",\n queryId,\n udfPath: canonicalizedUdfPath,\n args: [convexToJson(args)],\n journal,\n componentPath\n };\n if (this.paused) {\n this.pendingQuerySetModifications.set(queryId, add);\n } else {\n this.querySetVersion = newVersion;\n }\n const modification = {\n type: \"ModifyQuerySet\",\n baseVersion,\n newVersion,\n modifications: [add]\n };\n return {\n queryToken,\n modification,\n unsubscribe: () => this.removeSubscriber(queryToken)\n };\n }\n }\n transition(transition) {\n for (const modification of transition.modifications) {\n switch (modification.type) {\n case \"QueryUpdated\":\n case \"QueryFailed\": {\n this.outstandingQueriesOlderThanRestart.delete(modification.queryId);\n const journal = modification.journal;\n if (journal !== void 0) {\n const queryToken = this.queryIdToToken.get(modification.queryId);\n if (queryToken !== void 0) {\n this.querySet.get(queryToken).journal = journal;\n }\n }\n break;\n }\n case \"QueryRemoved\": {\n this.outstandingQueriesOlderThanRestart.delete(modification.queryId);\n break;\n }\n default: {\n modification;\n throw new Error(`Invalid modification ${modification.type}`);\n }\n }\n }\n }\n queryId(udfPath, args) {\n const canonicalizedUdfPath = canonicalizeUdfPath(udfPath);\n const queryToken = serializePathAndArgs(canonicalizedUdfPath, args);\n const existingEntry = this.querySet.get(queryToken);\n if (existingEntry !== void 0) {\n return existingEntry.id;\n }\n return null;\n }\n isCurrentOrNewerAuthVersion(version) {\n return version >= this.identityVersion;\n }\n getAuth() {\n return this.auth;\n }\n setAuth(value) {\n this.auth = {\n tokenType: \"User\",\n value\n };\n const baseVersion = this.identityVersion;\n if (!this.paused) {\n this.identityVersion = baseVersion + 1;\n }\n return {\n type: \"Authenticate\",\n baseVersion,\n ...this.auth\n };\n }\n setAdminAuth(value, actingAs) {\n const auth = {\n tokenType: \"Admin\",\n value,\n impersonating: actingAs\n };\n this.auth = auth;\n const baseVersion = this.identityVersion;\n if (!this.paused) {\n this.identityVersion = baseVersion + 1;\n }\n return {\n type: \"Authenticate\",\n baseVersion,\n ...auth\n };\n }\n clearAuth() {\n this.auth = void 0;\n this.markAuthCompletion();\n const baseVersion = this.identityVersion;\n if (!this.paused) {\n this.identityVersion = baseVersion + 1;\n }\n return {\n type: \"Authenticate\",\n tokenType: \"None\",\n baseVersion\n };\n }\n hasAuth() {\n return !!this.auth;\n }\n isNewAuth(value) {\n return this.auth?.value !== value;\n }\n queryPath(queryId) {\n const pathAndArgs = this.queryIdToToken.get(queryId);\n if (pathAndArgs) {\n return this.querySet.get(pathAndArgs).canonicalizedUdfPath;\n }\n return null;\n }\n queryArgs(queryId) {\n const pathAndArgs = this.queryIdToToken.get(queryId);\n if (pathAndArgs) {\n return this.querySet.get(pathAndArgs).args;\n }\n return null;\n }\n queryToken(queryId) {\n return this.queryIdToToken.get(queryId) ?? null;\n }\n queryJournal(queryToken) {\n return this.querySet.get(queryToken)?.journal;\n }\n restart() {\n this.unpause();\n this.outstandingQueriesOlderThanRestart.clear();\n const modifications = [];\n for (const localQuery of this.querySet.values()) {\n const add = {\n type: \"Add\",\n queryId: localQuery.id,\n udfPath: localQuery.canonicalizedUdfPath,\n args: [convexToJson(localQuery.args)],\n journal: localQuery.journal,\n componentPath: localQuery.componentPath\n };\n modifications.push(add);\n this.outstandingQueriesOlderThanRestart.add(localQuery.id);\n }\n this.querySetVersion = 1;\n const querySet = {\n type: \"ModifyQuerySet\",\n baseVersion: 0,\n newVersion: 1,\n modifications\n };\n if (!this.auth) {\n this.identityVersion = 0;\n return [querySet, void 0];\n }\n this.outstandingAuthOlderThanRestart = true;\n const authenticate = {\n type: \"Authenticate\",\n baseVersion: 0,\n ...this.auth\n };\n this.identityVersion = 1;\n return [querySet, authenticate];\n }\n pause() {\n this.paused = true;\n }\n resume() {\n const querySet = this.pendingQuerySetModifications.size > 0 ? {\n type: \"ModifyQuerySet\",\n baseVersion: this.querySetVersion,\n newVersion: ++this.querySetVersion,\n modifications: Array.from(\n this.pendingQuerySetModifications.values()\n )\n } : void 0;\n const authenticate = this.auth !== void 0 ? {\n type: \"Authenticate\",\n baseVersion: this.identityVersion++,\n ...this.auth\n } : void 0;\n this.unpause();\n return [querySet, authenticate];\n }\n unpause() {\n this.paused = false;\n this.pendingQuerySetModifications.clear();\n }\n removeSubscriber(queryToken) {\n const localQuery = this.querySet.get(queryToken);\n if (localQuery.numSubscribers > 1) {\n localQuery.numSubscribers -= 1;\n return null;\n } else {\n this.querySet.delete(queryToken);\n this.queryIdToToken.delete(localQuery.id);\n this.outstandingQueriesOlderThanRestart.delete(localQuery.id);\n const baseVersion = this.querySetVersion;\n const newVersion = this.querySetVersion + 1;\n const remove = {\n type: \"Remove\",\n queryId: localQuery.id\n };\n if (this.paused) {\n if (this.pendingQuerySetModifications.has(localQuery.id)) {\n this.pendingQuerySetModifications.delete(localQuery.id);\n } else {\n this.pendingQuerySetModifications.set(localQuery.id, remove);\n }\n } else {\n this.querySetVersion = newVersion;\n }\n return {\n type: \"ModifyQuerySet\",\n baseVersion,\n newVersion,\n modifications: [remove]\n };\n }\n }\n}\n//# sourceMappingURL=local_state.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { jsonToConvex } from \"../../values/index.js\";\nimport { logForFunction } from \"../logging.js\";\nexport class RequestManager {\n constructor(logger, markConnectionStateDirty) {\n this.logger = logger;\n this.markConnectionStateDirty = markConnectionStateDirty;\n __publicField(this, \"inflightRequests\");\n __publicField(this, \"requestsOlderThanRestart\");\n __publicField(this, \"inflightMutationsCount\", 0);\n __publicField(this, \"inflightActionsCount\", 0);\n this.inflightRequests = /* @__PURE__ */ new Map();\n this.requestsOlderThanRestart = /* @__PURE__ */ new Set();\n }\n request(message, sent) {\n const result = new Promise((resolve) => {\n const status = sent ? \"Requested\" : \"NotSent\";\n this.inflightRequests.set(message.requestId, {\n message,\n status: { status, requestedAt: /* @__PURE__ */ new Date(), onResult: resolve }\n });\n if (message.type === \"Mutation\") {\n this.inflightMutationsCount++;\n } else if (message.type === \"Action\") {\n this.inflightActionsCount++;\n }\n });\n this.markConnectionStateDirty();\n return result;\n }\n /**\n * Update the state after receiving a response.\n *\n * @returns A RequestId if the request is complete and its optimistic update\n * can be dropped, null otherwise.\n */\n onResponse(response) {\n const requestInfo = this.inflightRequests.get(response.requestId);\n if (requestInfo === void 0) {\n return null;\n }\n if (requestInfo.status.status === \"Completed\") {\n return null;\n }\n const udfType = requestInfo.message.type === \"Mutation\" ? \"mutation\" : \"action\";\n const udfPath = requestInfo.message.udfPath;\n for (const line of response.logLines) {\n logForFunction(this.logger, \"info\", udfType, udfPath, line);\n }\n const status = requestInfo.status;\n let result;\n let onResolve;\n if (response.success) {\n result = {\n success: true,\n logLines: response.logLines,\n value: jsonToConvex(response.result)\n };\n onResolve = () => status.onResult(result);\n } else {\n const errorMessage = response.result;\n const { errorData } = response;\n logForFunction(this.logger, \"error\", udfType, udfPath, errorMessage);\n result = {\n success: false,\n errorMessage,\n errorData: errorData !== void 0 ? jsonToConvex(errorData) : void 0,\n logLines: response.logLines\n };\n onResolve = () => status.onResult(result);\n }\n if (response.type === \"ActionResponse\" || !response.success) {\n onResolve();\n this.inflightRequests.delete(response.requestId);\n this.requestsOlderThanRestart.delete(response.requestId);\n if (requestInfo.message.type === \"Action\") {\n this.inflightActionsCount--;\n } else if (requestInfo.message.type === \"Mutation\") {\n this.inflightMutationsCount--;\n }\n this.markConnectionStateDirty();\n return { requestId: response.requestId, result };\n }\n requestInfo.status = {\n status: \"Completed\",\n result,\n ts: response.ts,\n onResolve\n };\n return null;\n }\n // Remove and returns completed requests.\n removeCompleted(ts) {\n const completeRequests = /* @__PURE__ */ new Map();\n for (const [requestId, requestInfo] of this.inflightRequests.entries()) {\n const status = requestInfo.status;\n if (status.status === \"Completed\" && status.ts.lessThanOrEqual(ts)) {\n status.onResolve();\n completeRequests.set(requestId, status.result);\n if (requestInfo.message.type === \"Mutation\") {\n this.inflightMutationsCount--;\n } else if (requestInfo.message.type === \"Action\") {\n this.inflightActionsCount--;\n }\n this.inflightRequests.delete(requestId);\n this.requestsOlderThanRestart.delete(requestId);\n }\n }\n if (completeRequests.size > 0) {\n this.markConnectionStateDirty();\n }\n return completeRequests;\n }\n restart() {\n this.requestsOlderThanRestart = new Set(this.inflightRequests.keys());\n const allMessages = [];\n for (const [requestId, value] of this.inflightRequests) {\n if (value.status.status === \"NotSent\") {\n value.status.status = \"Requested\";\n allMessages.push(value.message);\n continue;\n }\n if (value.message.type === \"Mutation\") {\n allMessages.push(value.message);\n } else if (value.message.type === \"Action\") {\n this.inflightRequests.delete(requestId);\n this.requestsOlderThanRestart.delete(requestId);\n this.inflightActionsCount--;\n if (value.status.status === \"Completed\") {\n throw new Error(\"Action should never be in 'Completed' state\");\n }\n value.status.onResult({\n success: false,\n errorMessage: \"Connection lost while action was in flight\",\n logLines: []\n });\n }\n }\n this.markConnectionStateDirty();\n return allMessages;\n }\n resume() {\n const allMessages = [];\n for (const [, value] of this.inflightRequests) {\n if (value.status.status === \"NotSent\") {\n value.status.status = \"Requested\";\n allMessages.push(value.message);\n continue;\n }\n }\n return allMessages;\n }\n /**\n * @returns true if there are any requests that have been requested but have\n * not be completed yet.\n */\n hasIncompleteRequests() {\n for (const requestInfo of this.inflightRequests.values()) {\n if (requestInfo.status.status === \"Requested\") {\n return true;\n }\n }\n return false;\n }\n /**\n * @returns true if there are any inflight requests, including ones that have\n * completed on the server, but have not been applied.\n */\n hasInflightRequests() {\n return this.inflightRequests.size > 0;\n }\n /**\n * @returns true if there are any inflight requests, that have been hanging around\n * since prior to the most recent restart.\n */\n hasSyncedPastLastReconnect() {\n return this.requestsOlderThanRestart.size === 0;\n }\n timeOfOldestInflightRequest() {\n if (this.inflightRequests.size === 0) {\n return null;\n }\n let oldestInflightRequest = Date.now();\n for (const request of this.inflightRequests.values()) {\n if (request.status.status !== \"Completed\") {\n if (request.status.requestedAt.getTime() < oldestInflightRequest) {\n oldestInflightRequest = request.status.requestedAt.getTime();\n }\n }\n }\n return new Date(oldestInflightRequest);\n }\n /**\n * @returns The number of mutations currently in flight.\n */\n inflightMutations() {\n return this.inflightMutationsCount;\n }\n /**\n * @returns The number of actions currently in flight.\n */\n inflightActions() {\n return this.inflightActionsCount;\n }\n}\n//# sourceMappingURL=request_manager.js.map\n","\"use strict\";\nexport const functionName = Symbol.for(\"functionName\");\n//# sourceMappingURL=functionName.js.map\n","\"use strict\";\nimport { functionName } from \"../functionName.js\";\nexport const toReferencePath = Symbol.for(\"toReferencePath\");\nexport function setReferencePath(obj, value) {\n obj[toReferencePath] = value;\n}\nexport function extractReferencePath(reference) {\n return reference[toReferencePath] ?? null;\n}\nexport function isFunctionHandle(s) {\n return s.startsWith(\"function://\");\n}\nexport function getFunctionAddress(functionReference) {\n let functionAddress;\n if (typeof functionReference === \"string\") {\n if (isFunctionHandle(functionReference)) {\n functionAddress = { functionHandle: functionReference };\n } else {\n functionAddress = { name: functionReference };\n }\n } else if (functionReference[functionName]) {\n functionAddress = { name: functionReference[functionName] };\n } else {\n const referencePath = extractReferencePath(functionReference);\n if (!referencePath) {\n throw new Error(`${functionReference} is not a functionReference`);\n }\n functionAddress = { reference: referencePath };\n }\n return functionAddress;\n}\n//# sourceMappingURL=paths.js.map\n","\"use strict\";\nimport { functionName } from \"./functionName.js\";\nimport { getFunctionAddress } from \"./components/paths.js\";\nexport function getFunctionName(functionReference) {\n const address = getFunctionAddress(functionReference);\n if (address.name === void 0) {\n if (address.functionHandle !== void 0) {\n throw new Error(\n `Expected function reference like \"api.file.func\" or \"internal.file.func\", but received function handle ${address.functionHandle}`\n );\n } else if (address.reference !== void 0) {\n throw new Error(\n `Expected function reference in the current component like \"api.file.func\" or \"internal.file.func\", but received reference ${address.reference}`\n );\n }\n throw new Error(\n `Expected function reference like \"api.file.func\" or \"internal.file.func\", but received ${JSON.stringify(address)}`\n );\n }\n if (typeof functionReference === \"string\") return functionReference;\n const name = functionReference[functionName];\n if (!name) {\n throw new Error(`${functionReference} is not a functionReference`);\n }\n return name;\n}\nexport function makeFunctionReference(name) {\n return { [functionName]: name };\n}\nfunction createApi(pathParts = []) {\n const handler = {\n get(_, prop) {\n if (typeof prop === \"string\") {\n const newParts = [...pathParts, prop];\n return createApi(newParts);\n } else if (prop === functionName) {\n if (pathParts.length < 2) {\n const found = [\"api\", ...pathParts].join(\".\");\n throw new Error(\n `API path is expected to be of the form \\`api.moduleName.functionName\\`. Found: \\`${found}\\``\n );\n }\n const path = pathParts.slice(0, -1).join(\"/\");\n const exportName = pathParts[pathParts.length - 1];\n if (exportName === \"default\") {\n return path;\n } else {\n return path + \":\" + exportName;\n }\n } else if (prop === Symbol.toStringTag) {\n return \"FunctionReference\";\n } else {\n return void 0;\n }\n }\n };\n return new Proxy({}, handler);\n}\nexport function filterApi(api) {\n return api;\n}\nexport function justInternal(api) {\n return api;\n}\nexport function justPublic(api) {\n return api;\n}\nexport function justQueries(api) {\n return api;\n}\nexport function justMutations(api) {\n return api;\n}\nexport function justActions(api) {\n return api;\n}\nexport function justPaginatedQueries(api) {\n return api;\n}\nexport function justSchedulable(api) {\n return api;\n}\nexport const anyApi = createApi();\n//# sourceMappingURL=api.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport {\n getFunctionName\n} from \"../../server/api.js\";\nimport { parseArgs } from \"../../common/index.js\";\nimport { createHybridErrorStacktrace, forwardData } from \"../logging.js\";\nimport {\n canonicalizeUdfPath,\n serializePathAndArgs\n} from \"./udf_path_utils.js\";\nimport { ConvexError } from \"../../values/errors.js\";\nclass OptimisticLocalStoreImpl {\n constructor(queryResults) {\n // A references of the query results in OptimisticQueryResults\n __publicField(this, \"queryResults\");\n // All of the queries modified by this class\n __publicField(this, \"modifiedQueries\");\n this.queryResults = queryResults;\n this.modifiedQueries = [];\n }\n getQuery(query, ...args) {\n const queryArgs = parseArgs(args[0]);\n const name = getFunctionName(query);\n const queryResult = this.queryResults.get(\n serializePathAndArgs(name, queryArgs)\n );\n if (queryResult === void 0) {\n return void 0;\n }\n return OptimisticLocalStoreImpl.queryValue(queryResult.result);\n }\n getAllQueries(query) {\n const queriesWithName = [];\n const name = getFunctionName(query);\n for (const queryResult of this.queryResults.values()) {\n if (queryResult.udfPath === canonicalizeUdfPath(name)) {\n queriesWithName.push({\n args: queryResult.args,\n value: OptimisticLocalStoreImpl.queryValue(queryResult.result)\n });\n }\n }\n return queriesWithName;\n }\n setQuery(queryReference, args, value) {\n const queryArgs = parseArgs(args);\n const name = getFunctionName(queryReference);\n const queryToken = serializePathAndArgs(name, queryArgs);\n let result;\n if (value === void 0) {\n result = void 0;\n } else {\n result = {\n success: true,\n value,\n // It's an optimistic update, so there are no function logs to show.\n logLines: []\n };\n }\n const query = {\n udfPath: name,\n args: queryArgs,\n result\n };\n this.queryResults.set(queryToken, query);\n this.modifiedQueries.push(queryToken);\n }\n static queryValue(result) {\n if (result === void 0) {\n return void 0;\n } else if (result.success) {\n return result.value;\n } else {\n return void 0;\n }\n }\n}\nexport class OptimisticQueryResults {\n constructor() {\n __publicField(this, \"queryResults\");\n __publicField(this, \"optimisticUpdates\");\n this.queryResults = /* @__PURE__ */ new Map();\n this.optimisticUpdates = [];\n }\n /**\n * Apply all optimistic updates on top of server query results\n */\n ingestQueryResultsFromServer(serverQueryResults, optimisticUpdatesToDrop) {\n this.optimisticUpdates = this.optimisticUpdates.filter((updateAndId) => {\n return !optimisticUpdatesToDrop.has(updateAndId.mutationId);\n });\n const oldQueryResults = this.queryResults;\n this.queryResults = new Map(serverQueryResults);\n const localStore = new OptimisticLocalStoreImpl(this.queryResults);\n for (const updateAndId of this.optimisticUpdates) {\n updateAndId.update(localStore);\n }\n const changedQueries = [];\n for (const [queryToken, query] of this.queryResults) {\n const oldQuery = oldQueryResults.get(queryToken);\n if (oldQuery === void 0 || oldQuery.result !== query.result) {\n changedQueries.push(queryToken);\n }\n }\n return changedQueries;\n }\n applyOptimisticUpdate(update, mutationId) {\n this.optimisticUpdates.push({\n update,\n mutationId\n });\n const localStore = new OptimisticLocalStoreImpl(this.queryResults);\n update(localStore);\n return localStore.modifiedQueries;\n }\n /**\n * \"Raw\" with respect to errors vs values, but query results still have\n * optimistic updates applied.\n *\n * @internal\n */\n rawQueryResult(queryToken) {\n const query = this.queryResults.get(queryToken);\n if (query === void 0) {\n return void 0;\n }\n return query.result;\n }\n queryResult(queryToken) {\n const query = this.queryResults.get(queryToken);\n if (query === void 0) {\n return void 0;\n }\n const result = query.result;\n if (result === void 0) {\n return void 0;\n } else if (result.success) {\n return result.value;\n } else {\n if (result.errorData !== void 0) {\n throw forwardData(\n result,\n new ConvexError(\n createHybridErrorStacktrace(\"query\", query.udfPath, result)\n )\n );\n }\n throw new Error(\n createHybridErrorStacktrace(\"query\", query.udfPath, result)\n );\n }\n }\n hasQueryResult(queryToken) {\n return this.queryResults.get(queryToken) !== void 0;\n }\n /**\n * @internal\n */\n queryLogs(queryToken) {\n const query = this.queryResults.get(queryToken);\n return query?.result?.logLines;\n }\n}\n//# sourceMappingURL=optimistic_updates_impl.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nexport class Long {\n constructor(low, high) {\n __publicField(this, \"low\");\n __publicField(this, \"high\");\n __publicField(this, \"__isUnsignedLong__\");\n this.low = low | 0;\n this.high = high | 0;\n this.__isUnsignedLong__ = true;\n }\n static isLong(obj) {\n return (obj && obj.__isUnsignedLong__) === true;\n }\n // prettier-ignore\n static fromBytesLE(bytes) {\n return new Long(\n bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24,\n bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24\n );\n }\n // prettier-ignore\n toBytesLE() {\n const hi = this.high;\n const lo = this.low;\n return [\n lo & 255,\n lo >>> 8 & 255,\n lo >>> 16 & 255,\n lo >>> 24,\n hi & 255,\n hi >>> 8 & 255,\n hi >>> 16 & 255,\n hi >>> 24\n ];\n }\n static fromNumber(value) {\n if (isNaN(value)) return UZERO;\n if (value < 0) return UZERO;\n if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE;\n return new Long(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0);\n }\n toString() {\n return (BigInt(this.high) * BigInt(TWO_PWR_32_DBL) + BigInt(this.low)).toString();\n }\n equals(other) {\n if (!Long.isLong(other)) other = Long.fromValue(other);\n if (this.high >>> 31 === 1 && other.high >>> 31 === 1) return false;\n return this.high === other.high && this.low === other.low;\n }\n notEquals(other) {\n return !this.equals(other);\n }\n comp(other) {\n if (!Long.isLong(other)) other = Long.fromValue(other);\n if (this.equals(other)) return 0;\n return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1;\n }\n lessThanOrEqual(other) {\n return this.comp(\n /* validates */\n other\n ) <= 0;\n }\n static fromValue(val) {\n if (typeof val === \"number\") return Long.fromNumber(val);\n return new Long(val.low, val.high);\n }\n}\nconst UZERO = new Long(0, 0);\nconst TWO_PWR_16_DBL = 1 << 16;\nconst TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\nconst TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\nconst MAX_UNSIGNED_VALUE = new Long(4294967295 | 0, 4294967295 | 0);\n//# sourceMappingURL=long.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { jsonToConvex } from \"../../values/index.js\";\nimport { Long } from \"../../vendor/long.js\";\nimport { logForFunction } from \"../logging.js\";\nexport class RemoteQuerySet {\n constructor(queryPath, logger) {\n __publicField(this, \"version\");\n __publicField(this, \"remoteQuerySet\");\n __publicField(this, \"queryPath\");\n __publicField(this, \"logger\");\n this.version = { querySet: 0, ts: Long.fromNumber(0), identity: 0 };\n this.remoteQuerySet = /* @__PURE__ */ new Map();\n this.queryPath = queryPath;\n this.logger = logger;\n }\n transition(transition) {\n const start = transition.startVersion;\n if (this.version.querySet !== start.querySet || this.version.ts.notEquals(start.ts) || this.version.identity !== start.identity) {\n throw new Error(\n `Invalid start version: ${start.ts.toString()}:${start.querySet}:${start.identity}, transitioning from ${this.version.ts.toString()}:${this.version.querySet}:${this.version.identity}`\n );\n }\n for (const modification of transition.modifications) {\n switch (modification.type) {\n case \"QueryUpdated\": {\n const queryPath = this.queryPath(modification.queryId);\n if (queryPath) {\n for (const line of modification.logLines) {\n logForFunction(this.logger, \"info\", \"query\", queryPath, line);\n }\n }\n const value = jsonToConvex(modification.value ?? null);\n this.remoteQuerySet.set(modification.queryId, {\n success: true,\n value,\n logLines: modification.logLines\n });\n break;\n }\n case \"QueryFailed\": {\n const queryPath = this.queryPath(modification.queryId);\n if (queryPath) {\n for (const line of modification.logLines) {\n logForFunction(this.logger, \"info\", \"query\", queryPath, line);\n }\n }\n const { errorData } = modification;\n this.remoteQuerySet.set(modification.queryId, {\n success: false,\n errorMessage: modification.errorMessage,\n errorData: errorData !== void 0 ? jsonToConvex(errorData) : void 0,\n logLines: modification.logLines\n });\n break;\n }\n case \"QueryRemoved\": {\n this.remoteQuerySet.delete(modification.queryId);\n break;\n }\n default: {\n modification;\n throw new Error(`Invalid modification ${modification.type}`);\n }\n }\n }\n this.version = transition.endVersion;\n }\n remoteQueryResults() {\n return this.remoteQuerySet;\n }\n timestamp() {\n return this.version.ts;\n }\n}\n//# sourceMappingURL=remote_query_set.js.map\n","\"use strict\";\nimport { Base64 } from \"../../values/index.js\";\nimport { Long } from \"../../vendor/long.js\";\nexport function u64ToLong(encoded) {\n const integerBytes = Base64.toByteArray(encoded);\n return Long.fromBytesLE(Array.from(integerBytes));\n}\nexport function longToU64(raw) {\n const integerBytes = new Uint8Array(raw.toBytesLE());\n return Base64.fromByteArray(integerBytes);\n}\nexport function parseServerMessage(encoded) {\n switch (encoded.type) {\n case \"FatalError\":\n case \"AuthError\":\n case \"ActionResponse\":\n case \"TransitionChunk\":\n case \"Ping\": {\n return { ...encoded };\n }\n case \"MutationResponse\": {\n if (encoded.success) {\n return { ...encoded, ts: u64ToLong(encoded.ts) };\n } else {\n return { ...encoded };\n }\n }\n case \"Transition\": {\n return {\n ...encoded,\n startVersion: {\n ...encoded.startVersion,\n ts: u64ToLong(encoded.startVersion.ts)\n },\n endVersion: {\n ...encoded.endVersion,\n ts: u64ToLong(encoded.endVersion.ts)\n }\n };\n }\n default: {\n encoded;\n }\n }\n return void 0;\n}\nexport function encodeClientMessage(message) {\n switch (message.type) {\n case \"Authenticate\":\n case \"ModifyQuerySet\":\n case \"Mutation\":\n case \"Action\":\n case \"Event\": {\n return { ...message };\n }\n case \"Connect\": {\n if (message.maxObservedTimestamp !== void 0) {\n return {\n ...message,\n maxObservedTimestamp: longToU64(message.maxObservedTimestamp)\n };\n } else {\n return { ...message, maxObservedTimestamp: void 0 };\n }\n }\n default: {\n message;\n }\n }\n return void 0;\n}\n//# sourceMappingURL=protocol.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport {\n encodeClientMessage,\n parseServerMessage\n} from \"./protocol.js\";\nconst CLOSE_NORMAL = 1e3;\nconst CLOSE_GOING_AWAY = 1001;\nconst CLOSE_NO_STATUS = 1005;\nconst CLOSE_NOT_FOUND = 4040;\nlet firstTime;\nfunction monotonicMillis() {\n if (firstTime === void 0) {\n firstTime = Date.now();\n }\n if (typeof performance === \"undefined\" || !performance.now) {\n return Date.now();\n }\n return Math.round(firstTime + performance.now());\n}\nfunction prettyNow() {\n return `t=${Math.round((monotonicMillis() - firstTime) / 100) / 10}s`;\n}\nconst serverDisconnectErrors = {\n // A known error, e.g. during a restart or push\n InternalServerError: { timeout: 1e3 },\n // ErrorMetadata::overloaded() messages that we realy should back off\n SubscriptionsWorkerFullError: { timeout: 3e3 },\n TooManyConcurrentRequests: { timeout: 3e3 },\n CommitterFullError: { timeout: 3e3 },\n AwsTooManyRequestsException: { timeout: 3e3 },\n ExecuteFullError: { timeout: 3e3 },\n SystemTimeoutError: { timeout: 3e3 },\n ExpiredInQueue: { timeout: 3e3 },\n // ErrorMetadata::feature_temporarily_unavailable() that typically indicate a deploy just happened\n VectorIndexesUnavailable: { timeout: 1e3 },\n SearchIndexesUnavailable: { timeout: 1e3 },\n TableSummariesUnavailable: { timeout: 1e3 },\n // More ErrorMetadata::overloaded()\n VectorIndexTooLarge: { timeout: 3e3 },\n SearchIndexTooLarge: { timeout: 3e3 },\n TooManyWritesInTimePeriod: { timeout: 3e3 }\n};\nfunction classifyDisconnectError(s) {\n if (s === void 0) return \"Unknown\";\n for (const prefix of Object.keys(\n serverDisconnectErrors\n )) {\n if (s.startsWith(prefix)) {\n return prefix;\n }\n }\n return \"Unknown\";\n}\nexport class WebSocketManager {\n constructor(uri, callbacks, webSocketConstructor, logger, markConnectionStateDirty, debug) {\n this.markConnectionStateDirty = markConnectionStateDirty;\n this.debug = debug;\n __publicField(this, \"socket\");\n __publicField(this, \"connectionCount\");\n __publicField(this, \"_hasEverConnected\", false);\n __publicField(this, \"lastCloseReason\");\n // State for assembling the split-up Transition currently being received.\n __publicField(this, \"transitionChunkBuffer\", null);\n /** Upon HTTPS/WSS failure, the first jittered backoff duration, in ms. */\n __publicField(this, \"defaultInitialBackoff\");\n /** We backoff exponentially, but we need to cap that--this is the jittered max. */\n __publicField(this, \"maxBackoff\");\n /** How many times have we failed consecutively? */\n __publicField(this, \"retries\");\n /** How long before lack of server response causes us to initiate a reconnect,\n * in ms */\n __publicField(this, \"serverInactivityThreshold\");\n __publicField(this, \"reconnectDueToServerInactivityTimeout\");\n /** Scheduled reconnect state: timeout handle and timing info */\n __publicField(this, \"scheduledReconnect\", null);\n __publicField(this, \"networkOnlineHandler\", null);\n /** Pending event to send after reconnecting due to network recovery */\n __publicField(this, \"pendingNetworkRecoveryInfo\", null);\n __publicField(this, \"uri\");\n __publicField(this, \"onOpen\");\n __publicField(this, \"onResume\");\n __publicField(this, \"onMessage\");\n __publicField(this, \"webSocketConstructor\");\n __publicField(this, \"logger\");\n __publicField(this, \"onServerDisconnectError\");\n this.webSocketConstructor = webSocketConstructor;\n this.socket = { state: \"disconnected\" };\n this.connectionCount = 0;\n this.lastCloseReason = \"InitialConnect\";\n this.defaultInitialBackoff = 1e3;\n this.maxBackoff = 16e3;\n this.retries = 0;\n this.serverInactivityThreshold = 6e4;\n this.reconnectDueToServerInactivityTimeout = null;\n this.uri = uri;\n this.onOpen = callbacks.onOpen;\n this.onResume = callbacks.onResume;\n this.onMessage = callbacks.onMessage;\n this.onServerDisconnectError = callbacks.onServerDisconnectError;\n this.logger = logger;\n this.setupNetworkListener();\n this.connect();\n }\n setSocketState(state) {\n this.socket = state;\n this._logVerbose(\n `socket state changed: ${this.socket.state}, paused: ${\"paused\" in this.socket ? this.socket.paused : void 0}`\n );\n this.markConnectionStateDirty();\n }\n setupNetworkListener() {\n if (typeof window === \"undefined\" || typeof window.addEventListener !== \"function\") {\n return;\n }\n if (this.networkOnlineHandler !== null) {\n return;\n }\n this.networkOnlineHandler = () => {\n this._logVerbose(\"network online event detected\");\n this.tryReconnectImmediately();\n };\n window.addEventListener(\"online\", this.networkOnlineHandler);\n this._logVerbose(\"network online event listener registered\");\n }\n cleanupNetworkListener() {\n if (this.networkOnlineHandler && typeof window !== \"undefined\" && typeof window.removeEventListener === \"function\") {\n window.removeEventListener(\"online\", this.networkOnlineHandler);\n this.networkOnlineHandler = null;\n this._logVerbose(\"network online event listener removed\");\n }\n }\n assembleTransition(chunk) {\n if (chunk.partNumber < 0 || chunk.partNumber >= chunk.totalParts || chunk.totalParts === 0 || this.transitionChunkBuffer && (this.transitionChunkBuffer.totalParts !== chunk.totalParts || this.transitionChunkBuffer.transitionId !== chunk.transitionId)) {\n this.transitionChunkBuffer = null;\n throw new Error(\"Invalid TransitionChunk\");\n }\n if (this.transitionChunkBuffer === null) {\n this.transitionChunkBuffer = {\n chunks: [],\n totalParts: chunk.totalParts,\n transitionId: chunk.transitionId\n };\n }\n if (chunk.partNumber !== this.transitionChunkBuffer.chunks.length) {\n const expectedLength = this.transitionChunkBuffer.chunks.length;\n this.transitionChunkBuffer = null;\n throw new Error(\n `TransitionChunk received out of order: expected part ${expectedLength}, got ${chunk.partNumber}`\n );\n }\n this.transitionChunkBuffer.chunks.push(chunk.chunk);\n if (this.transitionChunkBuffer.chunks.length === chunk.totalParts) {\n const fullJson = this.transitionChunkBuffer.chunks.join(\"\");\n this.transitionChunkBuffer = null;\n const transition = parseServerMessage(JSON.parse(fullJson));\n if (transition.type !== \"Transition\") {\n throw new Error(\n `Expected Transition, got ${transition.type} after assembling chunks`\n );\n }\n return transition;\n }\n return null;\n }\n connect() {\n if (this.socket.state === \"terminated\") {\n return;\n }\n if (this.socket.state !== \"disconnected\" && this.socket.state !== \"stopped\") {\n throw new Error(\n \"Didn't start connection from disconnected state: \" + this.socket.state\n );\n }\n const ws = new this.webSocketConstructor(this.uri);\n this._logVerbose(\"constructed WebSocket\");\n this.setSocketState({\n state: \"connecting\",\n ws,\n paused: \"no\"\n });\n this.resetServerInactivityTimeout();\n ws.onopen = () => {\n this.logger.logVerbose(\"begin ws.onopen\");\n if (this.socket.state !== \"connecting\") {\n throw new Error(\"onopen called with socket not in connecting state\");\n }\n this.setSocketState({\n state: \"ready\",\n ws,\n paused: this.socket.paused === \"yes\" ? \"uninitialized\" : \"no\"\n });\n this.resetServerInactivityTimeout();\n if (this.socket.paused === \"no\") {\n this._hasEverConnected = true;\n this.onOpen({\n connectionCount: this.connectionCount,\n lastCloseReason: this.lastCloseReason,\n clientTs: monotonicMillis()\n });\n }\n if (this.lastCloseReason !== \"InitialConnect\") {\n if (this.lastCloseReason) {\n this.logger.log(\n \"WebSocket reconnected at\",\n prettyNow(),\n \"after disconnect due to\",\n this.lastCloseReason\n );\n } else {\n this.logger.log(\"WebSocket reconnected at\", prettyNow());\n }\n }\n this.connectionCount += 1;\n this.lastCloseReason = null;\n if (this.pendingNetworkRecoveryInfo !== null) {\n const { timeSavedMs } = this.pendingNetworkRecoveryInfo;\n this.pendingNetworkRecoveryInfo = null;\n this.sendMessage({\n type: \"Event\",\n eventType: \"NetworkRecoveryReconnect\",\n event: { timeSavedMs }\n });\n this.logger.log(\n `Network recovery reconnect saved ~${Math.round(timeSavedMs / 1e3)}s of waiting`\n );\n }\n };\n ws.onerror = (error) => {\n this.transitionChunkBuffer = null;\n const message = error.message;\n if (message) {\n this.logger.log(`WebSocket error message: ${message}`);\n }\n };\n ws.onmessage = (message) => {\n this.resetServerInactivityTimeout();\n const messageLength = message.data.length;\n let serverMessage = parseServerMessage(JSON.parse(message.data));\n this._logVerbose(`received ws message with type ${serverMessage.type}`);\n if (serverMessage.type === \"Ping\") {\n return;\n }\n if (serverMessage.type === \"TransitionChunk\") {\n const transition = this.assembleTransition(serverMessage);\n if (!transition) {\n return;\n }\n serverMessage = transition;\n this._logVerbose(\n `assembled full ws message of type ${serverMessage.type}`\n );\n }\n if (this.transitionChunkBuffer !== null) {\n this.transitionChunkBuffer = null;\n this.logger.log(\n `Received unexpected ${serverMessage.type} while buffering TransitionChunks`\n );\n }\n if (serverMessage.type === \"Transition\") {\n this.reportLargeTransition({\n messageLength,\n transition: serverMessage\n });\n }\n const response = this.onMessage(serverMessage);\n if (response.hasSyncedPastLastReconnect) {\n this.retries = 0;\n this.markConnectionStateDirty();\n }\n };\n ws.onclose = (event) => {\n this._logVerbose(\"begin ws.onclose\");\n this.transitionChunkBuffer = null;\n if (this.lastCloseReason === null) {\n this.lastCloseReason = event.reason || `closed with code ${event.code}`;\n }\n if (event.code !== CLOSE_NORMAL && event.code !== CLOSE_GOING_AWAY && // This commonly gets fired on mobile apps when the app is backgrounded\n event.code !== CLOSE_NO_STATUS && event.code !== CLOSE_NOT_FOUND) {\n let msg = `WebSocket closed with code ${event.code}`;\n if (event.reason) {\n msg += `: ${event.reason}`;\n }\n this.logger.log(msg);\n if (this.onServerDisconnectError && event.reason) {\n this.onServerDisconnectError(msg);\n }\n }\n const reason = classifyDisconnectError(event.reason);\n this.scheduleReconnect(reason);\n return;\n };\n }\n /**\n * @returns The state of the {@link Socket}.\n */\n socketState() {\n return this.socket.state;\n }\n /**\n * @param message - A ClientMessage to send.\n * @returns Whether the message (might have been) sent.\n */\n sendMessage(message) {\n const messageForLog = {\n type: message.type,\n ...message.type === \"Authenticate\" && message.tokenType === \"User\" ? {\n value: `...${message.value.slice(-7)}`\n } : {}\n };\n if (this.socket.state === \"ready\" && this.socket.paused === \"no\") {\n const encodedMessage = encodeClientMessage(message);\n const request = JSON.stringify(encodedMessage);\n let sent = false;\n try {\n this.socket.ws.send(request);\n sent = true;\n } catch (error) {\n this.logger.log(\n `Failed to send message on WebSocket, reconnecting: ${error}`\n );\n this.closeAndReconnect(\"FailedToSendMessage\");\n }\n this._logVerbose(\n `${sent ? \"sent\" : \"failed to send\"} message with type ${message.type}: ${JSON.stringify(\n messageForLog\n )}`\n );\n return true;\n }\n this._logVerbose(\n `message not sent (socket state: ${this.socket.state}, paused: ${\"paused\" in this.socket ? this.socket.paused : void 0}): ${JSON.stringify(\n messageForLog\n )}`\n );\n return false;\n }\n resetServerInactivityTimeout() {\n if (this.socket.state === \"terminated\") {\n return;\n }\n if (this.reconnectDueToServerInactivityTimeout !== null) {\n clearTimeout(this.reconnectDueToServerInactivityTimeout);\n this.reconnectDueToServerInactivityTimeout = null;\n }\n this.reconnectDueToServerInactivityTimeout = setTimeout(() => {\n this.closeAndReconnect(\"InactiveServer\");\n }, this.serverInactivityThreshold);\n }\n scheduleReconnect(reason) {\n if (this.scheduledReconnect) {\n clearTimeout(this.scheduledReconnect.timeout);\n this.scheduledReconnect = null;\n }\n this.socket = { state: \"disconnected\" };\n const backoff = this.nextBackoff(reason);\n this.markConnectionStateDirty();\n this.logger.log(`Attempting reconnect in ${Math.round(backoff)}ms`);\n const scheduledAt = monotonicMillis();\n const timeoutId = setTimeout(() => {\n if (this.scheduledReconnect?.timeout === timeoutId) {\n this.scheduledReconnect = null;\n this.connect();\n }\n }, backoff);\n this.scheduledReconnect = {\n timeout: timeoutId,\n scheduledAt,\n backoffMs: backoff\n };\n }\n /**\n * Close the WebSocket and schedule a reconnect.\n *\n * This should be used when we hit an error and would like to restart the session.\n */\n closeAndReconnect(closeReason) {\n this._logVerbose(`begin closeAndReconnect with reason ${closeReason}`);\n switch (this.socket.state) {\n case \"disconnected\":\n case \"terminated\":\n case \"stopped\":\n return;\n case \"connecting\":\n case \"ready\": {\n this.lastCloseReason = closeReason;\n void this.close();\n this.scheduleReconnect(\"client\");\n return;\n }\n default: {\n this.socket;\n }\n }\n }\n /**\n * Close the WebSocket, being careful to clear the onclose handler to avoid re-entrant\n * calls. Use this instead of directly calling `ws.close()`\n *\n * It is the callers responsibility to update the state after this method is called so that the\n * closed socket is not accessible or used again after this method is called\n */\n close() {\n this.transitionChunkBuffer = null;\n switch (this.socket.state) {\n case \"disconnected\":\n case \"terminated\":\n case \"stopped\":\n return Promise.resolve();\n case \"connecting\": {\n const ws = this.socket.ws;\n ws.onmessage = (_message) => {\n this._logVerbose(\"Ignoring message received after close\");\n };\n return new Promise((r) => {\n ws.onclose = () => {\n this._logVerbose(\"Closed after connecting\");\n r();\n };\n ws.onopen = () => {\n this._logVerbose(\"Opened after connecting\");\n ws.close();\n };\n });\n }\n case \"ready\": {\n this._logVerbose(\"ws.close called\");\n const ws = this.socket.ws;\n ws.onmessage = (_message) => {\n this._logVerbose(\"Ignoring message received after close\");\n };\n const result = new Promise((r) => {\n ws.onclose = () => {\n r();\n };\n });\n ws.close();\n return result;\n }\n default: {\n this.socket;\n return Promise.resolve();\n }\n }\n }\n /**\n * Close the WebSocket and do not reconnect.\n * @returns A Promise that resolves when the WebSocket `onClose` callback is called.\n */\n terminate() {\n if (this.reconnectDueToServerInactivityTimeout) {\n clearTimeout(this.reconnectDueToServerInactivityTimeout);\n }\n if (this.scheduledReconnect) {\n clearTimeout(this.scheduledReconnect.timeout);\n this.scheduledReconnect = null;\n }\n this.cleanupNetworkListener();\n switch (this.socket.state) {\n case \"terminated\":\n case \"stopped\":\n case \"disconnected\":\n case \"connecting\":\n case \"ready\": {\n const result = this.close();\n this.setSocketState({ state: \"terminated\" });\n return result;\n }\n default: {\n this.socket;\n throw new Error(\n `Invalid websocket state: ${this.socket.state}`\n );\n }\n }\n }\n stop() {\n switch (this.socket.state) {\n case \"terminated\":\n return Promise.resolve();\n case \"connecting\":\n case \"stopped\":\n case \"disconnected\":\n case \"ready\": {\n this.cleanupNetworkListener();\n const result = this.close();\n this.socket = { state: \"stopped\" };\n return result;\n }\n default: {\n this.socket;\n return Promise.resolve();\n }\n }\n }\n /**\n * Create a new WebSocket after a previous `stop()`, unless `terminate()` was\n * called before.\n */\n tryRestart() {\n switch (this.socket.state) {\n case \"stopped\":\n break;\n case \"terminated\":\n case \"connecting\":\n case \"ready\":\n case \"disconnected\":\n this.logger.logVerbose(\"Restart called without stopping first\");\n return;\n default: {\n this.socket;\n }\n }\n this.setupNetworkListener();\n this.connect();\n }\n pause() {\n switch (this.socket.state) {\n case \"disconnected\":\n case \"stopped\":\n case \"terminated\":\n return;\n case \"connecting\":\n case \"ready\": {\n this.socket = { ...this.socket, paused: \"yes\" };\n return;\n }\n default: {\n this.socket;\n return;\n }\n }\n }\n /**\n * Try to reconnect immediately, canceling any scheduled reconnect.\n * This is useful when detecting network recovery.\n * Only takes action if we're in disconnected state (waiting to reconnect).\n */\n tryReconnectImmediately() {\n this._logVerbose(\"tryReconnectImmediately called\");\n if (this.socket.state !== \"disconnected\") {\n this._logVerbose(\n `tryReconnectImmediately called but socket state is ${this.socket.state}, no action taken`\n );\n return;\n }\n let timeSavedMs = null;\n if (this.scheduledReconnect) {\n const elapsed = monotonicMillis() - this.scheduledReconnect.scheduledAt;\n timeSavedMs = Math.max(0, this.scheduledReconnect.backoffMs - elapsed);\n this._logVerbose(\n `would have waited ${Math.round(timeSavedMs)}ms more (backoff was ${Math.round(this.scheduledReconnect.backoffMs)}ms, elapsed ${Math.round(elapsed)}ms)`\n );\n clearTimeout(this.scheduledReconnect.timeout);\n this.scheduledReconnect = null;\n this._logVerbose(\"canceled scheduled reconnect\");\n }\n this.logger.log(\"Network recovery detected, reconnecting immediately\");\n this.pendingNetworkRecoveryInfo = timeSavedMs !== null ? { timeSavedMs } : null;\n this.connect();\n }\n /**\n * Resume the state machine if previously paused.\n */\n resume() {\n switch (this.socket.state) {\n case \"connecting\":\n this.socket = { ...this.socket, paused: \"no\" };\n return;\n case \"ready\":\n if (this.socket.paused === \"uninitialized\") {\n this.socket = { ...this.socket, paused: \"no\" };\n this._hasEverConnected = true;\n this.onOpen({\n connectionCount: this.connectionCount,\n lastCloseReason: this.lastCloseReason,\n clientTs: monotonicMillis()\n });\n } else if (this.socket.paused === \"yes\") {\n this.socket = { ...this.socket, paused: \"no\" };\n this.onResume();\n }\n return;\n case \"terminated\":\n case \"stopped\":\n case \"disconnected\":\n return;\n default: {\n this.socket;\n }\n }\n this.connect();\n }\n connectionState() {\n return {\n isConnected: this.socket.state === \"ready\",\n hasEverConnected: this._hasEverConnected,\n connectionCount: this.connectionCount,\n connectionRetries: this.retries\n };\n }\n _logVerbose(message) {\n this.logger.logVerbose(message);\n }\n nextBackoff(reason) {\n const initialBackoff = reason === \"client\" ? 100 : reason === \"Unknown\" ? this.defaultInitialBackoff : serverDisconnectErrors[reason].timeout;\n const baseBackoff = initialBackoff * Math.pow(2, this.retries);\n this.retries += 1;\n const actualBackoff = Math.min(baseBackoff, this.maxBackoff);\n const jitter = actualBackoff * (Math.random() - 0.5);\n return actualBackoff + jitter;\n }\n reportLargeTransition({\n transition,\n messageLength\n }) {\n if (transition.clientClockSkew === void 0 || transition.serverTs === void 0) {\n return;\n }\n const transitionTransitTime = monotonicMillis() - // client time now\n // clientClockSkew = (server time + upstream latency) - client time\n // clientClockSkew is \"how many milliseconds behind (slow) is the client clock\"\n // but the latency of the Connect message inflates this, making it appear further behind\n transition.clientClockSkew - transition.serverTs / 1e6;\n const prettyTransitionTime = `${Math.round(transitionTransitTime)}ms`;\n const prettyMessageMB = `${Math.round(messageLength / 1e4) / 100}MB`;\n const bytesPerSecond = messageLength / (transitionTransitTime / 1e3);\n const prettyBytesPerSecond = `${Math.round(bytesPerSecond / 1e4) / 100}MB per second`;\n this._logVerbose(\n `received ${prettyMessageMB} transition in ${prettyTransitionTime} at ${prettyBytesPerSecond}`\n );\n if (messageLength > 2e7) {\n this.logger.log(\n `received query results totaling more that 20MB (${prettyMessageMB}) which will take a long time to download on slower connections`\n );\n } else if (transitionTransitTime > 2e4) {\n this.logger.log(\n `received query results totaling ${prettyMessageMB} which took more than 20s to arrive (${prettyTransitionTime})`\n );\n }\n if (this.debug) {\n this.sendMessage({\n type: \"Event\",\n eventType: \"ClientReceivedTransition\",\n event: { transitionTransitTime, messageLength }\n });\n }\n }\n}\n//# sourceMappingURL=web_socket_manager.js.map\n","\"use strict\";\nexport function newSessionId() {\n return uuidv4();\n}\nfunction uuidv4() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0, v = c === \"x\" ? r : r & 3 | 8;\n return v.toString(16);\n });\n}\n//# sourceMappingURL=session.js.map\n","\"use strict\";\nexport class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, (_m, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n })\n );\n}\nfunction base64UrlDecode(str) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n try {\n return b64DecodeUnicode(output);\n } catch {\n return atob(output);\n }\n}\nexport function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n options || (options = {});\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(\n `Invalid token specified: missing part #${pos + 1}`\n );\n }\n let decoded;\n try {\n decoded = base64UrlDecode(part);\n } catch (e) {\n throw new InvalidTokenError(\n `Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`\n );\n }\n try {\n return JSON.parse(decoded);\n } catch (e) {\n throw new InvalidTokenError(\n `Invalid token specified: invalid json for part #${pos + 1} (${e.message})`\n );\n }\n}\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { jwtDecode } from \"../../vendor/jwt-decode/index.js\";\nconst MAXIMUM_REFRESH_DELAY = 20 * 24 * 60 * 60 * 1e3;\nconst MAX_TOKEN_CONFIRMATION_ATTEMPTS = 2;\nexport class AuthenticationManager {\n constructor(syncState, callbacks, config) {\n __publicField(this, \"authState\", { state: \"noAuth\" });\n // Used to detect races involving `setConfig` calls\n // while a token is being fetched.\n __publicField(this, \"configVersion\", 0);\n // Shared by the BaseClient so that the auth manager can easily inspect it\n __publicField(this, \"syncState\");\n // Passed down by BaseClient, sends a message to the server\n __publicField(this, \"authenticate\");\n __publicField(this, \"stopSocket\");\n __publicField(this, \"tryRestartSocket\");\n __publicField(this, \"pauseSocket\");\n __publicField(this, \"resumeSocket\");\n // Passed down by BaseClient, sends a message to the server\n __publicField(this, \"clearAuth\");\n __publicField(this, \"logger\");\n __publicField(this, \"refreshTokenLeewaySeconds\");\n // Track last value to avoid redundant calls\n __publicField(this, \"lastRefreshChange\");\n // Number of times we have attempted to confirm the latest token. We retry up\n // to `MAX_TOKEN_CONFIRMATION_ATTEMPTS` times.\n __publicField(this, \"tokenConfirmationAttempts\", 0);\n this.syncState = syncState;\n this.authenticate = callbacks.authenticate;\n this.stopSocket = callbacks.stopSocket;\n this.tryRestartSocket = callbacks.tryRestartSocket;\n this.pauseSocket = callbacks.pauseSocket;\n this.resumeSocket = callbacks.resumeSocket;\n this.clearAuth = callbacks.clearAuth;\n this.logger = config.logger;\n this.refreshTokenLeewaySeconds = config.refreshTokenLeewaySeconds;\n this.lastRefreshChange = false;\n }\n notifyRefreshChange(isRefreshing) {\n if (this.authState.state !== \"noAuth\" && this.authState.state !== \"initialRefetch\" && this.authState.config.onRefreshChange && this.lastRefreshChange !== isRefreshing) {\n this.lastRefreshChange = isRefreshing;\n this.authState.config.onRefreshChange(isRefreshing);\n }\n }\n async setConfig(fetchToken, onChange, onRefreshChange) {\n this.resetAuthState();\n this._logVerbose(\"pausing WS for auth token fetch\");\n this.pauseSocket();\n const token = await this.fetchTokenAndGuardAgainstRace(fetchToken, {\n forceRefreshToken: false\n });\n if (token.isFromOutdatedConfig) {\n return;\n }\n const config = {\n fetchToken,\n onAuthChange: onChange,\n onRefreshChange\n };\n if (token.value) {\n this.setAuthState({\n state: \"waitingForServerConfirmationOfCachedToken\",\n config,\n hasRetried: false\n });\n this.authenticate(token.value);\n } else {\n this.setAuthState({\n state: \"initialRefetch\",\n config\n });\n await this.refetchToken();\n }\n this._logVerbose(\"resuming WS after auth token fetch\");\n this.resumeSocket();\n }\n onTransition(serverMessage) {\n if (!this.syncState.isCurrentOrNewerAuthVersion(\n serverMessage.endVersion.identity\n )) {\n return;\n }\n if (serverMessage.endVersion.identity <= serverMessage.startVersion.identity) {\n return;\n }\n this._logVerbose(\n `auth state is ${this.authState.state} when handling transition`\n );\n this.syncState.markAuthCompletion();\n if (this.authState.state === \"waitingForServerConfirmationOfCachedToken\") {\n this._logVerbose(\"server confirmed auth token is valid\");\n void this.refetchToken();\n this.authState.config.onAuthChange(true);\n return;\n }\n if (this.authState.state === \"waitingForServerConfirmationOfFreshToken\") {\n this._logVerbose(\"server confirmed new auth token is valid\");\n this.notifyRefreshChange(false);\n this.scheduleTokenRefetch(this.authState.token);\n this.tokenConfirmationAttempts = 0;\n if (!this.authState.hadAuth) {\n this.authState.config.onAuthChange(true);\n }\n }\n }\n onAuthError(serverMessage) {\n if (serverMessage.authUpdateAttempted === false && (this.authState.state === \"waitingForServerConfirmationOfFreshToken\" || this.authState.state === \"waitingForServerConfirmationOfCachedToken\")) {\n this._logVerbose(\"ignoring non-auth token expired error\");\n return;\n }\n const { baseVersion } = serverMessage;\n if (!this.syncState.isCurrentOrNewerAuthVersion(baseVersion + 1)) {\n this._logVerbose(\"ignoring auth error for previous auth attempt\");\n return;\n }\n void this.tryToReauthenticate(serverMessage);\n return;\n }\n // This is similar to `refetchToken` defined below, in fact we\n // don't represent them as different states, but it is different\n // in that we pause the WebSocket so that mutations\n // don't retry with bad auth.\n async tryToReauthenticate(serverMessage) {\n this._logVerbose(`attempting to reauthenticate: ${serverMessage.error}`);\n if (\n // No way to fetch another token, kaboom\n this.authState.state === \"noAuth\" || // We failed on a fresh token. After a small number of retries, we give up\n // and clear the auth state to avoid infinite retries.\n this.authState.state === \"waitingForServerConfirmationOfFreshToken\" && this.tokenConfirmationAttempts >= MAX_TOKEN_CONFIRMATION_ATTEMPTS\n ) {\n this.logger.error(\n `Failed to authenticate: \"${serverMessage.error}\", check your server auth config`\n );\n if (this.syncState.hasAuth()) {\n this.syncState.clearAuth();\n }\n if (this.authState.state !== \"noAuth\") {\n this.setAndReportAuthFailed(this.authState.config.onAuthChange);\n }\n return;\n }\n if (this.authState.state === \"waitingForServerConfirmationOfFreshToken\") {\n this.tokenConfirmationAttempts++;\n this._logVerbose(\n `retrying reauthentication, ${MAX_TOKEN_CONFIRMATION_ATTEMPTS - this.tokenConfirmationAttempts} attempts remaining`\n );\n }\n this.notifyRefreshChange(true);\n await this.stopSocket();\n if (this.authState.state === \"noAuth\") {\n return;\n }\n const token = await this.fetchTokenAndGuardAgainstRace(\n this.authState.config.fetchToken,\n {\n forceRefreshToken: true\n }\n );\n if (token.isFromOutdatedConfig) {\n return;\n }\n if (token.value && this.syncState.isNewAuth(token.value)) {\n this.authenticate(token.value);\n this.setAuthState({\n state: \"waitingForServerConfirmationOfFreshToken\",\n config: this.authState.config,\n token: token.value,\n hadAuth: this.authState.state === \"notRefetching\" || this.authState.state === \"waitingForScheduledRefetch\"\n });\n } else {\n this._logVerbose(\"reauthentication failed, could not fetch a new token\");\n if (this.syncState.hasAuth()) {\n this.syncState.clearAuth();\n }\n this.setAndReportAuthFailed(this.authState.config.onAuthChange);\n }\n this.tryRestartSocket();\n }\n // Force refetch the token and schedule another refetch\n // before the token expires - an active client should never\n // need to reauthenticate.\n async refetchToken() {\n if (this.authState.state === \"noAuth\") {\n return;\n }\n this._logVerbose(\"refetching auth token\");\n const token = await this.fetchTokenAndGuardAgainstRace(\n this.authState.config.fetchToken,\n {\n forceRefreshToken: true\n }\n );\n if (token.isFromOutdatedConfig) {\n return;\n }\n if (token.value) {\n if (this.syncState.isNewAuth(token.value)) {\n this.setAuthState({\n state: \"waitingForServerConfirmationOfFreshToken\",\n hadAuth: this.syncState.hasAuth(),\n token: token.value,\n config: this.authState.config\n });\n this.authenticate(token.value);\n } else {\n this.setAuthState({\n state: \"notRefetching\",\n config: this.authState.config\n });\n }\n } else {\n this._logVerbose(\"refetching token failed\");\n if (this.syncState.hasAuth()) {\n this.clearAuth();\n }\n this.setAndReportAuthFailed(this.authState.config.onAuthChange);\n }\n this._logVerbose(\n \"restarting WS after auth token fetch (if currently stopped)\"\n );\n this.tryRestartSocket();\n }\n scheduleTokenRefetch(token) {\n if (this.authState.state === \"noAuth\") {\n return;\n }\n const decodedToken = this.decodeToken(token);\n if (!decodedToken) {\n this.logger.error(\n \"Auth token is not a valid JWT, cannot refetch the token\"\n );\n return;\n }\n const { iat, exp } = decodedToken;\n if (!iat || !exp) {\n this.logger.error(\n \"Auth token does not have required fields, cannot refetch the token\"\n );\n return;\n }\n const tokenValiditySeconds = exp - iat;\n if (tokenValiditySeconds <= 2) {\n this.logger.error(\n \"Auth token does not live long enough, cannot refetch the token\"\n );\n return;\n }\n let delay = Math.min(\n MAXIMUM_REFRESH_DELAY,\n (tokenValiditySeconds - this.refreshTokenLeewaySeconds) * 1e3\n );\n if (delay <= 0) {\n this.logger.warn(\n `Refetching auth token immediately, configured leeway ${this.refreshTokenLeewaySeconds}s is larger than the token's lifetime ${tokenValiditySeconds}s`\n );\n delay = 0;\n }\n const refetchTokenTimeoutId = setTimeout(() => {\n this._logVerbose(\"running scheduled token refetch\");\n void this.refetchToken();\n }, delay);\n this.setAuthState({\n state: \"waitingForScheduledRefetch\",\n refetchTokenTimeoutId,\n config: this.authState.config\n });\n this._logVerbose(\n `scheduled preemptive auth token refetching in ${delay}ms`\n );\n }\n // Protects against simultaneous calls to `setConfig`\n // while we're fetching a token\n async fetchTokenAndGuardAgainstRace(fetchToken, fetchArgs) {\n const originalConfigVersion = ++this.configVersion;\n this._logVerbose(\n `fetching token with config version ${originalConfigVersion}`\n );\n const token = await fetchToken(fetchArgs);\n if (this.configVersion !== originalConfigVersion) {\n this._logVerbose(\n `stale config version, expected ${originalConfigVersion}, got ${this.configVersion}`\n );\n return { isFromOutdatedConfig: true };\n }\n return { isFromOutdatedConfig: false, value: token };\n }\n stop() {\n this.resetAuthState();\n this.configVersion++;\n this._logVerbose(`config version bumped to ${this.configVersion}`);\n }\n setAndReportAuthFailed(onAuthChange) {\n onAuthChange(false);\n this.resetAuthState();\n }\n // The sole path to `state === \"noAuth\"`; consumers rely on this firing\n // `notifyRefreshChange(false)` to pair any in-flight `(true)`. May run\n // when refresh state is already false.\n resetAuthState() {\n this.notifyRefreshChange(false);\n this.setAuthState({ state: \"noAuth\" });\n }\n setAuthState(newAuth) {\n const authStateForLog = newAuth.state === \"waitingForServerConfirmationOfFreshToken\" ? {\n hadAuth: newAuth.hadAuth,\n state: newAuth.state,\n token: `...${newAuth.token.slice(-7)}`\n } : { state: newAuth.state };\n this._logVerbose(\n `setting auth state to ${JSON.stringify(authStateForLog)}`\n );\n switch (newAuth.state) {\n case \"waitingForScheduledRefetch\":\n case \"notRefetching\":\n case \"noAuth\":\n this.tokenConfirmationAttempts = 0;\n break;\n case \"waitingForServerConfirmationOfFreshToken\":\n case \"waitingForServerConfirmationOfCachedToken\":\n case \"initialRefetch\":\n break;\n default: {\n newAuth;\n }\n }\n if (this.authState.state === \"waitingForScheduledRefetch\") {\n clearTimeout(this.authState.refetchTokenTimeoutId);\n }\n this.authState = newAuth;\n }\n decodeToken(token) {\n try {\n return jwtDecode(token);\n } catch (e) {\n this._logVerbose(\n `Error decoding token: ${e instanceof Error ? e.message : \"Unknown error\"}`\n );\n return null;\n }\n }\n _logVerbose(message) {\n this.logger.logVerbose(`${message} [v${this.configVersion}]`);\n }\n}\n//# sourceMappingURL=authentication_manager.js.map\n","\"use strict\";\nconst markNames = [\n \"convexClientConstructed\",\n \"convexWebSocketOpen\",\n \"convexFirstMessageReceived\"\n];\nexport function mark(name, sessionId) {\n const detail = { sessionId };\n if (typeof performance === \"undefined\" || !performance.mark) return;\n performance.mark(name, { detail });\n}\nfunction performanceMarkToJson(mark2) {\n let name = mark2.name.slice(\"convex\".length);\n name = name.charAt(0).toLowerCase() + name.slice(1);\n return {\n name,\n startTime: mark2.startTime\n };\n}\nexport function getMarksReport(sessionId) {\n if (typeof performance === \"undefined\" || !performance.getEntriesByName) {\n return [];\n }\n const allMarks = [];\n for (const name of markNames) {\n const marks = performance.getEntriesByName(name).filter((entry) => entry.entryType === \"mark\").filter((mark2) => mark2.detail.sessionId === sessionId);\n allMarks.push(...marks);\n }\n return allMarks.map(performanceMarkToJson);\n}\n//# sourceMappingURL=metrics.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { version } from \"../../index.js\";\nimport { convexToJson } from \"../../values/index.js\";\nimport {\n createHybridErrorStacktrace,\n forwardData,\n instantiateDefaultLogger,\n instantiateNoopLogger,\n logFatalError\n} from \"../logging.js\";\nimport { LocalSyncState } from \"./local_state.js\";\nimport { RequestManager } from \"./request_manager.js\";\nimport {\n OptimisticQueryResults\n} from \"./optimistic_updates_impl.js\";\nimport { RemoteQuerySet } from \"./remote_query_set.js\";\nimport { serializePathAndArgs } from \"./udf_path_utils.js\";\nimport { WebSocketManager } from \"./web_socket_manager.js\";\nimport { newSessionId } from \"./session.js\";\nimport {\n AuthenticationManager\n} from \"./authentication_manager.js\";\nimport { getMarksReport, mark } from \"./metrics.js\";\nimport { parseArgs, validateDeploymentUrl } from \"../../common/index.js\";\nimport { ConvexError } from \"../../values/errors.js\";\nimport { jwtDecode } from \"../../vendor/jwt-decode/index.js\";\nexport class BaseConvexClient {\n /**\n * @param address - The url of your Convex deployment, often provided\n * by an environment variable. E.g. `https://small-mouse-123.convex.cloud`.\n * @param onTransition - A callback receiving an array of query tokens\n * corresponding to query results that have changed -- additional handlers\n * can be added via `addOnTransitionHandler`.\n * @param options - See {@link BaseConvexClientOptions} for a full description.\n */\n constructor(address, onTransition, options) {\n __publicField(this, \"address\");\n __publicField(this, \"state\");\n __publicField(this, \"requestManager\");\n __publicField(this, \"webSocketManager\");\n __publicField(this, \"authenticationManager\");\n __publicField(this, \"remoteQuerySet\");\n __publicField(this, \"optimisticQueryResults\");\n __publicField(this, \"_transitionHandlerCounter\", 0);\n __publicField(this, \"_nextRequestId\");\n __publicField(this, \"_onTransitionFns\", /* @__PURE__ */ new Map());\n __publicField(this, \"_sessionId\");\n __publicField(this, \"firstMessageReceived\", false);\n __publicField(this, \"debug\");\n __publicField(this, \"logger\");\n __publicField(this, \"maxObservedTimestamp\");\n __publicField(this, \"connectionStateSubscribers\", /* @__PURE__ */ new Map());\n __publicField(this, \"nextConnectionStateSubscriberId\", 0);\n __publicField(this, \"_lastPublishedConnectionState\");\n /**\n * Call this whenever the connection state may have changed in a way that could\n * require publishing it. Schedules a possibly update.\n */\n __publicField(this, \"markConnectionStateDirty\", () => {\n void Promise.resolve().then(() => {\n const curConnectionState = this.connectionState();\n if (JSON.stringify(curConnectionState) !== JSON.stringify(this._lastPublishedConnectionState)) {\n this._lastPublishedConnectionState = curConnectionState;\n for (const cb of this.connectionStateSubscribers.values()) {\n cb(curConnectionState);\n }\n }\n });\n });\n // Instance property so that `mark()` doesn't need to be called as a method.\n __publicField(this, \"mark\", (name) => {\n if (this.debug) {\n mark(name, this.sessionId);\n }\n });\n if (typeof address === \"object\") {\n throw new Error(\n \"Passing a ClientConfig object is no longer supported. Pass the URL of the Convex deployment as a string directly.\"\n );\n }\n if (options?.skipConvexDeploymentUrlCheck !== true) {\n validateDeploymentUrl(address);\n }\n options = { ...options };\n const authRefreshTokenLeewaySeconds = options.authRefreshTokenLeewaySeconds ?? 10;\n let webSocketConstructor = options.webSocketConstructor;\n if (!webSocketConstructor && typeof WebSocket === \"undefined\") {\n throw new Error(\n \"No WebSocket global variable defined! To use Convex in an environment without WebSocket try the HTTP client: https://docs.convex.dev/api/classes/browser.ConvexHttpClient\"\n );\n }\n webSocketConstructor = webSocketConstructor || WebSocket;\n this.debug = options.reportDebugInfoToConvex ?? false;\n this.address = address;\n this.logger = options.logger === false ? instantiateNoopLogger({ verbose: options.verbose ?? false }) : options.logger !== true && options.logger ? options.logger : instantiateDefaultLogger({ verbose: options.verbose ?? false });\n const i = address.search(\"://\");\n if (i === -1) {\n throw new Error(\"Provided address was not an absolute URL.\");\n }\n const origin = address.substring(i + 3);\n const protocol = address.substring(0, i);\n let wsProtocol;\n if (protocol === \"http\") {\n wsProtocol = \"ws\";\n } else if (protocol === \"https\") {\n wsProtocol = \"wss\";\n } else {\n throw new Error(`Unknown parent protocol ${protocol}`);\n }\n const wsUri = `${wsProtocol}://${origin}/api/${version}/sync`;\n this.state = new LocalSyncState();\n this.remoteQuerySet = new RemoteQuerySet(\n (queryId) => this.state.queryPath(queryId),\n this.logger\n );\n this.requestManager = new RequestManager(\n this.logger,\n this.markConnectionStateDirty\n );\n const pauseSocket = () => {\n this.webSocketManager.pause();\n this.state.pause();\n };\n this.authenticationManager = new AuthenticationManager(\n this.state,\n {\n authenticate: (token) => {\n const message = this.state.setAuth(token);\n this.webSocketManager.sendMessage(message);\n return message.baseVersion;\n },\n stopSocket: () => this.webSocketManager.stop(),\n tryRestartSocket: () => this.webSocketManager.tryRestart(),\n pauseSocket,\n resumeSocket: () => this.webSocketManager.resume(),\n clearAuth: () => {\n this.clearAuth();\n }\n },\n {\n logger: this.logger,\n refreshTokenLeewaySeconds: authRefreshTokenLeewaySeconds\n }\n );\n this.optimisticQueryResults = new OptimisticQueryResults();\n this.addOnTransitionHandler((transition) => {\n onTransition(transition.queries.map((q) => q.token));\n });\n this._nextRequestId = 0;\n this._sessionId = newSessionId();\n const { unsavedChangesWarning } = options;\n if (typeof window === \"undefined\" || typeof window.addEventListener === \"undefined\") {\n if (unsavedChangesWarning === true) {\n throw new Error(\n \"unsavedChangesWarning requested, but window.addEventListener not found! Remove {unsavedChangesWarning: true} from Convex client options.\"\n );\n }\n } else if (unsavedChangesWarning !== false) {\n window.addEventListener(\"beforeunload\", (e) => {\n if (this.requestManager.hasIncompleteRequests()) {\n e.preventDefault();\n const confirmationMessage = \"Are you sure you want to leave? Your changes may not be saved.\";\n (e || window.event).returnValue = confirmationMessage;\n return confirmationMessage;\n }\n });\n }\n this.webSocketManager = new WebSocketManager(\n wsUri,\n {\n onOpen: (reconnectMetadata) => {\n this.mark(\"convexWebSocketOpen\");\n this.webSocketManager.sendMessage({\n ...reconnectMetadata,\n type: \"Connect\",\n sessionId: this._sessionId,\n maxObservedTimestamp: this.maxObservedTimestamp\n });\n this.remoteQuerySet = new RemoteQuerySet(\n (queryId) => this.state.queryPath(queryId),\n this.logger\n );\n const [querySetModification, authModification] = this.state.restart();\n if (authModification) {\n this.webSocketManager.sendMessage(authModification);\n }\n this.webSocketManager.sendMessage(querySetModification);\n for (const message of this.requestManager.restart()) {\n this.webSocketManager.sendMessage(message);\n }\n },\n onResume: () => {\n const [querySetModification, authModification] = this.state.resume();\n if (authModification) {\n this.webSocketManager.sendMessage(authModification);\n }\n if (querySetModification) {\n this.webSocketManager.sendMessage(querySetModification);\n }\n for (const message of this.requestManager.resume()) {\n this.webSocketManager.sendMessage(message);\n }\n },\n onMessage: (serverMessage) => {\n if (!this.firstMessageReceived) {\n this.firstMessageReceived = true;\n this.mark(\"convexFirstMessageReceived\");\n this.reportMarks();\n }\n switch (serverMessage.type) {\n case \"Transition\": {\n this.observedTimestamp(serverMessage.endVersion.ts);\n this.authenticationManager.onTransition(serverMessage);\n this.remoteQuerySet.transition(serverMessage);\n this.state.transition(serverMessage);\n const completedRequests = this.requestManager.removeCompleted(\n this.remoteQuerySet.timestamp()\n );\n this.notifyOnQueryResultChanges(completedRequests);\n break;\n }\n case \"MutationResponse\": {\n if (serverMessage.success) {\n this.observedTimestamp(serverMessage.ts);\n }\n const completedMutationInfo = this.requestManager.onResponse(serverMessage);\n if (completedMutationInfo !== null) {\n this.notifyOnQueryResultChanges(\n /* @__PURE__ */ new Map([\n [\n completedMutationInfo.requestId,\n completedMutationInfo.result\n ]\n ])\n );\n }\n break;\n }\n case \"ActionResponse\": {\n this.requestManager.onResponse(serverMessage);\n break;\n }\n case \"AuthError\": {\n this.authenticationManager.onAuthError(serverMessage);\n break;\n }\n case \"FatalError\": {\n const error = logFatalError(this.logger, serverMessage.error);\n void this.webSocketManager.terminate();\n throw error;\n }\n default: {\n serverMessage;\n }\n }\n return {\n hasSyncedPastLastReconnect: this.hasSyncedPastLastReconnect()\n };\n },\n onServerDisconnectError: options.onServerDisconnectError\n },\n webSocketConstructor,\n this.logger,\n this.markConnectionStateDirty,\n this.debug\n );\n this.mark(\"convexClientConstructed\");\n if (options.expectAuth) {\n pauseSocket();\n }\n }\n /**\n * Return true if there is outstanding work from prior to the time of the most recent restart.\n * This indicates that the client has not proven itself to have gotten past the issue that\n * potentially led to the restart. Use this to influence when to reset backoff after a failure.\n */\n hasSyncedPastLastReconnect() {\n const hasSyncedPastLastReconnect = this.requestManager.hasSyncedPastLastReconnect() && this.state.hasSyncedPastLastReconnect();\n return hasSyncedPastLastReconnect;\n }\n observedTimestamp(observedTs) {\n if (this.maxObservedTimestamp === void 0 || this.maxObservedTimestamp.lessThanOrEqual(observedTs)) {\n this.maxObservedTimestamp = observedTs;\n }\n }\n getMaxObservedTimestamp() {\n return this.maxObservedTimestamp;\n }\n /**\n * Compute the current query results based on the remoteQuerySet and the\n * current optimistic updates and call `onTransition` for all the changed\n * queries.\n *\n * @param completedMutations - A set of mutation IDs whose optimistic updates\n * are no longer needed.\n */\n notifyOnQueryResultChanges(completedRequests) {\n const remoteQueryResults = this.remoteQuerySet.remoteQueryResults();\n const queryTokenToValue = /* @__PURE__ */ new Map();\n for (const [queryId, result] of remoteQueryResults) {\n const queryToken = this.state.queryToken(queryId);\n if (queryToken !== null) {\n const query = {\n result,\n udfPath: this.state.queryPath(queryId),\n args: this.state.queryArgs(queryId)\n };\n queryTokenToValue.set(queryToken, query);\n }\n }\n const changedQueryTokens = this.optimisticQueryResults.ingestQueryResultsFromServer(\n queryTokenToValue,\n new Set(completedRequests.keys())\n );\n this.handleTransition({\n queries: changedQueryTokens.map((token) => {\n const optimisticResult = this.optimisticQueryResults.rawQueryResult(token);\n return {\n token,\n modification: {\n kind: \"Updated\",\n result: optimisticResult\n }\n };\n }),\n reflectedMutations: Array.from(completedRequests).map(\n ([requestId, result]) => ({\n requestId,\n result\n })\n ),\n timestamp: this.remoteQuerySet.timestamp()\n });\n }\n handleTransition(transition) {\n for (const fn of this._onTransitionFns.values()) {\n fn(transition);\n }\n }\n /**\n * Add a handler that will be called on a transition.\n *\n * Any external side effects (e.g. setting React state) should be handled here.\n *\n * @param fn\n *\n * @returns\n */\n addOnTransitionHandler(fn) {\n const id = this._transitionHandlerCounter++;\n this._onTransitionFns.set(id, fn);\n return () => this._onTransitionFns.delete(id);\n }\n /**\n * Get the current JWT auth token and decoded claims.\n */\n getCurrentAuthClaims() {\n const authToken = this.state.getAuth();\n let decoded = {};\n if (authToken && authToken.tokenType === \"User\") {\n try {\n decoded = authToken ? jwtDecode(authToken.value) : {};\n } catch {\n decoded = {};\n }\n } else {\n return void 0;\n }\n return { token: authToken.value, decoded };\n }\n /**\n * Set the authentication token to be used for subsequent queries and mutations.\n * `fetchToken` will be called automatically again if a token expires.\n * `fetchToken` should return `null` if the token cannot be retrieved, for example\n * when the user's rights were permanently revoked.\n * @param fetchToken - an async function returning the JWT-encoded OpenID Connect Identity Token\n * @param onChange - a callback that will be called when the authentication status changes\n * @param onRefreshChange - a callback called with `true` when the socket is paused to fetch a replacement token after a server rejection, and `false` when refresh completes\n */\n setAuth(fetchToken, onChange, onRefreshChange) {\n void this.authenticationManager.setConfig(\n fetchToken,\n onChange,\n onRefreshChange\n );\n }\n hasAuth() {\n return this.state.hasAuth();\n }\n /** @internal */\n setAdminAuth(value, fakeUserIdentity) {\n const message = this.state.setAdminAuth(value, fakeUserIdentity);\n this.webSocketManager.sendMessage(message);\n }\n clearAuth() {\n const message = this.state.clearAuth();\n this.webSocketManager.sendMessage(message);\n }\n /**\n * Subscribe to a query function.\n *\n * Whenever this query's result changes, the `onTransition` callback\n * passed into the constructor will be called.\n *\n * @param name - The name of the query.\n * @param args - An arguments object for the query. If this is omitted, the\n * arguments will be `{}`.\n * @param options - A {@link SubscribeOptions} options object for this query.\n \n * @returns An object containing a {@link QueryToken} corresponding to this\n * query and an `unsubscribe` callback.\n */\n subscribe(name, args, options) {\n const argsObject = parseArgs(args);\n const { modification, queryToken, unsubscribe } = this.state.subscribe(\n name,\n argsObject,\n options?.journal,\n options?.componentPath\n );\n if (modification !== null) {\n this.webSocketManager.sendMessage(modification);\n }\n return {\n queryToken,\n unsubscribe: () => {\n const modification2 = unsubscribe();\n if (modification2) {\n this.webSocketManager.sendMessage(modification2);\n }\n }\n };\n }\n /**\n * A query result based only on the current, local state.\n *\n * The only way this will return a value is if we're already subscribed to the\n * query or its value has been set optimistically.\n */\n localQueryResult(udfPath, args) {\n const argsObject = parseArgs(args);\n const queryToken = serializePathAndArgs(udfPath, argsObject);\n return this.optimisticQueryResults.queryResult(queryToken);\n }\n /**\n * Get query result by query token based on current, local state\n *\n * The only way this will return a value is if we're already subscribed to the\n * query or its value has been set optimistically.\n *\n * @internal\n */\n localQueryResultByToken(queryToken) {\n return this.optimisticQueryResults.queryResult(queryToken);\n }\n /**\n * Whether local query result is available for a token.\n *\n * This method does not throw if the result is an error.\n *\n * @internal\n */\n hasLocalQueryResultByToken(queryToken) {\n return this.optimisticQueryResults.hasQueryResult(queryToken);\n }\n /**\n * @internal\n */\n localQueryLogs(udfPath, args) {\n const argsObject = parseArgs(args);\n const queryToken = serializePathAndArgs(udfPath, argsObject);\n return this.optimisticQueryResults.queryLogs(queryToken);\n }\n /**\n * Retrieve the current {@link QueryJournal} for this query function.\n *\n * If we have not yet received a result for this query, this will be `undefined`.\n *\n * @param name - The name of the query.\n * @param args - The arguments object for this query.\n * @returns The query's {@link QueryJournal} or `undefined`.\n */\n queryJournal(name, args) {\n const argsObject = parseArgs(args);\n const queryToken = serializePathAndArgs(name, argsObject);\n return this.state.queryJournal(queryToken);\n }\n /**\n * Get the current {@link ConnectionState} between the client and the Convex\n * backend.\n *\n * @returns The {@link ConnectionState} with the Convex backend.\n */\n connectionState() {\n const wsConnectionState = this.webSocketManager.connectionState();\n return {\n hasInflightRequests: this.requestManager.hasInflightRequests(),\n isWebSocketConnected: wsConnectionState.isConnected,\n hasEverConnected: wsConnectionState.hasEverConnected,\n connectionCount: wsConnectionState.connectionCount,\n connectionRetries: wsConnectionState.connectionRetries,\n timeOfOldestInflightRequest: this.requestManager.timeOfOldestInflightRequest(),\n inflightMutations: this.requestManager.inflightMutations(),\n inflightActions: this.requestManager.inflightActions()\n };\n }\n /**\n * Subscribe to the {@link ConnectionState} between the client and the Convex\n * backend, calling a callback each time it changes.\n *\n * Subscribed callbacks will be called when any part of ConnectionState changes.\n * ConnectionState may grow in future versions (e.g. to provide a array of\n * inflight requests) in which case callbacks would be called more frequently.\n *\n * @returns An unsubscribe function to stop listening.\n */\n subscribeToConnectionState(cb) {\n const id = this.nextConnectionStateSubscriberId++;\n this.connectionStateSubscribers.set(id, cb);\n return () => {\n this.connectionStateSubscribers.delete(id);\n };\n }\n /**\n * Execute a mutation function.\n *\n * @param name - The name of the mutation.\n * @param args - An arguments object for the mutation. If this is omitted,\n * the arguments will be `{}`.\n * @param options - A {@link MutationOptions} options object for this mutation.\n \n * @returns - A promise of the mutation's result.\n */\n async mutation(name, args, options) {\n const result = await this.mutationInternal(name, args, options);\n if (!result.success) {\n if (result.errorData !== void 0) {\n throw forwardData(\n result,\n new ConvexError(\n createHybridErrorStacktrace(\"mutation\", name, result)\n )\n );\n }\n throw new Error(createHybridErrorStacktrace(\"mutation\", name, result));\n }\n return result.value;\n }\n /**\n * @internal\n */\n async mutationInternal(udfPath, args, options, componentPath) {\n const { mutationPromise } = this.enqueueMutation(\n udfPath,\n args,\n options,\n componentPath\n );\n return mutationPromise;\n }\n /**\n * @internal\n */\n enqueueMutation(udfPath, args, options, componentPath) {\n const mutationArgs = parseArgs(args);\n this.tryReportLongDisconnect();\n const requestId = this.nextRequestId;\n this._nextRequestId++;\n if (options !== void 0) {\n const optimisticUpdate = options.optimisticUpdate;\n if (optimisticUpdate !== void 0) {\n const wrappedUpdate = (localQueryStore) => {\n const result = optimisticUpdate(\n localQueryStore,\n mutationArgs\n );\n if (result instanceof Promise) {\n this.logger.warn(\n \"Optimistic update handler returned a Promise. Optimistic updates should be synchronous.\"\n );\n }\n };\n const changedQueryTokens = this.optimisticQueryResults.applyOptimisticUpdate(\n wrappedUpdate,\n requestId\n );\n const changedQueries = changedQueryTokens.map((token) => {\n const localResult = this.localQueryResultByToken(token);\n return {\n token,\n modification: {\n kind: \"Updated\",\n result: localResult === void 0 ? void 0 : {\n success: true,\n value: localResult,\n logLines: []\n }\n }\n };\n });\n this.handleTransition({\n queries: changedQueries,\n reflectedMutations: [],\n timestamp: this.remoteQuerySet.timestamp()\n });\n }\n }\n const message = {\n type: \"Mutation\",\n requestId,\n udfPath,\n componentPath,\n args: [convexToJson(mutationArgs)]\n };\n const mightBeSent = this.webSocketManager.sendMessage(message);\n const mutationPromise = this.requestManager.request(message, mightBeSent);\n return {\n requestId,\n mutationPromise\n };\n }\n /**\n * Execute an action function.\n *\n * @param name - The name of the action.\n * @param args - An arguments object for the action. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the action's result.\n */\n async action(name, args) {\n const result = await this.actionInternal(name, args);\n if (!result.success) {\n if (result.errorData !== void 0) {\n throw forwardData(\n result,\n new ConvexError(createHybridErrorStacktrace(\"action\", name, result))\n );\n }\n throw new Error(createHybridErrorStacktrace(\"action\", name, result));\n }\n return result.value;\n }\n /**\n * @internal\n */\n async actionInternal(udfPath, args, componentPath) {\n const actionArgs = parseArgs(args);\n const requestId = this.nextRequestId;\n this._nextRequestId++;\n this.tryReportLongDisconnect();\n const message = {\n type: \"Action\",\n requestId,\n udfPath,\n componentPath,\n args: [convexToJson(actionArgs)]\n };\n const mightBeSent = this.webSocketManager.sendMessage(message);\n return this.requestManager.request(message, mightBeSent);\n }\n /**\n * Close any network handles associated with this client and stop all subscriptions.\n *\n * Call this method when you're done with an {@link BaseConvexClient} to\n * dispose of its sockets and resources.\n *\n * @returns A `Promise` fulfilled when the connection has been completely closed.\n */\n async close() {\n this.authenticationManager.stop();\n return this.webSocketManager.terminate();\n }\n /**\n * Return the address for this client, useful for creating a new client.\n *\n * Not guaranteed to match the address with which this client was constructed:\n * it may be canonicalized.\n */\n get url() {\n return this.address;\n }\n /**\n * @internal\n */\n get nextRequestId() {\n return this._nextRequestId;\n }\n /**\n * @internal\n */\n get sessionId() {\n return this._sessionId;\n }\n /**\n * Reports performance marks to the server. This should only be called when\n * we have a functional websocket.\n */\n reportMarks() {\n if (this.debug) {\n const report = getMarksReport(this.sessionId);\n this.webSocketManager.sendMessage({\n type: \"Event\",\n eventType: \"ClientConnect\",\n event: report\n });\n }\n }\n tryReportLongDisconnect() {\n if (!this.debug) {\n return;\n }\n const timeOfOldestRequest = this.connectionState().timeOfOldestInflightRequest;\n if (timeOfOldestRequest === null || Date.now() - timeOfOldestRequest.getTime() <= 60 * 1e3) {\n return;\n }\n const endpoint = `${this.address}/api/debug_event`;\n fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Convex-Client\": `npm-${version}`\n },\n body: JSON.stringify({ event: \"LongWebsocketDisconnect\" })\n }).then((response) => {\n if (!response.ok) {\n this.logger.warn(\n \"Analytics request failed with response:\",\n response.body\n );\n }\n }).catch((error) => {\n this.logger.warn(\"Analytics response failed with error:\", error);\n });\n }\n}\n//# sourceMappingURL=client.js.map\n","\"use strict\";\nexport function asPaginationArgs(value) {\n if (typeof value.paginationOpts.numItems !== \"number\") {\n throw new Error(`Not valid paginated query args: ${JSON.stringify(value)}`);\n }\n return value;\n}\nexport function asPaginationResult(value) {\n if (typeof value !== \"object\" || value === null || !Array.isArray(value.page) || typeof value.isDone !== \"boolean\" || typeof value.continueCursor !== \"string\") {\n throw new Error(`Not a valid paginated query result: ${value?.toString()}`);\n }\n return value;\n}\n//# sourceMappingURL=pagination.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport {\n serializePaginatedPathAndArgs,\n canonicalizeUdfPath\n} from \"./udf_path_utils.js\";\nimport {\n asPaginationResult\n} from \"./pagination.js\";\nimport { Long } from \"../../vendor/long.js\";\nexport class PaginatedQueryClient {\n constructor(client, onTransition) {\n this.client = client;\n this.onTransition = onTransition;\n __publicField(this, \"paginatedQuerySet\", /* @__PURE__ */ new Map());\n // hold onto a real Transition so we can construct synthetic ones with that timestamp\n __publicField(this, \"lastTransitionTs\");\n this.lastTransitionTs = Long.fromNumber(0);\n this.client.addOnTransitionHandler(\n (transition) => this.onBaseTransition(transition)\n );\n }\n /**\n * Subscribe to a paginated query.\n *\n * @param name - The name of the paginated query function\n * @param args - Arguments for the query (excluding paginationOpts)\n * @param options - Pagination options including initialNumItems\n * @returns Object with paginatedQueryToken and unsubscribe function\n */\n subscribe(name, args, options) {\n const canonicalizedUdfPath = canonicalizeUdfPath(name);\n const token = serializePaginatedPathAndArgs(\n canonicalizedUdfPath,\n args,\n options\n );\n const unsubscribe = () => this.removePaginatedQuerySubscriber(token);\n const existingEntry = this.paginatedQuerySet.get(token);\n if (existingEntry) {\n existingEntry.numSubscribers += 1;\n return {\n paginatedQueryToken: token,\n unsubscribe\n };\n }\n this.paginatedQuerySet.set(token, {\n token,\n canonicalizedUdfPath,\n args,\n numSubscribers: 1,\n options: { initialNumItems: options.initialNumItems },\n nextPageKey: 0,\n pageKeys: [],\n pageKeyToQuery: /* @__PURE__ */ new Map(),\n ongoingSplits: /* @__PURE__ */ new Map(),\n skip: false,\n id: options.id\n });\n this.addPageToPaginatedQuery(token, null, options.initialNumItems);\n return {\n paginatedQueryToken: token,\n unsubscribe\n };\n }\n /**\n * Get current results for a paginated query based on local state.\n *\n * Throws an error when one of the pages has errored.\n */\n localQueryResult(name, args, options) {\n const canonicalizedUdfPath = canonicalizeUdfPath(name);\n const token = serializePaginatedPathAndArgs(\n canonicalizedUdfPath,\n args,\n options\n );\n return this.localQueryResultByToken(token);\n }\n /**\n * @internal\n */\n localQueryResultByToken(token) {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n return void 0;\n }\n const activePages = this.activePageQueryTokens(paginatedQuery);\n if (activePages.length === 0) {\n return {\n results: [],\n status: \"LoadingFirstPage\",\n loadMore: (numItems) => {\n return this.loadMoreOfPaginatedQuery(token, numItems);\n }\n };\n }\n let allResults = [];\n let hasUndefined = false;\n let isDone = false;\n for (const pageToken of activePages) {\n const result = this.client.localQueryResultByToken(pageToken);\n if (result === void 0) {\n hasUndefined = true;\n isDone = false;\n continue;\n }\n const paginationResult = asPaginationResult(result);\n allResults = allResults.concat(paginationResult.page);\n isDone = !!paginationResult.isDone;\n }\n let status;\n if (hasUndefined) {\n status = allResults.length === 0 ? \"LoadingFirstPage\" : \"LoadingMore\";\n } else if (isDone) {\n status = \"Exhausted\";\n } else {\n status = \"CanLoadMore\";\n }\n return {\n results: allResults,\n status,\n loadMore: (numItems) => {\n return this.loadMoreOfPaginatedQuery(token, numItems);\n }\n };\n }\n onBaseTransition(transition) {\n const changedBaseTokens = transition.queries.map((q) => q.token);\n const changed = this.queriesContainingTokens(changedBaseTokens);\n let paginatedQueries = [];\n if (changed.length > 0) {\n this.processPaginatedQuerySplits(\n changed,\n (token) => this.client.localQueryResultByToken(token)\n );\n paginatedQueries = changed.map((token) => ({\n token,\n modification: {\n kind: \"Updated\",\n result: this.localQueryResultByToken(token)\n }\n }));\n }\n const extendedTransition = {\n ...transition,\n paginatedQueries\n };\n this.onTransition(extendedTransition);\n }\n /**\n * Load more items for a paginated query.\n *\n * This *always* causes a transition, the status of the query\n * has probably changed from \"CanLoadMore\" to \"LoadingMore\".\n * Data might have changed too: maybe a subscription to this page\n * query already exists (unlikely but possible) or this page query\n * has an optimistic update providing some initial data.\n *\n * @internal\n */\n loadMoreOfPaginatedQuery(token, numItems) {\n this.mustGetPaginatedQuery(token);\n const lastPageToken = this.queryTokenForLastPageOfPaginatedQuery(token);\n const lastPageResult = this.client.localQueryResultByToken(lastPageToken);\n if (!lastPageResult) {\n return false;\n }\n const paginationResult = asPaginationResult(lastPageResult);\n if (paginationResult.isDone) {\n return false;\n }\n this.addPageToPaginatedQuery(\n token,\n paginationResult.continueCursor,\n numItems\n );\n const loadMoreTransition = {\n timestamp: this.lastTransitionTs,\n reflectedMutations: [],\n queries: [],\n paginatedQueries: [\n {\n token,\n modification: {\n kind: \"Updated\",\n result: this.localQueryResultByToken(token)\n }\n }\n ]\n };\n this.onTransition(loadMoreTransition);\n return true;\n }\n /**\n * @internal\n */\n queriesContainingTokens(queryTokens) {\n if (queryTokens.length === 0) {\n return [];\n }\n const changed = [];\n const queryTokenSet = new Set(queryTokens);\n for (const [paginatedToken, paginatedQuery] of this.paginatedQuerySet) {\n for (const pageToken of this.allQueryTokens(paginatedQuery)) {\n if (queryTokenSet.has(pageToken)) {\n changed.push(paginatedToken);\n break;\n }\n }\n }\n return changed;\n }\n /**\n * @internal\n */\n processPaginatedQuerySplits(changed, getResult) {\n for (const paginatedQueryToken of changed) {\n const paginatedQuery = this.mustGetPaginatedQuery(paginatedQueryToken);\n const { ongoingSplits, pageKeyToQuery, pageKeys } = paginatedQuery;\n for (const [pageKey, [splitKey1, splitKey2]] of ongoingSplits) {\n const bothNewPagesLoaded = getResult(pageKeyToQuery.get(splitKey1).queryToken) !== void 0 && getResult(pageKeyToQuery.get(splitKey2).queryToken) !== void 0;\n if (bothNewPagesLoaded) {\n this.completePaginatedQuerySplit(\n paginatedQuery,\n pageKey,\n splitKey1,\n splitKey2\n );\n }\n }\n for (const pageKey of pageKeys) {\n if (ongoingSplits.has(pageKey)) {\n continue;\n }\n const pageToken = pageKeyToQuery.get(pageKey).queryToken;\n const pageResult = getResult(pageToken);\n if (!pageResult) {\n continue;\n }\n const result = asPaginationResult(pageResult);\n const shouldSplit = result.splitCursor && (result.pageStatus === \"SplitRecommended\" || result.pageStatus === \"SplitRequired\" || // This client-driven page splitting condition will change in the future.\n result.page.length > paginatedQuery.options.initialNumItems * 2);\n if (shouldSplit) {\n this.splitPaginatedQueryPage(\n paginatedQuery,\n pageKey,\n result.splitCursor,\n // we just checked\n result.continueCursor\n );\n }\n }\n }\n }\n splitPaginatedQueryPage(paginatedQuery, pageKey, splitCursor, continueCursor) {\n const splitKey1 = paginatedQuery.nextPageKey++;\n const splitKey2 = paginatedQuery.nextPageKey++;\n const paginationOpts = {\n cursor: continueCursor,\n numItems: paginatedQuery.options.initialNumItems,\n id: paginatedQuery.id\n };\n const firstSubscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n {\n ...paginatedQuery.args,\n paginationOpts: {\n ...paginationOpts,\n cursor: null,\n // Start from beginning for first split\n endCursor: splitCursor\n }\n }\n );\n paginatedQuery.pageKeyToQuery.set(splitKey1, firstSubscription);\n const secondSubscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n {\n ...paginatedQuery.args,\n paginationOpts: {\n ...paginationOpts,\n cursor: splitCursor,\n endCursor: continueCursor\n }\n }\n );\n paginatedQuery.pageKeyToQuery.set(splitKey2, secondSubscription);\n paginatedQuery.ongoingSplits.set(pageKey, [splitKey1, splitKey2]);\n }\n /**\n * @internal\n */\n addPageToPaginatedQuery(token, continueCursor, numItems) {\n const paginatedQuery = this.mustGetPaginatedQuery(token);\n const pageKey = paginatedQuery.nextPageKey++;\n const paginationOpts = {\n cursor: continueCursor,\n numItems,\n id: paginatedQuery.id\n };\n const pageArgs = {\n ...paginatedQuery.args,\n paginationOpts\n };\n const subscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n pageArgs\n );\n paginatedQuery.pageKeys.push(pageKey);\n paginatedQuery.pageKeyToQuery.set(pageKey, subscription);\n return subscription;\n }\n removePaginatedQuerySubscriber(token) {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n return;\n }\n paginatedQuery.numSubscribers -= 1;\n if (paginatedQuery.numSubscribers > 0) {\n return;\n }\n for (const subscription of paginatedQuery.pageKeyToQuery.values()) {\n subscription.unsubscribe();\n }\n this.paginatedQuerySet.delete(token);\n }\n completePaginatedQuerySplit(paginatedQuery, pageKey, splitKey1, splitKey2) {\n const originalQuery = paginatedQuery.pageKeyToQuery.get(pageKey);\n paginatedQuery.pageKeyToQuery.delete(pageKey);\n const pageIndex = paginatedQuery.pageKeys.indexOf(pageKey);\n paginatedQuery.pageKeys.splice(pageIndex, 1, splitKey1, splitKey2);\n paginatedQuery.ongoingSplits.delete(pageKey);\n originalQuery.unsubscribe();\n }\n /** The query tokens for all active pages, in result order */\n activePageQueryTokens(paginatedQuery) {\n return paginatedQuery.pageKeys.map(\n (pageKey) => paginatedQuery.pageKeyToQuery.get(pageKey).queryToken\n );\n }\n allQueryTokens(paginatedQuery) {\n return Array.from(paginatedQuery.pageKeyToQuery.values()).map(\n (sub) => sub.queryToken\n );\n }\n queryTokenForLastPageOfPaginatedQuery(token) {\n const paginatedQuery = this.mustGetPaginatedQuery(token);\n const lastPageKey = paginatedQuery.pageKeys[paginatedQuery.pageKeys.length - 1];\n if (lastPageKey === void 0) {\n throw new Error(`No pages for paginated query ${token}`);\n }\n return paginatedQuery.pageKeyToQuery.get(lastPageKey).queryToken;\n }\n mustGetPaginatedQuery(token) {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n throw new Error(\"paginated query no longer exists for token \" + token);\n }\n return paginatedQuery;\n }\n}\n//# sourceMappingURL=paginated_query_client.js.map\n","\"use strict\";\nimport { useEffect, useState } from \"react\";\nexport function useSubscription({\n // (Synchronously) returns the current value of our subscription.\n getCurrentValue,\n // This function is passed an event handler to attach to the subscription.\n // It should return an unsubscribe function that removes the handler.\n subscribe\n}) {\n const [state, setState] = useState(() => ({\n getCurrentValue,\n subscribe,\n value: getCurrentValue()\n }));\n let valueToReturn = state.value;\n if (state.getCurrentValue !== getCurrentValue || state.subscribe !== subscribe) {\n valueToReturn = getCurrentValue();\n setState({\n getCurrentValue,\n subscribe,\n value: valueToReturn\n });\n }\n useEffect(() => {\n let didUnsubscribe = false;\n const checkForUpdates = () => {\n if (didUnsubscribe) {\n return;\n }\n setState((prevState) => {\n if (prevState.getCurrentValue !== getCurrentValue || prevState.subscribe !== subscribe) {\n return prevState;\n }\n const value = getCurrentValue();\n if (prevState.value === value) {\n return prevState;\n }\n return { ...prevState, value };\n });\n };\n const unsubscribe = subscribe(checkForUpdates);\n checkForUpdates();\n return () => {\n didUnsubscribe = true;\n unsubscribe();\n };\n }, [getCurrentValue, subscribe]);\n return valueToReturn;\n}\n//# sourceMappingURL=use_subscription.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { BaseConvexClient } from \"../browser/index.js\";\nimport React, { useCallback, useContext, useMemo } from \"react\";\nimport { convexToJson } from \"../values/index.js\";\nimport { useQueries } from \"./use_queries.js\";\nimport { useSubscription } from \"./use_subscription.js\";\nimport { parseArgs } from \"../common/index.js\";\nimport {\n getFunctionName,\n makeFunctionReference\n} from \"../server/api.js\";\nimport {\n instantiateDefaultLogger,\n instantiateNoopLogger\n} from \"../browser/logging.js\";\nimport {\n PaginatedQueryClient\n} from \"../browser/sync/paginated_query_client.js\";\nconst DEFAULT_EXTEND_SUBSCRIPTION_FOR = 5e3;\nif (typeof React === \"undefined\") {\n throw new Error(\"Required dependency 'react' not found\");\n}\nexport function createMutation(mutationReference, client, update) {\n function mutation(args) {\n assertNotAccidentalArgument(args);\n return client.mutation(mutationReference, args, {\n optimisticUpdate: update\n });\n }\n mutation.withOptimisticUpdate = function withOptimisticUpdate(optimisticUpdate) {\n if (update !== void 0) {\n throw new Error(\n `Already specified optimistic update for mutation ${getFunctionName(\n mutationReference\n )}`\n );\n }\n return createMutation(mutationReference, client, optimisticUpdate);\n };\n return mutation;\n}\nfunction createAction(actionReference, client) {\n return function(args) {\n return client.action(actionReference, args);\n };\n}\nexport class ConvexReactClient {\n /**\n * @param address - The url of your Convex deployment, often provided\n * by an environment variable. E.g. `https://small-mouse-123.convex.cloud`.\n * @param options - See {@link ConvexReactClientOptions} for a full description.\n */\n constructor(address, options) {\n __publicField(this, \"address\");\n __publicField(this, \"cachedSync\");\n __publicField(this, \"cachedPaginatedQueryClient\");\n __publicField(this, \"listeners\");\n __publicField(this, \"options\");\n // \"closed\" means this client is done, not just that the underlying WS connection is closed.\n __publicField(this, \"closed\", false);\n __publicField(this, \"_logger\");\n __publicField(this, \"adminAuth\");\n __publicField(this, \"fakeUserIdentity\");\n if (address === void 0) {\n throw new Error(\n \"No address provided to ConvexReactClient.\\nIf trying to deploy to production, make sure to follow all the instructions found at https://docs.convex.dev/production/hosting/\\nIf running locally, make sure to run `convex dev` and ensure the .env.local file is populated.\"\n );\n }\n if (typeof address !== \"string\") {\n throw new Error(\n `ConvexReactClient requires a URL like 'https://happy-otter-123.convex.cloud', received something of type ${typeof address} instead.`\n );\n }\n if (!address.includes(\"://\")) {\n throw new Error(\"Provided address was not an absolute URL.\");\n }\n this.address = address;\n this.listeners = /* @__PURE__ */ new Map();\n this._logger = options?.logger === false ? instantiateNoopLogger({ verbose: options?.verbose ?? false }) : options?.logger !== true && options?.logger ? options.logger : instantiateDefaultLogger({ verbose: options?.verbose ?? false });\n this.options = { ...options, logger: this._logger };\n }\n /**\n * Return the address for this client, useful for creating a new client.\n *\n * Not guaranteed to match the address with which this client was constructed:\n * it may be canonicalized.\n */\n get url() {\n return this.address;\n }\n /**\n * Lazily instantiate the `BaseConvexClient` so we don't create the WebSocket\n * when server-side rendering.\n *\n * @internal\n */\n get sync() {\n if (this.closed) {\n throw new Error(\"ConvexReactClient has already been closed.\");\n }\n if (this.cachedSync) {\n return this.cachedSync;\n }\n this.cachedSync = new BaseConvexClient(\n this.address,\n () => {\n },\n // Use the PaginatedQueryClient's transition instead.\n this.options\n );\n if (this.adminAuth) {\n this.cachedSync.setAdminAuth(this.adminAuth, this.fakeUserIdentity);\n }\n this.cachedPaginatedQueryClient = new PaginatedQueryClient(\n this.cachedSync,\n (transition) => this.handleTransition(transition)\n );\n return this.cachedSync;\n }\n /**\n * Lazily instantiate the `PaginatedQueryClient` so we don't create it\n * when server-side rendering.\n *\n * @internal\n */\n get paginatedQueryClient() {\n this.sync;\n if (this.cachedPaginatedQueryClient) {\n return this.cachedPaginatedQueryClient;\n }\n throw new Error(\"Should already be instantiated\");\n }\n /**\n * Set the authentication token to be used for subsequent queries and mutations.\n * `fetchToken` will be called automatically again if a token expires.\n * `fetchToken` should return `null` if the token cannot be retrieved, for example\n * when the user's rights were permanently revoked.\n * @param fetchToken - an async function returning the JWT-encoded OpenID Connect Identity Token\n * @param onChange - a callback that will be called when the authentication status changes\n * @param onRefreshChange - a callback called with `true` when the socket is paused to fetch a replacement token after a server rejection, and `false` when refresh completes\n */\n setAuth(fetchToken, onChange, onRefreshChange) {\n if (typeof fetchToken === \"string\") {\n throw new Error(\n \"Passing a string to ConvexReactClient.setAuth is no longer supported, please upgrade to passing in an async function to handle reauthentication.\"\n );\n }\n this.sync.setAuth(\n fetchToken,\n onChange ?? (() => {\n }),\n onRefreshChange\n );\n }\n /**\n * Clear the current authentication token if set.\n */\n clearAuth() {\n this.sync.clearAuth();\n }\n /**\n * @internal\n */\n setAdminAuth(token, identity) {\n this.adminAuth = token;\n this.fakeUserIdentity = identity;\n if (this.closed) {\n throw new Error(\"ConvexReactClient has already been closed.\");\n }\n if (this.cachedSync) {\n this.sync.setAdminAuth(token, identity);\n }\n }\n /**\n * Construct a new {@link Watch} on a Convex query function.\n *\n * **Most application code should not call this method directly. Instead use\n * the {@link useQuery} hook.**\n *\n * The act of creating a watch does nothing, a Watch is stateless.\n *\n * @param query - A {@link server.FunctionReference} for the public query to run.\n * @param args - An arguments object for the query. If this is omitted,\n * the arguments will be `{}`.\n * @param options - A {@link WatchQueryOptions} options object for this query.\n *\n * @returns The {@link Watch} object.\n */\n watchQuery(query, ...argsAndOptions) {\n const [args, options] = argsAndOptions;\n const name = getFunctionName(query);\n return {\n onUpdate: (callback) => {\n const { queryToken, unsubscribe } = this.sync.subscribe(\n name,\n args,\n options\n );\n const currentListeners = this.listeners.get(queryToken);\n if (currentListeners !== void 0) {\n currentListeners.add(callback);\n } else {\n this.listeners.set(queryToken, /* @__PURE__ */ new Set([callback]));\n }\n return () => {\n if (this.closed) {\n return;\n }\n const currentListeners2 = this.listeners.get(queryToken);\n currentListeners2.delete(callback);\n if (currentListeners2.size === 0) {\n this.listeners.delete(queryToken);\n }\n unsubscribe();\n };\n },\n localQueryResult: () => {\n if (this.cachedSync) {\n return this.cachedSync.localQueryResult(name, args);\n }\n return void 0;\n },\n localQueryLogs: () => {\n if (this.cachedSync) {\n return this.cachedSync.localQueryLogs(name, args);\n }\n return void 0;\n },\n journal: () => {\n if (this.cachedSync) {\n return this.cachedSync.queryJournal(name, args);\n }\n return void 0;\n }\n };\n }\n // Let's try out a queryOptions-style API.\n // This method is similar to the React Query API `queryClient.prefetchQuery()`.\n // In the future an ensureQueryData(): Promise<Data> method could exist.\n /**\n * Indicates likely future interest in a query subscription.\n *\n * The implementation currently immediately subscribes to a query. In the future this method\n * may prioritize some queries over others, fetch the query result without subscribing, or\n * do nothing in slow network connections or high load scenarios.\n *\n * To use this in a React component, call useQuery() and ignore the return value.\n *\n * @param queryOptions - A query (function reference from an api object) and its args, plus\n * an optional extendSubscriptionFor for how long to subscribe to the query.\n */\n prewarmQuery(queryOptions) {\n const extendSubscriptionFor = queryOptions.extendSubscriptionFor ?? DEFAULT_EXTEND_SUBSCRIPTION_FOR;\n const watch = this.watchQuery(queryOptions.query, queryOptions.args || {});\n const unsubscribe = watch.onUpdate(() => {\n });\n setTimeout(unsubscribe, extendSubscriptionFor);\n }\n /**\n * Construct a new {@link PaginatedWatch} on a Convex paginated query function.\n *\n * **Most application code should not call this method directly. Instead use\n * the {@link usePaginatedQuery} hook.**\n *\n * The act of creating a watch does nothing, a Watch is stateless.\n *\n * @param query - A {@link server.FunctionReference} for the public query to run.\n * @param args - An arguments object for the query. If this is omitted,\n * the arguments will be `{}`.\n * @param options - A {@link WatchPaginatedQueryOptions} options object for this query.\n *\n * @returns The {@link PaginatedWatch} object.\n *\n * @internal\n */\n watchPaginatedQuery(query, args, options) {\n const name = getFunctionName(query);\n return {\n onUpdate: (callback) => {\n const { paginatedQueryToken, unsubscribe } = this.paginatedQueryClient.subscribe(name, args || {}, options);\n const currentListeners = this.listeners.get(paginatedQueryToken);\n if (currentListeners !== void 0) {\n currentListeners.add(callback);\n } else {\n this.listeners.set(paginatedQueryToken, /* @__PURE__ */ new Set([callback]));\n }\n return () => {\n if (this.closed) {\n return;\n }\n const currentListeners2 = this.listeners.get(paginatedQueryToken);\n currentListeners2.delete(callback);\n if (currentListeners2.size === 0) {\n this.listeners.delete(paginatedQueryToken);\n }\n unsubscribe();\n };\n },\n localQueryResult: () => {\n return this.paginatedQueryClient.localQueryResult(name, args, options);\n }\n };\n }\n /**\n * Execute a mutation function.\n *\n * @param mutation - A {@link server.FunctionReference} for the public mutation\n * to run.\n * @param args - An arguments object for the mutation. If this is omitted,\n * the arguments will be `{}`.\n * @param options - A {@link MutationOptions} options object for the mutation.\n * @returns A promise of the mutation's result.\n */\n mutation(mutation, ...argsAndOptions) {\n const [args, options] = argsAndOptions;\n const name = getFunctionName(mutation);\n return this.sync.mutation(name, args, options);\n }\n /**\n * Execute an action function.\n *\n * @param action - A {@link server.FunctionReference} for the public action\n * to run.\n * @param args - An arguments object for the action. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the action's result.\n */\n action(action, ...args) {\n const name = getFunctionName(action);\n return this.sync.action(name, ...args);\n }\n /**\n * Fetch a query result once.\n *\n * **Most application code should subscribe to queries instead, using\n * the {@link useQuery} hook.**\n *\n * @param query - A {@link server.FunctionReference} for the public query\n * to run.\n * @param args - An arguments object for the query. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the query's result.\n */\n query(query, ...args) {\n const watch = this.watchQuery(query, ...args);\n const existingResult = watch.localQueryResult();\n if (existingResult !== void 0) {\n return Promise.resolve(existingResult);\n }\n return new Promise((resolve, reject) => {\n const unsubscribe = watch.onUpdate(() => {\n unsubscribe();\n try {\n resolve(watch.localQueryResult());\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n /**\n * Get the current {@link ConnectionState} between the client and the Convex\n * backend.\n *\n * @returns The {@link ConnectionState} with the Convex backend.\n */\n connectionState() {\n return this.sync.connectionState();\n }\n /**\n * Subscribe to the {@link ConnectionState} between the client and the Convex\n * backend, calling a callback each time it changes.\n *\n * Subscribed callbacks will be called when any part of ConnectionState changes.\n * ConnectionState may grow in future versions (e.g. to provide a array of\n * inflight requests) in which case callbacks would be called more frequently.\n * ConnectionState may also *lose* properties in future versions as we figure\n * out what information is most useful. As such this API is considered unstable.\n *\n * @returns An unsubscribe function to stop listening.\n */\n subscribeToConnectionState(cb) {\n return this.sync.subscribeToConnectionState(cb);\n }\n /**\n * Get the logger for this client.\n *\n * @returns The {@link Logger} for this client.\n */\n get logger() {\n return this._logger;\n }\n /**\n * Close any network handles associated with this client and stop all subscriptions.\n *\n * Call this method when you're done with a {@link ConvexReactClient} to\n * dispose of its sockets and resources.\n *\n * @returns A `Promise` fulfilled when the connection has been completely closed.\n */\n async close() {\n this.closed = true;\n this.listeners = /* @__PURE__ */ new Map();\n if (this.cachedPaginatedQueryClient) {\n this.cachedPaginatedQueryClient = void 0;\n }\n if (this.cachedSync) {\n const sync = this.cachedSync;\n this.cachedSync = void 0;\n await sync.close();\n }\n }\n /**\n * Handle transitions from both base client and paginated client.\n * This ensures all transitions are processed synchronously and in order.\n */\n handleTransition(transition) {\n const simple = transition.queries.map((q) => q.token);\n const paginated = transition.paginatedQueries.map((q) => q.token);\n this.transition([...simple, ...paginated]);\n }\n transition(updatedQueries) {\n for (const queryToken of updatedQueries) {\n const callbacks = this.listeners.get(queryToken);\n if (callbacks) {\n for (const callback of callbacks) {\n callback();\n }\n }\n }\n }\n}\nconst ConvexContext = React.createContext(\n void 0\n // in the future this will be a mocked client for testing\n);\nexport function useConvex() {\n return useContext(ConvexContext);\n}\nexport const ConvexProvider = ({ client, children }) => {\n return React.createElement(\n ConvexContext.Provider,\n { value: client },\n children\n );\n};\nexport function useQuery(query, ...args) {\n const skip = args[0] === \"skip\";\n const argsObject = args[0] === \"skip\" ? {} : parseArgs(args[0]);\n const queryReference = typeof query === \"string\" ? makeFunctionReference(query) : query;\n const queryName = getFunctionName(queryReference);\n const queries = useMemo(\n () => skip ? {} : { query: { query: queryReference, args: argsObject } },\n // Stringify args so args that are semantically the same don't trigger a\n // rerender. Saves developers from adding `useMemo` on every args usage.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(convexToJson(argsObject)), queryName, skip]\n );\n const results = useQueries(queries);\n const result = results[\"query\"];\n if (result instanceof Error) {\n throw result;\n }\n return result;\n}\nexport function useQuery_experimental(options) {\n const throwOnError = options.throwOnError ?? false;\n const queryReference = typeof options.query === \"string\" ? makeFunctionReference(options.query) : options.query;\n const skip = options.args === \"skip\";\n const argsObject = !skip ? parseArgs(options.args) : {};\n const queryName = getFunctionName(queryReference);\n const queries = useMemo(\n () => skip ? {} : { query: { query: queryReference, args: argsObject } },\n // Stringify args so args that are semantically the same don't trigger a\n // rerender. Saves developers from adding `useMemo` on every args usage.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(convexToJson(argsObject)), queryName, skip]\n );\n const results = useQueries(queries);\n const result = results[\"query\"];\n if (result instanceof Error) {\n if (throwOnError) {\n throw result;\n }\n return {\n error: result,\n status: \"error\"\n };\n }\n if (result === void 0) {\n return {\n status: \"pending\"\n };\n }\n return {\n data: result,\n status: \"success\"\n };\n}\nexport function useMutation(mutation) {\n const mutationReference = typeof mutation === \"string\" ? makeFunctionReference(mutation) : mutation;\n const convex = useContext(ConvexContext);\n if (convex === void 0) {\n throw new Error(\n \"Could not find Convex client! `useMutation` must be used in the React component tree under `ConvexProvider`. Did you forget it? See https://docs.convex.dev/quick-start#set-up-convex-in-your-react-app\"\n );\n }\n return useMemo(\n () => createMutation(mutationReference, convex),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [convex, getFunctionName(mutationReference)]\n );\n}\nexport function useAction(action) {\n const convex = useContext(ConvexContext);\n const actionReference = typeof action === \"string\" ? makeFunctionReference(action) : action;\n if (convex === void 0) {\n throw new Error(\n \"Could not find Convex client! `useAction` must be used in the React component tree under `ConvexProvider`. Did you forget it? See https://docs.convex.dev/quick-start#set-up-convex-in-your-react-app\"\n );\n }\n return useMemo(\n () => createAction(actionReference, convex),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [convex, getFunctionName(actionReference)]\n );\n}\nexport function useConvexConnectionState() {\n const convex = useContext(ConvexContext);\n if (convex === void 0) {\n throw new Error(\n \"Could not find Convex client! `useConvexConnectionState` must be used in the React component tree under `ConvexProvider`. Did you forget it? See https://docs.convex.dev/quick-start#set-up-convex-in-your-react-app\"\n );\n }\n const getCurrentValue = useCallback(() => {\n return convex.connectionState();\n }, [convex]);\n const subscribe = useCallback(\n (callback) => {\n return convex.subscribeToConnectionState(() => {\n callback();\n });\n },\n [convex]\n );\n return useSubscription({ getCurrentValue, subscribe });\n}\nfunction assertNotAccidentalArgument(value) {\n if (typeof value === \"object\" && value !== null && \"bubbles\" in value && \"persist\" in value && \"isDefaultPrevented\" in value) {\n throw new Error(\n `Convex function called with SyntheticEvent object. Did you use a Convex function as an event handler directly? Event handlers like onClick receive an event object as their first argument. These SyntheticEvent objects are not valid Convex values. Try wrapping the function like \\`const handler = () => myMutation();\\` and using \\`handler\\` in the event handler.`\n );\n }\n}\n//# sourceMappingURL=client.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { convexToJson } from \"../values/index.js\";\nimport { getFunctionName } from \"../server/api.js\";\nexport class QueriesObserver {\n constructor(createWatch) {\n __publicField(this, \"createWatch\");\n __publicField(this, \"queries\");\n __publicField(this, \"listeners\");\n this.createWatch = createWatch;\n this.queries = {};\n this.listeners = /* @__PURE__ */ new Set();\n }\n setQueries(newQueries) {\n for (const identifier of Object.keys(newQueries)) {\n const { query, args, paginationOptions } = newQueries[identifier];\n getFunctionName(query);\n if (this.queries[identifier] === void 0) {\n this.addQuery(\n identifier,\n query,\n args,\n paginationOptions ? { paginationOptions } : {}\n );\n } else {\n const existingInfo = this.queries[identifier];\n if (getFunctionName(query) !== getFunctionName(existingInfo.query) || JSON.stringify(convexToJson(args)) !== JSON.stringify(convexToJson(existingInfo.args)) || JSON.stringify(paginationOptions) !== JSON.stringify(existingInfo.paginationOptions)) {\n this.removeQuery(identifier);\n this.addQuery(\n identifier,\n query,\n args,\n paginationOptions ? { paginationOptions } : {}\n );\n }\n }\n }\n for (const identifier of Object.keys(this.queries)) {\n if (newQueries[identifier] === void 0) {\n this.removeQuery(identifier);\n }\n }\n }\n subscribe(listener) {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n getLocalResults(queries) {\n const result = {};\n for (const identifier of Object.keys(queries)) {\n const { query, args } = queries[identifier];\n const paginationOptions = queries[identifier].paginationOptions;\n getFunctionName(query);\n const watch = this.createWatch(\n query,\n args,\n paginationOptions ? { paginationOptions } : {}\n );\n let value;\n try {\n value = watch.localQueryResult();\n } catch (e) {\n if (e instanceof Error) {\n value = e;\n } else {\n throw e;\n }\n }\n result[identifier] = value;\n }\n return result;\n }\n setCreateWatch(createWatch) {\n this.createWatch = createWatch;\n for (const identifier of Object.keys(this.queries)) {\n const { query, args, watch, paginationOptions } = this.queries[identifier];\n const journal = \"journal\" in watch ? watch.journal() : void 0;\n this.removeQuery(identifier);\n this.addQuery(identifier, query, args, {\n ...journal ? { journal } : [],\n ...paginationOptions ? { paginationOptions } : {}\n });\n }\n }\n destroy() {\n for (const identifier of Object.keys(this.queries)) {\n this.removeQuery(identifier);\n }\n this.listeners = /* @__PURE__ */ new Set();\n }\n addQuery(identifier, query, args, {\n paginationOptions,\n journal\n }) {\n if (this.queries[identifier] !== void 0) {\n throw new Error(\n `Tried to add a new query with identifier ${identifier} when it already exists.`\n );\n }\n const watch = this.createWatch(query, args, {\n ...journal ? { journal } : [],\n ...paginationOptions ? { paginationOptions } : {}\n });\n const unsubscribe = watch.onUpdate(() => this.notifyListeners());\n this.queries[identifier] = {\n query,\n args,\n watch,\n unsubscribe,\n ...paginationOptions ? { paginationOptions } : {}\n };\n }\n removeQuery(identifier) {\n const info = this.queries[identifier];\n if (info === void 0) {\n throw new Error(`No query found with identifier ${identifier}.`);\n }\n info.unsubscribe();\n delete this.queries[identifier];\n }\n notifyListeners() {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n//# sourceMappingURL=queries_observer.js.map\n","\"use strict\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useConvex } from \"./client.js\";\nimport { QueriesObserver } from \"./queries_observer.js\";\nimport { useSubscription } from \"./use_subscription.js\";\nexport function useQueries(queries) {\n const convex = useConvex();\n if (convex === void 0) {\n throw new Error(\n \"Could not find Convex client! `useQuery` must be used in the React component tree under `ConvexProvider`. Did you forget it? See https://docs.convex.dev/quick-start#set-up-convex-in-your-react-app\"\n );\n }\n const createWatch = useMemo(() => {\n return (query, args, {\n journal,\n paginationOptions\n }) => {\n if (paginationOptions) {\n return convex.watchPaginatedQuery(query, args, paginationOptions);\n } else {\n return convex.watchQuery(query, args, journal ? { journal } : {});\n }\n };\n }, [convex]);\n return useQueriesHelper(queries, createWatch);\n}\nexport function useQueriesHelper(queries, createWatch) {\n const [observer] = useState(() => new QueriesObserver(createWatch));\n if (observer.createWatch !== createWatch) {\n observer.setCreateWatch(createWatch);\n }\n useEffect(() => () => observer.destroy(), [observer]);\n const subscription = useMemo(\n () => ({\n getCurrentValue: () => {\n return observer.getLocalResults(queries);\n },\n subscribe: (callback) => {\n observer.setQueries(queries);\n return observer.subscribe(callback);\n }\n }),\n [observer, queries]\n );\n return useSubscription(subscription);\n}\n//# sourceMappingURL=use_queries.js.map\n","var i=Symbol.for(\"preact-signals\");function t(){if(!(s>1)){var i,t=!1;while(void 0!==h){var n=h;h=void 0;v++;while(void 0!==n){var r=n.o;n.o=void 0;n.f&=-3;if(!(8&n.f)&&a(n))try{n.c()}catch(n){if(!t){i=n;t=!0}}n=r}}v=0;s--;if(t)throw i}else s--}function n(i){if(s>0)return i();s++;try{return i()}finally{t()}}var r=void 0;function o(i){var t=r;r=void 0;try{return i()}finally{r=t}}var f,h=void 0,s=0,v=0,u=0;function e(i){if(void 0!==r){var t=i.n;if(void 0===t||t.t!==r){t={i:0,S:i,p:r.s,n:void 0,t:r,e:void 0,x:void 0,r:t};if(void 0!==r.s)r.s.n=t;r.s=t;i.n=t;if(32&r.f)i.S(t);return t}else if(-1===t.i){t.i=0;if(void 0!==t.n){t.n.p=t.p;if(void 0!==t.p)t.p.n=t.n;t.p=r.s;t.n=void 0;r.s.n=t;r.s=t}return t}}}function d(i,t){this.v=i;this.i=0;this.n=void 0;this.t=void 0;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}d.prototype.brand=i;d.prototype.h=function(){return!0};d.prototype.S=function(i){var t=this,n=this.t;if(n!==i&&void 0===i.e){i.x=n;this.t=i;if(void 0!==n)n.e=i;else o(function(){var i;null==(i=t.W)||i.call(t)})}};d.prototype.U=function(i){var t=this;if(void 0!==this.t){var n=i.e,r=i.x;if(void 0!==n){n.x=r;i.e=void 0}if(void 0!==r){r.e=n;i.x=void 0}if(i===this.t){this.t=r;if(void 0===r)o(function(){var i;null==(i=t.Z)||i.call(t)})}}};d.prototype.subscribe=function(i){var t=this;return m(function(){var n=t.value,o=r;r=void 0;try{i(n)}finally{r=o}},{name:\"sub\"})};d.prototype.valueOf=function(){return this.value};d.prototype.toString=function(){return this.value+\"\"};d.prototype.toJSON=function(){return this.value};d.prototype.peek=function(){var i=r;r=void 0;try{return this.value}finally{r=i}};Object.defineProperty(d.prototype,\"value\",{get:function(){var i=e(this);if(void 0!==i)i.i=this.i;return this.v},set:function(i){if(i!==this.v){if(v>100)throw new Error(\"Cycle detected\");this.v=i;this.i++;u++;s++;try{for(var n=this.t;void 0!==n;n=n.x)n.t.N()}finally{t()}}}});function c(i,t){return new d(i,t)}function a(i){for(var t=i.s;void 0!==t;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function l(i){for(var t=i.s;void 0!==t;t=t.n){var n=t.S.n;if(void 0!==n)t.r=n;t.S.n=t;t.i=-1;if(void 0===t.n){i.s=t;break}}}function y(i){var t=i.s,n=void 0;while(void 0!==t){var r=t.p;if(-1===t.i){t.S.U(t);if(void 0!==r)r.n=t.n;if(void 0!==t.n)t.n.p=r}else n=t;t.S.n=t.r;if(void 0!==t.r)t.r=void 0;t=r}i.s=n}function w(i,t){d.call(this,void 0);this.x=i;this.s=void 0;this.g=u-1;this.f=4;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}w.prototype=new d;w.prototype.h=function(){this.f&=-3;if(1&this.f)return!1;if(32==(36&this.f))return!0;this.f&=-5;if(this.g===u)return!0;this.g=u;this.f|=1;if(this.i>0&&!a(this)){this.f&=-2;return!0}var i=r;try{l(this);r=this;var t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++}}catch(i){this.v=i;this.f|=16;this.i++}r=i;y(this);this.f&=-2;return!0};w.prototype.S=function(i){if(void 0===this.t){this.f|=36;for(var t=this.s;void 0!==t;t=t.n)t.S.S(t)}d.prototype.S.call(this,i)};w.prototype.U=function(i){if(void 0!==this.t){d.prototype.U.call(this,i);if(void 0===this.t){this.f&=-33;for(var t=this.s;void 0!==t;t=t.n)t.S.U(t)}}};w.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var i=this.t;void 0!==i;i=i.x)i.t.N()}};Object.defineProperty(w.prototype,\"value\",{get:function(){if(1&this.f)throw new Error(\"Cycle detected\");var i=e(this);this.h();if(void 0!==i)i.i=this.i;if(16&this.f)throw this.v;return this.v}});function b(i,t){return new w(i,t)}function _(i){var n=i.u;i.u=void 0;if(\"function\"==typeof n){s++;var o=r;r=void 0;try{n()}catch(t){i.f&=-2;i.f|=8;p(i);throw t}finally{r=o;t()}}}function p(i){for(var t=i.s;void 0!==t;t=t.n)t.S.U(t);i.x=void 0;i.s=void 0;_(i)}function g(i){if(r!==this)throw new Error(\"Out-of-order effect\");y(this);r=i;this.f&=-2;if(8&this.f)p(this);t()}function S(i,t){this.x=i;this.u=void 0;this.s=void 0;this.o=void 0;this.f=32;this.name=null==t?void 0:t.name;if(f)f.push(this)}S.prototype.c=function(){var i=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var t=this.x();if(\"function\"==typeof t)this.u=t}finally{i()}};S.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;_(this);l(this);s++;var i=r;r=this;return g.bind(this,i)};S.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.o=h;h=this}};S.prototype.d=function(){this.f|=8;if(!(1&this.f))p(this)};S.prototype.dispose=function(){this.d()};function m(i,t){var n=new S(i,t);try{n.c()}catch(i){n.d();throw i}var r=n.d.bind(n);r[Symbol.dispose]=r;return r}function E(i){return function(){var t=arguments,r=this;return n(function(){return o(function(){return i.apply(r,[].slice.call(t))})})}}function x(){var i=f;f=[];return function(){var t=f;if(f&&i)i=i.concat(f);f=i;return t}}function C(i){return function(){var t,n,r=x();try{n=i.apply(void 0,[].slice.call(arguments))}catch(i){f=void 0;throw i}finally{t=r()}for(var o in n)if(\"function\"==typeof n[o])n[o]=E(n[o]);n[Symbol.dispose]=E(function(){if(t)for(var i=0;i<t.length;i++)t[i].dispose();t=void 0});return n}}export{w as Computed,S as Effect,d as Signal,E as action,n as batch,b as computed,C as createModel,m as effect,c as signal,o as untracked};//# sourceMappingURL=signals-core.module.js.map\n","import{Component as i,options as n,isValidElement as t,Fragment as r}from\"preact\";import{useMemo as o,useRef as f,useEffect as e}from\"preact/hooks\";import{effect as u,Signal as a,computed as c,signal as v,batch as s}from\"@preact/signals-core\";export{Signal,action,batch,computed,createModel,effect,signal,untracked}from\"@preact/signals-core\";var l,h,d,p=\"undefined\"!=typeof window&&!!window.__PREACT_SIGNALS_DEVTOOLS__,m=[],_=[];u(function(){l=this.N})();function g(i,t){n[i]=t.bind(null,n[i]||function(){})}function b(i){if(d){var n=d;d=void 0;n()}d=i&&i.S()}function y(i){var n=this,r=i.data,f=useSignal(r);f.value=r;var e=o(function(){var i=n,r=n.__v;while(r=r.__)if(r.__c){r.__c.__$f|=4;break}var o=c(function(){var i=f.value.value;return 0===i?0:!0===i?\"\":i||\"\"}),e=c(function(){return!Array.isArray(o.value)&&!t(o.value)}),a=u(function(){this.N=F;if(e.value){var n=o.value;if(i.__v&&i.__v.__e&&3===i.__v.__e.nodeType)i.__v.__e.data=n}}),v=n.__$u.d;n.__$u.d=function(){a();v.call(this)};return[e,o]},[]),a=e[0],v=e[1];return a.value?v.peek():v.value}y.displayName=\"ReactiveTextNode\";Object.defineProperties(a.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:y},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});g(\"__b\",function(i,n){if(\"string\"==typeof n.type){var t,r=n.props;for(var o in r)if(\"children\"!==o){var f=r[o];if(f instanceof a){if(!t)n.__np=t={};t[o]=f;r[o]=f.peek()}}}i(n)});g(\"__r\",function(i,n){i(n);if(n.type!==r){b();var t,o=n.__c;if(o){o.__$f&=-2;if(void 0===(t=o.__$u))o.__$u=t=function(i,n){var t;u(function(){t=this},{name:n});t.c=i;return t}(function(){var i;if(p)null==(i=t.y)||i.call(t);o.__$f|=1;o.setState({})},\"function\"==typeof n.type?n.type.displayName||n.type.name:\"\")}h=o;b(t)}});g(\"__e\",function(i,n,t,r){b();h=void 0;i(n,t,r)});g(\"diffed\",function(i,n){b();h=void 0;var t;if(\"string\"==typeof n.type&&(t=n.__e)){var r=n.__np,o=n.props;if(r){var f=t.U;if(f)for(var e in f){var u=f[e];if(void 0!==u&&!(e in r)){u.d();f[e]=void 0}}else{f={};t.U=f}for(var a in r){var c=f[a],v=r[a];if(void 0===c){c=w(t,a,v,o);f[a]=c}else c.o(v,o)}}}i(n)});function w(i,n,t,r){var o=n in i&&void 0===i.ownerSVGElement,f=v(t);return{o:function(i,n){f.value=i;r=n},d:u(function(){this.N=F;var t=f.value.value;if(r[n]!==t){r[n]=t;if(o)i[n]=t;else if(null!=t&&(!1!==t||\"-\"===n[4]))i.setAttribute(n,t);else i.removeAttribute(n)}})}}g(\"unmount\",function(i,n){if(\"string\"==typeof n.type){var t=n.__e;if(t){var r=t.U;if(r){t.U=void 0;for(var o in r){var f=r[o];if(f)f.d()}}}}else{var e=n.__c;if(e){var u=e.__$u;if(u){e.__$u=void 0;u.d()}}}i(n)});g(\"__h\",function(i,n,t,r){if(r<3||9===r)n.__$f|=2;i(n,t,r)});i.prototype.shouldComponentUpdate=function(i,n){if(this.__R)return!0;var t=this.__$u,r=t&&void 0!==t.s;for(var o in n)return!0;if(this.__f||\"boolean\"==typeof this.u&&!0===this.u){var f=2&this.__$f;if(!(r||f||4&this.__$f))return!0;if(1&this.__$f)return!0}else{if(!(r||4&this.__$f))return!0;if(3&this.__$f)return!0}for(var e in i)if(\"__source\"!==e&&i[e]!==this.props[e])return!0;for(var u in this.props)if(!(u in i))return!0;return!1};function useSignal(i,n){return o(function(){return v(i,n)},[])}function useComputed(i,n){var t=f(i);t.current=i;h.__$f|=4;return o(function(){return c(function(){return t.current()},n)},[])}var k=\"undefined\"==typeof requestAnimationFrame?setTimeout:function(i){var n=function(){clearTimeout(t);cancelAnimationFrame(r);i()},t=setTimeout(n,35),r=requestAnimationFrame(n)},q=function(i){queueMicrotask(function(){queueMicrotask(i)})};function A(){s(function(){var i;while(i=m.shift())l.call(i)})}function T(){if(1===m.push(this))(n.requestAnimationFrame||k)(A)}function x(){s(function(){var i;while(i=_.shift())l.call(i)})}function F(){if(1===_.push(this))(n.requestAnimationFrame||q)(x)}function useSignalEffect(i,n){var t=f(i);t.current=i;e(function(){return u(function(){this.N=T;return t.current()},n)},[])}function M(i){var n=o(function(){return i()},[]);e(function(){return n[Symbol.dispose]},[n]);return n}export{useComputed,M as useModel,useSignal,useSignalEffect};//# sourceMappingURL=signals.module.js.map\n","import { signal } from '@preact/signals'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Whether the chat window is currently open.\n *\n * Lives in its own file because it is read and written across multiple layers:\n * - widget-instance.ts open() / close() / toggle() / subscribe()\n * - mount.tsx reset to false on shutdown\n * - WidgetShell.tsx conditionally renders the chat window\n * - FAB.tsx toggle button reads and flips this value\n *\n * Keeping it here prevents any one of those files from becoming the\n * \"source\" that others import from — none of them own it, they all share it.\n */\nexport const isOpen = signal(false)\n\n/** Session source tag, e.g. \"dashboard-test\". Set once during mount. */\nexport const widgetSource = signal<string | undefined>(undefined)\n\nexport const PLATFORM_PRIVACY_POLICY_URL = 'https://jexitychat.de/privacy'\n\nexport const resolvedPrivacyPolicyUrl = signal(PLATFORM_PRIVACY_POLICY_URL)\n\nexport const privacyNoticeStyle = signal<'chip' | 'explicit'>('chip')\n\n/** Bootstrap token issued by POST /widget/bootstrap. Read by useConvexSession. */\nexport const bootstrapToken = signal<Id<'widgetBootstrapTokens'> | undefined>(undefined)\n\n/**\n * Path-scoped allow URLs from the bootstrap response (e.g. [\"https://example.com/en\", \"https://example.com/ru\"]).\n * Multiple entries arise when a project has several path rules for the same origin.\n * Set once after bootstrap; consumed by usePathGuard. Empty = no path restriction.\n */\nexport const allowedUrls = signal<string[]>([])\n\n/**\n * Per-domain exclude paths from the bootstrap response.\n * Paths listed here hide the widget even when the domain/origin is allowed.\n * Set once after bootstrap; consumed by usePathGuard.\n */\nexport const excludedPaths = signal<string[]>([])\n\n/**\n * Inputs needed to re-POST /widget/bootstrap when the current token expires\n * mid-session. Populated by useBootstrap on mount (both IIFE preToken path\n * and ESM async-fetch path). Consumed by refreshBootstrapToken().\n */\nexport const bootstrapInputs = signal<{\n orgSlug: string\n projSlug: string | undefined\n siteUrl: string\n} | null>(null)\n","/**\n * Convex URL normalisation helpers.\n *\n * VITE_CONVEX_URL accepts either Convex URL format:\n * https://<name>.convex.cloud — WebSocket / REST API base\n * https://<name>.convex.site — HTTP Actions base\n *\n * These helpers normalise whichever format is provided to the one needed\n * by each consumer, so only a single env var is required.\n *\n * The \\b word-boundary in each regex prevents partial matches if the\n * hostname ever contains the pattern mid-string.\n */\n\n/** Returns the .convex.cloud URL regardless of which format is provided. */\nexport function toConvexCloudUrl(url: string): string {\n return url.replace(/\\.convex\\.site\\b/, '.convex.cloud')\n}\n\n/** Returns the .convex.site URL regardless of which format is provided. */\nexport function toConvexSiteUrl(url: string): string {\n return url.replace(/\\.convex\\.cloud\\b/, '.convex.site')\n}\n","import type { JexityChatOptions } from '../types'\n\ntype PrivacyNoticeStyle = 'chip' | 'explicit'\nimport type { WidgetLocale } from '../i18n/index'\n\n/**\n * Fully-resolved widget configuration — produced by merging embed-script\n * options with the Convex remote config (embed options take precedence).\n *\n * All fields with defaults are non-optional so consumers never need ?? chains.\n */\nexport interface ResolvedWidgetConfig {\n // Display\n title: string\n greeting: string\n locale: string | undefined\n // Position / appearance\n position: JexityChatOptions['position']\n colorScheme: JexityChatOptions['colorScheme']\n hideBranding: boolean\n privacyPolicyMode: NonNullable<JexityChatOptions['privacyPolicyMode']>\n privacyPolicyUrl: string | undefined\n privacyNoticeStyle: PrivacyNoticeStyle\n // Floating action button\n triggerIcon: NonNullable<JexityChatOptions['triggerIcon']>\n triggerRadius: NonNullable<JexityChatOptions['triggerRadius']>\n triggerLabel: string\n // Mode\n mode: NonNullable<JexityChatOptions['mode']>\n // Theme overrides (passed through to buildThemeStyle)\n primaryColor: string | undefined\n accentColor: string | undefined\n fontFamily: string | undefined\n fontSize: number | undefined\n borderRadius: string | undefined\n windowWidth: number | undefined\n windowHeight: number | undefined\n}\n\nfunction normalizeHttpUrl(url: string | undefined): string | undefined {\n const trimmed = url?.trim()\n if (!trimmed) { return undefined }\n try {\n const parsed = new URL(trimmed)\n if (parsed.protocol === 'http:' || parsed.protocol === 'https:') { return trimmed }\n } catch {\n return undefined\n }\n return undefined\n}\n\n/**\n * Merges embed-script options with the remote Convex config.\n * Embed-script values always take precedence; remote config fills the gaps.\n *\n * Centralising the merge here means AppShell never needs ?? chains,\n * and any new remote config field has exactly one place to wire it in.\n */\nexport function mergeWidgetConfig(\n options: JexityChatOptions,\n remote: RemoteConfig | null,\n): ResolvedWidgetConfig {\n const title = options.title ?? remote?.title ?? 'Assistant'\n const privacyPolicyMode = options.privacyPolicyMode ?? remote?.privacyPolicyMode ?? 'platform'\n const privacyNoticeStyle = normalizePrivacyNoticeStyle(\n options.privacyNoticeStyle ?? remote?.privacyNoticeStyle,\n )\n return {\n title,\n greeting: options.greeting ?? remote?.welcomeMessage ?? `Hi! I'm ${title}. How can I help?`,\n locale: options.locale ?? remote?.locale,\n position: options.position ?? remote?.position,\n colorScheme: options.colorScheme ?? remote?.colorScheme,\n hideBranding: options.hideBranding ?? remote?.hideBranding ?? false,\n privacyPolicyMode,\n privacyPolicyUrl: privacyPolicyMode === 'custom'\n ? normalizeHttpUrl(options.privacyPolicyUrl ?? remote?.privacyPolicyUrl)\n : undefined,\n privacyNoticeStyle,\n triggerIcon: options.triggerIcon ?? remote?.triggerIcon ?? 'chat',\n triggerRadius: options.triggerRadius ?? remote?.triggerRadius ?? 'full',\n triggerLabel: options.triggerLabel ?? remote?.triggerLabel ?? 'Chatte mit uns',\n mode: options.mode ?? 'floating',\n primaryColor: options.primaryColor ?? remote?.primaryColor,\n accentColor: options.accentColor ?? remote?.accentColor,\n fontFamily: options.fontFamily ?? remote?.fontFamily,\n fontSize: options.fontSize ?? remote?.fontSize,\n borderRadius: options.borderRadius ?? remote?.borderRadius,\n windowWidth: options.windowWidth ?? remote?.windowWidth,\n windowHeight: options.windowHeight ?? remote?.windowHeight,\n }\n}\n\nfunction normalizePrivacyNoticeStyle(style: JexityChatOptions['privacyNoticeStyle']): PrivacyNoticeStyle {\n return style === 'explicit' || style === 'sheet' ? 'explicit' : 'chip'\n}\n\n/**\n * Shape of the response from the public GET /widget/config endpoint.\n *\n * Uses Pick<JexityChatOptions, ...> so that field types stay in sync with\n * the embed-script options automatically — no need to duplicate type definitions.\n *\n * Extra fields (primaryColor, title, welcomeMessage) come from the database\n * and have no equivalent in JexityChatOptions, so they're defined separately.\n */\nexport type RemoteConfig = Pick<JexityChatOptions,\n | 'position' | 'colorScheme' | 'hideBranding'\n | 'accentColor' | 'fontFamily' | 'fontSize'\n | 'borderRadius' | 'windowWidth' | 'windowHeight'\n | 'triggerIcon' | 'triggerRadius' | 'triggerLabel'\n | 'privacyPolicyMode' | 'privacyPolicyUrl' | 'privacyNoticeStyle'\n> & {\n primaryColor: string // always set in DB\n title: string // mapped from widgetConfigs.name\n welcomeMessage: string // mapped from widgetConfigs.welcomeMessage\n locale?: WidgetLocale\n}\n\n/**\n * Fetches the widget's remote configuration from the Convex HTTP endpoint.\n *\n * @param siteUrl The .convex.site base URL (HTTP Actions domain).\n * @param orgSlug The organisation slug embedded in the script tag.\n * @param signal AbortSignal to cancel the request on component unmount.\n *\n * @returns The parsed config, or null if the org is not found (404) or the\n * server returns any non-OK status.\n */\nexport async function fetchRemoteConfig(\n siteUrl: string,\n orgSlug: string,\n signal: AbortSignal,\n projSlug?: string,\n): Promise<RemoteConfig | null> {\n const urlObj = new URL(`${siteUrl}/widget/config`)\n urlObj.searchParams.set('orgSlug', orgSlug)\n if (projSlug) {\n urlObj.searchParams.set('projSlug', projSlug)\n }\n const response = await fetch(urlObj.toString(), { signal })\n\n if (!response.ok) {\n return null\n }\n\n return response.json() as Promise<RemoteConfig>\n}\n","import { useState, useEffect } from 'preact/hooks'\nimport { toConvexSiteUrl } from '../../../lib/convex-url'\nimport { fetchRemoteConfig, type RemoteConfig } from '../../../lib/widget-config'\n\n/**\n * Fetches the widget's remote config from Convex for the given orgSlug.\n *\n * - Returns null on first render, then updates once the fetch resolves.\n * - Clears stale config immediately when orgSlug changes (prevents flashing\n * the previous org's title/colors while the new fetch is in flight).\n * - Aborts the in-flight request if orgSlug changes or the hook unmounts.\n * - Silent fail: any error (network, 404, parse) resolves to null so the\n * widget still renders using embed-script options as a fallback.\n */\nexport function useRemoteConfig(orgSlug: string, projSlug: string | undefined, runtimeConvexUrl?: string): RemoteConfig | null {\n const [remoteConfig, setRemoteConfig] = useState<RemoteConfig | null>(null)\n\n useEffect(() => {\n // Clear stale config immediately — the widget should not show the previous\n // org's title/colors while the new fetch is still in flight.\n setRemoteConfig(null)\n\n const convexUrl = runtimeConvexUrl ?? import.meta.env.VITE_CONVEX_URL\n const siteUrl = convexUrl ? toConvexSiteUrl(convexUrl) : undefined\n\n // No Convex URL configured or orgSlug missing — skip the fetch entirely\n if (!siteUrl || !orgSlug) { return }\n\n const controller = new AbortController()\n\n async function load(url: string): Promise<void> {\n try {\n const cfg = await fetchRemoteConfig(url, orgSlug, controller.signal, projSlug)\n if (cfg) { setRemoteConfig(cfg) }\n } catch (err) {\n // AbortError is expected when orgSlug changes or the widget unmounts.\n if (err instanceof Error && err.name === 'AbortError') { return }\n // Any other error (network failure, 404, parse error) is a silent fail.\n // The widget renders with embed-script options as a fallback.\n }\n }\n\n void load(siteUrl)\n\n return () => { controller.abort() }\n }, [orgSlug, projSlug, runtimeConvexUrl])\n\n return remoteConfig\n}\n","/**\n * Calls POST /widget/bootstrap on the Convex HTTP actions endpoint.\n * The browser automatically sends the real `Origin` header — JS cannot forge it.\n * Returns the bootstrap token (a Convex document ID) on success, or an error code.\n */\n\ntype BootstrapOk = { ok: true; token: string; excludePaths: string[]; allowedUrls: string[] }\ntype BootstrapErr = {\n ok: false\n error: 'unauthorized' | 'not_found' | 'network' | 'rate_limited'\n retryAfterSec?: number\n}\ntype BootstrapResult = BootstrapOk | BootstrapErr\n\nexport async function bootstrapWidget(\n orgSlug: string,\n convexSiteUrl: string,\n projSlug?: string,\n): Promise<BootstrapResult> {\n try {\n const resp = await fetch(`${convexSiteUrl}/widget/bootstrap`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(projSlug ? { orgSlug, projSlug } : { orgSlug }),\n credentials: 'omit',\n })\n\n if (resp.ok) {\n const data: { token: string; excludePaths: string[]; allowedUrls?: string[]; allowedUrl?: string } = await resp.json()\n const allowedUrls = data.allowedUrls ?? (data.allowedUrl ? [data.allowedUrl] : [])\n return { ok: true, token: data.token, excludePaths: data.excludePaths, allowedUrls }\n }\n\n if (resp.status === 403) {\n return { ok: false, error: 'unauthorized' }\n }\n if (resp.status === 404) {\n return { ok: false, error: 'not_found' }\n }\n if (resp.status === 429) {\n // Honor server's Retry-After header (seconds); fall back to 60s.\n const retryAfterSec = Number(resp.headers.get('Retry-After')) || 60\n return { ok: false, error: 'rate_limited', retryAfterSec }\n }\n\n return { ok: false, error: 'network' }\n } catch {\n return { ok: false, error: 'network' }\n }\n}\n\n// Keep in sync with packages/backend/convex/lib/widgetOrigin.ts\nexport function isPathExcluded(pathname: string, excludePaths: string[]): boolean {\n return excludePaths.some((excluded) => {\n if (excluded === '/') { return pathname === '/' }\n return pathname === excluded || pathname.startsWith(excluded + '/')\n })\n}\n\nexport function isUrlMatched(currentUrl: string, allowedUrl: string): boolean {\n try {\n const current = new URL(currentUrl)\n const allowed = new URL(allowedUrl)\n if (current.origin !== allowed.origin) { return false }\n const allowedPath = allowed.pathname.replace(/\\/$/, '')\n if (!allowedPath) { return true } // root-domain rule → allow all paths\n const currentPath = current.pathname.replace(/\\/$/, '')\n return currentPath === allowedPath || currentPath.startsWith(allowedPath + '/')\n } catch {\n return false\n }\n}\n","import { useEffect } from 'preact/hooks'\nimport { toConvexSiteUrl } from '../../../lib/convex-url'\nimport { bootstrapWidget } from '../../../lib/widgetBootstrap'\nimport { bootstrapToken, bootstrapInputs, allowedUrls, excludedPaths } from '../shell.state'\n\ninterface UseBootstrapOptions {\n orgSlug: string\n projSlug?: string\n preToken?: string\n convexUrl?: string\n preAllowedUrls?: string[]\n preExcludedPaths?: string[]\n}\n\n/**\n * If no pre-existing bootstrap token was passed via mount options (i.e. the\n * ESM/React path — JexityChatProvider), call POST /widget/bootstrap here and\n * populate the token signal so useConvexSession can create sessions.\n *\n * The IIFE entry bootstraps *before* mount and passes the token in via\n * options.bootstrapToken — in that case preToken is set, this hook no-ops\n * the initial fetch but still records the inputs so refreshBootstrapToken()\n * can re-POST when the 1-hour token TTL elapses mid-session.\n */\nexport function useBootstrap({\n orgSlug,\n projSlug,\n preToken,\n convexUrl,\n preAllowedUrls,\n preExcludedPaths,\n}: UseBootstrapOptions): void {\n useEffect(() => {\n const resolvedConvexUrl = convexUrl ?? (import.meta.env.VITE_CONVEX_URL as string | undefined)\n const siteUrl = resolvedConvexUrl ? toConvexSiteUrl(resolvedConvexUrl) : undefined\n if (!siteUrl || !orgSlug) { return }\n\n // Record inputs for refreshBootstrapToken() — needed by both entry paths\n // so auto-recovery works after the initial fetch (IIFE) or refetch (ESM).\n bootstrapInputs.value = { orgSlug, projSlug, siteUrl }\n\n if (preToken) {\n // Pre-bootstrapped path (IIFE or custom integration): store allowedUrls and\n // excludedPaths from mount options so usePathGuard can enforce path-scoped\n // rules without refetch.\n allowedUrls.value = preAllowedUrls ?? []\n excludedPaths.value = preExcludedPaths ?? []\n return\n }\n\n let cancelled = false\n void (async () => {\n const result = await bootstrapWidget(orgSlug, siteUrl, projSlug)\n if (cancelled) { return }\n if (result.ok) {\n bootstrapToken.value = result.token as typeof bootstrapToken.value\n allowedUrls.value = result.allowedUrls\n excludedPaths.value = result.excludePaths\n } else {\n const scope = projSlug ? `project '${orgSlug}/${projSlug}'` : `org '${orgSlug}'`\n if (result.error === 'unauthorized') {\n console.warn(\n `[JexityChat] Domain not authorized for ${scope}. Check the widget's domain rules.`,\n )\n } else if (result.error === 'not_found') {\n console.error(`[JexityChat] No active widget config found for ${scope}.`)\n } else if (result.error === 'rate_limited') {\n console.error(\n `[JexityChat] Bootstrap rate-limited for ${scope}. Retry after ${result.retryAfterSec ?? 60}s.`,\n )\n } else {\n console.error(`[JexityChat] Bootstrap failed: ${result.error}`)\n }\n }\n })()\n\n return () => { cancelled = true }\n }, [orgSlug, projSlug, preToken, convexUrl])\n}\n","/**\n * Singleton history patch — wraps pushState/replaceState once and notifies\n * all registered listeners on programmatic SPA navigation. Also forwards\n * popstate so listeners don't need to wire it themselves.\n */\n\nconst listeners = new Set<() => void>()\nlet patched = false\n\nfunction ensureHistoryPatch(): void {\n if (patched) { return }\n patched = true\n const origPush = history.pushState.bind(history)\n const origReplace = history.replaceState.bind(history)\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args)\n listeners.forEach(fn => fn())\n }\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args)\n listeners.forEach(fn => fn())\n }\n}\n\n/** Register a navigation listener. Returns a cleanup function. */\nexport function addHistoryListener(fn: () => void): () => void {\n listeners.add(fn)\n window.addEventListener('popstate', fn)\n ensureHistoryPatch()\n return () => {\n listeners.delete(fn)\n window.removeEventListener('popstate', fn)\n }\n}\n","import { useEffect } from 'preact/hooks'\nimport { useSignal } from '@preact/signals'\nimport { isUrlMatched, isPathExcluded } from '../../../lib/widgetBootstrap'\nimport { addHistoryListener } from '../../../lib/history-patch'\nimport { allowedUrls, excludedPaths } from '../shell.state'\n\n/**\n * Returns true when the widget is allowed to display on the current page.\n * If no path-scoped allowedUrls are set, always returns true.\n * Reacts to SPA navigation (popstate + history.pushState/replaceState).\n */\nexport function usePathGuard(): boolean {\n const href = useSignal(window.location.href)\n\n useEffect(() => {\n const update = () => { href.value = window.location.href }\n return addHistoryListener(update)\n }, [])\n\n const urls = allowedUrls.value\n const excluded = excludedPaths.value\n const pathname = new URL(href.value).pathname\n\n // Compute once — reused in warn effect and guard logic.\n const isExcluded = isPathExcluded(pathname, excluded)\n\n useEffect(() => {\n if (isExcluded) {\n console.warn(\n `[JexityChat] Widget hidden — current path is in the exclude list: ${pathname}`,\n )\n } else if (urls.length > 0 && !urls.some((url) => isUrlMatched(href.value, url))) {\n console.warn(\n `[JexityChat] Widget hidden — current page does not match path rule. Allowed: ${urls.join(', ')}`,\n )\n }\n }, [href.value, urls, excluded])\n\n // Exclude check takes priority — an excluded path hides the widget even if\n // the allow-rule would otherwise permit it.\n if (isExcluded) { return false }\n if (urls.length === 0) { return true }\n return urls.some((url) => isUrlMatched(href.value, url))\n}\n","// Keep in sync with de.ts — both must export the same WidgetStrings shape.\nexport interface WidgetStrings {\n title: string\n statusOnline: string\n inputPlaceholder: string\n aiThinking: string\n sendAriaLabel: string\n attachImagesAriaLabel: string\n attachComingSoon: string\n removeAttachmentAriaLabel: string\n openChatAriaLabel: string\n closeChatAriaLabel: string\n errorNetwork: string\n errorQuota: string\n errorRateLimited: string\n /** Shown when the widget couldn't get a bootstrap token (POST /widget/bootstrap failed or 10s wait timed out). */\n errorSessionNoToken: string\n /** Shown when the bootstrap token was rejected and a refresh also failed. */\n errorSessionUnauthorized: string\n localeLabelDe: string\n localeLabelEn: string\n resumeConversation: string\n startingConversation: string\n sessionNotFound: string\n startNewConversation: string\n chatWith: string\n haveReferenceNumber: string\n referencePlaceholder: string\n resume: string\n howCanWeHelp: string\n getInstantHelp: string\n submitTicket: string\n replyByEmail: string\n ticketSubmitted: string\n yourReferenceNumber: string\n sentToEmailHint: string\n done: string\n submittingTicket: string\n yourName: string\n yourEmail: string\n submit: string\n back: string\n // Escalation form (inline in chat thread)\n escalationFormTitle: string\n escalationNameLabel: string\n escalationEmailLabel: string\n escalationSubtitle: string\n escalationSubmit: string\n escalationSubmitting: string\n escalationSubmitted: string\n escalationConsent: string\n escalationPrivacyLinkText: string\n escalationSkip: string\n escalationPromptTitle: string\n escalationPromptSubtitle: string\n escalationPromptSubmit: string\n escalationSubmitFailed: string\n // Session resume prompt\n sessionNotFoundPrompt: string\n /** Privacy notice shown on Home after the idle/visibility lock wiped the chat. */\n sessionLocked: string\n // Resolved session\n sessionResolved: string\n tryAgain: string\n goBack: string\n somethingWentWrong: string\n fabLabel: string\n /** Shown when a session belongs to an org that has been deleted. */\n chatNoLongerAvailable: string\n // Handoff & resume list\n talkToHuman: string\n talkToHumanAria: string\n handoffPending: string\n handoffFailed: string\n handoffRateLimited: string\n resumeListLabel: string\n resumeListTimestamp: string\n // System notices (mirror backend `noticeKind`; `{name}` = joining agent)\n noticeAgentJoined: string\n noticeHumanRequested: string\n noticeHumanRequestedForm: string\n /** Markdown confirmation card. `{name}` `{email}` `{ref}` are interpolated. */\n noticeEscalationConfirmed: string\n /** Free-tier/quota fallback shown when no AI reply will come. */\n noticeMessageReceived: string\n /** Shown when a human agent owns the session and the AI is suppressed. */\n noticeAgentHandling: string\n /** Reply-to-agent button aria-label/title. `{name}` is interpolated. */\n replyTo: string\n /** Sources pill count. `{count}` is interpolated. */\n sourcesCountOne: string\n sourcesCountOther: string\n /** Privacy notice below composer. Split so the link can be wrapped in <a>. */\n privacyNoticePre: string\n privacyPolicyLinkText: string\n privacyChipText: string\n privacyExplicitTitle: string\n privacyExplicitBodyPre: string\n privacyExplicitButton: string\n // Magicline integration forms (inline in chat thread)\n magiclineTrialTitle: string\n magiclineLeadTitle: string\n magiclineFirstName: string\n magiclineLastName: string\n magiclineEmail: string\n magiclinePhone: string\n magiclineBirthDate: string\n magiclineInterest: string\n magiclineMessage: string\n magiclineSlotLabel: string\n magiclineSlotPlaceholder: string\n magiclineLoadingSlots: string\n magiclineNoSlots: string\n magiclineSubmit: string\n magiclineSubmitting: string\n magiclineSubmitted: string\n magiclineSubmittedDetail: string\n magiclineFailed: string\n magiclineFailedDetail: string\n magiclineConsent: string\n magiclinePrivacyLinkText: string\n magiclineRequiredError: string\n magiclineEmailError: string\n magiclineConsentError: string\n // Dynamic per-studio trial form (v2)\n magiclineConfigLoading: string\n magiclineConfigUnsupported: string\n magiclineConfigInconsistent: string\n magiclineConfigUnavailable: string\n magiclineGender: string\n magiclineGenderPlaceholder: string\n magiclineGenderMale: string\n magiclineGenderFemale: string\n magiclineGenderUnisex: string\n magiclineStreet: string\n magiclineHouseNumber: string\n magiclineZip: string\n magiclineCity: string\n magiclineCountry: string\n magiclineCountryPlaceholder: string\n magiclineNote: string\n /** Suffix appended to a config-driven field label when the studio marks it optional. */\n magiclineOptionalSuffix: string\n magiclineTrainerRequired: string\n magiclineMinAgeError: string\n magiclineSlotRequiredError: string\n magiclineSlotUnavailableNotice: string\n // Step wizard (v3)\n magiclineStepTrainer: string\n magiclineStepSlot: string\n magiclineStepPersonal: string\n magiclineStepAddress: string\n magiclineStepConfirm: string\n /** \"Step {n} of {total}\". `{n}` and `{total}` interpolated. */\n magiclineStepCounter: string\n magiclineWizardBack: string\n magiclineWizardNext: string\n magiclineTrainerWith: string\n magiclineTrainerWithout: string\n magiclineSummaryTrainer: string\n magiclineSummarySlot: string\n magiclineSummaryName: string\n magiclineRetry: string\n /** Distinct from `magiclineNoSlots` — a retryable load failure, not empty. */\n magiclineSlotsError: string\n\n // Membership signup wizard (contract creation)\n magiclineContractTitle: string\n magiclineStepOffer: string\n magiclineStepUpgrades: string\n magiclineStepPayment: string\n magiclineStepReview: string\n magiclineOffersLoading: string\n magiclineOffersError: string\n magiclineNoOffers: string\n /** \"{value} {unit}\" term length, e.g. \"12 months\". */\n magiclineTermLength: string\n // Payment-frequency suffixes used by formatPaymentFrequency\n /** \"per day\" (value === 1) */\n magiclineFreqPerDay: string\n /** \"per week\" (value === 1) */\n magiclineFreqPerWeek: string\n /** \"per month\" (value === 1) */\n magiclineFreqPerMonth: string\n /** \"per year\" (value === 1) */\n magiclineFreqPerYear: string\n /** \"every {n} days\" (value > 1) — \"{n}\" interpolated by caller */\n magiclineFreqEveryDays: string\n /** \"every {n} weeks\" (value > 1) — \"{n}\" interpolated by caller */\n magiclineFreqEveryWeeks: string\n /** \"every {n} months\" (value > 1) — \"{n}\" interpolated by caller */\n magiclineFreqEveryMonths: string\n /** \"every {n} years\" (value > 1) — \"{n}\" interpolated by caller */\n magiclineFreqEveryYears: string\n // Module price label suffixes\n /** \"per term\" price suffix for TERM_BASED modules */\n magiclineModulePerTerm: string\n /** \"one-time\" price suffix for NON_RECURRING / MONTH_DAY modules */\n magiclineModuleOneTime: string\n /** \"included\" label for FREE modules */\n magiclineModuleIncluded: string\n // Module renewal labels\n /** Renewal line when extensionType is \"NONE\" */\n magiclineRenewalNone: string\n /** \"Renewal: {n} {unit}\" prefix — \"{n}\" and \"{unit}\" interpolated by caller */\n magiclineRenewalTerm: string\n magiclineCancellationPeriod: string\n magiclineStarterPackage: string\n magiclineFlatFee: string\n magiclineIncludedModules: string\n /** Disclosure label for the collapsible bundle details on the offer step. */\n magiclineDetails: string\n /** Caption above a required consent checkbox (upgrade + contract block). */\n magiclineRequired: string\n // Optional upgrades (paid add-on modules) step\n magiclineUpgradesIntro: string\n magiclineUpgradesNone: string\n magiclineUpgradeAdd: string\n magiclineUpgradeAdded: string\n magiclineUpgradeOneTime: string\n magiclineUpgradeConsentError: string\n magiclineOfferRequiredError: string\n magiclineCountryStatic: string\n magiclineAccountHolder: string\n magiclineIban: string\n magiclineIbanInvalidError: string\n magiclineSepaConsent: string\n magiclineReviewLoading: string\n magiclineReviewError: string\n magiclineReviewOffer: string\n magiclineReviewPriceSummary: string\n magiclineReviewBasePrice: string\n magiclineReviewOneTimeFees: string\n magiclineReviewPreUseCharge: string\n magiclineReviewSelectedUpgrades: string\n magiclineReviewContractVolume: string\n magiclineReviewStartsOn: string\n magiclineReviewPayment: string\n magiclineReviewTerms: string\n /** Generic prompt above the contract confirmation checkboxes. */\n magiclineConfirmPrompt: string\n /** Validation error when a required confirmation is not ticked. */\n magiclineConfirmRequiredError: string\n magiclineSummaryAddress: string\n magiclineContractSubmitted: string\n /** \"{number}\" interpolated with the Magicline customer number. */\n magiclineCustomerNumber: string\n magiclinePriceChangedNotice: string\n magiclineOfferUnavailableNotice: string\n magiclineConfirmationRequiredNotice: string\n magiclineLiveSubmissionDisabled: string\n magiclineDuplicateNotice: string\n magiclineUnknownOutcome: string\n /** Localized label for the \"Startpaket\" flat fee returned by Magicline. */\n magiclineFeeStarterPackage: string\n /** Localized label for the \"Trainerpauschale\" flat fee returned by Magicline. */\n magiclineFeeTrainerFee: string\n}\n\nexport const en: WidgetStrings = {\n title: 'Assistant',\n statusOnline: 'Online \\u00b7 Responds in seconds',\n inputPlaceholder: 'Type a message\\u2026',\n aiThinking: 'AI is responding\\u2026',\n sendAriaLabel: 'Send message',\n attachImagesAriaLabel: 'Attach images',\n attachComingSoon: 'File attachments — coming soon',\n removeAttachmentAriaLabel: 'Remove attachment',\n openChatAriaLabel: 'Open chat',\n closeChatAriaLabel: 'Close chat',\n errorNetwork: 'Network error. Please try again.',\n errorQuota: 'Message limit reached. Please try again later.',\n errorRateLimited: 'Too many messages. Try again in {seconds}s.',\n errorSessionNoToken: 'Could not connect to chat. Check your connection and try again.',\n errorSessionUnauthorized: 'This chat is not authorised on this page. Please reload.',\n localeLabelDe: 'DE',\n localeLabelEn: 'EN',\n resumeConversation: 'Resuming conversation…',\n startingConversation: 'Starting conversation…',\n sessionNotFound: 'Your previous session was not found. Starting a new conversation.',\n startNewConversation: 'Start new conversation',\n chatWith: 'Chat with {title}',\n haveReferenceNumber: 'Have a reference number?',\n referencePlaceholder: 'e.g. JEX-A3B7C2',\n resume: 'Resume',\n howCanWeHelp: 'How can we help?',\n getInstantHelp: 'Get instant help',\n submitTicket: 'Submit a ticket',\n replyByEmail: \"We'll reply by email\",\n ticketSubmitted: 'Ticket submitted',\n yourReferenceNumber: 'Your reference number:',\n sentToEmailHint: \"We've sent it to your email. Use this number to follow up.\",\n done: 'Done',\n submittingTicket: 'Submitting your ticket\\u2026',\n yourName: 'Your name',\n yourEmail: 'Your email',\n submit: 'Submit',\n back: 'Go back',\n // Escalation form\n escalationFormTitle: 'Leave your details',\n escalationSubtitle: 'Our team will get back to you by email so you don\\u2019t have to wait here.',\n escalationNameLabel: 'Your name',\n escalationEmailLabel: 'Your email',\n escalationSubmit: 'Send to team',\n escalationSubmitting: 'Sending\\u2026',\n escalationSubmitted: 'Request submitted',\n escalationConsent: 'By submitting, you agree to our',\n escalationPrivacyLinkText: 'Privacy Policy',\n escalationSkip: 'Skip, I\\u2019ll wait here',\n escalationPromptTitle: 'Talk to our team',\n escalationPromptSubtitle: 'We can notify you by email when our team replies.',\n escalationPromptSubmit: 'Leave details',\n escalationSubmitFailed: 'Failed to submit. Please try again.',\n // Session resume prompt\n sessionNotFoundPrompt: 'Session not found. Would you like to start a new conversation?',\n sessionLocked: 'For your privacy, this conversation was closed after a period of inactivity. Enter your reference to resume, or start a new conversation.',\n // Resolved session\n sessionResolved: 'This conversation has been resolved.',\n tryAgain: 'Try again',\n goBack: 'Go back',\n somethingWentWrong: 'Something went wrong',\n fabLabel: 'Chat with us',\n chatNoLongerAvailable: 'This chat is no longer available.',\n // Handoff & resume list\n talkToHuman: 'Talk to human',\n talkToHumanAria: 'Talk to a human agent',\n handoffPending: 'Connecting you to a human agent…',\n handoffFailed: 'Could not request a human agent. Try again.',\n handoffRateLimited: 'You requested an agent recently. Please wait before trying again.',\n resumeListLabel: 'Continue conversation',\n resumeListTimestamp: '{minutes}m ago',\n noticeAgentJoined: '{name} has joined the conversation.',\n noticeHumanRequested: 'You requested to speak with a human agent.',\n noticeHumanRequestedForm: 'You requested to speak with a human agent. Please share your contact details below.',\n noticeEscalationConfirmed: 'Thank you {name}! A human agent will be available soon.\\nWe will contact you at {email} when an agent is ready.\\n\\nYour reference: **{ref}**\\nUse it to resume this conversation from any device.',\n noticeMessageReceived: 'Your message has been received. A team member will respond shortly.',\n noticeAgentHandling: 'Your conversation is with a human agent who will respond shortly.',\n replyTo: 'Reply to {name}',\n sourcesCountOne: '{count} source',\n sourcesCountOther: '{count} sources',\n privacyNoticePre: 'By chatting, you agree to our',\n privacyPolicyLinkText: 'Privacy Policy',\n privacyChipText: 'We respect your privacy - read our policy',\n privacyExplicitTitle: 'Before you send',\n privacyExplicitBodyPre: 'Messages are processed to assist you. By continuing you agree to our',\n privacyExplicitButton: 'Got it, continue',\n // Magicline integration forms\n magiclineTrialTitle: 'Book a trial session',\n magiclineLeadTitle: 'Request more information',\n magiclineFirstName: 'First name',\n magiclineLastName: 'Last name',\n magiclineEmail: 'Email',\n magiclinePhone: 'Phone',\n magiclineBirthDate: 'Date of birth',\n magiclineInterest: 'What are you interested in? (optional)',\n magiclineMessage: 'Message (optional)',\n magiclineSlotLabel: 'Preferred time',\n magiclineSlotPlaceholder: 'Select a time…',\n magiclineLoadingSlots: 'Loading available times…',\n magiclineNoSlots: 'No trial times are available right now. Please check back later or ask us for help.',\n magiclineSubmit: 'Submit',\n magiclineSubmitting: 'Submitting…',\n magiclineSubmitted: 'Request submitted',\n magiclineSubmittedDetail: 'We’ve received your request and will be in touch shortly.',\n magiclineFailed: 'Submission failed',\n magiclineFailedDetail: 'Something went wrong submitting your request. Please try again.',\n magiclineConsent: 'I agree to the processing of my data in accordance with the',\n magiclinePrivacyLinkText: 'Privacy Policy',\n magiclineRequiredError: 'Please fill in all required fields.',\n magiclineEmailError: 'Please enter a valid email address.',\n magiclineConsentError: 'Please accept the privacy policy to continue.',\n // Dynamic per-studio trial form (v2)\n magiclineConfigLoading: 'Loading the booking form…',\n magiclineConfigUnsupported: 'Online trial booking is not supported for this studio. Please ask us for help.',\n magiclineConfigInconsistent: 'The booking form is temporarily misconfigured. Please ask us for help.',\n magiclineConfigUnavailable: 'Trial booking is not available right now. Please try again later or ask us for help.',\n magiclineGender: 'Gender',\n magiclineGenderPlaceholder: 'Select gender…',\n magiclineGenderMale: 'Male',\n magiclineGenderFemale: 'Female',\n magiclineGenderUnisex: 'Diverse',\n magiclineStreet: 'Street',\n magiclineHouseNumber: 'House number',\n magiclineZip: 'Postal code',\n magiclineCity: 'City',\n magiclineCountry: 'Country',\n magiclineCountryPlaceholder: 'Select a country…',\n magiclineNote: 'Note (optional)',\n magiclineOptionalSuffix: ' (optional)',\n magiclineTrainerRequired: 'I want a trainer present',\n magiclineMinAgeError: 'You must be at least {age} years old to book a trial.',\n magiclineSlotRequiredError: 'Please select an available time.',\n magiclineSlotUnavailableNotice: 'That time is no longer available. Please pick another time below.',\n // Step wizard (v3)\n magiclineStepTrainer: 'Trainer',\n magiclineStepSlot: 'Choose a time',\n magiclineStepPersonal: 'Your details',\n magiclineStepAddress: 'Your address',\n magiclineStepConfirm: 'Confirm',\n magiclineStepCounter: 'Step {n} of {total}',\n magiclineWizardBack: 'Back',\n magiclineWizardNext: 'Next',\n magiclineTrainerWith: 'Trial session with trainer',\n magiclineTrainerWithout: 'Trial session without trainer',\n magiclineSummaryTrainer: 'Trainer',\n magiclineSummarySlot: 'Time',\n magiclineSummaryName: 'Name',\n magiclineRetry: 'Try again',\n magiclineSlotsError: 'We couldn’t load available times right now. Please try again.',\n // Membership signup wizard (contract creation)\n magiclineContractTitle: 'Become a member',\n magiclineStepOffer: 'Choose a membership',\n magiclineStepUpgrades: 'Add-ons',\n magiclineStepPayment: 'Payment',\n magiclineStepReview: 'Review',\n magiclineOffersLoading: 'Loading memberships…',\n magiclineOffersError: 'We couldn’t load the memberships right now. Please try again.',\n magiclineNoOffers: 'No memberships are available to sign up for online right now. Please ask us for help.',\n magiclineTermLength: '{value} {unit}',\n magiclineFreqPerDay: 'per day',\n magiclineFreqPerWeek: 'per week',\n magiclineFreqPerMonth: 'per month',\n magiclineFreqPerYear: 'per year',\n magiclineFreqEveryDays: 'every {n} days',\n magiclineFreqEveryWeeks: 'every {n} weeks',\n magiclineFreqEveryMonths: 'every {n} months',\n magiclineFreqEveryYears: 'every {n} years',\n magiclineModulePerTerm: 'per term',\n magiclineModuleOneTime: 'one-time',\n magiclineModuleIncluded: 'included',\n magiclineRenewalNone: 'No automatic renewal',\n magiclineRenewalTerm: 'Renewal: {n} {unit}',\n magiclineCancellationPeriod: 'Cancellation period',\n magiclineStarterPackage: 'Starter package',\n magiclineFlatFee: 'One-time fee',\n magiclineIncludedModules: 'Included',\n magiclineDetails: 'Details',\n magiclineRequired: 'Required',\n magiclineUpgradesIntro: 'Add optional upgrades to your membership.',\n magiclineUpgradesNone: 'No optional upgrades are available for this membership.',\n magiclineUpgradeAdd: 'Add',\n magiclineUpgradeAdded: 'Added',\n magiclineUpgradeOneTime: 'one-time',\n magiclineUpgradeConsentError: 'Please accept the terms for your selected upgrade to keep it.',\n magiclineOfferRequiredError: 'Please select a membership.',\n magiclineCountryStatic: 'Germany',\n magiclineAccountHolder: 'Account holder',\n magiclineIban: 'IBAN',\n magiclineIbanInvalidError: 'Please enter a valid IBAN.',\n magiclineSepaConsent: 'I authorise the studio to collect payments from my account by SEPA direct debit and instruct my bank to honour these debits.',\n magiclineReviewLoading: 'Calculating your price…',\n magiclineReviewError: 'We couldn’t calculate your price right now. Please try again.',\n magiclineReviewOffer: 'Membership',\n magiclineReviewPriceSummary: 'Price summary',\n magiclineReviewBasePrice: 'Price per month',\n magiclineReviewOneTimeFees: 'One-time fees',\n magiclineReviewPreUseCharge: 'Pre-use charge',\n magiclineReviewSelectedUpgrades: 'Your selected upgrades',\n magiclineReviewContractVolume: 'Total contract volume',\n magiclineReviewStartsOn: 'Starts on',\n magiclineReviewPayment: 'Payment',\n magiclineReviewTerms: 'Terms & conditions',\n magiclineConfirmPrompt: 'Please confirm the following to continue:',\n magiclineConfirmRequiredError: 'Please confirm all required terms before submitting.',\n magiclineSummaryAddress: 'Address',\n magiclineContractSubmitted: 'Your membership is confirmed and the studio will be in touch shortly.',\n magiclineCustomerNumber: 'Your customer number: {number}',\n magiclinePriceChangedNotice: 'The price has changed. Please review the new price and confirm again.',\n magiclineOfferUnavailableNotice: 'That membership is no longer available. Please choose another one.',\n magiclineConfirmationRequiredNotice: 'Please confirm all required terms before submitting.',\n magiclineLiveSubmissionDisabled: 'Live submission is disabled for this project — please contact the studio.',\n magiclineDuplicateNotice: 'A membership for this offer was already created recently.',\n magiclineUnknownOutcome: 'We couldn’t confirm your signup. The studio will verify it and contact you — please do not submit again.',\n magiclineFeeStarterPackage: 'Starter package',\n magiclineFeeTrainerFee: 'Trainer fee',\n}\n","import type { WidgetStrings } from './en'\n\nexport const de: WidgetStrings = {\n title: 'Assistent',\n statusOnline: 'Online \\u00b7 Antwortet in Sekunden',\n inputPlaceholder: 'Nachricht eingeben\\u2026',\n aiThinking: 'KI antwortet\\u2026',\n sendAriaLabel: 'Nachricht senden',\n attachImagesAriaLabel: 'Bilder anh\\u00e4ngen',\n attachComingSoon: 'Dateianh\\u00e4nge \\u2014 bald verf\\u00fcgbar',\n removeAttachmentAriaLabel: 'Anhang entfernen',\n openChatAriaLabel: 'Chat \\u00f6ffnen',\n closeChatAriaLabel: 'Chat schlie\\u00dfen',\n errorNetwork: 'Netzwerkfehler. Bitte versuche es erneut.',\n errorQuota: 'Nachrichtenlimit erreicht. Bitte versuche es sp\\u00e4ter erneut.',\n errorRateLimited: 'Zu viele Nachrichten. Bitte in {seconds} Sek. erneut versuchen.',\n errorSessionNoToken: 'Verbindung zum Chat fehlgeschlagen. Bitte Internet prüfen und erneut versuchen.',\n errorSessionUnauthorized: 'Dieser Chat ist auf dieser Seite nicht autorisiert. Bitte neu laden.',\n localeLabelDe: 'DE',\n localeLabelEn: 'EN',\n resumeConversation: 'Gespr\\u00e4ch wird fortgesetzt\\u2026',\n startingConversation: 'Konversation wird gestartet\\u2026',\n sessionNotFound: 'Ihre vorherige Sitzung wurde nicht gefunden. Ein neues Gespr\\u00e4ch wird gestartet.',\n startNewConversation: 'Neues Gespr\\u00e4ch beginnen',\n chatWith: 'Chatte mit {title}',\n haveReferenceNumber: 'Hast du eine Referenznummer?',\n referencePlaceholder: 'z.B. JEX-A3B7C2',\n resume: 'Fortsetzen',\n howCanWeHelp: 'Wie k\\u00f6nnen wir helfen?',\n getInstantHelp: 'Soforthilfe erhalten',\n submitTicket: 'Ticket einreichen',\n replyByEmail: 'Wir antworten per E-Mail',\n ticketSubmitted: 'Ticket eingereicht',\n yourReferenceNumber: 'Deine Referenznummer:',\n sentToEmailHint: 'Wir haben sie an deine E-Mail gesendet. Verwende diese Nummer f\\u00fcr R\\u00fcckfragen.',\n done: 'Fertig',\n submittingTicket: 'Dein Ticket wird \\u00fcbermittelt\\u2026',\n yourName: 'Dein Name',\n yourEmail: 'Deine E-Mail',\n submit: 'Absenden',\n back: 'Zur\\u00fcck',\n // Escalation form\n escalationFormTitle: 'Hinterlassen Sie Ihre Daten',\n escalationSubtitle: 'Unser Team meldet sich per E-Mail bei Ihnen \\u2014 Sie m\\u00fcssen nicht hier warten.',\n escalationNameLabel: 'Ihr Name',\n escalationEmailLabel: 'Ihre E-Mail',\n escalationSubmit: 'An Team senden',\n escalationSubmitting: 'Wird gesendet\\u2026',\n escalationSubmitted: 'Anfrage gesendet',\n escalationConsent: 'Mit dem Absenden stimmen Sie unserer',\n escalationPrivacyLinkText: 'Datenschutzerkl\\u00e4rung',\n escalationSkip: '\\u00dcberspringen, ich warte hier',\n escalationPromptTitle: 'Sprechen Sie mit unserem Team',\n escalationPromptSubtitle: 'Wir benachrichtigen Sie per E-Mail, wenn wir antworten.',\n escalationPromptSubmit: 'Daten hinterlassen',\n escalationSubmitFailed: 'Senden fehlgeschlagen. Bitte versuche es erneut.',\n // Session resume prompt\n sessionNotFoundPrompt: 'Sitzung nicht gefunden. M\\u00f6chten Sie ein neues Gespr\\u00e4ch beginnen?',\n sessionLocked: 'Aus Datenschutzgr\\u00fcnden wurde dieses Gespr\\u00e4ch nach einer Inaktivit\\u00e4tszeit geschlossen. Geben Sie Ihre Referenz ein, um fortzufahren, oder beginnen Sie ein neues Gespr\\u00e4ch.',\n // Resolved session\n sessionResolved: 'Diese Unterhaltung wurde abgeschlossen.',\n tryAgain: 'Erneut versuchen',\n goBack: 'Zur\\u00fcck',\n somethingWentWrong: 'Etwas ist schiefgelaufen',\n fabLabel: 'Chatte mit uns',\n chatNoLongerAvailable: 'Dieser Chat ist nicht mehr verf\\u00fcgbar.',\n // Handoff & resume list\n talkToHuman: 'Mit Mitarbeiter sprechen',\n talkToHumanAria: 'Mit einem menschlichen Mitarbeiter sprechen',\n handoffPending: 'Sie werden mit einem Mitarbeiter verbunden\\u2026',\n handoffFailed: 'Anfrage konnte nicht gesendet werden. Erneut versuchen.',\n handoffRateLimited: 'Sie haben k\\u00fcrzlich einen Mitarbeiter angefragt. Bitte warten Sie.',\n resumeListLabel: 'Unterhaltung fortsetzen',\n resumeListTimestamp: 'vor {minutes} Min.',\n noticeAgentJoined: '{name} ist der Unterhaltung beigetreten.',\n noticeHumanRequested: 'Sie haben darum gebeten, mit einem Mitarbeiter zu sprechen.',\n noticeHumanRequestedForm: 'Sie haben darum gebeten, mit einem Mitarbeiter zu sprechen. Bitte teilen Sie unten Ihre Kontaktdaten mit.',\n noticeEscalationConfirmed: 'Vielen Dank, {name}! Ein Mitarbeiter wird in Kürze verfügbar sein.\\nWir kontaktieren Sie unter {email}, sobald ein Mitarbeiter bereit ist.\\n\\nIhre Referenz: **{ref}**\\nVerwenden Sie sie, um diese Unterhaltung auf jedem Gerät fortzusetzen.',\n noticeMessageReceived: 'Ihre Nachricht ist eingegangen. Ein Mitarbeiter wird in Kürze antworten.',\n noticeAgentHandling: 'Ihre Unterhaltung wird von einem menschlichen Mitarbeiter betreut, der in Kürze antwortet.',\n replyTo: 'Antworten an {name}',\n sourcesCountOne: '{count} Quelle',\n sourcesCountOther: '{count} Quellen',\n privacyNoticePre: 'Mit dem Chatten stimmst du unserer',\n privacyPolicyLinkText: 'Datenschutzerklärung',\n privacyChipText: 'Wir respektieren Ihre Privatsphäre - Richtlinie lesen',\n privacyExplicitTitle: 'Vor dem Senden',\n privacyExplicitBodyPre: 'Nachrichten werden verarbeitet, um Ihnen zu helfen. Durch Fortfahren stimmen Sie unserer',\n privacyExplicitButton: 'Verstanden, fortfahren',\n // Magicline integration forms\n magiclineTrialTitle: 'Probetraining buchen',\n magiclineLeadTitle: 'Weitere Informationen anfordern',\n magiclineFirstName: 'Vorname',\n magiclineLastName: 'Nachname',\n magiclineEmail: 'E-Mail',\n magiclinePhone: 'Telefon',\n magiclineBirthDate: 'Geburtsdatum',\n magiclineInterest: 'Wofür interessieren Sie sich? (optional)',\n magiclineMessage: 'Nachricht (optional)',\n magiclineSlotLabel: 'Wunschtermin',\n magiclineSlotPlaceholder: 'Termin auswählen…',\n magiclineLoadingSlots: 'Verfügbare Termine werden geladen…',\n magiclineNoSlots: 'Derzeit sind keine Probetermine verfügbar. Bitte versuchen Sie es später erneut oder fragen Sie uns um Hilfe.',\n magiclineSubmit: 'Absenden',\n magiclineSubmitting: 'Wird gesendet…',\n magiclineSubmitted: 'Anfrage gesendet',\n magiclineSubmittedDetail: 'Wir haben Ihre Anfrage erhalten und melden uns in Kürze bei Ihnen.',\n magiclineFailed: 'Senden fehlgeschlagen',\n magiclineFailedDetail: 'Beim Senden Ihrer Anfrage ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.',\n magiclineConsent: 'Ich stimme der Verarbeitung meiner Daten gemäß der',\n magiclinePrivacyLinkText: 'Datenschutzerklärung',\n magiclineRequiredError: 'Bitte füllen Sie alle Pflichtfelder aus.',\n magiclineEmailError: 'Bitte geben Sie eine gültige E-Mail-Adresse ein.',\n magiclineConsentError: 'Bitte akzeptieren Sie die Datenschutzerklärung, um fortzufahren.',\n // Dynamisches studiospezifisches Probetraining-Formular (v2)\n magiclineConfigLoading: 'Buchungsformular wird geladen…',\n magiclineConfigUnsupported: 'Die Online-Buchung eines Probetrainings wird für dieses Studio nicht unterstützt. Bitte fragen Sie uns um Hilfe.',\n magiclineConfigInconsistent: 'Das Buchungsformular ist vorübergehend falsch konfiguriert. Bitte fragen Sie uns um Hilfe.',\n magiclineConfigUnavailable: 'Die Buchung eines Probetrainings ist derzeit nicht verfügbar. Bitte versuchen Sie es später erneut oder fragen Sie uns um Hilfe.',\n magiclineGender: 'Geschlecht',\n magiclineGenderPlaceholder: 'Geschlecht auswählen…',\n magiclineGenderMale: 'Männlich',\n magiclineGenderFemale: 'Weiblich',\n magiclineGenderUnisex: 'Divers',\n magiclineStreet: 'Straße',\n magiclineHouseNumber: 'Hausnummer',\n magiclineZip: 'Postleitzahl',\n magiclineCity: 'Stadt',\n magiclineCountry: 'Land',\n magiclineCountryPlaceholder: 'Land auswählen…',\n magiclineNote: 'Anmerkung (optional)',\n magiclineOptionalSuffix: ' (optional)',\n magiclineTrainerRequired: 'Ich wünsche einen Trainer vor Ort',\n magiclineMinAgeError: 'Sie müssen mindestens {age} Jahre alt sein, um ein Probetraining zu buchen.',\n magiclineSlotRequiredError: 'Bitte wählen Sie einen verfügbaren Termin aus.',\n magiclineSlotUnavailableNotice: 'Dieser Termin ist nicht mehr verfügbar. Bitte wählen Sie unten einen anderen Termin aus.',\n // Schritt-Assistent (v3)\n magiclineStepTrainer: 'Trainer',\n magiclineStepSlot: 'Termin wählen',\n magiclineStepPersonal: 'Ihre Daten',\n magiclineStepAddress: 'Ihre Adresse',\n magiclineStepConfirm: 'Bestätigen',\n magiclineStepCounter: 'Schritt {n} von {total}',\n magiclineWizardBack: 'Zurück',\n magiclineWizardNext: 'Weiter',\n magiclineTrainerWith: 'Probetraining mit Trainer',\n magiclineTrainerWithout: 'Probetraining ohne Trainer',\n magiclineSummaryTrainer: 'Trainer',\n magiclineSummarySlot: 'Termin',\n magiclineSummaryName: 'Name',\n magiclineRetry: 'Erneut versuchen',\n magiclineSlotsError: 'Die verfügbaren Termine konnten gerade nicht geladen werden. Bitte versuchen Sie es erneut.',\n // Mitgliedschafts-Assistent (Vertragsabschluss)\n magiclineContractTitle: 'Mitglied werden',\n magiclineStepOffer: 'Mitgliedschaft wählen',\n magiclineStepUpgrades: 'Zusatzoptionen',\n magiclineStepPayment: 'Zahlung',\n magiclineStepReview: 'Überprüfen',\n magiclineOffersLoading: 'Mitgliedschaften werden geladen…',\n magiclineOffersError: 'Die Mitgliedschaften konnten gerade nicht geladen werden. Bitte versuchen Sie es erneut.',\n magiclineNoOffers: 'Derzeit sind keine Mitgliedschaften für den Online-Abschluss verfügbar. Bitte fragen Sie uns um Hilfe.',\n magiclineTermLength: '{value} {unit}',\n magiclineFreqPerDay: 'pro Tag',\n magiclineFreqPerWeek: 'pro Woche',\n magiclineFreqPerMonth: 'pro Monat',\n magiclineFreqPerYear: 'pro Jahr',\n magiclineFreqEveryDays: 'alle {n} Tage',\n magiclineFreqEveryWeeks: 'alle {n} Wochen',\n magiclineFreqEveryMonths: 'alle {n} Monate',\n magiclineFreqEveryYears: 'alle {n} Jahre',\n magiclineModulePerTerm: 'pro Laufzeit',\n magiclineModuleOneTime: 'einmalig',\n magiclineModuleIncluded: 'inklusive',\n magiclineRenewalNone: 'Keine automatische Verlängerung',\n magiclineRenewalTerm: 'Verlängerung: {n} {unit}',\n magiclineCancellationPeriod: 'Kündigungsfrist',\n magiclineStarterPackage: 'Startpaket',\n magiclineFlatFee: 'Einmalige Gebühr',\n magiclineIncludedModules: 'Inklusive',\n magiclineDetails: 'Details',\n magiclineRequired: 'Erforderlich',\n magiclineUpgradesIntro: 'Fügen Sie Ihrer Mitgliedschaft optionale Zusatzoptionen hinzu.',\n magiclineUpgradesNone: 'Für diese Mitgliedschaft sind keine optionalen Zusatzoptionen verfügbar.',\n magiclineUpgradeAdd: 'Hinzufügen',\n magiclineUpgradeAdded: 'Hinzugefügt',\n magiclineUpgradeOneTime: 'einmalig',\n magiclineUpgradeConsentError: 'Bitte akzeptieren Sie die Bedingungen für Ihre gewählte Zusatzoption, um sie beizubehalten.',\n magiclineOfferRequiredError: 'Bitte wählen Sie eine Mitgliedschaft aus.',\n magiclineCountryStatic: 'Deutschland',\n magiclineAccountHolder: 'Kontoinhaber',\n magiclineIban: 'IBAN',\n magiclineIbanInvalidError: 'Bitte geben Sie eine gültige IBAN ein.',\n magiclineSepaConsent: 'Ich ermächtige das Studio, Zahlungen von meinem Konto per SEPA-Lastschrift einzuziehen, und weise mein Kreditinstitut an, diese Lastschriften einzulösen.',\n magiclineReviewLoading: 'Ihr Preis wird berechnet…',\n magiclineReviewError: 'Ihr Preis konnte gerade nicht berechnet werden. Bitte versuchen Sie es erneut.',\n magiclineReviewOffer: 'Mitgliedschaft',\n magiclineReviewPriceSummary: 'Preisübersicht',\n magiclineReviewBasePrice: 'Preis pro Monat',\n magiclineReviewOneTimeFees: 'Einmalige Gebühren',\n magiclineReviewPreUseCharge: 'Vorab-Nutzungsgebühr',\n magiclineReviewSelectedUpgrades: 'Deine gewählten Zusatzoptionen',\n magiclineReviewContractVolume: 'Gesamtes Vertragsvolumen',\n magiclineReviewStartsOn: 'Beginnt am',\n magiclineReviewPayment: 'Zahlung',\n magiclineReviewTerms: 'Vertragsbedingungen',\n magiclineConfirmPrompt: 'Bitte bestätigen Sie zum Fortfahren das Folgende:',\n magiclineConfirmRequiredError: 'Bitte bestätigen Sie alle erforderlichen Bedingungen vor dem Absenden.',\n magiclineSummaryAddress: 'Adresse',\n magiclineContractSubmitted: 'Ihre Mitgliedschaft ist bestätigt. Das Studio meldet sich in Kürze bei Ihnen.',\n magiclineCustomerNumber: 'Ihre Kundennummer: {number}',\n magiclinePriceChangedNotice: 'Der Preis hat sich geändert. Bitte prüfen Sie den neuen Preis und bestätigen Sie erneut.',\n magiclineOfferUnavailableNotice: 'Diese Mitgliedschaft ist nicht mehr verfügbar. Bitte wählen Sie eine andere aus.',\n magiclineConfirmationRequiredNotice: 'Bitte bestätigen Sie alle erforderlichen Bedingungen vor dem Absenden.',\n magiclineLiveSubmissionDisabled: 'Die Live-Übermittlung ist für dieses Projekt deaktiviert — bitte wenden Sie sich an das Studio.',\n magiclineDuplicateNotice: 'Für dieses Angebot wurde kürzlich bereits eine Mitgliedschaft erstellt.',\n magiclineUnknownOutcome: 'Wir konnten Ihre Anmeldung nicht bestätigen. Das Studio prüft sie und meldet sich bei Ihnen — bitte senden Sie das Formular nicht erneut ab.',\n magiclineFeeStarterPackage: 'Startpaket',\n magiclineFeeTrainerFee: 'Trainerpauschale',\n}\n","export type WidgetLocale = 'en' | 'de'\n\nexport interface LocaleConfig {\n value: WidgetLocale\n label: string\n flag: string\n}\n\nexport const SUPPORTED_LOCALES: LocaleConfig[] = [\n { value: 'de', label: 'Deutsch', flag: '🇩🇪' },\n { value: 'en', label: 'English', flag: '🇬🇧' },\n]\n\nexport const WIDGET_DEFAULT_LOCALE: WidgetLocale = 'de'\nexport const LOCALE_STORAGE_KEY = 'jex-locale'\n","import { signal } from '@preact/signals'\nimport { en, type WidgetStrings } from './locales/en'\nimport { de } from './locales/de'\n\nexport type { WidgetStrings }\nexport {\n type WidgetLocale,\n SUPPORTED_LOCALES as WIDGET_LOCALES,\n WIDGET_DEFAULT_LOCALE,\n LOCALE_STORAGE_KEY,\n} from './config'\n\n/**\n * Active locale for the widget UI.\n * Initialised to 'de' (default); overridden in WidgetShell on mount via resolveWidgetLocale.\n */\nexport const locale = signal<'en' | 'de'>('de')\n\nconst STRINGS: Record<string, WidgetStrings> = { en, de }\n\n/**\n * Returns the current locale's string dictionary.\n * Reactive — components that call this re-render when locale changes.\n *\n * Usage inside a Preact component:\n * const s = useLocale();\n * return <p>{s.inputPlaceholder}</p>;\n */\nexport function useLocale(): WidgetStrings {\n // Accessing locale.value inside render subscribes this component to changes.\n return STRINGS[locale.value] ?? en\n}\n\n/**\n * Switch the active locale and persist the visitor's choice to localStorage.\n * Call this from the footer toggle's onClick handler.\n */\nexport function setLocale(next: 'en' | 'de'): void {\n locale.value = next\n try {\n localStorage.setItem('jex-locale', next)\n } catch {\n // Storage blocked — still update the in-memory signal\n }\n}\n","import { \n type WidgetLocale, \n SUPPORTED_LOCALES, \n WIDGET_DEFAULT_LOCALE, \n LOCALE_STORAGE_KEY \n} from './config'\n\n/** Normalise a raw locale string (e.g. \"en-US\") to a WidgetLocale, or null. */\nfunction parseLocale(raw: string | null | undefined): WidgetLocale | null {\n if (!raw) { return null }\n const base = (raw.split('-')[0] ?? '').toLowerCase()\n const isValid = SUPPORTED_LOCALES.some(l => l.value === base)\n return isValid ? (base as WidgetLocale) : null\n}\n\n/**\n * Resolve the active locale using the priority chain:\n * 1. configLocale (explicit prop/dashboard override — HIGHEST)\n * 2. localStorage['jex-locale'] (visitor's persistent choice)\n * 3. navigator.language (browser auto-detect)\n * 4. 'de' (hardcoded default)\n * \n * Priority Note:\n * Explicit configuration (configLocale) now outranks localStorage. \n * This ensures that changing the language in the Dashboard or Playground \n * instantly reflects in the preview, even if the user previously selected\n * a different language inside the widget's persistent session.\n */\nexport function resolveWidgetLocale(configLocale?: string): WidgetLocale {\n // 1. Explicit UI Configuration (Dashboard/Playground override)\n const config = parseLocale(configLocale)\n if (config) { return config }\n\n // 2. Visitor's persistent saved choice\n try {\n const saved = parseLocale(localStorage.getItem(LOCALE_STORAGE_KEY))\n if (saved) { return saved }\n } catch {\n // localStorage blocked (e.g. Safari private mode)\n }\n\n // 3. Browser language fallback\n if (typeof navigator !== 'undefined') {\n const browser = parseLocale(navigator.language)\n if (browser) { return browser }\n }\n\n // 4. Global default\n return WIDGET_DEFAULT_LOCALE\n}\n","import { useEffect } from 'preact/hooks'\nimport { locale } from '../../../i18n/index'\nimport { resolveWidgetLocale } from '../../../i18n/resolve-widget-locale'\n\n/**\n * Listens for postMessage config updates sent from the dashboard preview iframe.\n *\n * This is a playground/dashboard-only concern — the `parentOrigin` option is\n * only set when the widget is embedded inside the dashboard preview panel.\n * Production embeds on customer websites never send this message type.\n *\n * Message shape:\n * { type: 'jexity:config', payload: { locale?: string } }\n *\n * Incoming locale strings are passed through `resolveWidgetLocale` so the full\n * priority chain (config → localStorage → browser → default) is respected,\n * and no type assertions are needed.\n */\nexport function usePreviewBridge(parentOrigin: string | undefined): void {\n useEffect(() => {\n function handleMessage(e: MessageEvent): void {\n // Reject messages from unexpected origins (security guard)\n const allowedOrigin = parentOrigin ?? window.location.origin\n if (e.origin !== allowedOrigin) { return }\n if (e.data?.type !== 'jexity:config') { return }\n\n const { locale: newLocale } = e.data.payload as { locale?: string }\n\n if (newLocale) {\n locale.value = resolveWidgetLocale(newLocale)\n }\n }\n\n window.addEventListener('message', handleMessage)\n return () => { window.removeEventListener('message', handleMessage) }\n }, [parentOrigin])\n}\n","import { signal, computed } from '@preact/signals'\n\n/** Exported so the privacy lock module can clear the same key on wipe. */\nexport const SESSION_HISTORY_STORAGE_KEY = 'jex-session-history'\nconst STORAGE_KEY = SESSION_HISTORY_STORAGE_KEY\nexport const SESSION_HISTORY_TTL_MS = 60 * 60 * 1000\n\nexport type SessionHistoryEntry = {\n ref: string\n startedAt: number\n lastActivityAt: number\n}\n\ntype HistoryEnvelope = { v: 1; entries: SessionHistoryEntry[] }\n\nexport const sessionHistory = signal<SessionHistoryEntry[]>([])\nexport const currentSessionRef = signal<string | null>(null)\n\n// Derived — used by ScreenRouter init + ChatScreen mount snapshot.\nexport const hasAnyHistory = computed(() => sessionHistory.value.length > 0)\n\n/**\n * Set by HomeScreen actions BEFORE navigating to chat, so ChatScreen\n * can render the correct LoadingScreen copy on mount. Consumed + cleared\n * by ChatScreen.\n *\n * - 'fresh' — visitor clicked \"Start new conversation\"\n * - 'resume' — visitor clicked a history entry or used the lookup form\n * - null — initial mount (first-time visitor lands on chat) OR not set\n */\nexport const chatMountIntent = signal<'fresh' | 'resume' | null>(null)\n\nfunction generateRef(): string {\n return 'JEX-' + Math.random().toString(36).slice(2, 8).toUpperCase()\n}\n\nfunction loadEnvelope(now: number): SessionHistoryEntry[] {\n try {\n const raw = sessionStorage.getItem(STORAGE_KEY)\n if (!raw) { return [] }\n const parsed = JSON.parse(raw) as HistoryEnvelope\n if (parsed.v !== 1 || !Array.isArray(parsed.entries)) { return [] }\n // Sliding TTL prune.\n return parsed.entries.filter((e) => now - e.lastActivityAt <= SESSION_HISTORY_TTL_MS)\n } catch {\n return []\n }\n}\n\nfunction persist(entries: SessionHistoryEntry[]): void {\n try {\n const envelope: HistoryEnvelope = { v: 1, entries }\n // Tab-scoped — sessionStorage wipes on tab close (GDPR posture preserved).\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(envelope))\n } catch { /* private mode / quota — best effort */ }\n}\n\n/** Call once on widget mount before computing initial screen. */\nexport function initVisitor(): void {\n const now = Date.now()\n // Load envelope + drop expired entries.\n const pruned = loadEnvelope(now)\n sessionHistory.value = pruned\n // Re-persist so the on-disk copy reflects the pruned list.\n persist(pruned)\n // Resume context = most-recent entry (sliding TTL guarantees it's still live).\n currentSessionRef.value = pruned[pruned.length - 1]?.ref ?? null\n}\n\n/** Generate a fresh ref, push to history, set as current. */\nexport function startNewSession(): string {\n const ref = generateRef()\n const now = Date.now()\n const next = [...sessionHistory.value, { ref, startedAt: now, lastActivityAt: now }]\n sessionHistory.value = next\n currentSessionRef.value = ref\n persist(next)\n return ref\n}\n\n/** Resume an existing entry — bumps lastActivityAt + sets current. */\nexport function resumeSession(ref: string): void {\n const now = Date.now()\n // Bump activity timestamp — new array so signal subscribers fire.\n const next = sessionHistory.value.map((e) =>\n e.ref === ref ? { ...e, lastActivityAt: now } : e,\n )\n sessionHistory.value = next\n currentSessionRef.value = ref\n persist(next)\n}\n\n/** Mark activity on the current session (visitor send or bot final reply). */\nexport function markActivity(ref: string): void {\n if (!ref) { return }\n const now = Date.now()\n const next = sessionHistory.value.map((e) =>\n e.ref === ref ? { ...e, lastActivityAt: now } : e,\n )\n sessionHistory.value = next\n persist(next)\n}\n","import { signal } from '@preact/signals'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\nimport { hasAnyHistory } from '../visitor/visitor.state'\n\nexport type ScreenState =\n | { id: 'home' }\n | { id: 'selection' }\n | { id: 'chat' }\n | { id: 'form' }\n | { id: 'escalation-form'; formMessageId: Id<'conversations'>; sessionId: Id<'contactSessions'>; visitorId: string }\n | { id: 'confirmation'; ref: string }\n | { id: 'loading'; message?: string }\n | { id: 'error'; message: string }\n\n// Initial stack is computed from history state. WidgetShell must call\n// initVisitor() BEFORE this module is read for the first time, OR call\n// resetInitialStack() after initVisitor() resolves.\nexport const screenStack = signal<ScreenState[]>(computeInitialStack())\n\nexport function computeInitialStack(): ScreenState[] {\n // Returning visitor → home (resume list visible).\n // First-time visitor → chat (zero-friction entry).\n return hasAnyHistory.value\n ? [{ id: 'home' }]\n : [{ id: 'chat' }]\n}\n\n/** Re-seed the stack after initVisitor() has populated history. */\nexport function resetInitialStack(): void {\n screenStack.value = computeInitialStack()\n}\n\n/**\n * Escalation form style:\n * - 'inline': form card rendered inside the chat thread (default)\n * - 'screen': full-screen form (navigates away from chat)\n *\n * Toggle this to compare both UX approaches.\n */\nexport const escalationFormStyle = signal<'inline' | 'screen'>('screen')\n\n/** Push a new screen onto the stack. */\nexport function navigate(screen: ScreenState): void {\n screenStack.value = [...screenStack.value, screen]\n}\n\n/** Pop the top screen. No-op if already at root. */\nexport function back(): void {\n if (screenStack.value.length > 1) {\n screenStack.value = screenStack.value.slice(0, -1)\n }\n}\n\n/** Swap the top of the stack. Used for loading→result transitions. */\nexport function replace(screen: ScreenState): void {\n screenStack.value = [...screenStack.value.slice(0, -1), screen]\n}\n","/**\n * Idle / privacy lock — GDPR safeguard for public-computer scenarios.\n *\n * If a visitor leaves the widget open and walks away, the next person on\n * the same browser tab could read shipping codes, support refs, or PII in\n * the chat history. Once the conversation has been idle for\n * `SESSION_HISTORY_TTL_MS` (15 min) — measured either as no activity while\n * visible OR cumulative hidden time — wipe the session history, clear the\n * current ref, drop the visitor back on Home, and raise `isLocked` so the\n * UI can show a privacy notice.\n *\n * The owner of the conversation can still resume by typing their JEX-XXXXXX\n * reference into the lookup form (they wrote it down). A stranger sees an\n * empty Home with no resumable entries — no leak.\n *\n * Two triggers, both reuse the per-ref `lastActivityAt` already maintained\n * by visitor.state.ts (`markActivity` runs on chat mount, on every visitor\n * send, and on every assistant final reply):\n *\n * 1. Visible-but-idle: a 60s poll checks the current ref's\n * lastActivityAt. Over threshold → lock.\n * 2. Hidden-too-long: visibilitychange records `hiddenSince`; on next\n * `visible`, if (now - hiddenSince) > threshold → lock.\n *\n * Race protection: callers writing to Convex (createOrResume in flight)\n * raise `isSessionBusy` so the poll skips a tick rather than wiping the\n * ref under an in-flight mutation. Hooks that cache a resolved session\n * (useConvexSession.resolvedRef) register a reset callback so the wipe\n * clears their cache too.\n */\nimport { signal } from '@preact/signals'\nimport {\n sessionHistory,\n currentSessionRef,\n SESSION_HISTORY_TTL_MS,\n SESSION_HISTORY_STORAGE_KEY,\n} from './visitor.state'\nimport { screenStack } from '../screens/screens.state'\n\nconst POLL_MS = 60_000\n\n/** True while the widget is showing the privacy-lock notice. */\nexport const isLocked = signal(false)\n\n/**\n * True while a session-creating mutation is in flight. The idle poll skips\n * a tick when this is set, so a wipe can't race an awaited createOrResume.\n */\nexport const isSessionBusy = signal(false)\n\n/** Per-hook callbacks run when the lock fires — clears caches like resolvedRef. */\ntype ResetCallback = () => void\nconst resetCallbacks = new Set<ResetCallback>()\n\n/** Register a callback fired on lock. Returns a deregister fn for useEffect cleanup. */\nexport function registerLockResetCallback(fn: ResetCallback): () => void {\n resetCallbacks.add(fn)\n return () => {\n resetCallbacks.delete(fn)\n }\n}\n\nfunction lastActivityAtForCurrent(): number | null {\n const ref = currentSessionRef.value\n if (!ref) { return null }\n const entry = sessionHistory.value.find((e) => e.ref === ref)\n return entry?.lastActivityAt ?? null\n}\n\nfunction isIdle(threshold: number): boolean {\n const last = lastActivityAtForCurrent()\n if (last === null) { return false }\n return Date.now() - last > threshold\n}\n\n/**\n * Wipe in-memory + persisted session refs, drop back to Home, raise the\n * lock flag, and notify hooks holding cached session references.\n * Idempotent — safe to call from both triggers.\n */\nexport function lockSession(): void {\n if (isLocked.value && sessionHistory.value.length === 0) { return }\n sessionHistory.value = []\n currentSessionRef.value = null\n try {\n sessionStorage.removeItem(SESSION_HISTORY_STORAGE_KEY)\n } catch (err) {\n // GDPR safeguard failed — sessionStorage clear errored (quota, exotic\n // sandbox). Surface so operator can see PII may persist across visitors.\n console.warn('[JexityChat] Idle-lock storage clear failed:', err)\n }\n for (const cb of resetCallbacks) {\n try {\n cb()\n } catch (err) {\n console.warn('[JexityChat] Lock reset callback threw:', err)\n }\n }\n screenStack.value = [{ id: 'home' }]\n isLocked.value = true\n}\n\n/** Called by HomeScreen actions — visitor explicitly engaged again. */\nexport function unlockSession(): void {\n if (!isLocked.value) { return }\n isLocked.value = false\n}\n\n/**\n * Start the watcher. Returns a teardown function for useEffect cleanup.\n * All timer / visibility state lives in the returned closure so StrictMode\n * double-invocation (or fast-refresh) cannot orphan a prior interval.\n */\nexport function startIdleLockWatcher(threshold: number = SESSION_HISTORY_TTL_MS): () => void {\n let hiddenSince: number | null = null\n\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') {\n hiddenSince = Date.now()\n return\n }\n if (hiddenSince !== null && Date.now() - hiddenSince > threshold) {\n lockSession()\n }\n hiddenSince = null\n }\n\n document.addEventListener('visibilitychange', onVisibility)\n const timer = setInterval(() => {\n // Skip while a session-creating mutation is mid-flight so we don't\n // wipe currentSessionRef out from under it.\n if (isSessionBusy.value) { return }\n if (isIdle(threshold)) { lockSession() }\n }, POLL_MS)\n\n return () => {\n document.removeEventListener('visibilitychange', onVisibility)\n clearInterval(timer)\n hiddenSince = null\n }\n}\n","import type { JSX } from 'preact'\nimport type { JexityChatOptions } from '../../types'\n\n/** Maps JexityChatOptions theme fields → CSS custom properties on the widget root. */\nexport function buildThemeStyle(options: JexityChatOptions): JSX.CSSProperties | undefined {\n const vars: Record<string, string> = {}\n const { primaryColor, theme } = options\n\n if (primaryColor) {\n vars['--jex-primary'] = primaryColor\n vars['--jex-bg-trigger'] = primaryColor\n vars['--jex-bg-header'] = primaryColor\n vars['--jex-bg-msg-user'] = primaryColor\n vars['--jex-bg-send-btn'] = primaryColor\n }\n \n if (options.accentColor) {\n vars['--jex-accent'] = options.accentColor\n }\n\n if (theme?.bg) {\n const bg = theme.bg\n if (bg.trigger) { vars['--jex-bg-trigger'] = bg.trigger }\n if (bg.header) { vars['--jex-bg-header'] = bg.header }\n if (bg.msgUser) { vars['--jex-bg-msg-user'] = bg.msgUser }\n if (bg.msgBot) { vars['--jex-bg-msg-bot'] = bg.msgBot }\n if (bg.window) { vars['--jex-bg-window'] = bg.window }\n if (bg.sendBtn) { vars['--jex-bg-send-btn'] = bg.sendBtn }\n }\n if (theme?.text) {\n const text = theme.text\n if (text.header) { vars['--jex-text-header'] = text.header }\n if (text.msgUser) { vars['--jex-text-msg-user'] = text.msgUser }\n if (text.msgBot) { vars['--jex-text-msg-bot'] = text.msgBot }\n if (text.main) { vars['--jex-text-main'] = text.main }\n if (text.muted) { vars['--jex-text-muted'] = text.muted }\n }\n if (theme?.border) {\n const border = theme.border\n if (border.window) { vars['--jex-border-window'] = border.window }\n if (border.input) { vars['--jex-border-input'] = border.input }\n }\n\n // Layout & Typography (from Extended Config)\n if (options.fontFamily) { vars['--jex-font-family'] = options.fontFamily }\n if (options.fontSize) { vars['--jex-font-size'] = `${options.fontSize}px` }\n if (options.borderRadius) { vars['--jex-radius'] = options.borderRadius }\n if (options.windowWidth) { vars['--jex-window-width'] = `${options.windowWidth}px` }\n if (options.windowHeight) { vars['--jex-window-height'] = `${options.windowHeight}px` }\n\n return Object.keys(vars).length > 0 ? (vars as JSX.CSSProperties) : undefined\n}\n","export function BotIcon({ size = 24 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n )\n}\n","import { screenStack, back } from '../../module/screens/screens.state'\nimport { useLocale } from '../../i18n/index'\nimport { BotIcon } from '../icons/BotIcon'\n\n/**\n * Left slot of the chat header — either a chevron-back button when nested\n * screens are on the stack, or the bot avatar at the root screen.\n *\n * Single-responsibility split so the back/avatar toggle can be debugged\n * without touching title or right-side actions.\n */\nexport function HeaderLeft() {\n const t = useLocale()\n const canGoBack = screenStack.value.length > 1\n\n if (canGoBack) {\n return (\n <button\n class=\"jex-header-back\"\n onClick={back}\n aria-label={t.back || 'Go back'}\n >\n <svg width={20} height={20} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n )\n }\n\n return <BotIcon size={24} />\n}\n","import { useLocale } from '../../i18n/index'\n\ninterface HeaderTitleProps {\n title: string\n}\n\n/** Header text cluster — title + online-status line. */\nexport function HeaderTitle({ title }: HeaderTitleProps) {\n const t = useLocale()\n return (\n <div class=\"jex-header-info\">\n <h3>{title}</h3>\n <p>{t.statusOnline}</p>\n </div>\n )\n}\n","export function CloseIcon({ size = 28 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n )\n}\n","import { isOpen } from '../../module/shell/shell.state'\nimport { useLocale } from '../../i18n/index'\nimport { CloseIcon } from '../icons/CloseIcon'\n\n/**\n * Header close button — flips isOpen so the chat window unmounts.\n *\n * Always rendered in the header so the visitor has a close affordance even\n * in mobile fullscreen mode where the FAB is hidden by the CSS :has() rule.\n * Skipped in embedded mode where the host page owns visibility (rendered\n * conditionally by the Header parent).\n */\nexport function HeaderCloseButton() {\n const t = useLocale()\n return (\n <button\n class=\"jex-header-close\"\n type=\"button\"\n onClick={() => { isOpen.value = false }}\n aria-label={t.closeChatAriaLabel}\n title={t.closeChatAriaLabel}\n >\n <CloseIcon size={18} />\n </button>\n )\n}\n","import type { ComponentChildren } from 'preact'\nimport { HeaderCloseButton } from './HeaderCloseButton'\n\ninterface HeaderActionsProps {\n /** Optional action slot (typically HumanHandoffAction) rendered before the close button. */\n action?: ComponentChildren\n /** Whether to render the close button (skipped in embedded mode — host owns visibility). */\n showClose?: boolean\n}\n\n/** Right-cluster of the chat header: action slot + close button. */\nexport function HeaderActions({ action, showClose = true }: HeaderActionsProps) {\n if (!action && !showClose) { return null }\n return (\n <div class=\"jex-header-right\">\n {action}\n {showClose && <HeaderCloseButton />}\n </div>\n )\n}\n","import type { ComponentChildren } from 'preact'\nimport { HeaderLeft } from './HeaderLeft'\nimport { HeaderTitle } from './HeaderTitle'\nimport { HeaderActions } from './HeaderActions'\n\ninterface HeaderProps {\n title: string\n /** Slot for the action button (e.g. HumanHandoffAction). Sits left of close. */\n rightAction?: ComponentChildren\n /** Hide the close button in embedded mode where the host owns visibility. */\n showClose?: boolean\n}\n\n/**\n * Chat window header bar — composed of three independently-debuggable\n * subcomponents: left (back/avatar), title (text), and right actions.\n */\nexport function Header({ title, rightAction, showClose = true }: HeaderProps) {\n return (\n <header class=\"jex-chat-header\">\n <HeaderLeft />\n <HeaderTitle title={title} />\n <HeaderActions action={rightAction} showClose={showClose} />\n </header>\n )\n}\n","export function ZapIcon({ size = 14 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n )\n}\n","import { ZapIcon } from '../icons/ZapIcon'\n\n/** \"Powered by Jexity\" branding bar with locale switcher. */\nexport function Footer() {\n return (\n <div class=\"jex-widget-footer\">\n <a\n href=\"https://jexitychat.de\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"jex-branding\"\n >\n <ZapIcon size={14} />\n <span>\n Powered by <strong>Jexity</strong>\n </span>\n </a>\n </div>\n )\n}\n","export function MessageIcon({ size = 28 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )\n}\n","import type { JSX } from 'preact'\n\nexport function SparklesIcon({ size = 24, ...props }: JSX.SVGAttributes<SVGSVGElement> & { size?: number | string }) {\n return (\n <svg \n width={size} \n height={size} \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\" \n stroke-width=\"2\" \n stroke-linecap=\"round\" \n stroke-linejoin=\"round\"\n {...props}\n >\n <path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\" />\n </svg>\n )\n}\n","import { isOpen } from '../../module/shell/shell.state'\nimport { useLocale } from '../../i18n/index'\nimport { MessageIcon } from '../icons/MessageIcon'\nimport { CloseIcon } from '../icons/CloseIcon'\nimport { BotIcon } from '../icons/BotIcon'\nimport { SparklesIcon } from '../icons/SparklesIcon'\n\ninterface FABProps {\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'full'\n iconOption?: 'chat' | 'bot' | 'sparkles'\n label?: string\n}\n\nconst ICON_MAP: Record<NonNullable<FABProps['iconOption']>, import('preact').VNode> = {\n chat: <MessageIcon size={28} />,\n bot: <BotIcon size={28} />,\n sparkles: <SparklesIcon size={28} />,\n}\n\nconst RADIUS_MAP: Record<NonNullable<FABProps['radius']>, string> = {\n none: '0px',\n sm: '0.5rem',\n md: '0.75rem',\n lg: '1.25rem',\n full: '9999px',\n}\n\n/** Floating action button — the circular or pill-shaped trigger. */\nexport function FAB({ radius = 'full', iconOption = 'chat', label }: FABProps) {\n const s = useLocale()\n const resolvedLabel = label ?? s.fabLabel\n const hasLabel = resolvedLabel !== ''\n\n return (\n <button\n class={`jex-floating-button ${!isOpen.value && hasLabel ? 'jex-has-label' : ''}`}\n style={{ borderRadius: RADIUS_MAP[radius] ?? '9999px' }}\n onClick={() => { isOpen.value = !isOpen.value }}\n aria-label={isOpen.value ? s.closeChatAriaLabel : s.openChatAriaLabel}\n >\n {isOpen.value ? (\n <CloseIcon size={28} />\n ) : (\n <div class=\"jex-fab-inner\">\n {ICON_MAP[iconOption]}\n {hasLabel && <span class=\"jex-fab-label\">{resolvedLabel}</span>}\n </div>\n )}\n </button>\n )\n}\n","import { useState } from 'preact/hooks'\nimport { navigate } from '../../../module/screens/screens.state'\nimport { sessionHistory, resumeSession, chatMountIntent } from '../../../module/visitor/visitor.state'\nimport { isLocked, unlockSession } from '../../../module/visitor/idle-lock'\nimport { useLocale } from '../../../i18n/index'\nimport { MessageIcon } from '../../../shared/icons/MessageIcon'\nimport type { SessionResult } from '../../chat/hooks/useConvexSession'\n\ninterface HomeScreenProps {\n greeting: string\n title: string\n // Reset useConvexSession's resolvedRef and start a fresh session.\n onStartFresh: () => Promise<SessionResult | null>\n // Clear cached resolved session so next ensureSession() picks up the new currentSessionRef.\n onResetSession: () => void\n}\n\n/**\n * Home / greeting screen.\n *\n * Session resume (GDPR):\n * - sessionHistory has entries → show multi-entry history list\n * - No history (new tab / after close) → show start chat + optional reference lookup\n */\nexport function HomeScreen({ title, onStartFresh, onResetSession }: HomeScreenProps) {\n const t = useLocale()\n const [lookupRef, setLookupRef] = useState('')\n\n function handleStartChat() {\n // Visitor explicitly engaging again — clear any privacy lock notice.\n unlockSession()\n // Intent BEFORE startFresh so ChatScreen renders \"Starting…\" not \"Resuming…\".\n chatMountIntent.value = 'fresh'\n // Clear stale resolvedRef so the lock-wiped history doesn't leak in.\n onResetSession()\n // Fire-and-forget — ChatScreen renders LoadingScreen until sessionId resolves.\n // Navigating immediately lets the loading state be visible during the mutation.\n void onStartFresh()\n navigate({ id: 'chat' })\n }\n\n function handleResumeEntry(ref: string) {\n unlockSession()\n chatMountIntent.value = 'resume'\n // Clear stale resolvedRef so ensureSession() re-resolves from the new currentSessionRef.\n onResetSession()\n // Bump TTL anchor + switch current ref + open chat.\n resumeSession(ref)\n navigate({ id: 'chat' })\n }\n\n function handleLookupSubmit(e: Event) {\n e.preventDefault()\n const trimmed = lookupRef.trim().toUpperCase()\n if (!trimmed) { return }\n unlockSession()\n chatMountIntent.value = 'resume'\n onResetSession()\n // Insert a synthetic entry so the lookup acts like a resume.\n resumeSession(trimmed)\n navigate({ id: 'chat' })\n }\n\n return (\n <div class=\"jex-home\">\n {/* Privacy-lock notice — shown after the idle/visibility watcher wiped\n the prior conversation. Cleared on the next visitor action. */}\n {isLocked.value && (\n <div class=\"jex-session-prompt\" role=\"status\">\n <div class=\"jex-session-prompt-text\">{t.sessionLocked}</div>\n </div>\n )}\n\n {/* Avatar + status indicator */}\n <div class=\"jex-home-hero\">\n <div class=\"jex-home-avatar\">\n <MessageIcon size={24} />\n <span class=\"jex-home-status-dot\" />\n </div>\n <div class=\"jex-home-hero-text\">\n <h2 class=\"jex-home-title\">{title}</h2>\n <span class=\"jex-home-status\">{t.statusOnline}</span>\n </div>\n </div>\n\n {/* Session lookup — always visible */}\n <form class=\"jex-home-lookup\" onSubmit={handleLookupSubmit}>\n <input\n class=\"jex-home-lookup-input\"\n type=\"text\"\n placeholder={t.referencePlaceholder}\n value={lookupRef}\n onInput={(e) => { setLookupRef(e.currentTarget.value) }}\n />\n <button\n class=\"jex-home-lookup-submit\"\n type=\"submit\"\n disabled={!lookupRef.trim()}\n >\n {t.resume}\n </button>\n </form>\n\n <div class=\"jex-home-actions\">\n {sessionHistory.value.length > 0 && (\n <div class=\"jex-home-history\">\n {sessionHistory.value\n .slice()\n .reverse()\n .map((entry) => (\n <button\n key={entry.ref}\n class=\"jex-home-resume-card\"\n onClick={() => { handleResumeEntry(entry.ref) }}\n >\n <div class=\"jex-home-resume-top\">\n <span class=\"jex-home-resume-label\">{t.resumeListLabel}</span>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"jex-home-resume-arrow\">\n <path d=\"M6 3l5 5-5 5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"jex-home-resume-ref\">{entry.ref}</span>\n <span class=\"jex-home-resume-meta\">\n {t.resumeListTimestamp.replace('{minutes}', String(Math.max(1, Math.round((Date.now() - entry.lastActivityAt) / 60000))))}\n </span>\n </button>\n ))}\n </div>\n )}\n\n <button class=\"jex-home-new-btn\" onClick={handleStartChat}>\n {sessionHistory.value.length > 0 ? t.startNewConversation : t.chatWith.replace('{title}', title)}\n </button>\n </div>\n </div>\n )\n}\n","import { navigate } from '../../../module/screens/screens.state'\nimport { useLocale } from '../../../i18n/index'\n\ninterface SelectionScreenProps {\n title: string\n}\n\n/** Contact method selection — chat vs. submit ticket. */\nexport function SelectionScreen({ title }: SelectionScreenProps) {\n const t = useLocale()\n return (\n <div class=\"jex-selection\">\n <h2 class=\"jex-selection-title\">{t.howCanWeHelp}</h2>\n <div class=\"jex-selection-options\">\n <button\n class=\"jex-selection-option\"\n onClick={() => navigate({ id: 'chat' })}\n >\n <span class=\"jex-selection-icon\">💬</span>\n <span class=\"jex-selection-label\">{t.chatWith.replace('{title}', title)}</span>\n <span class=\"jex-selection-sub\">{t.getInstantHelp}</span>\n </button>\n <button\n class=\"jex-selection-option\"\n onClick={() => navigate({ id: 'form' })}\n >\n <span class=\"jex-selection-icon\">📝</span>\n <span class=\"jex-selection-label\">{t.submitTicket}</span>\n <span class=\"jex-selection-sub\">{t.replyByEmail}</span>\n </button>\n </div>\n </div>\n )\n}\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { h, toChildArray } from 'preact';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\n\nconst Icon = ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n children,\n iconNode,\n class: classes = \"\",\n ...rest\n}) => h(\n \"svg\",\n {\n ...defaultAttributes,\n width: String(size),\n height: size,\n stroke: color,\n [\"stroke-width\"]: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n class: [\"lucide\", classes].join(\" \"),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [...iconNode.map(([tag, attrs]) => h(tag, attrs)), ...toChildArray(children)]\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { h } from 'preact';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = ({ class: classes = \"\", className = \"\", children, ...props }) => h(\n Icon,\n {\n ...props,\n iconNode,\n class: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${toKebabCase(iconName)}`,\n classes,\n className\n )\n },\n children\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CornerUpLeft = createLucideIcon(\"corner-up-left\", [\n [\"path\", { d: \"M20 20v-7a4 4 0 0 0-4-4H4\", key: \"1nkjon\" }],\n [\"path\", { d: \"M9 14 4 9l5-5\", key: \"102s5s\" }]\n]);\n\nexport { CornerUpLeft as default };\n//# sourceMappingURL=corner-up-left.js.map\n","/**\n * marked v17.0.5 - a markdown parser\n * Copyright (c) 2018-2026, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction M(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=M();function G(u){T=u}var _={exec:()=>null};function k(u,e=\"\"){let t=typeof u==\"string\"?u:u.source,n={replace:(r,i)=>{let s=typeof i==\"string\"?i:i.source;return s=s.replace(m.caret,\"$1\"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var be=(()=>{try{return!!new RegExp(\"(?<=1)(?<!1)\")}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:u=>new RegExp(`^( {0,3}${u})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),hrRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),fencesBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\\`\\`\\`|~~~)`),headingBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}#`),htmlBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}<(?:[a-z].*>|!--)`,\"i\"),blockquoteBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}>`)},Re=/^(?:[ \\t]*(?:\\n|$))+/,Te=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Oe=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,C=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,we=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,Q=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,se=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,ie=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),ye=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),j=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,Pe=/^[^\\n]+/,F=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Se=k(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",F).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),$e=k(/^(bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g,Q).getRegex(),v=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",U=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,_e=k(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",U).replace(\"tag\",v).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),oe=k(j).replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),Le=k(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",oe).getRegex(),K={blockquote:Le,code:Te,def:Se,fences:Oe,heading:we,hr:C,html:_e,lheading:ie,list:$e,newline:Re,paragraph:oe,table:_,text:Pe},ne=k(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),Me={...K,lheading:ye,table:ne,paragraph:k(j).replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",ne).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex()},ze={...K,html:k(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",U).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:_,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:k(j).replace(\"hr\",C).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",ie).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Ee=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,Ie=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ae=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ae=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,z=/[\\p{P}\\p{S}]/u,H=/[\\s\\p{P}\\p{S}]/u,W=/[^\\s\\p{P}\\p{S}]/u,Ce=k(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,H).getRegex(),le=/(?!~)[\\p{P}\\p{S}]/u,Be=/(?!~)[\\s\\p{P}\\p{S}]/u,De=/(?:[^\\s\\p{P}\\p{S}]|~)/u,qe=k(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",be?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),ue=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,ve=k(ue,\"u\").replace(/punct/g,z).getRegex(),He=k(ue,\"u\").replace(/punct/g,le).getRegex(),pe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",Ze=k(pe,\"gu\").replace(/notPunctSpace/g,W).replace(/punctSpace/g,H).replace(/punct/g,z).getRegex(),Ge=k(pe,\"gu\").replace(/notPunctSpace/g,De).replace(/punctSpace/g,Be).replace(/punct/g,le).getRegex(),Ne=k(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,W).replace(/punctSpace/g,H).replace(/punct/g,z).getRegex(),Qe=k(/^~~?(?:((?!~)punct)|[^\\s~])/,\"u\").replace(/punct/g,z).getRegex(),je=\"^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)\",Fe=k(je,\"gu\").replace(/notPunctSpace/g,W).replace(/punctSpace/g,H).replace(/punct/g,z).getRegex(),Ue=k(/\\\\(punct)/,\"gu\").replace(/punct/g,z).getRegex(),Ke=k(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),We=k(U).replace(\"(?:-->|$)\",\"-->\").getRegex(),Xe=k(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",We).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),q=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/,Je=k(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace(\"label\",q).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),ce=k(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",q).replace(\"ref\",F).getRegex(),he=k(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",F).getRegex(),Ve=k(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",ce).replace(\"nolink\",he).getRegex(),re=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,X={_backpedal:_,anyPunctuation:Ue,autolink:Ke,blockSkip:qe,br:ae,code:Ie,del:_,delLDelim:_,delRDelim:_,emStrongLDelim:ve,emStrongRDelimAst:Ze,emStrongRDelimUnd:Ne,escape:Ee,link:Je,nolink:he,punctuation:Ce,reflink:ce,reflinkSearch:Ve,tag:Xe,text:Ae,url:_},Ye={...X,link:k(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",q).getRegex(),reflink:k(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",q).getRegex()},N={...X,emStrongRDelimAst:Ge,emStrongLDelim:He,delLDelim:Qe,delRDelim:Fe,url:k(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",re).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:k(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",re).getRegex()},et={...N,br:k(ae).replace(\"{2,}\",\"*\").getRegex(),text:k(N.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},B={normal:K,gfm:Me,pedantic:ze},E={normal:X,gfm:N,breaks:et,pedantic:Ye};var tt={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\"},ke=u=>tt[u];function O(u,e){if(e){if(m.escapeTest.test(u))return u.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(u))return u.replace(m.escapeReplaceNoEncode,ke);return u}function J(u){try{u=encodeURI(u).replace(m.percentDecode,\"%\")}catch{return null}return u}function V(u,e){let t=u.replace(m.findPipe,(i,s,a)=>{let o=!1,l=s;for(;--l>=0&&a[l]===\"\\\\\";)o=!o;return o?\"|\":\" |\"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,\"|\");return n}function I(u,e,t){let n=u.length;if(n===0)return\"\";let r=0;for(;r<n;){let i=u.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return u.slice(0,n-r)}function de(u,e){if(u.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<u.length;n++)if(u[n]===\"\\\\\")n++;else if(u[n]===e[0])t++;else if(u[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function ge(u,e=0){let t=e,n=\"\";for(let r of u)if(r===\"\t\"){let i=4-t%4;n+=\" \".repeat(i),t+=i}else n+=r,t++;return n}function fe(u,e,t,n,r){let i=e.href,s=e.title||null,a=u[1].replace(r.other.outputLinkReplace,\"$1\");n.state.inLink=!0;let o={type:u[0].charAt(0)===\"!\"?\"image\":\"link\",raw:t,href:i,title:s,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function nt(u,e,t){let n=u.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`\n`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[a]=s;return a.length>=r.length?i.slice(r.length):i}).join(`\n`)}var w=class{options;rules;lexer;constructor(e){this.options=e||T}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:t[0],codeBlockStyle:\"indented\",text:this.options.pedantic?n:I(n,`\n`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=nt(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=I(n,\"#\");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:\"heading\",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:I(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=I(t[0],`\n`).split(`\n`),r=\"\",i=\"\",s=[];for(;n.length>0;){let a=!1,o=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))o.push(n[l]),a=!0;else if(!a)o.push(n[l]);else break;n=n.slice(l);let p=o.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");r=r?`${r}\n${p}`:p,i=i?`${i}\n${c}`:c;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=d,n.length===0)break;let h=s.at(-1);if(h?.type===\"code\")break;if(h?.type===\"blockquote\"){let R=h,f=R.raw+`\n`+n.join(`\n`),S=this.blockquote(f);s[s.length-1]=S,r=r.substring(0,r.length-R.raw.length)+S.raw,i=i.substring(0,i.length-R.text.length)+S.text;break}else if(h?.type===\"list\"){let R=h,f=R.raw+`\n`+n.join(`\n`),S=this.list(f);s[s.length-1]=S,r=r.substring(0,r.length-h.raw.length)+S.raw,i=i.substring(0,i.length-R.raw.length)+S.raw,n=f.substring(s.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:\"list\",raw:\"\",ordered:r,start:r?+n.slice(0,-1):\"\",loose:!1,items:[]};n=r?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=r?n:\"[*+-]\");let s=this.rules.other.listItemRegex(n),a=!1;for(;e;){let l=!1,p=\"\",c=\"\";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let d=ge(t[2].split(`\n`,1)[0],t[1].length),h=e.split(`\n`,1)[0],R=!d.trim(),f=0;if(this.options.pedantic?(f=2,c=d.trimStart()):R?f=t[1].length+1:(f=d.search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=d.slice(f),f+=t[1].length),R&&this.rules.other.blankLine.test(h)&&(p+=h+`\n`,e=e.substring(h.length+1),l=!0),!l){let S=this.rules.other.nextBulletRegex(f),Y=this.rules.other.hrRegex(f),ee=this.rules.other.fencesBeginRegex(f),te=this.rules.other.headingBeginRegex(f),me=this.rules.other.htmlBeginRegex(f),xe=this.rules.other.blockquoteBeginRegex(f);for(;e;){let Z=e.split(`\n`,1)[0],A;if(h=Z,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting,\" \"),A=h):A=h.replace(this.rules.other.tabCharGlobal,\" \"),ee.test(h)||te.test(h)||me.test(h)||xe.test(h)||S.test(h)||Y.test(h))break;if(A.search(this.rules.other.nonSpaceChar)>=f||!h.trim())c+=`\n`+A.slice(f);else{if(R||d.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||ee.test(d)||te.test(d)||Y.test(d))break;c+=`\n`+h}R=!h.trim(),p+=Z+`\n`,e=e.substring(Z.length+1),d=A.slice(f)}}i.loose||(a?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(a=!0)),i.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),i.raw+=p}let o=i.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let l of i.items){if(this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]),l.task){if(l.text=l.text.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0]?.type===\"text\"||l.tokens[0]?.type===\"paragraph\"){l.tokens[0].raw=l.tokens[0].raw.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0].text=l.tokens[0].text.replace(this.rules.other.listReplaceTask,\"\");for(let c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,\"\");break}}let p=this.rules.other.listTaskCheckbox.exec(l.raw);if(p){let c={type:\"checkbox\",raw:p[0]+\" \",checked:p[0]!==\"[ ]\"};l.checked=c.checked,i.loose?l.tokens[0]&&[\"paragraph\",\"text\"].includes(l.tokens[0].type)&&\"tokens\"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=c.raw+l.tokens[0].raw,l.tokens[0].text=c.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(c)):l.tokens.unshift({type:\"paragraph\",raw:c.raw,text:c.raw,tokens:[c]}):l.tokens.unshift(c)}}if(!i.loose){let p=l.tokens.filter(d=>d.type===\"space\"),c=p.length>0&&p.some(d=>this.rules.other.anyLine.test(d.raw));i.loose=c}}if(i.loose)for(let l of i.items){l.loose=!0;for(let p of l.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:\"html\",block:!0,raw:t[0],pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:t[0],href:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=V(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],s={type:\"table\",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?s.align.push(\"right\"):this.rules.other.tableAlignCenter.test(a)?s.align.push(\"center\"):this.rules.other.tableAlignLeft.test(a)?s.align.push(\"left\"):s.align.push(null);for(let a=0;a<n.length;a++)s.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:s.align[a]});for(let a of i)s.rows.push(V(a,s.header.length).map((o,l)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:s.align[l]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:\"heading\",raw:t[0],depth:t[2].charAt(0)===\"=\"?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=I(n.slice(0,-1),\"\\\\\");if((n.length-s.length)%2===0)return}else{let s=de(t[2],\"()\");if(s===-2)return;if(s>-1){let o=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,o).trim(),t[3]=\"\"}}let r=t[2],i=\"\";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),fe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:i&&i.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:\"text\",raw:s,text:s}}return fe(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||!r[1]&&!r[2]&&!r[3]&&!r[4]||r[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[3]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=0,c=r[0][0]===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){l+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){p+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l+p);let d=[...r[0]][0].length,h=e.slice(0,s+r.index+d+o);if(Math.min(s,o)%2){let f=h.slice(1,-1);return{type:\"em\",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let R=h.slice(2,-2);return{type:\"strong\",raw:h,text:R,tokens:this.lexer.inlineTokens(R)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e,t,n=\"\"){let r=this.rules.inline.delLDelim.exec(e);if(!r)return;if(!(r[1]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=this.rules.inline.delRDelim;for(p.lastIndex=0,t=t.slice(-1*e.length+s);(r=p.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a||(o=[...a].length,o!==s))continue;if(r[3]||r[4]){l+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l);let c=[...r[0]][0].length,d=e.slice(0,s+r.index+c+o),h=d.slice(s,-s);return{type:\"del\",raw:d,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]===\"@\"?(n=t[1],r=\"mailto:\"+n):(n=t[1],r=n),{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]===\"@\")n=t[0],r=\"mailto:\"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(i!==t[0]);n=t[0],t[1]===\"www.\"?r=\"http://\"+t[0]:r=t[0]}return{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:t[0],escaped:n}}}};var x=class u{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||T,this.options.tokenizer=this.options.tokenizer||new w,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:B.normal,inline:E.normal};this.options.pedantic?(t.block=B.pedantic,t.inline=E.pedantic):this.options.gfm&&(t.block=B.gfm,this.options.breaks?t.inline=E.breaks:t.inline=E.gfm),this.tokenizer.rules=t}static get rules(){return{block:B,inline:E}}static lex(e,t){return new u(t).lex(e)}static lexInline(e,t){return new u(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\" \").replace(m.spaceLine,\"\"));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,a=e.slice(1),o;this.options.extensions.startBlock.forEach(l=>{o=l.call({lexer:this},a),typeof o==\"number\"&&o>=0&&(s=Math.min(s,o))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type===\"paragraph\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf(\"[\")+1,-1))&&(n=n.slice(0,r.index)+\"[\"+\"a\".repeat(r[0].length-2)+\"]\"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+\"++\"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)i=r[2]?r[2].length:0,n=n.slice(0,r.index+i)+\"[\"+\"a\".repeat(r[0].length-i-2)+\"]\"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,a=\"\";for(;e;){s||(a=\"\"),s=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type===\"text\"&&p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let l=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),d;this.options.extensions.startInline.forEach(h=>{d=h.call({lexer:this},c),typeof d==\"number\"&&d>=0&&(p=Math.min(p,d))}),p<1/0&&p>=0&&(l=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(l)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(a=o.raw.slice(-1)),s=!0;let p=t.at(-1);p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){let p=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return t}};var y=class{options;parser;constructor(e){this.options=e||T}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let r=(t||\"\").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,\"\")+`\n`;return r?'<pre><code class=\"language-'+O(r)+'\">'+(n?i:O(i,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?i:O(i,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,r=\"\";for(let a=0;a<e.items.length;a++){let o=e.items[a];r+=this.listitem(o)}let i=t?\"ol\":\"ul\",s=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+i+s+`>\n`+r+\"</\"+i+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let r=\"\";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n=\"\";for(let a=0;a<s.length;a++)n+=this.tablecell(s[a]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+r+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${O(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=J(e);if(i===null)return r;e=i;let s='<a href=\"'+e+'\"';return t&&(s+=' title=\"'+O(t)+'\"'),s+=\">\"+r+\"</a>\",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=J(e);if(i===null)return O(n);e=i;let s=`<img src=\"${e}\" alt=\"${O(n)}\"`;return t&&(s+=` title=\"${O(t)}\"`),s+=\">\",s}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:O(e.text)}};var $=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var b=class u{options;renderer;textRenderer;constructor(e){this.options=e||T,this.options.renderer=this.options.renderer||new y,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new $}static parse(e,t){return new u(t).parse(e)}static parseInline(e,t){return new u(t).parseInline(e)}parse(e){this.renderer.parser=this;let t=\"\";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let s=r,a=this.options.extensions.renderers[s.type].call({parser:this},s);if(a!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"def\",\"paragraph\",\"text\"].includes(s.type)){t+=a||\"\";continue}}let i=r;switch(i.type){case\"space\":{t+=this.renderer.space(i);break}case\"hr\":{t+=this.renderer.hr(i);break}case\"heading\":{t+=this.renderer.heading(i);break}case\"code\":{t+=this.renderer.code(i);break}case\"table\":{t+=this.renderer.table(i);break}case\"blockquote\":{t+=this.renderer.blockquote(i);break}case\"list\":{t+=this.renderer.list(i);break}case\"checkbox\":{t+=this.renderer.checkbox(i);break}case\"html\":{t+=this.renderer.html(i);break}case\"def\":{t+=this.renderer.def(i);break}case\"paragraph\":{t+=this.renderer.paragraph(i);break}case\"text\":{t+=this.renderer.text(i);break}default:{let s='Token with \"'+i.type+'\" type was not found.';if(this.options.silent)return console.error(s),\"\";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=\"\";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let a=this.options.extensions.renderers[i.type].call({parser:this},i);if(a!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(i.type)){n+=a||\"\";continue}}let s=i;switch(s.type){case\"escape\":{n+=t.text(s);break}case\"html\":{n+=t.html(s);break}case\"link\":{n+=t.link(s);break}case\"image\":{n+=t.image(s);break}case\"checkbox\":{n+=t.checkbox(s);break}case\"strong\":{n+=t.strong(s);break}case\"em\":{n+=t.em(s);break}case\"codespan\":{n+=t.codespan(s);break}case\"br\":{n+=t.br(s);break}case\"del\":{n+=t.del(s);break}case\"text\":{n+=t.text(s);break}default:{let a='Token with \"'+s.type+'\" type was not found.';if(this.options.silent)return console.error(a),\"\";throw new Error(a)}}}return n}};var P=class{options;block;constructor(e){this.options=e||T}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?x.lex:x.lexInline}provideParser(){return this.block?b.parse:b.parseInline}};var D=class{defaults=M();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=y;TextRenderer=$;Lexer=x;Tokenizer=w;Hooks=P;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case\"table\":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let a of s)n=n.concat(this.walkTokens(a.tokens,t));break}case\"list\":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let a=i[s].flat(1/0);n=n.concat(this.walkTokens(a,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error(\"extension name required\");if(\"renderer\"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=s.apply(this,a)),o}:t.renderers[i.name]=i.renderer}if(\"tokenizer\"in i){if(!i.level||i.level!==\"block\"&&i.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level===\"block\"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level===\"inline\"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}\"childTokens\"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new y(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if([\"options\",\"parser\"].includes(s))continue;let a=s,o=n.renderer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c||\"\"}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new w(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(s))continue;let a=s,o=n.tokenizer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new P;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if([\"options\",\"block\"].includes(s))continue;let a=s,o=n.hooks[a],l=i[a];P.passThroughHooks.has(s)?i[a]=p=>{if(this.defaults.async&&P.passThroughHooksRespectAsync.has(s))return(async()=>{let d=await o.call(i,p);return l.call(i,d)})();let c=o.call(i,p);return l.call(i,c)}:i[a]=(...p)=>{if(this.defaults.async)return(async()=>{let d=await o.apply(i,p);return d===!1&&(d=await l.apply(i,p)),d})();let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(s.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},a=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return a(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return a(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return a(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let o=s.hooks?await s.hooks.preprocess(n):n,p=await(s.hooks?await s.hooks.provideLexer():e?x.lex:x.lexInline)(o,s),c=s.hooks?await s.hooks.processAllTokens(p):p;s.walkTokens&&await Promise.all(this.walkTokens(c,s.walkTokens));let h=await(s.hooks?await s.hooks.provideParser():e?b.parse:b.parseInline)(c,s);return s.hooks?await s.hooks.postprocess(h):h})().catch(a);try{s.hooks&&(n=s.hooks.preprocess(n));let l=(s.hooks?s.hooks.provideLexer():e?x.lex:x.lexInline)(n,s);s.hooks&&(l=s.hooks.processAllTokens(l)),s.walkTokens&&this.walkTokens(l,s.walkTokens);let c=(s.hooks?s.hooks.provideParser():e?b.parse:b.parseInline)(l,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let r=\"<p>An error occurred:</p><pre>\"+O(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var L=new D;function g(u,e){return L.parse(u,e)}g.options=g.setOptions=function(u){return L.setOptions(u),g.defaults=L.defaults,G(g.defaults),g};g.getDefaults=M;g.defaults=T;g.use=function(...u){return L.use(...u),g.defaults=L.defaults,G(g.defaults),g};g.walkTokens=function(u,e){return L.walkTokens(u,e)};g.parseInline=L.parseInline;g.Parser=b;g.parser=b.parse;g.Renderer=y;g.TextRenderer=$;g.Lexer=x;g.lexer=x.lex;g.Tokenizer=w;g.Hooks=P;g.parse=g;var Qt=g.options,jt=g.setOptions,Ft=g.use,Ut=g.walkTokens,Kt=g.parseInline,Wt=g,Xt=b.parse,Jt=x.lex;export{P as Hooks,x as Lexer,D as Marked,b as Parser,y as Renderer,$ as TextRenderer,w as Tokenizer,T as defaults,M as getDefaults,Jt as lexer,g as marked,Qt as options,Wt as parse,Kt as parseInline,Xt as parser,jt as setOptions,Ft as use,Ut as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","import { useMemo } from 'preact/hooks'\nimport { marked } from 'marked'\n\n/** Configure marked for chat-style output */\nmarked.setOptions({\n breaks: true,\n gfm: true,\n})\n\ninterface MarkdownContentProps {\n text: string\n}\n\n/**\n * Renders markdown text as HTML using `marked`.\n * Used for bot messages so formatting (bold, lists, code, links) displays correctly.\n */\nexport function MarkdownContent({ text }: MarkdownContentProps) {\n const html = useMemo(() => {\n if (!text) { return '' }\n const raw = marked.parse(text)\n // marked.parse can return string | Promise<string>; with async: false (default) it's always string\n return typeof raw === 'string' ? raw : ''\n }, [text])\n\n // eslint-disable-next-line react/no-danger\n return <div class=\"jex-md\" dangerouslySetInnerHTML={{ __html: html }} />\n}\n","import { signal } from '@preact/signals'\n\n/**\n * Visitor's draft message — shared so the reply icon on agent messages\n * can prepend an `@<agent>` mention into the active input. ChatInput\n * binds its <textarea> to this signal; BotMessage's reply icon writes\n * to it via `tagAgent`.\n *\n * Module-scope signal is fine here: a widget instance has at most one\n * active composer, and visitors never have two widgets on the same page.\n */\nexport const draftMessage = signal('')\n\n/**\n * Prepends `@<firstName> ` to the current draft so the visitor can type\n * their question after the mention. If the draft already contains a\n * mention for the same agent, it's a no-op. Trailing whitespace from\n * the existing draft is preserved.\n */\nexport function tagAgent(agentName: string | undefined): void {\n if (!agentName) {\n return\n }\n const firstName = agentName.trim().split(/\\s+/)[0]\n if (!firstName) {\n return\n }\n const mention = `@${firstName} `\n const current = draftMessage.value\n if (current.includes(mention) || current.includes(`@${firstName}`)) {\n return\n }\n draftMessage.value = current.trimStart()\n ? `${mention}${current.trimStart()}`\n : mention\n}\n","import { signal } from '@preact/signals'\n\n/** Wall-clock ms when visitor may send again. null = unsubscribed. */\nexport const rateLimitedUntilMs = signal<number | null>(null)\n\n/**\n * Module-scope wall-clock ticker. Updated once per second by\n * RateLimitNotice while a rate-limit countdown is active, used to\n * derive remaining seconds. Lives at module scope so multiple\n * consumers share one timer if needed.\n */\nexport const nowMs = signal<number>(Date.now())\n","import { signal } from '@preact/signals'\n\n/**\n * Pending image attachments staged in the composer.\n *\n * Frontend-only state for now. The backend `send` mutation accepts a\n * single `content: string` — image upload + persistence (Convex storage,\n * message-level attachment array, agent vision-input wiring) is a\n * follow-up. When that lands, replace `previewUrl` with the uploaded\n * `storageId` and pass the array in `send(...)`.\n *\n * `previewUrl` is an `URL.createObjectURL(file)` blob — callers MUST\n * revoke it via `removeAttachedImage` / `clearAttachedImages` to avoid\n * leaking memory.\n */\nexport interface AttachedImage {\n id: string\n file: File\n previewUrl: string\n}\n\nexport const attachedImages = signal<AttachedImage[]>([])\n\nconst MAX_IMAGE_ATTACHMENTS = 4\nconst MAX_IMAGE_BYTES = 8 * 1024 * 1024 // 8MB per file\n\n/**\n * Generate a unique id for a staged attachment.\n *\n * `crypto.randomUUID()` is only available in **secure contexts** (HTTPS\n * or localhost). The widget embeds inside visitor host pages — any HTTP\n * embed (intranet, file://, dev/staging without TLS) would throw\n * `TypeError: crypto.randomUUID is not a function` and crash the\n * composer the moment the visitor attaches an image.\n *\n * The id is used only as a local key + lookup handle (not security),\n * so a Date.now + Math.random fallback is fine — collision risk inside\n * a single composer session capped at 4 entries is negligible.\n */\nfunction genAttachmentId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n return `att-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`\n}\n\n/** Appends image files (after size + count guards) and creates blob preview URLs. */\nexport function addAttachedImages(files: FileList | File[]): void {\n const incoming = Array.from(files).filter((f) => f.type.startsWith('image/') && f.size <= MAX_IMAGE_BYTES)\n if (incoming.length === 0) {\n return\n }\n const room = MAX_IMAGE_ATTACHMENTS - attachedImages.value.length\n if (room <= 0) {\n return\n }\n const next = incoming.slice(0, room).map((file) => ({\n // Falls back to a non-crypto id when host page is HTTP — see genAttachmentId.\n id: genAttachmentId(),\n file,\n previewUrl: URL.createObjectURL(file),\n }))\n attachedImages.value = [...attachedImages.value, ...next]\n}\n\n/** Removes one staged image by id and revokes its blob URL. */\nexport function removeAttachedImage(id: string): void {\n const target = attachedImages.value.find((img) => img.id === id)\n if (target) {\n URL.revokeObjectURL(target.previewUrl)\n }\n attachedImages.value = attachedImages.value.filter((img) => img.id !== id)\n}\n\n/** Revokes every staged blob URL and resets the list. Call after send + on unmount. */\nexport function clearAttachedImages(): void {\n for (const img of attachedImages.value) {\n URL.revokeObjectURL(img.previewUrl)\n }\n attachedImages.value = []\n}\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { version } from \"../../index.js\";\nimport { performAsyncSyscall } from \"../impl/syscall.js\";\nimport {\n getFunctionAddress,\n setReferencePath,\n toReferencePath\n} from \"./paths.js\";\nimport { isValidator } from \"../../values/validator.js\";\nexport { getFunctionAddress } from \"./paths.js\";\nexport async function createFunctionHandle(functionReference) {\n const address = getFunctionAddress(functionReference);\n return await performAsyncSyscall(\"1.0/createFunctionHandle\", {\n ...address,\n version\n });\n}\nclass InstalledComponent {\n constructor(definition, name) {\n /**\n * @internal\n */\n __publicField(this, \"_definition\");\n /**\n * @internal\n */\n __publicField(this, \"_name\");\n this._definition = definition;\n this._name = name;\n setReferencePath(this, `_reference/childComponent/${name}`);\n }\n get exports() {\n return createExports(this._name, []);\n }\n}\nfunction createExports(name, pathParts) {\n const handler = {\n get(_, prop) {\n if (typeof prop === \"string\") {\n const newParts = [...pathParts, prop];\n return createExports(name, newParts);\n } else if (prop === toReferencePath) {\n let reference = `_reference/childComponent/${name}`;\n for (const part of pathParts) {\n reference += `/${part}`;\n }\n return reference;\n } else {\n return void 0;\n }\n }\n };\n return new Proxy({}, handler);\n}\nfunction createEnvRefs(ownerLabel, declared) {\n const handler = {\n get(_, prop) {\n if (typeof prop !== \"string\") {\n return void 0;\n }\n if (!declared || !Object.prototype.hasOwnProperty.call(declared, prop)) {\n throw new Error(\n `Env var \"${prop}\" is not declared on ${ownerLabel}. Add it to the \\`env\\` option of ${ownerLabel === \"this app\" ? \"defineApp\" : \"defineComponent\"}.`\n );\n }\n return { __envVarRef: prop };\n }\n };\n return new Proxy({}, handler);\n}\nfunction isEnvRef(value) {\n return typeof value === \"object\" && value !== null && typeof value.__envVarRef === \"string\";\n}\nfunction use(definition, options) {\n const importedComponentDefinition = definition;\n if (typeof importedComponentDefinition.componentDefinitionPath !== \"string\") {\n throw new Error(\n \"Component definition does not have the required componentDefinitionPath property. This code only works in Convex runtime.\"\n );\n }\n const name = options?.name ?? // added recently\n importedComponentDefinition.defaultName ?? // can be removed once backend is out\n importedComponentDefinition.componentDefinitionPath.split(\"/\").pop();\n if (typeof name !== \"string\") {\n throw new Error(\n `Component name must be a string. Received: ${typeof name}`\n );\n }\n if (name.length === 0) {\n throw new Error(\"Component name cannot be empty.\");\n }\n const httpPrefix = options?.httpPrefix;\n if (httpPrefix !== void 0) {\n if (!httpPrefix.startsWith(\"/\")) {\n throw new Error(\n `httpPrefix must start with \"/\". Received: \"${httpPrefix}\"`\n );\n }\n }\n const envValues = {};\n if (options?.env) {\n for (const [key, value] of Object.entries(options.env)) {\n if (value !== void 0) {\n envValues[key] = value;\n }\n }\n }\n this._childComponents.push([\n name,\n importedComponentDefinition,\n envValues,\n httpPrefix\n ]);\n return new InstalledComponent(definition, name);\n}\nfunction exportAppForAnalysis() {\n const definitionType = { type: \"app\" };\n const childComponents = serializeChildComponents(this._childComponents);\n const httpMounts = buildHttpMounts(this._childComponents);\n const envVars = this._env ? Object.entries(this._env).map(\n ([name, validator]) => [\n name,\n {\n type: \"value\",\n value: JSON.stringify(validator.json),\n ...validator.isOptional === \"optional\" ? { optional: true } : {}\n }\n ]\n ) : void 0;\n return {\n definitionType,\n ...this._httpPrefix !== void 0 ? { httpPrefix: normalizeHttpPrefix(this._httpPrefix) } : {},\n childComponents,\n httpMounts,\n exports: serializeExportTree(this._exportTree),\n ...envVars !== void 0 ? { envVars } : {}\n };\n}\nfunction serializeExportTree(tree) {\n const branch = [];\n for (const [key, child] of Object.entries(tree)) {\n let node;\n if (typeof child === \"string\") {\n node = { type: \"leaf\", leaf: child };\n } else {\n node = serializeExportTree(child);\n }\n branch.push([key, node]);\n }\n return { type: \"branch\", branch };\n}\nfunction normalizeHttpPrefix(prefix) {\n return prefix.endsWith(\"/\") ? prefix : prefix + \"/\";\n}\nfunction buildHttpMounts(childComponents) {\n const httpMounts = {};\n for (const [name, , , httpPrefix] of childComponents) {\n if (httpPrefix !== void 0) {\n const normalized = normalizeHttpPrefix(httpPrefix);\n httpMounts[normalized] = `_reference/childComponent/${name}`;\n }\n }\n return httpMounts;\n}\nfunction serializeChildComponents(childComponents) {\n return childComponents.map(([name, definition, p]) => {\n let env = null;\n if (p !== null) {\n env = [];\n for (const [name2, value] of Object.entries(p)) {\n if (value === void 0) {\n continue;\n }\n if (isEnvRef(value)) {\n env.push([name2, { type: \"envVar\", name: value.__envVarRef }]);\n } else if (typeof value === \"string\") {\n env.push([name2, { type: \"value\", value }]);\n } else {\n throw new Error(\n `Env var \"${name2}\" must be a string or an env var reference. Received: ${typeof value}`\n );\n }\n }\n }\n const path = definition.componentDefinitionPath;\n if (!path)\n throw new Error(\n \"no .componentPath for component definition \" + JSON.stringify(definition, null, 2)\n );\n return {\n name,\n path,\n args: [],\n env\n };\n });\n}\nfunction exportComponentForAnalysis() {\n const envVars = Object.entries(this._env).map(\n ([name, validator]) => [\n name,\n {\n type: \"value\",\n value: JSON.stringify(validator.json),\n ...validator.isOptional === \"optional\" ? { optional: true } : {}\n }\n ]\n );\n const definitionType = {\n type: \"childComponent\",\n name: this._name,\n args: []\n };\n const childComponents = serializeChildComponents(this._childComponents);\n const httpMounts = buildHttpMounts(this._childComponents);\n return {\n name: this._name,\n definitionType,\n childComponents,\n httpMounts,\n exports: serializeExportTree(this._exportTree),\n ...envVars.length > 0 ? { envVars } : {}\n };\n}\nexport function defineComponent(name, options) {\n const envValidators = {};\n if (options?.env) {\n for (const [key, decl] of Object.entries(options.env)) {\n if (decl !== null && decl !== void 0 && isValidator(decl)) {\n envValidators[key] = decl;\n } else {\n throw new Error(\n `Environment variable \"${key}\" must be defined with a validator (e.g. v.string()).`\n );\n }\n }\n }\n const ret = {\n _isRoot: false,\n _name: name,\n _env: envValidators,\n _childComponents: [],\n _exportTree: {},\n _onInitCallbacks: {},\n env: createEnvRefs(`component \"${name}\"`, options?.env),\n export: exportComponentForAnalysis,\n use,\n ...{}\n };\n return ret;\n}\nexport function defineApp(options) {\n const httpPrefix = options?.httpPrefix;\n if (httpPrefix !== void 0 && !httpPrefix.startsWith(\"/\")) {\n throw new Error(\n `httpPrefix must start with \"/\". Received: \"${httpPrefix}\"`\n );\n }\n const env = options?.env;\n if (env !== void 0) {\n for (const [name, validator] of Object.entries(env)) {\n if (!isValidator(validator)) {\n throw new Error(\n `Environment variable \"${name}\" must be defined with a validator (e.g. v.string()).`\n );\n }\n }\n }\n const ret = {\n _isRoot: true,\n _childComponents: [],\n _exportTree: {},\n ...httpPrefix !== void 0 ? { _httpPrefix: httpPrefix } : {},\n ...env !== void 0 ? { _env: env } : {},\n env: createEnvRefs(\"this app\", env),\n export: exportAppForAnalysis,\n use\n };\n return ret;\n}\nexport function currentSystemUdfInComponent(componentId) {\n return {\n [toReferencePath]: `_reference/currentSystemUdfInComponent/${componentId}`\n };\n}\nfunction createChildComponents(root, pathParts) {\n const handler = {\n get(_, prop) {\n if (typeof prop === \"string\") {\n const newParts = [...pathParts, prop];\n return createChildComponents(root, newParts);\n } else if (prop === toReferencePath) {\n if (pathParts.length < 1) {\n const found = [root, ...pathParts].join(\".\");\n throw new Error(\n `API path is expected to be of the form \\`${root}.childComponent.functionName\\`. Found: \\`${found}\\``\n );\n }\n return `_reference/childComponent/` + pathParts.join(\"/\");\n } else {\n return void 0;\n }\n }\n };\n return new Proxy({}, handler);\n}\nexport const componentsGeneric = () => createChildComponents(\"components\", []);\n//# sourceMappingURL=index.js.map\n","/* eslint-disable */\n/**\n * Generated `api` utility.\n *\n * THIS CODE IS AUTOMATICALLY GENERATED.\n *\n * To regenerate, run `npx convex dev`.\n * @module\n */\n\nimport { anyApi, componentsGeneric } from \"convex/server\";\n\n/**\n * A utility for referencing Convex functions in your app's API.\n *\n * Usage:\n * ```js\n * const myFunctionReference = api.myModule.myFunction;\n * ```\n */\nexport const api = anyApi;\nexport const internal = anyApi;\nexport const components = componentsGeneric();\n","import { useMutation } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\nimport { markActivity } from '../../../../module/visitor/visitor.state'\nimport { draftMessage, rateLimitedUntilMs, clearAttachedImages } from '../state'\n\ninterface UseSendMessageArgs {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n ensureSession: () => Promise<{ sessionId: Id<'contactSessions'>; visitorId: string } | null>\n}\n\n/**\n * Composer send-message hook — single seam over the Convex `send`\n * mutation.\n *\n * Owns:\n * - ensure-session lazy create (anonymous visitors commit on first send)\n * - rate_limit response → write `rateLimitedUntilMs` signal\n * - success → `markActivity` so the session stays in history list\n * - network / NOT_FOUND throws → log\n *\n * The returned function takes only `content` because the session\n * deps are captured at hook-call time. Composer state mutations\n * (clear draft, clear staged images) remain in the calling component\n * so the component still owns its composer reset.\n */\nexport function useSendMessage({ sessionId, visitorId, ensureSession }: UseSendMessageArgs) {\n // Bound to the public send mutation — single touch point if the\n // backend path moves.\n const send = useMutation(api.functions.chat.public.conversations.send)\n\n return async function sendMessage(content: string): Promise<void> {\n // Resolve session (existing or freshly created).\n const session = sessionId && visitorId\n ? { sessionId, visitorId }\n : await ensureSession()\n\n if (!session) {\n // ensureSession failed (network down / unauthorized / bootstrap\n // token missing). Visitor's draft + staged attachments stay so\n // they can retry once the SessionErrorNotice resolves — do not\n // silently destroy what they typed.\n return\n }\n\n // Composer reset happens AFTER the session is confirmed so a failed\n // session-create cannot wipe the visitor's text. Reset is still\n // BEFORE the send mutation so the textarea feels instant — if the\n // mutation later throws / rate-limits, the inline notices surface\n // it without the visitor losing their place mid-conversation.\n draftMessage.value = ''\n clearAttachedImages()\n\n try {\n // Fire the send mutation — backend returns a discriminator on\n // rate-limit instead of throwing, so we branch on `result.ok`.\n const result = await send({\n sessionId: session.sessionId,\n visitorId: session.visitorId,\n content,\n })\n\n // Narrow on `result.ok` first so any future failure variant (e.g.\n // 'session_closed', 'blocked') does NOT accidentally fall into\n // the markActivity branch. Only a confirmed success bumps TTL.\n if (result.ok) {\n // Bump sliding-TTL anchor so this session stays in history.\n markActivity(session.visitorId)\n } else if (result.reason === 'rate_limited') {\n // Write the countdown signal — RateLimitNotice subscribes to it.\n rateLimitedUntilMs.value = Date.now() + result.retryAfterMs\n }\n } catch (err) {\n // Non-rate-limit errors only (network, NOT_FOUND, etc.).\n console.error('[jexity] Failed to send message:', err)\n }\n }\n}\n","import { useEffect } from 'preact/hooks'\nimport { rateLimitedUntilMs, nowMs } from '../state'\n\ninterface UseRateLimitCountdownResult {\n /** True while a rate-limit window is open. */\n isActive: boolean\n /** Whole seconds remaining; 0 once the window expires. */\n remainingSeconds: number\n}\n\n/**\n * Rate-limit countdown — owns the per-second tick on `nowMs` and the\n * self-clearing setTimeout that resets `rateLimitedUntilMs` when the\n * retry-after window elapses.\n *\n * Splitting this out of RateLimitNotice puts timer ownership next to\n * the signal it drives (both live under `composer/state` /\n * `composer/hooks`). The notice becomes pure render.\n *\n * Reading both signals inside the hook body subscribes the calling\n * component to their updates, so the consumer re-renders once per\n * tick during a countdown — that is exactly what a countdown display\n * requires.\n */\nexport function useRateLimitCountdown(): UseRateLimitCountdownResult {\n const until = rateLimitedUntilMs.value\n const now = nowMs.value\n\n useEffect(() => {\n if (until === null) { return }\n\n // Tick the module-scope clock so subscribers re-render once per second.\n const tick = setInterval(() => { nowMs.value = Date.now() }, 1000)\n // Self-clear when the window expires; signal write triggers consumer re-render.\n const clear = setTimeout(() => { rateLimitedUntilMs.value = null }, Math.max(0, until - Date.now()))\n\n return () => {\n clearInterval(tick)\n clearTimeout(clear)\n }\n }, [until])\n\n const isActive = until !== null\n const remainingSeconds = isActive ? Math.max(0, Math.ceil((until - now) / 1000)) : 0\n\n return { isActive, remainingSeconds }\n}\n","import { useLocale } from '../../../../i18n/index'\nimport { useRateLimitCountdown } from '../hooks/useRateLimitCountdown'\n\n/**\n * Inline rate-limit countdown rendered above the chat input.\n *\n * Pure render. Timer ownership + auto-clear live in\n * `useRateLimitCountdown` so the notice never has to think about\n * intervals or signals directly.\n */\nexport function RateLimitNotice() {\n const s = useLocale()\n // Single seam over the per-second tick + auto-clear.\n const { isActive, remainingSeconds } = useRateLimitCountdown()\n\n if (!isActive) { return null }\n\n return (\n <div class=\"jex-rate-limit-notice\" role=\"status\" aria-live=\"polite\">\n {s.errorRateLimited.replace('{seconds}', String(remainingSeconds))}\n </div>\n )\n}\n","import { signal } from '@preact/signals'\n\n/**\n * Inline notice for session-creation failures. Visitor-facing widget can't\n * rely on console logs — every catch in useConvexSession / refreshBootstrap\n * that returns null must also write a reason here so ChatInput can render\n * a banner the visitor actually sees.\n *\n * - 'no-token' bootstrap token never arrived (initial POST failed,\n * network down, or 10s wait timed out)\n * - 'unauthorized' bootstrap token was rejected and refresh also failed\n * (origin de-authorised, clock skew, domain mis-config)\n * - 'network' transport error talking to Convex\n * - 'unknown' any other thrown error\n */\nexport type SessionErrorReason = 'no-token' | 'unauthorized' | 'network' | 'unknown'\n\nexport const sessionError = signal<SessionErrorReason | null>(null)\n","import { useLocale } from '../../../../i18n/index'\nimport { sessionError } from '../../state'\n\n/**\n * Inline banner rendered above the chat input when session creation fails.\n * Mirrors the RateLimitNotice pattern: module-scope signal, no prop drill,\n * self-clears on the next successful ensureSession() / startFresh() call.\n *\n * Visitor-facing widget — console logs are invisible to operators, so every\n * silent catch in useConvexSession / refreshBootstrap writes a reason here\n * and this component renders it. See state/session-error.ts for the reason enum.\n */\nexport function SessionErrorNotice() {\n const s = useLocale()\n const reason = sessionError.value\n if (reason === null) { return null }\n\n const message =\n reason === 'no-token' ? s.errorSessionNoToken\n : reason === 'unauthorized' ? s.errorSessionUnauthorized\n : reason === 'network' ? s.errorNetwork\n : s.somethingWentWrong\n\n return (\n <div class=\"jex-session-error-notice\" role=\"alert\" aria-live=\"assertive\">\n {message}\n </div>\n )\n}\n","export function SendIcon({ size = 18 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M22 2 11 13\" />\n <path d=\"M22 2 15 22 11 13 2 9l20-7z\" />\n </svg>\n )\n}\n","import { useEffect, useRef } from 'preact/hooks'\nimport { draftMessage, addAttachedImages } from '../state'\n\nconst MAX_TEXTAREA_PX = 132\n\ninterface UseComposerInputArgs {\n /** Called when the visitor presses Enter (without Shift). */\n onSend: () => void\n}\n\ninterface UseComposerInputResult {\n textareaRef: ReturnType<typeof useRef<HTMLTextAreaElement>>\n fileInputRef: ReturnType<typeof useRef<HTMLInputElement>>\n /** Enter → send, Shift+Enter → newline. */\n onKeyDown: (e: KeyboardEvent) => void\n /** Proxy click into the hidden native file input. */\n onAttachClick: () => void\n /** Validate + stage selected files, then reset the input value. */\n onFilesPicked: (e: Event) => void\n /** Focus the textarea when the visitor clicks empty card padding. */\n onCardClick: (e: MouseEvent) => void\n}\n\n/**\n * Composer input behaviours — the four side effects that used to live\n * inline in ComposerRow.tsx:\n *\n * 1. Autosize the textarea up to MAX_TEXTAREA_PX, then scroll.\n * 2. Send-on-Enter (preserving Shift+Enter for newline).\n * 3. Attach button → hidden <input type=\"file\"> proxy.\n * 4. Click-on-empty-card → focus the textarea (Intercom pattern).\n *\n * Returning refs + handlers keeps ComposerRow purely declarative —\n * it wires the result onto the DOM and never touches a useEffect or\n * useRef of its own. The hook reads `draftMessage` directly because\n * the autosize effect depends on the draft value, and that\n * dependency is composer-internal.\n */\nexport function useComposerInput({ onSend }: UseComposerInputArgs): UseComposerInputResult {\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n // Autosize: collapse to 0 then grow to scrollHeight, capped at MAX_TEXTAREA_PX.\n // Reading `draftMessage.value` subscribes the effect to draft updates.\n useEffect(() => {\n const el = textareaRef.current\n if (!el) {\n return\n }\n el.style.height = '0'\n const next = Math.min(el.scrollHeight, MAX_TEXTAREA_PX)\n el.style.height = `${next}px`\n el.style.overflowY = el.scrollHeight > MAX_TEXTAREA_PX ? 'auto' : 'hidden'\n }, [draftMessage.value])\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSend()\n }\n }\n\n function onAttachClick() {\n fileInputRef.current?.click()\n }\n\n function onFilesPicked(e: Event) {\n const target = e.currentTarget as HTMLInputElement\n if (target.files && target.files.length > 0) {\n // Stage selected images in shared composer state (8MB / 4-image cap).\n addAttachedImages(target.files)\n }\n // Reset so re-selecting the same file fires onChange.\n target.value = ''\n }\n\n function onCardClick(e: MouseEvent) {\n // Click on empty card padding focuses the textarea.\n // Buttons / textarea / chip images keep their native click behaviour.\n const target = e.target as HTMLElement\n if (target === e.currentTarget || !target.closest('button, textarea, img')) {\n textareaRef.current?.focus()\n }\n }\n\n return { textareaRef, fileInputRef, onKeyDown, onAttachClick, onFilesPicked, onCardClick }\n}\n","import { useLocale } from '../../../../i18n/index'\nimport { SendIcon } from '../../../../shared/icons/SendIcon'\nimport { draftMessage, attachedImages, removeAttachedImage } from '../state'\nimport { useComposerInput } from '../hooks/useComposerInput'\n\ninterface ComposerRowProps {\n isStreaming: boolean\n disabled: boolean\n inputDisabled: boolean\n onSend: () => void\n onFocus?: () => void\n}\n\n/**\n * Composer row — autosize textarea, attach button, staged image chips,\n * and a state-driven send button rendered inside one focus-within card.\n *\n * Pure presentation. All side effects (autosize, file picker proxy,\n * focus-on-empty-click, Enter-to-send) live in `useComposerInput`.\n * The component reads two composer signals (`draftMessage`,\n * `attachedImages`) for render-time conditionals and writes through\n * the hook + `removeAttachedImage`.\n *\n * Design notes:\n * - The whole card owns the border + focus-within highlight so the\n * send button can never overflow at narrow viewports.\n * - Send button has two visual states: \"muted\" (no draft / images)\n * and \"active\" (something to send). Streaming locks the textarea\n * via `inputDisabled` upstream; the button stays muted because\n * hasInput is false after clear-on-send.\n */\nexport function ComposerRow({ isStreaming, disabled, inputDisabled, onSend, onFocus }: ComposerRowProps) {\n const s = useLocale()\n const input = draftMessage\n const images = attachedImages\n // Behaviour seam — refs + handlers managed in the hook.\n const { textareaRef, fileInputRef, onKeyDown, onAttachClick, onFilesPicked, onCardClick } = useComposerInput({ onSend })\n\n const hasInput = input.value.trim().length > 0\n const hasImages = images.value.length > 0\n const sendActive = (hasInput || hasImages) && !disabled\n\n return (\n <div class=\"jex-composer-card\" onClick={onCardClick}>\n {hasImages && (\n <div class=\"jex-composer-attachments\" role=\"list\">\n {images.value.map((img) => (\n <div key={img.id} class=\"jex-attachment-chip\" role=\"listitem\">\n <img src={img.previewUrl} alt={img.file.name} class=\"jex-attachment-thumb\" />\n <button\n type=\"button\"\n class=\"jex-attachment-remove\"\n aria-label={s.removeAttachmentAriaLabel}\n onClick={() => { removeAttachedImage(img.id) }}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n class=\"jex-composer-textarea\"\n aria-label={s.inputPlaceholder}\n placeholder={isStreaming ? s.aiThinking : s.inputPlaceholder}\n value={input.value}\n rows={1}\n onInput={(e) => { input.value = e.currentTarget.value }}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n disabled={inputDisabled}\n />\n\n <div class=\"jex-composer-actions\">\n <div class=\"jex-composer-actions-left\">\n {/* Hidden native file input — attach button proxies its click. */}\n <input\n ref={fileInputRef}\n class=\"jex-visually-hidden\"\n type=\"file\"\n accept=\"image/*\"\n multiple\n onChange={onFilesPicked}\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n {/*\n * Attach button is intentionally disabled until the backend\n * wiring lands. Plan:\n * docs/superpowers/plans/2026-05-22-widget-attachments.md\n * To re-enable: drop the `disabled={true}` override + swap\n * aria-label / title back to attachImagesAriaLabel.\n */}\n <button\n type=\"button\"\n class=\"jex-attach-btn\"\n aria-label={s.attachComingSoon}\n title={s.attachComingSoon}\n disabled={true}\n onClick={onAttachClick}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n </button>\n </div>\n\n <button\n class={`jex-send-btn${sendActive ? ' jex-send-btn-active' : ''}`}\n type=\"button\"\n onClick={onSend}\n aria-label={s.sendAriaLabel}\n disabled={disabled || (!hasInput && !hasImages)}\n >\n <SendIcon size={16} />\n </button>\n </div>\n </div>\n )\n}\n","import { useLocale } from '../../../../i18n/index'\nimport { resolvedPrivacyPolicyUrl } from '../../../../module/shell/shell.state'\n\ninterface PrivacyNoticeProps {\n variant: 'chip' | 'explicit'\n isOpen?: boolean\n onAcknowledge?: () => void\n}\n\n/** Visitor-facing privacy notice shown above the composer. */\nexport function PrivacyNotice({ variant, isOpen = false, onAcknowledge }: PrivacyNoticeProps) {\n const s = useLocale()\n const privacyUrl = resolvedPrivacyPolicyUrl.value\n\n if (variant === 'explicit') {\n if (!isOpen) {\n return null\n }\n\n return (\n <div class=\"jex-privacy-explicit\" role=\"dialog\" aria-label={s.privacyExplicitTitle}>\n <div class=\"jex-privacy-explicit-content\">\n <div class=\"jex-privacy-explicit-icon\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n </div>\n <div class=\"jex-privacy-explicit-copy\">\n <div class=\"jex-privacy-explicit-title\">{s.privacyExplicitTitle}</div>\n <p class=\"jex-privacy-explicit-body\">\n {s.privacyExplicitBodyPre}{' '}\n <a\n href={privacyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"jex-privacy-notice-link\"\n >\n {s.privacyPolicyLinkText}\n </a>.\n </p>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"jex-privacy-explicit-button\"\n onClick={onAcknowledge}\n >\n {s.privacyExplicitButton}\n </button>\n </div>\n )\n }\n\n return (\n <p class=\"jex-privacy-chip\">\n <span class=\"jex-privacy-chip-icon\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n </span>\n <a\n href={privacyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"jex-privacy-chip-link\"\n >\n {s.privacyChipText}\n </a>\n </p>\n )\n}\n","import { useEffect, useState } from 'preact/hooks'\nimport { useLocale } from '../../../../i18n/index'\nimport { privacyNoticeStyle } from '../../../../module/shell/shell.state'\nimport { draftMessage, rateLimitedUntilMs } from '../state'\nimport { useSendMessage } from '../hooks/useSendMessage'\nimport { RateLimitNotice } from './RateLimitNotice'\nimport { SessionErrorNotice } from './SessionErrorNotice'\nimport { ComposerRow } from './ComposerRow'\nimport { PrivacyNotice } from './PrivacyNotice'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface ChatInputProps {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n isLoading: boolean\n isStreaming: boolean\n sessionStatus: 'active' | 'escalated' | 'assigned' | 'resolved' | null\n ensureSession: () => Promise<{ sessionId: Id<'contactSessions'>; visitorId: string } | null>\n onStartFresh: () => void\n}\n\n/** Composer area: stacks inline notices above a single focus-within input row. */\nexport function ChatInput({\n sessionId,\n visitorId,\n isLoading,\n isStreaming,\n sessionStatus,\n ensureSession,\n onStartFresh,\n}: ChatInputProps) {\n const s = useLocale()\n const input = draftMessage\n const noticeStyle = privacyNoticeStyle.value\n const [privacyGate, setPrivacyGate] = useState({ open: false, acknowledged: false })\n const sendMessage = useSendMessage({ sessionId, visitorId, ensureSession })\n\n const isRateLimited = rateLimitedUntilMs.value !== null && rateLimitedUntilMs.value > Date.now()\n const sendDisabled = isLoading || isStreaming || isRateLimited\n const requiresPrivacyAck = noticeStyle === 'explicit' && !privacyGate.acknowledged\n const blocksComposer = noticeStyle === 'explicit' && privacyGate.open\n\n function openPrivacyExplicit() {\n if (requiresPrivacyAck) {\n setPrivacyGate(g => ({ ...g, open: true }))\n }\n }\n\n function acknowledgePrivacyExplicit() {\n setPrivacyGate({ open: false, acknowledged: true })\n }\n\n useEffect(() => {\n setPrivacyGate({ open: false, acknowledged: false })\n }, [sessionId])\n\n if (sessionStatus === 'resolved') {\n return (\n <div class=\"jex-chat-input-resolved\">\n <div class=\"jex-resolved-notice\">{s.sessionResolved}</div>\n <button\n class=\"jex-resolved-new-btn\"\n type=\"button\"\n onClick={() => { void onStartFresh() }}\n >\n {s.startNewConversation}\n </button>\n </div>\n )\n }\n\n async function handleSend() {\n const content = input.value.trim()\n if (!content || sendDisabled) { return }\n if (requiresPrivacyAck) {\n setPrivacyGate(g => ({ ...g, open: true }))\n return\n }\n\n await sendMessage(content)\n }\n\n return (\n <div class=\"jex-chat-input\">\n <RateLimitNotice />\n <SessionErrorNotice />\n {noticeStyle === 'chip' && <PrivacyNotice variant=\"chip\" />}\n <div class={`jex-chat-input-composer-gate${blocksComposer ? ' jex-chat-input-composer-gate-open' : ''}`}>\n <ComposerRow\n isStreaming={isStreaming}\n disabled={sendDisabled}\n inputDisabled={isLoading || isStreaming || blocksComposer}\n onSend={handleSend}\n onFocus={openPrivacyExplicit}\n />\n {noticeStyle === 'explicit' && (\n <PrivacyNotice\n variant=\"explicit\"\n isOpen={privacyGate.open}\n onAcknowledge={acknowledgePrivacyExplicit}\n />\n )}\n </div>\n </div>\n )\n}\n","import { useCallback, useState } from 'preact/hooks'\nimport { CornerUpLeft } from 'lucide-preact'\nimport { MarkdownContent } from './MarkdownContent'\nimport { BotIcon } from '../../../shared/icons/BotIcon'\nimport { tagAgent } from '../composer'\nimport { useLocale } from '../../../i18n/index'\n\ninterface BotMessageProps {\n text: string\n streaming?: boolean\n error?: boolean\n /** BetterAuth user ID — present only for human agent replies */\n authorId?: string\n /** Denormalized agent display name */\n authorName?: string\n /** Denormalized agent profile image URL */\n authorImage?: string\n /** Custom bot avatar URL from widgetConfigs (future — falls back to BotIcon) */\n botAvatarUrl?: string\n}\n\n/** Extract up to 2 initials from a display name. Returns '?' for empty/whitespace input. */\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (parts.length === 0) { return '?' }\n return parts.map(p => p[0]).join('').slice(0, 2).toUpperCase()\n}\n\nexport function BotMessage({ text, streaming, error, authorId, authorName, authorImage, botAvatarUrl }: BotMessageProps) {\n const s = useLocale()\n const isHuman = !!authorId\n const [imgBroken, setImgBroken] = useState(false)\n const onImgError = useCallback(() => setImgBroken(true), [])\n const replyLabel = s.replyTo.replace('{name}', authorName ?? '')\n\n const bubbleClass = [\n 'jex-message bot',\n error ? 'jex-message-error' : '',\n ].filter(Boolean).join(' ')\n\n // Avatar: human agent (photo → initials) or bot (custom URL → default icon)\n const renderAvatar = () => {\n if (isHuman && authorImage && !imgBroken) {\n return <img src={authorImage} alt={authorName ?? ''} class=\"jex-avatar-img\" onError={onImgError} />\n }\n if (isHuman) {\n return <span class=\"jex-avatar-initials\">{getInitials(authorName ?? '')}</span>\n }\n if (botAvatarUrl && !imgBroken) {\n return <img src={botAvatarUrl} alt=\"\" class=\"jex-avatar-img\" onError={onImgError} />\n }\n return <BotIcon size={14} />\n }\n\n return (\n <div class=\"jex-message-row bot\">\n <div class={`jex-avatar ${isHuman ? 'jex-avatar-agent' : 'jex-avatar-bot'}`}>\n {renderAvatar()}\n </div>\n\n <div class=\"jex-message-content\">\n <div class={bubbleClass}>\n <MarkdownContent text={text} />\n {streaming && <span class=\"jex-streaming-cursor\" />}\n </div>\n {isHuman && authorName && (\n <div class=\"jex-message-author-row\">\n <span class=\"jex-message-author\">{authorName}</span>\n <button\n type=\"button\"\n class=\"jex-reply-tag-btn\"\n aria-label={replyLabel}\n title={replyLabel}\n onClick={() => { tagAgent(authorName) }}\n >\n <CornerUpLeft size={12} />\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","interface UserMessageProps {\n text: string\n}\n\nexport function UserMessage({ text }: UserMessageProps) {\n return <div class=\"jex-message user\">{text}</div>\n}\n","import { useMutation } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\n\n/**\n * Escalation submit hook — single touch point for the\n * `submitEscalation` mutation.\n *\n * Returned function inserts the visitor's name + email onto the\n * escalation form-message row and triggers the backend's inline\n * escalation-confirm BotMessage insertion. Two consumers today\n * (FormMessage + EscalationFormScreen); each owns its own\n * submitting / error UI.\n *\n * Components that want error UI must catch the rejection themselves;\n * this hook intentionally does not encapsulate error state because\n * the two consumers render error differently (inline alert vs.\n * silent log + form-reset).\n */\nexport function useEscalation() {\n return useMutation(api.functions.chat.public.helpdesk.submitEscalation)\n}\n","import { useState } from 'preact/hooks'\nimport { locale as widgetLocale, useLocale } from '../../../i18n/index'\nimport { PLATFORM_PRIVACY_POLICY_URL, resolvedPrivacyPolicyUrl } from '../../../module/shell/shell.state'\nimport { useEscalation } from '../hooks/useEscalation'\nimport type { Doc, Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface FormMessageProps {\n message: Doc<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\n/**\n * Inline escalation form rendered inside the chat thread.\n *\n * Two states:\n * - Not submitted (formData undefined): interactive form with name + email\n * - Submitted (formData exists): read-only card showing submitted data\n *\n * Follows the same patterns as FormScreen.tsx:\n * - Preact hooks for state, onInput for controlled fields\n * - .jex-* CSS classes, reuses .jex-form-input and .jex-form-submit\n */\nexport function FormMessage({ message, sessionId, visitorId }: FormMessageProps) {\n const t = useLocale()\n\n // Already submitted — render full-width centered action card\n if (message.formData) {\n return (\n <div class=\"jex-inline-form-submitted\">\n <span class=\"jex-inline-form-check\">✓</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.escalationSubmitted}</div>\n <div class=\"jex-inline-form-submitted-detail\">\n {message.formData.visitorName} · {message.formData.visitorEmail}\n </div>\n </div>\n </div>\n )\n }\n\n // Not yet submitted — render interactive form\n return (\n <div class=\"jex-message-row bot\">\n <FormMessageInput\n messageId={message._id}\n sessionId={sessionId}\n visitorId={visitorId}\n />\n </div>\n )\n}\n\n// ── Interactive form (extracted to keep FormMessage clean) ─────────────────\n\ninterface FormMessageInputProps {\n messageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\nfunction FormMessageInput({ messageId, sessionId, visitorId }: FormMessageInputProps) {\n const t = useLocale()\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [submitting, setSubmitting] = useState(false)\n const rawPrivacyUrl = resolvedPrivacyPolicyUrl.value\n const privacyUrl = /^https?:\\/\\//i.test(rawPrivacyUrl) ? rawPrivacyUrl : PLATFORM_PRIVACY_POLICY_URL\n\n // Bound to the escalation seam — single touch point shared with EscalationFormScreen.\n const submitEscalation = useEscalation()\n\n async function handleSubmit(e: Event) {\n e.preventDefault()\n if (submitting) { return }\n\n setSubmitting(true)\n try {\n await submitEscalation({\n sessionId,\n visitorId,\n formMessageId: messageId,\n visitorName: name.trim(),\n visitorEmail: email.trim(),\n locale: widgetLocale.value,\n })\n } catch (error) {\n console.error('[FormMessage] Submit failed:', error)\n setSubmitting(false)\n }\n // On success, the mutation patches formData on the message.\n // Convex subscription triggers re-render → FormMessage shows read-only state.\n // No need to manually update state.\n }\n\n return (\n <div class=\"jex-inline-form\">\n <div class=\"jex-inline-form-title\">{t.escalationFormTitle}</div>\n <form class=\"jex-form\" onSubmit={(e) => { void handleSubmit(e) }}>\n <input\n class=\"jex-form-input\"\n type=\"text\"\n placeholder={t.escalationNameLabel}\n value={name}\n required\n disabled={submitting}\n onInput={(e) => { setName(e.currentTarget.value) }}\n />\n <input\n class=\"jex-form-input\"\n type=\"email\"\n placeholder={t.escalationEmailLabel}\n value={email}\n required\n disabled={submitting}\n onInput={(e) => { setEmail(e.currentTarget.value) }}\n />\n <button class=\"jex-form-submit\" type=\"submit\" disabled={submitting}>\n {submitting ? t.escalationSubmitting : t.escalationSubmit}\n </button>\n </form>\n <div class=\"jex-inline-form-consent\">\n {t.escalationConsent}{' '}\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {t.escalationPrivacyLinkText}\n </a>.\n </div>\n </div>\n )\n}\n","import { useAction, useMutation } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Safe trial slot shape returned by `listTrialSlots`. The backend validator\n * also carries `endDateTime`/`rawId`/`title`, but the widget only ever reads\n * `startDateTime` (submitted as the `slotId` field + used as the option key),\n * so we keep the widget type honest and narrow.\n */\nexport interface TrialSlot {\n startDateTime: string\n}\n\n/**\n * Result of `listTrialSlots`. `status` distinguishes a healthy empty list\n * (`ok` + zero slots → no availability) from a backend/availability failure\n * (`unavailable` / `network_error` → retryable). The widget no longer reads a\n * separate `ok` boolean — `status === 'ok'` is the single success signal.\n * Extra backend fields are intentionally dropped from this mirror.\n */\nexport interface TrialSlotsResult {\n status: 'ok' | 'unavailable' | 'network_error'\n slots: TrialSlot[]\n}\n\nexport type ListTrialSlots = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n trainerRequired: boolean\n}) => Promise<TrialSlotsResult>\n\n/** Per-field visibility/requirement flag from the resolved studio plan. */\nexport interface TrialFieldFlag {\n visible: boolean\n required: boolean\n}\n\n/** Resolved per-studio trial plan (only present when status === \"ok\"). */\nexport interface TrialConfigPlan {\n firstname: TrialFieldFlag\n lastname: TrialFieldFlag\n email: TrialFieldFlag\n phone: TrialFieldFlag\n dateOfBirth: TrialFieldFlag\n gender: TrialFieldFlag\n /** Governs street/houseNumber/city/country as a group. */\n address: TrialFieldFlag\n zip: TrialFieldFlag\n}\n\nexport type TrialConfigResult =\n | {\n status: 'ok'\n plan: TrialConfigPlan\n minimumAge: number\n bookingWithoutTrainerAllowed: boolean\n /** Stored studio IANA timezone (or null) for bare-UTC slot display. */\n studioZoneId: string | null\n }\n | {\n status: 'unsupported' | 'inconsistent' | 'unavailable'\n message: string\n }\n\nexport type GetTrialConfig = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}) => Promise<TrialConfigResult>\n\n/**\n * Magicline widget seam — single touch point for the public Magicline widget\n * functions.\n *\n * - `useMagiclineSubmit` wraps the `submitForm` mutation. The mutation inserts\n * the submission row, patches the form card to `submitted`, and schedules the\n * Node submit action. Consumers own their own submitting / error UI.\n * - `useTrialConfig` wraps the `getTrialConfig` action — the dynamic form fetches\n * the per-studio field plan on mount and renders fields accordingly.\n * - `useTrialSlots` wraps the `listTrialSlots` action. It is fail-safe on the\n * backend (never throws, always returns a result object), but the network\n * call itself can still reject; callers should catch and treat a rejection\n * the same as an `unavailable` status. It now forwards the visitor's\n * `trainerRequired` preference (re-fetched when the toggle changes).\n *\n * Mirrors `useEscalation` / `useHandoff`: thin api-path abstraction, no state.\n */\nexport function useMagiclineSubmit() {\n return useMutation(api.functions.magicline.public.submitForm)\n}\n\nexport function useTrialConfig(): GetTrialConfig {\n return useAction(api.functions.magicline.actions.getTrialConfig)\n}\n\nexport function useTrialSlots(): ListTrialSlots {\n return useAction(api.functions.magicline.actions.listTrialSlots)\n}\n\n// ── Contract creation (membership signup) ───────────────────────────────────\n\n/** A one-time / flat fee attached to a rate-bundle term. */\nexport interface ContractFlatFee {\n name: string\n price: number\n isStarterPackage: boolean\n paymentFrequencyLabel: string | null\n identifier: string | null\n}\n\n/** Attachment kind carried by a renderable text block. */\nexport type ContractAttachmentType = 'NONE' | 'URL' | 'FILE'\n\n/**\n * A free-text block (terms, conditions) attached to a rate-bundle term. A block\n * flagged `isConfirmationRequired` must be acknowledged before submit; the\n * widget echoes its `ackKey` back in `acknowledgedAckKeys`.\n */\nexport interface ContractTextBlock {\n id: number | null\n title: string\n text: string\n isConfirmationRequired: boolean\n attachmentType: ContractAttachmentType\n attachmentLabel: string | null\n attachmentUrl: string | null\n ackKey: string\n}\n\n/** Consent block attached to a single paid optional module. */\nexport interface ContractModuleConsent {\n ackKey: string\n title: string\n text: string\n attachmentLabel: string | null\n attachmentUrl: string | null\n}\n\n/** Payment-frequency classification for a paid optional module. */\nexport type ModulePaymentFrequencyType =\n | 'RECURRING'\n | 'NON_RECURRING'\n | 'MONTH_DAY'\n | 'TERM_BASED'\n | 'FREE'\n\n/** Renewal classification for a paid optional module's duration. */\nexport type ModuleExtensionType =\n | 'NONE'\n | 'TERM_EXTENSION'\n | 'SUBSEQUENT_RATE_DETAIL'\n\n/**\n * A paid optional module the visitor can add to a term. `price`/`currencyCode`\n * render with the same money formatter as the base price. When a `consent` is\n * present and the module is selected, its `ackKey` joins the required set. The\n * four display-only fields drive the price/renewal wording: `paymentFrequencyType`\n * + `recurringUnit` come from the payment-frequency path, `extensionType` +\n * `termExtension` from the duration path.\n */\nexport interface ContractOptionalModule {\n id: number\n name: string\n description: string | null\n price: number\n currencyCode: string\n termLabel: string | null\n paymentFrequencyType: ModulePaymentFrequencyType | null\n recurringUnit: 'DAY' | 'WEEK' | 'MONTH' | 'YEAR' | null\n extensionType: ModuleExtensionType | null\n termExtension: { value: number; unit: string } | null\n consent: ContractModuleConsent | null\n}\n\n/** A recurring period (payment frequency / cancellation period). */\nexport interface ContractPeriod {\n value: number\n unit: string\n}\n\n/**\n * One selectable membership offer — a rate-bundle TERM card. Terms are grouped\n * by `bundleId` / `bundleName` in the Offer step; each term is the radio-select\n * unit (its `termId` is what the preview + submit actions consume).\n */\nexport interface RateBundleTermCard {\n bundleId: number\n bundleName: string\n bundleDescription: string | null\n bundleSubDescription: string | null\n footnote: string | null\n termId: number\n termValue: number\n termUnit: string\n price: number\n currencyCode: string\n paymentFrequency: ContractPeriod\n cancellationPeriod: ContractPeriod | null\n defaultContractStartDate: string | null\n flatFees: ContractFlatFee[]\n includedModuleNames: string[]\n optionalModules: ContractOptionalModule[]\n textBlocks: ContractTextBlock[]\n}\n\n/**\n * Result of `getRateBundles`. `ok` carries the eligible term cards (an EMPTY\n * list is still `ok` → the widget shows a friendly no-offers state).\n * `unavailable` covers ownership / availability / network failures.\n */\nexport type RateBundlesResult =\n | { status: 'ok'; terms: RateBundleTermCard[] }\n | { status: 'unavailable'; message: string }\n\nexport type GetRateBundles = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}) => Promise<RateBundlesResult>\n\n/** Personal + address fields shared by the preview action (no bank data). */\nexport interface ContractCustomerFields {\n firstname: string\n lastname: string\n email: string\n dateOfBirth: string\n gender: string\n phone: string\n street: string\n houseNumber: string\n zipCode: string\n city: string\n}\n\n/** One selected paid module row in the preview pricing breakdown. */\nexport interface ContractPreviewModule {\n moduleId: number\n name: string\n amount: number\n currencyCode: string\n paymentFrequencyLabel: string | null\n}\n\n/** Aggregate contract-volume totals; null when Magicline omits them. */\nexport interface ContractVolume {\n total: number | null\n averagePerMonth: number | null\n averagePerFrequencyTerm: number | null\n}\n\n/**\n * Result of `getContractPreview`. `ok` carries the server-resolved pricing\n * (base, fees, selected `modules`, aggregate `contractVolume`) plus the\n * `pricingFingerprint` the submit action re-verifies. The non-ok branch\n * distinguishes a missing-consent / invalid-field client error from an\n * `offer_unavailable` (re-fetch offers) or a generic `unavailable`.\n */\nexport type ContractPreviewResult =\n | {\n status: 'ok'\n basePrice: number\n preUseCharge: number\n currencyCode: string\n flatFees: ContractFlatFee[]\n modules: ContractPreviewModule[]\n contractVolume: ContractVolume | null\n startDate: string\n /** Payment frequency of the revalidated term; renders the base-price period. */\n paymentFrequency: ContractPeriod\n pricingFingerprint: string\n }\n | {\n status: 'consent_required' | 'invalid_fields' | 'offer_unavailable' | 'unavailable'\n message: string\n }\n\nexport type GetContractPreview = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n termId: number\n startDate: string\n fields: ContractCustomerFields\n /** Chosen paid optional-module ids; omitted/empty when none selected. */\n selectedModuleIds?: number[]\n privacyConsent: boolean\n sepaConsent: boolean\n}) => Promise<ContractPreviewResult>\n\n/**\n * Result of `submitContractCreation`. `succeeded` carries the safe identifiers\n * (Magicline customer number for the success bubble). `failed` carries a safe\n * `errorCode` and a `retryable` flag — pre-dispatch failures may be retried by\n * the visitor; post-dispatch outcomes (`unknown_outcome`) never are.\n */\nexport type ContractSubmitResult =\n | { status: 'succeeded'; externalId: string | null; customerNumber: string | null }\n | { status: 'failed'; errorCode: string; message: string; retryable: boolean }\n\n/**\n * Submit args. `bankAccount` (accountHolder + IBAN) is the ONLY place the IBAN\n * ever travels — it is a transient action arg, never persisted or logged.\n */\nexport type SubmitContractCreation = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n projectId: Id<'projects'>\n formMessageId: Id<'conversations'>\n fields: {\n firstname: string\n lastname: string\n email: string\n phone: string\n dateOfBirth: string\n gender: string\n street: string\n houseNumber: string\n zipCode: string\n city: string\n rateBundleTermId: number\n privacyConsent: boolean\n sepaConsent: boolean\n }\n bankAccount: { accountHolder: string; iban: string }\n /** Chosen paid optional-module ids; omitted/empty when none selected. */\n selectedModuleIds?: number[]\n /** ackKeys the visitor confirmed (required text blocks + selected-module consents). */\n acknowledgedAckKeys?: string[]\n pricingFingerprint: string\n}) => Promise<ContractSubmitResult>\n\nexport function useRateBundles(): GetRateBundles {\n return useAction(api.functions.magicline.actions.getRateBundles)\n}\n\nexport function useContractPreview(): GetContractPreview {\n return useAction(api.functions.magicline.actions.getContractPreview)\n}\n\nexport function useSubmitContractCreation(): SubmitContractCreation {\n return useAction(api.functions.magicline.actions.submitContractCreation)\n}\n","import { PLATFORM_PRIVACY_POLICY_URL, resolvedPrivacyPolicyUrl } from '../../../../module/shell/shell.state'\nimport { en } from '../../../../i18n/locales/en'\nimport type { WidgetStrings } from '../../../../i18n/locales/en'\nimport { de } from '../../../../i18n/locales/de'\n\nconst LOCALE_STRINGS = { en, de } as const\n\n/** Basic RFC-lite email check — mirrors the widget's escalation expectations. */\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nexport function isValidEmail(value: string): boolean {\n return EMAIL_RE.test(value.trim())\n}\n\n/**\n * Whole-years age from an ISO `YYYY-MM-DD` date-of-birth string at `now`.\n * Returns `null` when the value is empty or unparseable (callers treat a null\n * age as \"not yet entered\", deferring to required-field handling). Client-side\n * UX only — the backend re-validates minimum age against the studio plan.\n *\n * The Y/M/D parts are parsed manually via `split('-')` instead of\n * `new Date('YYYY-MM-DD')`. The string form is parsed as UTC midnight, so\n * comparing it with LOCAL getters (`now.getDate()` etc.) shifts the day by one\n * in negative-offset timezones and mis-gates min-age on the birthday boundary.\n * Parsing the parts directly keeps the comparison purely calendar-based.\n */\nexport function ageFromIsoDate(isoDate: string, now: Date = new Date()): number | null {\n const trimmed = isoDate.trim()\n if (trimmed === '') {\n return null\n }\n const parts = trimmed.split('-')\n if (parts.length !== 3) {\n return null\n }\n const year = Number(parts[0])\n const month = Number(parts[1])\n const day = Number(parts[2])\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n !Number.isInteger(day) ||\n month < 1 ||\n month > 12 ||\n day < 1 ||\n day > 31\n ) {\n return null\n }\n let age = now.getFullYear() - year\n // month is 1-based here; now.getMonth() is 0-based, so compare year-relative.\n const monthDelta = now.getMonth() + 1 - month\n if (monthDelta < 0 || (monthDelta === 0 && now.getDate() < day)) {\n age -= 1\n }\n return age\n}\n\n/** Today's date as an ISO `YYYY-MM-DD` string in LOCAL time (for `<input max>`). */\nexport function todayIsoDate(now: Date = new Date()): string {\n const year = now.getFullYear()\n const month = String(now.getMonth() + 1).padStart(2, '0')\n const day = String(now.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\n/**\n * Resolve the privacy-policy URL the same way FormMessage does: prefer the\n * org-configured URL when it is absolute, otherwise fall back to the platform\n * default.\n */\nexport function resolvePrivacyUrl(): string {\n const raw = resolvedPrivacyPolicyUrl.value\n return /^https?:\\/\\//i.test(raw) ? raw : PLATFORM_PRIVACY_POLICY_URL\n}\n\n/**\n * Per-country IBAN length table. Countries not listed fall back to the generic\n * 15–34 character range. Mirrors the backend `IBAN_LENGTHS` so a client-side\n * pass means the server-side `validateIban` agrees (both run the same mod-97).\n */\nconst IBAN_LENGTHS: Record<string, number> = {\n DE: 22,\n AT: 20,\n CH: 21,\n GB: 22,\n FR: 27,\n NL: 18,\n BE: 16,\n ES: 24,\n IT: 27,\n PL: 28,\n SE: 24,\n NO: 15,\n DK: 18,\n FI: 18,\n PT: 25,\n}\n\nconst IBAN_GENERIC_MIN = 15\nconst IBAN_GENERIC_MAX = 34\n\n/** Strip whitespace and uppercase — the canonical IBAN form for validation. */\nexport function normalizeIban(raw: string): string {\n return raw.replace(/\\s+/g, '').toUpperCase()\n}\n\n/**\n * Client-side IBAN check mirroring the backend `validateIban` exactly:\n * 1. length against the per-country table (or the generic 15–34 bound);\n * 2. the ISO 13616 mod-97 check (move first 4 chars to the end, expand\n * letters A=10..Z=35, chunked reduction to stay in safe-integer range).\n *\n * Pure UX gate — the backend re-validates. The raw IBAN is never logged here.\n */\nexport function isValidIban(raw: string): boolean {\n const normalized = normalizeIban(raw)\n const country = normalized.slice(0, 2)\n const expectedLength = IBAN_LENGTHS[country]\n if (expectedLength !== undefined) {\n if (normalized.length !== expectedLength) {\n return false\n }\n } else if (normalized.length < IBAN_GENERIC_MIN || normalized.length > IBAN_GENERIC_MAX) {\n return false\n }\n\n const rearranged = normalized.slice(4) + normalized.slice(0, 4)\n let digits = ''\n for (const ch of rearranged) {\n const code = ch.charCodeAt(0)\n if (code >= 65 && code <= 90) {\n digits += String(code - 55)\n } else if (code >= 48 && code <= 57) {\n digits += ch\n } else {\n // Any non-alphanumeric character is invalid.\n return false\n }\n }\n\n let remainder = 0\n for (let i = 0; i < digits.length; i += 9) {\n const chunk = String(remainder) + digits.slice(i, i + 9)\n remainder = Number(chunk) % 97\n }\n return remainder === 1\n}\n\n/**\n * Mask an IBAN for the review summary: show the first 4 and last 4 characters\n * of the normalized value, bullets in between, regrouped into 4-char blocks.\n * e.g. `DE89 3704 0044 0532 0130 00` → `DE89 •••• •••• •••• •••• 00`. Used for\n * display ONLY — the raw IBAN never leaves component memory through this path.\n */\nexport function maskIban(raw: string): string {\n const normalized = normalizeIban(raw)\n if (normalized.length <= 8) {\n return normalized\n }\n const head = normalized.slice(0, 4)\n const tail = normalized.slice(-4)\n const masked = head + '•'.repeat(normalized.length - 8) + tail\n return masked.replace(/(.{4})/g, '$1 ').trim()\n}\n\n/**\n * Format a Magicline money amount with its currency code, localised to the\n * widget locale. Magicline rate-bundle / flat-fee prices are decimal MAJOR\n * units (e.g. `29` → \"29,00 €\"), so the value is rendered as-is — never divided.\n * Falls back to a bare numeric string when the currency code is unsupported by\n * the runtime's `Intl`.\n */\nexport function formatContractMoney(\n amount: number,\n currencyCode: string,\n widgetLocale: 'en' | 'de',\n): string {\n const bcp47 = widgetLocale === 'de' ? 'de-DE' : 'en-GB'\n try {\n return new Intl.NumberFormat(bcp47, {\n style: 'currency',\n currency: currencyCode,\n }).format(amount)\n } catch {\n return `${amount.toFixed(2)} ${currencyCode}`\n }\n}\n\n/**\n * Localised \"{value} {unit}\" period label, e.g. \"12 months\" / \"12 Monate\". The\n * Magicline period unit is an uppercase enum (`DAY` / `WEEK` / `MONTH` / `YEAR`);\n * unknown units fall back to a lowercased raw unit so the label degrades safely.\n */\nexport function formatContractPeriod(\n value: number,\n unit: string,\n widgetLocale: 'en' | 'de',\n): string {\n const plural = value !== 1\n const table: Record<string, Record<'en' | 'de', [string, string]>> = {\n DAY: { en: ['day', 'days'], de: ['Tag', 'Tage'] },\n WEEK: { en: ['week', 'weeks'], de: ['Woche', 'Wochen'] },\n MONTH: { en: ['month', 'months'], de: ['Monat', 'Monate'] },\n YEAR: { en: ['year', 'years'], de: ['Jahr', 'Jahre'] },\n }\n const entry = table[unit.toUpperCase()]\n if (!entry) {\n return `${value} ${unit.toLowerCase()}`\n }\n const [singular, pluralWord] = entry[widgetLocale]\n return `${value} ${plural ? pluralWord : singular}`\n}\n\n/**\n * Format an ISO date (`YYYY-MM-DD` or a full datetime) for display in the\n * review summary, localised to the widget locale. Falls back to the raw value\n * when unparseable so a malformed start date never blanks the summary row.\n */\nexport function formatContractDate(isoDate: string, widgetLocale: 'en' | 'de'): string {\n const trimmed = isoDate.trim()\n if (trimmed === '') {\n return '—'\n }\n const bcp47 = widgetLocale === 'de' ? 'de-DE' : 'en-GB'\n const date = new Date(trimmed)\n if (Number.isNaN(date.getTime())) {\n return isoDate\n }\n return date.toLocaleDateString(bcp47, { day: '2-digit', month: 'long', year: 'numeric' })\n}\n\n/**\n * Recurring-price frequency suffix for a rate-bundle term price, e.g.\n * \"per week\" / \"pro Woche\" (value === 1) or \"every 3 weeks\" / \"alle 3 Wochen\"\n * (value > 1). Used as a suffix after a formatted money amount in offer cards\n * and the review base-price line.\n *\n * Supported units: DAY / WEEK / MONTH / YEAR (Magicline uppercase enum).\n * Unknown units fall back to a lowercased raw unit so the label degrades safely.\n */\nexport function formatPaymentFrequency(\n value: number,\n unit: string,\n widgetLocale: 'en' | 'de',\n): string {\n const t = LOCALE_STRINGS[widgetLocale]\n const upper = unit.toUpperCase()\n if (value === 1) {\n const perMap: Record<string, string> = {\n DAY: t.magiclineFreqPerDay,\n WEEK: t.magiclineFreqPerWeek,\n MONTH: t.magiclineFreqPerMonth,\n YEAR: t.magiclineFreqPerYear,\n }\n return perMap[upper] ?? unit.toLowerCase()\n }\n const everyMap: Record<string, string> = {\n DAY: t.magiclineFreqEveryDays,\n WEEK: t.magiclineFreqEveryWeeks,\n MONTH: t.magiclineFreqEveryMonths,\n YEAR: t.magiclineFreqEveryYears,\n }\n const template = everyMap[upper]\n if (template === undefined) {\n return `${value} ${unit.toLowerCase()}`\n }\n return template.replace('{n}', String(value))\n}\n\n/**\n * Formatted price label for an optional module, combining the money amount with\n * the appropriate frequency or type suffix. Mirrors Fit Inn's formatPriceLabel.\n *\n * paymentFrequencyType values:\n * \"TERM_BASED\" → \"{money} per term\"\n * \"RECURRING\" → \"{money} \" + formatPaymentFrequency(1, recurringUnit)\n * \"NON_RECURRING\" → \"{money} one-time\"\n * \"MONTH_DAY\" → \"{money} one-time\"\n * \"FREE\" → \"included\"\n * null / other → bare money string\n */\nexport function formatModulePrice(\n amount: number,\n currencyCode: string,\n paymentFrequencyType: string | null,\n recurringUnit: string | null,\n widgetLocale: 'en' | 'de',\n): string {\n const t = LOCALE_STRINGS[widgetLocale]\n const money = formatContractMoney(amount, currencyCode, widgetLocale)\n switch (paymentFrequencyType) {\n case 'TERM_BASED':\n return `${money} ${t.magiclineModulePerTerm}`\n case 'RECURRING': {\n const unit = recurringUnit ?? 'MONTH'\n return `${money} ${formatPaymentFrequency(1, unit, widgetLocale)}`\n }\n case 'NON_RECURRING':\n return `${money} ${t.magiclineModuleOneTime}`\n case 'MONTH_DAY':\n return `${money} ${t.magiclineModuleOneTime}`\n case 'FREE':\n return t.magiclineModuleIncluded\n default:\n return money\n }\n}\n\n/**\n * Known Magicline flat-fee names mapped to WidgetStrings keys.\n * Keys are normalized (trimmed + lowercased) raw fee names as returned by the\n * Magicline /preview and rate-bundle endpoints; values are WidgetStrings keys.\n * Both the German studio name and the connectdemo English variant map to the\n * same key so the correct locale label is shown regardless of studio language.\n */\nconst FEE_NAME_KEY_MAP: Record<string, keyof WidgetStrings> = {\n startpaket: 'magiclineFeeStarterPackage',\n 'starter package': 'magiclineFeeStarterPackage',\n trainerpauschale: 'magiclineFeeTrainerFee',\n}\n\n/**\n * Localize a raw Magicline flat-fee name. When the normalized name is in the\n * known-fee map, the locale string for that key is returned. Otherwise the\n * original raw name is returned unchanged so unmapped fees degrade safely.\n */\nexport function localizeFeeName(rawName: string, t: WidgetStrings): string {\n const normalized = rawName.trim().toLowerCase()\n const key = FEE_NAME_KEY_MAP[normalized]\n if (key !== undefined) {\n return t[key] as string\n }\n return rawName\n}\n\n/**\n * Renewal label for an optional module extension type. Returns an empty string\n * when the type produces no visible renewal line (SUBSEQUENT_RATE_DETAIL, null).\n *\n * extensionType values:\n * \"NONE\" → \"No automatic renewal\"\n * \"TERM_EXTENSION\" → \"Renewal: {n} {unit}\" (via the period table)\n * \"SUBSEQUENT_RATE_DETAIL\"→ \"\" (no line rendered)\n * null → \"\" (no line rendered)\n */\nexport function formatModuleRenewal(\n extensionType: string | null,\n termExtension: { value: number; unit: string } | null,\n widgetLocale: 'en' | 'de',\n): string {\n const t = LOCALE_STRINGS[widgetLocale]\n if (extensionType === 'NONE') {\n return t.magiclineRenewalNone\n }\n if (extensionType === 'TERM_EXTENSION' && termExtension !== null) {\n // formatContractPeriod returns \"{value} {unitWord}\" — reuse it directly as\n // the full \"{n} {unit}\" interpolation since the template wraps both.\n const periodLabel = formatContractPeriod(termExtension.value, termExtension.unit, widgetLocale)\n return t.magiclineRenewalTerm.replace('{n} {unit}', periodLabel)\n }\n return ''\n}\n","/**\n * Widget-side Magicline constants. The widget cannot import the backend\n * `model.ts` (it is bundled separately), so the controlled `<select>` enums are\n * mirrored here. Every value below is a member of the backend `GENDER_ENUM` /\n * `COUNTRY_ENUM` so a submission re-validates server-side without surprises.\n */\n\n/** Magicline gender enum (controlled select). Mirrors backend `GENDER_ENUM`. */\nexport const GENDER_VALUES = ['MALE', 'FEMALE', 'UNISEX'] as const\nexport type GenderValue = (typeof GENDER_VALUES)[number]\n\n/**\n * Curated subset of the backend `COUNTRY_ENUM` for the country `<select>`.\n * Magicline's full enum has 250+ ISO codes; surfacing all of them in a widget\n * dropdown is poor UX. We ship the DACH region plus common neighbours — every\n * code here is a valid `COUNTRY_ENUM` member, so the server-side check passes.\n */\nexport interface CountryOption {\n code: string\n label: string\n}\n\nexport const COUNTRY_OPTIONS: readonly CountryOption[] = [\n { code: 'DE', label: 'Germany / Deutschland' },\n { code: 'AT', label: 'Austria / Österreich' },\n { code: 'CH', label: 'Switzerland / Schweiz' },\n { code: 'LI', label: 'Liechtenstein' },\n { code: 'LU', label: 'Luxembourg / Luxemburg' },\n { code: 'NL', label: 'Netherlands / Niederlande' },\n { code: 'BE', label: 'Belgium / Belgien' },\n { code: 'FR', label: 'France / Frankreich' },\n { code: 'IT', label: 'Italy / Italien' },\n { code: 'ES', label: 'Spain / Spanien' },\n { code: 'PL', label: 'Poland / Polen' },\n { code: 'CZ', label: 'Czechia / Tschechien' },\n { code: 'DK', label: 'Denmark / Dänemark' },\n { code: 'GB', label: 'United Kingdom' },\n { code: 'US', label: 'United States' },\n] as const\n","import type { TrialConfigPlan } from '../../hooks/useMagicline'\n\n/**\n * Ordered wizard step identifiers. The widget renders these as internal steps\n * inside ONE card (not one chat message per step).\n */\nexport type WizardStep = 'trainer' | 'slot' | 'personal' | 'address' | 'confirm'\n\n/**\n * Pure helper — resolves the ordered list of VISIBLE wizard steps for a studio\n * plan. Steps with no visible fields are skipped so the visitor never lands on\n * an empty page and the \"Step n of N\" counter shrinks accordingly.\n *\n * Skip rules:\n * - `trainer` — skipped unless the studio allows trainer-free bookings\n * (`bookingWithoutTrainerAllowed === true`); otherwise the choice is forced\n * and there is nothing to ask.\n * - `slot` — always shown (a slot is mandatory).\n * - `personal` — always shown (firstname/lastname are always visible+required).\n * - `address` — skipped when neither the address group nor the zip field is\n * visible per the plan.\n * - `confirm` — always shown (note + consent + summary + submit).\n *\n * Visibility is derived ONLY from the same `plan` the fields use — no second\n * source of truth.\n */\nexport function buildWizardSteps(\n plan: TrialConfigPlan,\n bookingWithoutTrainerAllowed: boolean,\n): WizardStep[] {\n const steps: WizardStep[] = []\n if (bookingWithoutTrainerAllowed) {\n steps.push('trainer')\n }\n steps.push('slot')\n steps.push('personal')\n if (plan.address.visible || plan.zip.visible) {\n steps.push('address')\n }\n steps.push('confirm')\n return steps\n}\n","import { useCallback, useEffect, useReducer } from 'preact/hooks'\nimport {\n useTrialConfig,\n useTrialSlots,\n type TrialConfigPlan,\n type TrialSlot,\n} from '../../hooks/useMagicline'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/** Resolved per-studio config (only present once the fetch succeeds). */\nexport interface ResolvedConfig {\n plan: TrialConfigPlan\n minimumAge: number\n bookingWithoutTrainerAllowed: boolean\n /** Studio IANA timezone (or null) — used to display bare-UTC slot times. */\n studioZoneId: string | null\n}\n\n/**\n * Config status as a CODE, not a resolved message. The view resolves the\n * code to a localised string at render time so a locale toggle mid-fill never\n * re-runs the config fetch and never nukes the filled form to an error card.\n */\nexport type ConfigStatusCode = 'unsupported' | 'inconsistent' | 'unavailable'\n\nexport type ConfigState =\n | { phase: 'loading' }\n | { phase: 'ready'; config: ResolvedConfig }\n | { phase: 'error'; code: ConfigStatusCode; backendMessage: string }\n\n/**\n * Slots lifecycle. `empty` (healthy, zero availability) is split from\n * `error` (unavailable / network_error / rejection) so the Slot step can show\n * a Retry affordance on `error` and a no-slots message on `empty`.\n */\nexport type SlotsState =\n | { phase: 'loading' }\n | { phase: 'ready'; slots: TrialSlot[] }\n | { phase: 'empty' }\n | { phase: 'error' }\n\n/** The flat field bag — all controlled inputs default to \"\". */\nexport interface TrialFormFields {\n firstName: string\n lastName: string\n email: string\n phone: string\n birthDate: string\n gender: string\n street: string\n houseNumber: string\n zip: string\n city: string\n country: string\n note: string\n slotId: string\n consent: boolean\n /** Trainer required defaults to TRUE (safest); preselected \"with trainer\". */\n trainerRequired: boolean\n}\n\nconst INITIAL_FIELDS: TrialFormFields = {\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n birthDate: '',\n gender: '',\n street: '',\n houseNumber: '',\n zip: '',\n city: '',\n country: '',\n note: '',\n slotId: '',\n consent: false,\n trainerRequired: true,\n}\n\ntype FieldAction =\n | { type: 'set'; key: keyof TrialFormFields; value: string | boolean }\n /** Trainer choice changes clear the picked slot in the SAME action. */\n | { type: 'setTrainer'; trainerRequired: boolean }\n /** Drop a slot selection that is no longer in the fresh list. */\n | { type: 'clearSlotIfAbsent'; available: string[] }\n\nfunction fieldsReducer(state: TrialFormFields, action: FieldAction): TrialFormFields {\n switch (action.type) {\n case 'set': {\n return { ...state, [action.key]: action.value }\n }\n case 'setTrainer': {\n // Clear the picked slot here (not in a mount effect) so a restored\n // selection survives, but a deliberate trainer change re-gates slots.\n return { ...state, trainerRequired: action.trainerRequired, slotId: '' }\n }\n case 'clearSlotIfAbsent': {\n if (state.slotId !== '' && !action.available.includes(state.slotId)) {\n return { ...state, slotId: '' }\n }\n return state\n }\n default: {\n return state\n }\n }\n}\n\nexport interface UseTrialBookingStateOptions {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\nexport interface TrialBookingState {\n fields: TrialFormFields\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n setTrainerRequired: (trainerRequired: boolean) => void\n configState: ConfigState\n slotsState: SlotsState\n /** Re-fetch slots with the current `trainerRequired` (Retry button). */\n refetchSlots: () => void\n}\n\n/**\n * Single fetch-once container for the trial-booking wizard.\n *\n * - Config is fetched ONCE on mount. A locale toggle does NOT re-fetch it\n * (no `t` in deps; status stored as a code).\n * - Slots are fetched once config is ready and again whenever `trainerRequired`\n * flips OR `refetchSlots` is called. A `refreshKey` counter drives the slot\n * effect so the Retry button can re-run it without other deps changing.\n * - Wizard STEP components read this shared state — mounting a step never\n * re-fetches config or slots (the fetches live on this single hook instance,\n * which is mounted once by the container, above the step switch).\n */\nexport function useTrialBookingState({\n sessionId,\n visitorId,\n}: UseTrialBookingStateOptions): TrialBookingState {\n const getTrialConfig = useTrialConfig()\n const listTrialSlots = useTrialSlots()\n\n const [fields, dispatch] = useReducer(fieldsReducer, INITIAL_FIELDS)\n const [configState, setConfigState] = useReducer(\n (_prev: ConfigState, next: ConfigState) => next,\n { phase: 'loading' } satisfies ConfigState,\n )\n const [slotsState, setSlotsState] = useReducer(\n (_prev: SlotsState, next: SlotsState) => next,\n { phase: 'loading' } satisfies SlotsState,\n )\n // Bumping this counter forces the slot effect to re-run (Retry / refetch).\n const [refreshKey, bumpRefresh] = useReducer((n: number) => n + 1, 0)\n\n const setField = useCallback((key: keyof TrialFormFields, value: string | boolean) => {\n dispatch({ type: 'set', key, value })\n }, [])\n\n const setTrainerRequired = useCallback((trainerRequired: boolean) => {\n // Clears slotId + triggers a slot refetch (refreshKey bump) atomically.\n dispatch({ type: 'setTrainer', trainerRequired })\n bumpRefresh()\n }, [])\n\n const refetchSlots = useCallback(() => {\n bumpRefresh()\n }, [])\n\n // ── Config: fetch ONCE on mount. No `t` in deps. ──────────────────────────\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const result = await getTrialConfig({ sessionId, visitorId })\n if (cancelled) {\n return\n }\n if (result.status === 'ok') {\n setConfigState({\n phase: 'ready',\n config: {\n plan: result.plan,\n minimumAge: result.minimumAge,\n bookingWithoutTrainerAllowed: result.bookingWithoutTrainerAllowed,\n studioZoneId: result.studioZoneId,\n },\n })\n } else {\n setConfigState({\n phase: 'error',\n code: result.status,\n backendMessage: result.message,\n })\n }\n } catch {\n if (!cancelled) {\n setConfigState({ phase: 'error', code: 'unavailable', backendMessage: '' })\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [getTrialConfig, sessionId, visitorId])\n\n // ── Slots: once config is ready + whenever trainerRequired / refreshKey\n // changes. Clears an orphaned selection from a re-fetched list. ─────────\n const configReady = configState.phase === 'ready'\n const { trainerRequired } = fields\n useEffect(() => {\n if (!configReady) {\n return\n }\n let cancelled = false\n setSlotsState({ phase: 'loading' })\n void (async () => {\n try {\n const result = await listTrialSlots({ sessionId, visitorId, trainerRequired })\n if (cancelled) {\n return\n }\n if (result.status === 'ok') {\n if (result.slots.length > 0) {\n setSlotsState({ phase: 'ready', slots: result.slots })\n dispatch({\n type: 'clearSlotIfAbsent',\n available: result.slots.map((slot) => slot.startDateTime),\n })\n } else {\n setSlotsState({ phase: 'empty' })\n }\n } else {\n // unavailable / network_error → retryable error state.\n setSlotsState({ phase: 'error' })\n }\n } catch {\n if (!cancelled) {\n setSlotsState({ phase: 'error' })\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [configReady, listTrialSlots, sessionId, visitorId, trainerRequired, refreshKey])\n\n return {\n fields,\n setField,\n setTrainerRequired,\n configState,\n slotsState,\n refetchSlots,\n }\n}\n","import { useMemo, useState } from 'preact/hooks'\nimport { locale, useLocale } from '../../../../i18n/index'\nimport { useMagiclineSubmit, type TrialConfigPlan, type TrialSlot } from '../../hooks/useMagicline'\nimport { ageFromIsoDate, isValidEmail, resolvePrivacyUrl, todayIsoDate } from './formUtils'\nimport { COUNTRY_OPTIONS, GENDER_VALUES } from './magiclineConstants'\nimport { buildWizardSteps, type WizardStep } from './buildWizardSteps'\nimport {\n useTrialBookingState,\n type ConfigStatusCode,\n type ResolvedConfig,\n type SlotsState,\n type TrialFormFields,\n} from './useTrialBookingState'\nimport type { WidgetStrings } from '../../../../i18n/locales/en'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface TrialSessionBookingFormProps {\n formMessageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n /** Set when the form was reopened after a `slot_unavailable` 409. */\n slotUnavailable?: boolean\n /**\n * True while the 409 retry-status query is still resolving. The Slot\n * step waits for this to clear before deciding its UI so a reopened form\n * doesn't flash \"no slots\" before the slot-unavailable notice resolves.\n */\n retryPending?: boolean\n}\n\n/** Per-field error map keyed by field name. */\ntype FieldErrors = Partial<Record<keyof TrialFormFields, string>>\n\n/**\n * Inline Magicline trial-session booking STEP WIZARD. Renders the\n * dynamic per-studio form as internal steps inside ONE chat card:\n *\n * Trainer → Slot → Personal → Address → Confirm\n *\n * Steps with no visible fields are auto-skipped (see `buildWizardSteps`). The\n * trainer step is shown only when the studio allows trainer-free bookings.\n *\n * State (config, slots, all field values) is lifted into `useTrialBookingState`\n * which is mounted ONCE here, above the step switch — so navigating between\n * steps never refetches config or slots. Config is fetched once on open;\n * slots are fetched on open and whenever the trainer choice changes.\n *\n * The selected slot's `startDateTime` is sent as the `slotId` field — the\n * backend transformer maps `slotId` → Magicline `startDateTime`.\n */\nexport function TrialSessionBookingForm({\n formMessageId,\n sessionId,\n visitorId,\n slotUnavailable = false,\n retryPending = false,\n}: TrialSessionBookingFormProps) {\n const t = useLocale()\n const submitForm = useMagiclineSubmit()\n const { fields, setField, setTrainerRequired, configState, slotsState, refetchSlots } =\n useTrialBookingState({ sessionId, visitorId })\n\n // ── Loading / error states own the whole card (no wizard). ───────────────\n if (configState.phase === 'loading') {\n return (\n <div class=\"jex-inline-form jex-magicline-form\">\n <div class=\"jex-inline-form-title\">{t.magiclineTrialTitle}</div>\n <div class=\"jex-magicline-slots-hint\">{t.magiclineConfigLoading}</div>\n </div>\n )\n }\n\n if (configState.phase === 'error') {\n return (\n <div class=\"jex-inline-form jex-magicline-form\">\n <div class=\"jex-inline-form-title\">{t.magiclineTrialTitle}</div>\n <div class=\"jex-magicline-slots-hint\" role=\"alert\">\n {resolveConfigMessage(configState.code, configState.backendMessage, t)}\n </div>\n </div>\n )\n }\n\n return (\n <TrialWizard\n formMessageId={formMessageId}\n sessionId={sessionId}\n visitorId={visitorId}\n slotUnavailable={slotUnavailable}\n retryPending={retryPending}\n config={configState.config}\n fields={fields}\n setField={setField}\n setTrainerRequired={setTrainerRequired}\n slotsState={slotsState}\n refetchSlots={refetchSlots}\n submitForm={submitForm}\n />\n )\n}\n\ninterface TrialWizardProps {\n formMessageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n slotUnavailable: boolean\n retryPending: boolean\n config: ResolvedConfig\n fields: TrialFormFields\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n setTrainerRequired: (trainerRequired: boolean) => void\n slotsState: SlotsState\n refetchSlots: () => void\n submitForm: ReturnType<typeof useMagiclineSubmit>\n}\n\n/**\n * The wizard body — rendered only once config is `ready`. Owns the step index,\n * per-step validation, and submit. All FORM state lives one level up so it is\n * fetched once and preserved across step navigation.\n */\nfunction TrialWizard({\n formMessageId,\n sessionId,\n visitorId,\n slotUnavailable,\n retryPending,\n config,\n fields,\n setField,\n setTrainerRequired,\n slotsState,\n refetchSlots,\n submitForm,\n}: TrialWizardProps) {\n const t = useLocale()\n const { plan, minimumAge, bookingWithoutTrainerAllowed, studioZoneId } = config\n\n const steps = useMemo(\n () => buildWizardSteps(plan, bookingWithoutTrainerAllowed),\n [plan, bookingWithoutTrainerAllowed],\n )\n\n // On a 409 reopen, start at the Slot step so the visitor re-picks a time.\n const initialIndex = slotUnavailable ? Math.max(steps.indexOf('slot'), 0) : 0\n const [index, setIndex] = useState(initialIndex)\n const [fieldErrors, setFieldErrors] = useState<FieldErrors>({})\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n\n const privacyUrl = useMemo(() => resolvePrivacyUrl(), [])\n\n const safeIndex = Math.min(index, steps.length - 1)\n const step = steps[safeIndex]\n const isLast = safeIndex === steps.length - 1\n const isFirst = safeIndex === 0\n\n function validateStep(current: WizardStep): FieldErrors {\n const errors: FieldErrors = {}\n if (current === 'slot') {\n if (fields.slotId === '') {\n errors.slotId = t.magiclineSlotRequiredError\n }\n return errors\n }\n if (current === 'personal') {\n if (fields.firstName.trim() === '') {\n errors.firstName = t.magiclineRequiredError\n }\n if (fields.lastName.trim() === '') {\n errors.lastName = t.magiclineRequiredError\n }\n if (plan.email.visible && plan.email.required && fields.email.trim() === '') {\n errors.email = t.magiclineRequiredError\n }\n if (fields.email.trim() !== '' && !isValidEmail(fields.email)) {\n errors.email = t.magiclineEmailError\n }\n if (plan.phone.visible && plan.phone.required && fields.phone.trim() === '') {\n errors.phone = t.magiclineRequiredError\n }\n if (plan.gender.visible && plan.gender.required && fields.gender === '') {\n errors.gender = t.magiclineRequiredError\n }\n if (plan.dateOfBirth.visible) {\n if (plan.dateOfBirth.required && fields.birthDate.trim() === '') {\n errors.birthDate = t.magiclineRequiredError\n }\n if (fields.birthDate.trim() !== '') {\n const age = ageFromIsoDate(fields.birthDate)\n if (age !== null && age < 0) {\n // future DOB → negative age.\n errors.birthDate = t.magiclineRequiredError\n } else if (minimumAge > 0 && age !== null && age < minimumAge) {\n errors.birthDate = t.magiclineMinAgeError.replace('{age}', String(minimumAge))\n }\n }\n }\n return errors\n }\n if (current === 'address') {\n // only enforce when visible && required.\n if (plan.address.visible && plan.address.required) {\n if (fields.street.trim() === '') {\n errors.street = t.magiclineRequiredError\n }\n if (fields.houseNumber.trim() === '') {\n errors.houseNumber = t.magiclineRequiredError\n }\n if (fields.city.trim() === '') {\n errors.city = t.magiclineRequiredError\n }\n if (fields.country === '') {\n errors.country = t.magiclineRequiredError\n }\n }\n if (plan.zip.visible && plan.zip.required && fields.zip.trim() === '') {\n errors.zip = t.magiclineRequiredError\n }\n return errors\n }\n if (current === 'confirm') {\n if (!fields.consent) {\n errors.consent = t.magiclineConsentError\n }\n return errors\n }\n return errors\n }\n\n function handleNext() {\n const errors = validateStep(step)\n if (Object.keys(errors).length > 0) {\n setFieldErrors(errors)\n return\n }\n setFieldErrors({})\n setIndex((prev) => Math.min(prev + 1, steps.length - 1))\n }\n\n function handleBack() {\n setFieldErrors({})\n setSubmitError(null)\n setIndex((prev) => Math.max(prev - 1, 0))\n }\n\n async function handleSubmit() {\n if (submitting) {\n return\n }\n const errors = validateStep('confirm')\n if (Object.keys(errors).length > 0) {\n setFieldErrors(errors)\n return\n }\n setFieldErrors({})\n setSubmitError(null)\n setSubmitting(true)\n try {\n const bag = buildFieldBag(plan, fields)\n await submitForm({\n sessionId,\n visitorId,\n formMessageId,\n action: 'trialSessionBooking',\n fields: bag,\n })\n // On success the mutation patches magiclineForm.status → submitted; the\n // Convex subscription re-renders MagiclineFormMessage into read-only.\n } catch (err) {\n console.error('[TrialSessionBookingForm] Submit failed:', err)\n setSubmitError(t.magiclineFailedDetail)\n setSubmitting(false)\n }\n }\n\n function onPrimary() {\n if (isLast) {\n void handleSubmit()\n } else {\n handleNext()\n }\n }\n\n const stepTitle = stepTitleFor(step, t)\n const consentId = `jex-ml-consent-${formMessageId}`\n\n return (\n <div class=\"jex-inline-form jex-magicline-form\">\n <div class=\"jex-magicline-wizard-header\">\n <div class=\"jex-inline-form-title\">{t.magiclineTrialTitle}</div>\n <div class=\"jex-magicline-wizard-progress\">\n <span class=\"jex-magicline-wizard-step-label\">{stepTitle}</span>\n <span class=\"jex-magicline-wizard-counter\">\n {t.magiclineStepCounter\n .replace('{n}', String(safeIndex + 1))\n .replace('{total}', String(steps.length))}\n </span>\n </div>\n <div class=\"jex-magicline-wizard-dots\" aria-hidden=\"true\">\n {steps.map((s, i) => (\n <span\n key={s}\n class={\n i === safeIndex\n ? 'jex-magicline-wizard-dot jex-magicline-wizard-dot-active'\n : 'jex-magicline-wizard-dot'\n }\n />\n ))}\n </div>\n </div>\n\n <div class=\"jex-form\" role=\"group\" aria-label={stepTitle}>\n {step === 'trainer' ? (\n <TrainerStep\n formMessageId={formMessageId}\n trainerRequired={fields.trainerRequired}\n disabled={submitting}\n onChange={setTrainerRequired}\n />\n ) : null}\n\n {step === 'slot' ? (\n <SlotStep\n slotsState={slotsState}\n slotId={fields.slotId}\n studioZoneId={studioZoneId}\n disabled={submitting}\n retryPending={retryPending}\n slotUnavailable={slotUnavailable}\n error={fieldErrors.slotId}\n onSelect={(value) => { setField('slotId', value) }}\n onRetry={refetchSlots}\n />\n ) : null}\n\n {step === 'personal' ? (\n <PersonalStep\n plan={plan}\n fields={fields}\n errors={fieldErrors}\n disabled={submitting}\n setField={setField}\n />\n ) : null}\n\n {step === 'address' ? (\n <AddressStep\n plan={plan}\n fields={fields}\n errors={fieldErrors}\n disabled={submitting}\n setField={setField}\n />\n ) : null}\n\n {step === 'confirm' ? (\n <ConfirmStep\n consentId={consentId}\n privacyUrl={privacyUrl}\n studioZoneId={studioZoneId}\n fields={fields}\n disabled={submitting}\n consentError={fieldErrors.consent}\n setField={setField}\n />\n ) : null}\n\n {submitError !== null ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{submitError}</div>\n ) : null}\n\n <div class=\"jex-magicline-wizard-nav\">\n {!isFirst ? (\n <button\n type=\"button\"\n class=\"jex-magicline-wizard-back\"\n disabled={submitting}\n onClick={handleBack}\n >\n {t.magiclineWizardBack}\n </button>\n ) : null}\n <button\n type=\"button\"\n class=\"jex-form-submit jex-magicline-wizard-next\"\n disabled={submitting}\n onClick={onPrimary}\n >\n {isLast\n ? submitting\n ? t.magiclineSubmitting\n : t.magiclineSubmit\n : t.magiclineWizardNext}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\n// ── Step components ────────────────────────────────────────────────────────\n\ninterface TrainerStepProps {\n formMessageId: Id<'conversations'>\n trainerRequired: boolean\n disabled: boolean\n onChange: (trainerRequired: boolean) => void\n}\n\nfunction TrainerStep({ formMessageId, trainerRequired, disabled, onChange }: TrainerStepProps) {\n const t = useLocale()\n const name = `jex-ml-trainer-${formMessageId}`\n return (\n <div class=\"jex-magicline-radio-group\" role=\"radiogroup\" aria-label={t.magiclineStepTrainer}>\n <label\n class={\n trainerRequired\n ? 'jex-magicline-radio-card jex-magicline-radio-card-active'\n : 'jex-magicline-radio-card'\n }\n >\n <input\n type=\"radio\"\n name={name}\n checked={trainerRequired}\n disabled={disabled}\n onChange={() => { onChange(true) }}\n />\n <span>{t.magiclineTrainerWith}</span>\n </label>\n <label\n class={\n !trainerRequired\n ? 'jex-magicline-radio-card jex-magicline-radio-card-active'\n : 'jex-magicline-radio-card'\n }\n >\n <input\n type=\"radio\"\n name={name}\n checked={!trainerRequired}\n disabled={disabled}\n onChange={() => { onChange(false) }}\n />\n <span>{t.magiclineTrainerWithout}</span>\n </label>\n </div>\n )\n}\n\ninterface SlotStepProps {\n slotsState: SlotsState\n slotId: string\n /** Studio IANA timezone (or null) for bare-UTC slot labels. */\n studioZoneId: string | null\n disabled: boolean\n retryPending: boolean\n slotUnavailable: boolean\n error: string | undefined\n onSelect: (value: string) => void\n onRetry: () => void\n}\n\nfunction SlotStep({\n slotsState,\n slotId,\n studioZoneId,\n disabled,\n retryPending,\n slotUnavailable,\n error,\n onSelect,\n onRetry,\n}: SlotStepProps) {\n const t = useLocale()\n return (\n <>\n {slotUnavailable ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{t.magiclineSlotUnavailableNotice}</div>\n ) : null}\n\n {/* wait for the 409 retry-status query before deciding the UI. */}\n {retryPending || slotsState.phase === 'loading' ? (\n <div class=\"jex-magicline-slots-hint\" aria-live=\"polite\">{t.magiclineLoadingSlots}</div>\n ) : slotsState.phase === 'ready' ? (\n <select\n class=\"jex-form-input jex-magicline-select\"\n aria-label={t.magiclineSlotLabel}\n value={slotId}\n required\n disabled={disabled}\n aria-invalid={error !== undefined}\n onChange={(e) => { onSelect(e.currentTarget.value) }}\n >\n <option value=\"\" disabled>{t.magiclineSlotPlaceholder}</option>\n {slotsState.slots.map((slot) => (\n <option key={slot.startDateTime} value={slot.startDateTime}>\n {formatSlot(slot.startDateTime, locale.value, studioZoneId)}\n </option>\n ))}\n </select>\n ) : slotsState.phase === 'error' ? (\n // distinct error state with a Retry affordance.\n <div class=\"jex-magicline-slots-error\">\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {t.magiclineSlotsError}\n </div>\n <button\n type=\"button\"\n class=\"jex-magicline-retry\"\n disabled={disabled}\n onClick={onRetry}\n >\n {t.magiclineRetry}\n </button>\n </div>\n ) : (\n // empty → healthy no-availability message (no retry, can't advance).\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {t.magiclineNoSlots}\n </div>\n )}\n\n {error !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{error}</div>\n ) : null}\n </>\n )\n}\n\ninterface PersonalStepProps {\n plan: TrialConfigPlan\n fields: TrialFormFields\n errors: FieldErrors\n disabled: boolean\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n}\n\nfunction PersonalStep({ plan, fields, errors, disabled, setField }: PersonalStepProps) {\n const t = useLocale()\n const maxDob = useMemo(() => todayIsoDate(), [])\n return (\n <>\n <div class=\"jex-magicline-row\">\n <TextField\n label={t.magiclineFirstName}\n value={fields.firstName}\n required\n disabled={disabled}\n error={errors.firstName}\n fieldKey=\"firstName\"\n onInput={(v) => { setField('firstName', v) }}\n />\n <TextField\n label={t.magiclineLastName}\n value={fields.lastName}\n required\n disabled={disabled}\n error={errors.lastName}\n fieldKey=\"lastName\"\n onInput={(v) => { setField('lastName', v) }}\n />\n </div>\n\n {plan.email.visible ? (\n <TextField\n label={optionalLabel(t.magiclineEmail, plan.email.required, t)}\n type=\"email\"\n value={fields.email}\n required={plan.email.required}\n disabled={disabled}\n error={errors.email}\n fieldKey=\"email\"\n onInput={(v) => { setField('email', v) }}\n />\n ) : null}\n\n {plan.phone.visible ? (\n <TextField\n label={optionalLabel(t.magiclinePhone, plan.phone.required, t)}\n type=\"tel\"\n value={fields.phone}\n required={plan.phone.required}\n disabled={disabled}\n error={errors.phone}\n fieldKey=\"phone\"\n onInput={(v) => { setField('phone', v) }}\n />\n ) : null}\n\n {plan.dateOfBirth.visible ? (\n <label class=\"jex-magicline-field\">\n <span class=\"jex-magicline-field-label\">\n {optionalLabel(t.magiclineBirthDate, plan.dateOfBirth.required, t)}\n </span>\n <input\n class=\"jex-form-input\"\n type=\"date\"\n aria-label={optionalLabel(t.magiclineBirthDate, plan.dateOfBirth.required, t)}\n value={fields.birthDate}\n max={maxDob}\n required={plan.dateOfBirth.required}\n disabled={disabled}\n aria-invalid={errors.birthDate !== undefined}\n onInput={(e) => { setField('birthDate', e.currentTarget.value) }}\n />\n {errors.birthDate !== undefined ? (\n <span class=\"jex-magicline-error\" role=\"alert\">{errors.birthDate}</span>\n ) : null}\n </label>\n ) : null}\n\n {plan.gender.visible ? (\n <SelectField\n label={optionalLabel(t.magiclineGender, plan.gender.required, t)}\n value={fields.gender}\n required={plan.gender.required}\n disabled={disabled}\n placeholder={optionalLabel(t.magiclineGenderPlaceholder, plan.gender.required, t)}\n error={errors.gender}\n onChange={(v) => { setField('gender', v) }}\n options={GENDER_VALUES.map((value) => ({ value, label: genderLabel(value, t) }))}\n />\n ) : null}\n </>\n )\n}\n\ninterface AddressStepProps {\n plan: TrialConfigPlan\n fields: TrialFormFields\n errors: FieldErrors\n disabled: boolean\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n}\n\nfunction AddressStep({ plan, fields, errors, disabled, setField }: AddressStepProps) {\n const t = useLocale()\n return (\n <>\n {plan.address.visible ? (\n <>\n <div class=\"jex-magicline-row\">\n <TextField\n label={optionalLabel(t.magiclineStreet, plan.address.required, t)}\n value={fields.street}\n required={plan.address.required}\n disabled={disabled}\n error={errors.street}\n fieldKey=\"street\"\n onInput={(v) => { setField('street', v) }}\n />\n <TextField\n label={optionalLabel(t.magiclineHouseNumber, plan.address.required, t)}\n value={fields.houseNumber}\n required={plan.address.required}\n disabled={disabled}\n error={errors.houseNumber}\n fieldKey=\"houseNumber\"\n onInput={(v) => { setField('houseNumber', v) }}\n />\n </div>\n <TextField\n label={optionalLabel(t.magiclineCity, plan.address.required, t)}\n value={fields.city}\n required={plan.address.required}\n disabled={disabled}\n error={errors.city}\n fieldKey=\"city\"\n onInput={(v) => { setField('city', v) }}\n />\n <SelectField\n label={optionalLabel(t.magiclineCountry, plan.address.required, t)}\n value={fields.country}\n required={plan.address.required}\n disabled={disabled}\n placeholder={optionalLabel(t.magiclineCountryPlaceholder, plan.address.required, t)}\n error={errors.country}\n onChange={(v) => { setField('country', v) }}\n options={COUNTRY_OPTIONS.map((option) => ({ value: option.code, label: option.label }))}\n />\n </>\n ) : null}\n\n {plan.zip.visible ? (\n <TextField\n label={optionalLabel(t.magiclineZip, plan.zip.required, t)}\n value={fields.zip}\n required={plan.zip.required}\n disabled={disabled}\n error={errors.zip}\n fieldKey=\"zip\"\n onInput={(v) => { setField('zip', v) }}\n />\n ) : null}\n </>\n )\n}\n\ninterface ConfirmStepProps {\n consentId: string\n privacyUrl: string\n /** Studio IANA timezone (or null) for the bare-UTC summary slot label. */\n studioZoneId: string | null\n fields: TrialFormFields\n disabled: boolean\n consentError: string | undefined\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n}\n\nfunction ConfirmStep({\n consentId,\n privacyUrl,\n studioZoneId,\n fields,\n disabled,\n consentError,\n setField,\n}: ConfirmStepProps) {\n const t = useLocale()\n const slotLabel =\n fields.slotId !== '' ? formatSlot(fields.slotId, locale.value, studioZoneId) : '—'\n const name = `${fields.firstName} ${fields.lastName}`.trim()\n return (\n <>\n <dl class=\"jex-magicline-summary\">\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummaryTrainer}</dt>\n <dd>{fields.trainerRequired ? t.magiclineTrainerWith : t.magiclineTrainerWithout}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummarySlot}</dt>\n <dd>{slotLabel}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummaryName}</dt>\n <dd>{name !== '' ? name : '—'}</dd>\n </div>\n </dl>\n\n <textarea\n class=\"jex-form-textarea\"\n aria-label={t.magiclineNote}\n placeholder={t.magiclineNote}\n value={fields.note}\n disabled={disabled}\n onInput={(e) => { setField('note', e.currentTarget.value) }}\n />\n\n <label class=\"jex-magicline-consent\" for={consentId}>\n <input\n id={consentId}\n type=\"checkbox\"\n checked={fields.consent}\n disabled={disabled}\n aria-invalid={consentError !== undefined}\n onChange={(e) => { setField('consent', e.currentTarget.checked) }}\n />\n <span>\n {t.magiclineConsent}{' '}\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {t.magiclinePrivacyLinkText}\n </a>.\n </span>\n </label>\n\n {consentError !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{consentError}</div>\n ) : null}\n </>\n )\n}\n\n// ── Reusable field primitives ────────────────────────────────────────────────\n\ninterface TextFieldProps {\n label: string\n value: string\n fieldKey: keyof TrialFormFields\n type?: string\n required?: boolean\n disabled: boolean\n error: string | undefined\n onInput: (value: string) => void\n}\n\nfunction TextField({\n label,\n value,\n fieldKey,\n type = 'text',\n required = false,\n disabled,\n error,\n onInput,\n}: TextFieldProps) {\n const describedBy = error !== undefined ? `jex-ml-err-${fieldKey}` : undefined\n return (\n <div class=\"jex-magicline-field\">\n <input\n class=\"jex-form-input\"\n type={type}\n aria-label={label}\n placeholder={label}\n value={value}\n required={required}\n disabled={disabled}\n aria-invalid={error !== undefined}\n aria-describedby={describedBy}\n onInput={(e) => { onInput(e.currentTarget.value) }}\n />\n {error !== undefined ? (\n <span id={describedBy} class=\"jex-magicline-error\" role=\"alert\">{error}</span>\n ) : null}\n </div>\n )\n}\n\ninterface SelectOption {\n value: string\n label: string\n}\n\ninterface SelectFieldProps {\n label: string\n value: string\n required: boolean\n disabled: boolean\n placeholder: string\n error: string | undefined\n options: SelectOption[]\n onChange: (value: string) => void\n}\n\nfunction SelectField({\n label,\n value,\n required,\n disabled,\n placeholder,\n error,\n options,\n onChange,\n}: SelectFieldProps) {\n return (\n <div class=\"jex-magicline-field\">\n <select\n class=\"jex-form-input jex-magicline-select\"\n aria-label={label}\n value={value}\n required={required}\n disabled={disabled}\n aria-invalid={error !== undefined}\n onChange={(e) => { onChange(e.currentTarget.value) }}\n >\n {/* a disabled placeholder makes an OPTIONAL select un-clearable,\n so only render it disabled when the field is required. */}\n <option value=\"\" disabled={required}>{placeholder}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>{option.label}</option>\n ))}\n </select>\n {error !== undefined ? (\n <span class=\"jex-magicline-error\" role=\"alert\">{error}</span>\n ) : null}\n </div>\n )\n}\n\n// ── Pure helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Label for a config-driven field: appends the localised \"(optional)\" suffix\n * when the studio's plan does NOT mark the field as required, so the visible\n * label always matches the actual validation behaviour.\n */\nfunction optionalLabel(label: string, required: boolean, t: WidgetStrings): string {\n return required ? label : label + t.magiclineOptionalSuffix\n}\n\n/** Localised step title for the wizard header. */\nfunction stepTitleFor(step: WizardStep, t: WidgetStrings): string {\n switch (step) {\n case 'trainer': {\n return t.magiclineStepTrainer\n }\n case 'slot': {\n return t.magiclineStepSlot\n }\n case 'personal': {\n return t.magiclineStepPersonal\n }\n case 'address': {\n return t.magiclineStepAddress\n }\n case 'confirm': {\n return t.magiclineStepConfirm\n }\n default: {\n return ''\n }\n }\n}\n\n/** Resolve a config status CODE to a localised message at render time. */\nfunction resolveConfigMessage(\n code: ConfigStatusCode,\n backendMessage: string,\n t: WidgetStrings,\n): string {\n if (backendMessage.trim() !== '') {\n return backendMessage\n }\n if (code === 'unsupported') {\n return t.magiclineConfigUnsupported\n }\n if (code === 'inconsistent') {\n return t.magiclineConfigInconsistent\n }\n return t.magiclineConfigUnavailable\n}\n\n/**\n * Build the LOWERCASE field bag for `submitForm`. Only includes fields the plan\n * collects; firstname/lastname/slotId/trainerRequired/privacyConsent always\n * present. Mirrors the v2 payload exactly (no backend contract change).\n */\nfunction buildFieldBag(\n plan: TrialConfigPlan,\n fields: TrialFormFields,\n): Record<string, string | number | boolean | null> {\n const bag: Record<string, string | number | boolean | null> = {\n firstname: fields.firstName.trim(),\n lastname: fields.lastName.trim(),\n slotId: fields.slotId,\n trainerRequired: fields.trainerRequired,\n privacyConsent: fields.consent,\n }\n if (plan.email.visible && fields.email.trim() !== '') {\n bag.email = fields.email.trim()\n }\n if (plan.phone.visible && fields.phone.trim() !== '') {\n bag.phone = fields.phone.trim()\n }\n if (plan.dateOfBirth.visible && fields.birthDate.trim() !== '') {\n bag.dateOfBirth = fields.birthDate.trim()\n }\n if (plan.gender.visible && fields.gender !== '') {\n bag.gender = fields.gender\n }\n if (plan.address.visible) {\n if (fields.street.trim() !== '') {\n bag.street = fields.street.trim()\n }\n if (fields.houseNumber.trim() !== '') {\n bag.houseNumber = fields.houseNumber.trim()\n }\n if (fields.city.trim() !== '') {\n bag.city = fields.city.trim()\n }\n if (fields.country !== '') {\n bag.country = fields.country\n }\n }\n if (plan.zip.visible && fields.zip.trim() !== '') {\n bag.zip = fields.zip.trim()\n }\n if (fields.note.trim() !== '') {\n bag.note = fields.note.trim()\n }\n return bag\n}\n\n/** Localised label for a gender enum value. */\nfunction genderLabel(value: 'MALE' | 'FEMALE' | 'UNISEX', t: WidgetStrings): string {\n if (value === 'MALE') {\n return t.magiclineGenderMale\n }\n if (value === 'FEMALE') {\n return t.magiclineGenderFemale\n }\n return t.magiclineGenderUnisex\n}\n\n/**\n * Human-readable label for a Magicline slot start time. Magicline returns\n * either a zoned ISO string like `2026-06-12T08:00:00.000+02:00[Europe/Berlin]`\n * — the non-standard `[Zone]` suffix breaks `Date` parsing in some engines, so\n * it is stripped and used as the display zone — or a bare UTC instant like\n * `2026-06-10T16:00:00.000Z` (older tenants), which must be shown in the\n * STUDIO's timezone, not the viewer's. Display-zone precedence:\n *\n * slot's own `[Zone]` bracket → `studioZoneId` (stored on the connection)\n * → viewer-local last resort.\n *\n * A short zone name is appended. Falls back to the raw value if unparseable.\n *\n * The BCP-47 locale tag is threaded in from the widget locale signal\n * (`de` → `de-DE`, `en` → `en-GB`) so a German UI never shows English dates.\n * The submitted slot value remains the raw `startDateTime` — only the label is\n * formatted here.\n */\nfunction formatSlot(\n startDateTime: string,\n widgetLocale: 'en' | 'de',\n studioZoneId?: string | null,\n): string {\n const bcp47 = widgetLocale === 'de' ? 'de-DE' : 'en-GB'\n const zoneMatch = startDateTime.match(/\\[([^\\]]+)\\]\\s*$/)\n const ianaZone = zoneMatch ? zoneMatch[1] : (studioZoneId ?? undefined)\n const parseable = startDateTime.replace(/\\[[^\\]]+\\]\\s*$/, '')\n const date = new Date(parseable)\n if (Number.isNaN(date.getTime())) {\n return startDateTime\n }\n try {\n return date.toLocaleString(bcp47, {\n weekday: 'short',\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n ...(ianaZone ? { timeZone: ianaZone, timeZoneName: 'short' } : { timeZoneName: 'short' }),\n })\n } catch {\n // invalid IANA zone for this engine — keep timeZoneName, drop zone.\n return date.toLocaleString(bcp47, {\n weekday: 'short',\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n timeZoneName: 'short',\n })\n }\n}\n","import { useCallback, useEffect, useMemo, useReducer } from 'preact/hooks'\nimport {\n useRateBundles,\n useContractPreview,\n type ContractFlatFee,\n type ContractPeriod,\n type ContractPreviewModule,\n type ContractPreviewResult,\n type ContractVolume,\n type RateBundleTermCard,\n} from '../../hooks/useMagicline'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Offers lifecycle. `empty` (healthy, zero eligible terms) is split from\n * `error` (unavailable / network rejection) so the Offer step shows a friendly\n * no-offers message on `empty` and a Retry affordance on `error`.\n */\nexport type OffersState =\n | { phase: 'loading' }\n | { phase: 'ready'; terms: RateBundleTermCard[] }\n | { phase: 'empty' }\n | { phase: 'error' }\n\n/**\n * Server-resolved pricing for the Review step. Fetched on entering Review and\n * re-fetched after a `price_changed` outcome. The `fingerprint` is replayed to\n * the submit action so the backend can confirm the price the visitor saw.\n */\nexport interface ContractPricing {\n basePrice: number\n preUseCharge: number\n currencyCode: string\n flatFees: ContractFlatFee[]\n modules: ContractPreviewModule[]\n contractVolume: ContractVolume | null\n startDate: string\n /** Payment frequency of the revalidated term; renders the base-price period. */\n paymentFrequency: ContractPeriod\n fingerprint: string\n}\n\n/**\n * Preview lifecycle. `idle` is the pre-Review state (no fetch yet). A non-ok\n * preview status is surfaced as the `error` phase carrying the status code so\n * the view can route an `offer_unavailable` back to the Offer step.\n */\nexport type PreviewState =\n | { phase: 'idle' }\n | { phase: 'loading' }\n | { phase: 'ready'; pricing: ContractPricing }\n | {\n phase: 'error'\n code: 'consent_required' | 'invalid_fields' | 'offer_unavailable' | 'unavailable'\n }\n\n/** Personal detail fields — all required by the backend. */\nexport interface ContractPersonalFields {\n firstName: string\n lastName: string\n email: string\n dateOfBirth: string\n gender: string\n phone: string\n}\n\n/** Address fields — country is a static \"Deutschland\"/\"Germany\", not collected. */\nexport interface ContractAddressFields {\n street: string\n houseNumber: string\n zipCode: string\n city: string\n}\n\n/**\n * Payment fields. `accountHolderTouched` tracks whether the visitor has edited\n * the account holder so the firstname+lastname prefill only auto-fills once and\n * never clobbers a manual edit. The IBAN lives ONLY here, in memory — it is\n * never persisted to sessionStorage and never logged.\n */\nexport interface ContractPaymentFields {\n accountHolder: string\n accountHolderTouched: boolean\n iban: string\n}\n\n/** Consent flags — both must be accepted before submit. */\nexport interface ContractConsentFields {\n privacy: boolean\n sepa: boolean\n}\n\nexport interface ContractFormFields {\n termId: number | null\n /** Chosen paid optional-module ids for the current term. */\n selectedModuleIds: number[]\n /**\n * Acceptance of required confirmations, keyed by ackKey. Carries both contract\n * text-block acknowledgements and selected-module consents — a single source\n * of truth for every gating tick across the wizard.\n */\n acknowledgedBlocks: Record<string, boolean>\n personal: ContractPersonalFields\n address: ContractAddressFields\n payment: ContractPaymentFields\n consents: ContractConsentFields\n}\n\nconst INITIAL_FIELDS: ContractFormFields = {\n termId: null,\n selectedModuleIds: [],\n acknowledgedBlocks: {},\n personal: {\n firstName: '',\n lastName: '',\n email: '',\n dateOfBirth: '',\n gender: '',\n phone: '',\n },\n address: {\n street: '',\n houseNumber: '',\n zipCode: '',\n city: '',\n },\n payment: {\n accountHolder: '',\n accountHolderTouched: false,\n iban: '',\n },\n consents: {\n privacy: false,\n sepa: false,\n },\n}\n\ntype FieldAction =\n | { type: 'setTermId'; termId: number }\n | { type: 'setPersonal'; key: keyof ContractPersonalFields; value: string }\n | { type: 'setAddress'; key: keyof ContractAddressFields; value: string }\n /** Add/remove a paid optional module; deselecting clears its consent ack too. */\n | { type: 'toggleModule'; moduleId: number; selected: boolean; consentAckKey?: string }\n | { type: 'setBlockAck'; ackKey: string; value: boolean }\n /** A manual account-holder edit also flips the `touched` guard. */\n | { type: 'setAccountHolder'; value: string }\n | { type: 'setIban'; value: string }\n | { type: 'setConsent'; key: keyof ContractConsentFields; value: boolean }\n /** Clears the IBAN after a retryable submit failure (never reused). */\n | { type: 'clearIban' }\n /** Clears the selected term so a stale selection does not survive an offer refetch. */\n | { type: 'clearTermId' }\n /** Auto-prefill the account holder once both names are filled + untouched. */\n | { type: 'prefillAccountHolder'; value: string }\n\nfunction fieldsReducer(state: ContractFormFields, action: FieldAction): ContractFormFields {\n switch (action.type) {\n case 'setTermId': {\n // A different term carries different modules/blocks — reset selections and\n // all acknowledgements (module consents + contract-block confirmations).\n if (state.termId === action.termId) {\n return state\n }\n return {\n ...state,\n termId: action.termId,\n selectedModuleIds: [],\n acknowledgedBlocks: {},\n }\n }\n case 'toggleModule': {\n if (action.selected) {\n if (state.selectedModuleIds.includes(action.moduleId)) {\n return state\n }\n return {\n ...state,\n selectedModuleIds: [...state.selectedModuleIds, action.moduleId],\n }\n }\n // Deselect: drop the id AND clear its consent ack so a stale tick cannot\n // survive a re-add (the visitor must re-accept the terms).\n const nextAcks = { ...state.acknowledgedBlocks }\n if (action.consentAckKey !== undefined) {\n delete nextAcks[action.consentAckKey]\n }\n return {\n ...state,\n selectedModuleIds: state.selectedModuleIds.filter((id) => id !== action.moduleId),\n acknowledgedBlocks: nextAcks,\n }\n }\n case 'setBlockAck': {\n return {\n ...state,\n acknowledgedBlocks: { ...state.acknowledgedBlocks, [action.ackKey]: action.value },\n }\n }\n case 'setPersonal': {\n return { ...state, personal: { ...state.personal, [action.key]: action.value } }\n }\n case 'setAddress': {\n return { ...state, address: { ...state.address, [action.key]: action.value } }\n }\n case 'setAccountHolder': {\n return {\n ...state,\n payment: { ...state.payment, accountHolder: action.value, accountHolderTouched: true },\n }\n }\n case 'setIban': {\n return { ...state, payment: { ...state.payment, iban: action.value } }\n }\n case 'setConsent': {\n return { ...state, consents: { ...state.consents, [action.key]: action.value } }\n }\n case 'clearIban': {\n return { ...state, payment: { ...state.payment, iban: '' } }\n }\n case 'clearTermId': {\n return {\n ...state,\n termId: null,\n selectedModuleIds: [],\n acknowledgedBlocks: {},\n }\n }\n case 'prefillAccountHolder': {\n // Only prefill an untouched, empty field — never clobber a manual entry.\n if (state.payment.accountHolderTouched || state.payment.accountHolder !== '') {\n return state\n }\n return { ...state, payment: { ...state.payment, accountHolder: action.value } }\n }\n default: {\n return state\n }\n }\n}\n\nexport interface UseContractCreationStateOptions {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\nexport interface ContractCreationState {\n fields: ContractFormFields\n offersState: OffersState\n previewState: PreviewState\n /** The currently selected term card (or null when none is chosen). */\n selectedTerm: RateBundleTermCard | null\n /**\n * ackKeys that MUST be acknowledged before submit for the current term:\n * required text blocks ∪ the consents of SELECTED modules that carry one.\n */\n requiredAckKeys: string[]\n /** True when every `requiredAckKeys` entry is currently acknowledged. */\n allAcknowledged: boolean\n setTermId: (termId: number) => void\n setPersonal: (key: keyof ContractPersonalFields, value: string) => void\n setAddress: (key: keyof ContractAddressFields, value: string) => void\n /**\n * Add/remove a paid optional module from the current term. Pass the module's\n * consent ackKey so deselecting clears its acknowledgement in one dispatch.\n */\n toggleModule: (moduleId: number, selected: boolean, consentAckKey?: string) => void\n /** Set the acknowledgement for a contract block or module consent by ackKey. */\n setBlockAck: (ackKey: string, value: boolean) => void\n setAccountHolder: (value: string) => void\n setIban: (value: string) => void\n setConsent: (key: keyof ContractConsentFields, value: boolean) => void\n clearIban: () => void\n /** Clears the selected term so a stale selection does not survive an offer refetch. */\n clearTermId: () => void\n /** Re-run the offers fetch (Retry button + `offer_unavailable` recovery). */\n refetchOffers: () => void\n /** Fetch the server pricing for the selected term (called entering Review). */\n fetchPreview: () => void\n /** Reset the preview back to idle (e.g. when leaving Review). */\n resetPreview: () => void\n}\n\n/**\n * Single fetch-once container for the membership-signup wizard.\n *\n * - Offers are fetched ONCE on mount and again on `refetchOffers` (Retry /\n * `offer_unavailable` recovery). A `offersKey` counter drives the effect.\n * - The preview is NOT fetched until `fetchPreview` runs (entering Review). A\n * `previewKey` counter re-runs it for `price_changed` recovery.\n * - The account holder auto-prefills from firstname+lastname the first time both\n * are present and the field is still untouched.\n *\n * The IBAN is held only in this hook's in-memory reducer state — it is never\n * written to sessionStorage and never logged.\n */\nexport function useContractCreationState({\n sessionId,\n visitorId,\n}: UseContractCreationStateOptions): ContractCreationState {\n const getRateBundles = useRateBundles()\n const getContractPreview = useContractPreview()\n\n const [fields, dispatch] = useReducer(fieldsReducer, INITIAL_FIELDS)\n const [offersState, setOffersState] = useReducer(\n (_prev: OffersState, next: OffersState) => next,\n { phase: 'loading' } satisfies OffersState,\n )\n const [previewState, setPreviewState] = useReducer(\n (_prev: PreviewState, next: PreviewState) => next,\n { phase: 'idle' } satisfies PreviewState,\n )\n const [offersKey, bumpOffers] = useReducer((n: number) => n + 1, 0)\n const [previewKey, bumpPreview] = useReducer((n: number) => n + 1, 0)\n\n const setTermId = useCallback((termId: number) => {\n dispatch({ type: 'setTermId', termId })\n }, [])\n\n const setPersonal = useCallback((key: keyof ContractPersonalFields, value: string) => {\n dispatch({ type: 'setPersonal', key, value })\n }, [])\n\n const setAddress = useCallback((key: keyof ContractAddressFields, value: string) => {\n dispatch({ type: 'setAddress', key, value })\n }, [])\n\n const toggleModule = useCallback((moduleId: number, selected: boolean, consentAckKey?: string) => {\n dispatch({ type: 'toggleModule', moduleId, selected, consentAckKey })\n }, [])\n\n const setBlockAck = useCallback((ackKey: string, value: boolean) => {\n dispatch({ type: 'setBlockAck', ackKey, value })\n }, [])\n\n const setAccountHolder = useCallback((value: string) => {\n dispatch({ type: 'setAccountHolder', value })\n }, [])\n\n const setIban = useCallback((value: string) => {\n dispatch({ type: 'setIban', value })\n }, [])\n\n const setConsent = useCallback((key: keyof ContractConsentFields, value: boolean) => {\n dispatch({ type: 'setConsent', key, value })\n }, [])\n\n const clearIban = useCallback(() => {\n dispatch({ type: 'clearIban' })\n }, [])\n\n const clearTermId = useCallback(() => {\n dispatch({ type: 'clearTermId' })\n }, [])\n\n const refetchOffers = useCallback(() => {\n bumpOffers()\n }, [])\n\n const resetPreview = useCallback(() => {\n setPreviewState({ phase: 'idle' })\n }, [])\n\n const fetchPreview = useCallback(() => {\n bumpPreview()\n }, [])\n\n // ── Resolve the selected term from the loaded offer list. ───────────────────\n const selectedTerm =\n offersState.phase === 'ready' && fields.termId !== null\n ? (offersState.terms.find((term) => term.termId === fields.termId) ?? null)\n : null\n\n // ── Required acknowledgements for the current term. ─────────────────────────\n // Required text blocks plus the consent ackKey of each SELECTED module that\n // carries one. `allAcknowledged` gates the Review submit button.\n const { selectedModuleIds, acknowledgedBlocks } = fields\n const requiredAckKeys = useMemo(() => {\n if (selectedTerm === null) {\n return []\n }\n const keys = new Set<string>()\n for (const block of selectedTerm.textBlocks) {\n if (block.isConfirmationRequired) {\n keys.add(block.ackKey)\n }\n }\n for (const moduleId of selectedModuleIds) {\n const module = selectedTerm.optionalModules.find((m) => m.id === moduleId)\n if (module?.consent) {\n keys.add(module.consent.ackKey)\n }\n }\n return [...keys]\n }, [selectedTerm, selectedModuleIds])\n\n const allAcknowledged = useMemo(\n () => requiredAckKeys.every((key) => acknowledgedBlocks[key] === true),\n [requiredAckKeys, acknowledgedBlocks],\n )\n\n // ── Account holder prefill: once both names are present + untouched. ────────\n const { firstName, lastName } = fields.personal\n const { accountHolder, accountHolderTouched } = fields.payment\n useEffect(() => {\n if (accountHolderTouched || accountHolder !== '') {\n return\n }\n if (firstName.trim() !== '' && lastName.trim() !== '') {\n dispatch({\n type: 'prefillAccountHolder',\n value: `${firstName.trim()} ${lastName.trim()}`,\n })\n }\n }, [firstName, lastName, accountHolder, accountHolderTouched])\n\n // ── Offers: fetch ONCE on mount + on every `offersKey` bump. ────────────────\n useEffect(() => {\n let cancelled = false\n setOffersState({ phase: 'loading' })\n void (async () => {\n try {\n const result = await getRateBundles({ sessionId, visitorId })\n if (cancelled) {\n return\n }\n if (result.status === 'ok') {\n if (result.terms.length > 0) {\n setOffersState({ phase: 'ready', terms: result.terms })\n } else {\n setOffersState({ phase: 'empty' })\n }\n } else {\n setOffersState({ phase: 'error' })\n }\n } catch {\n if (!cancelled) {\n setOffersState({ phase: 'error' })\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [getRateBundles, sessionId, visitorId, offersKey])\n\n // ── Preview: only when `previewKey` advances (entering Review / re-price). ──\n // `previewKey === 0` is the idle baseline; the first fetch is `fetchPreview`.\n useEffect(() => {\n if (previewKey === 0) {\n return\n }\n const term = selectedTerm\n if (!term) {\n setPreviewState({ phase: 'error', code: 'offer_unavailable' })\n return\n }\n let cancelled = false\n setPreviewState({ phase: 'loading' })\n const startDate = term.defaultContractStartDate ?? ''\n const previewArgs = {\n sessionId,\n visitorId,\n termId: term.termId,\n startDate,\n fields: {\n firstname: fields.personal.firstName.trim(),\n lastname: fields.personal.lastName.trim(),\n email: fields.personal.email.trim(),\n dateOfBirth: fields.personal.dateOfBirth.trim(),\n gender: fields.personal.gender,\n phone: fields.personal.phone.trim(),\n street: fields.address.street.trim(),\n houseNumber: fields.address.houseNumber.trim(),\n zipCode: fields.address.zipCode.trim(),\n city: fields.address.city.trim(),\n },\n // Only modules still offered by the (re-fetched) term are sent; a vanished\n // module is dropped by the term-change reset before this runs.\n selectedModuleIds: term.optionalModules\n .filter((module) => fields.selectedModuleIds.includes(module.id))\n .map((module) => module.id),\n privacyConsent: fields.consents.privacy,\n sepaConsent: fields.consents.sepa,\n }\n void (async () => {\n try {\n const result: ContractPreviewResult = await getContractPreview(previewArgs)\n if (cancelled) {\n return\n }\n if (result.status === 'ok') {\n setPreviewState({\n phase: 'ready',\n pricing: {\n basePrice: result.basePrice,\n preUseCharge: result.preUseCharge,\n currencyCode: result.currencyCode,\n flatFees: result.flatFees,\n modules: result.modules,\n contractVolume: result.contractVolume,\n startDate: result.startDate,\n paymentFrequency: result.paymentFrequency,\n fingerprint: result.pricingFingerprint,\n },\n })\n } else {\n setPreviewState({ phase: 'error', code: result.status })\n }\n } catch {\n if (!cancelled) {\n setPreviewState({ phase: 'error', code: 'unavailable' })\n }\n }\n })()\n return () => {\n cancelled = true\n }\n // The selected term + field values are read at fetch time; the fetch is\n // deliberately gated on an explicit `previewKey` bump (entering Review /\n // re-pricing) so editing a field never auto-refetches the preview.\n }, [previewKey, getContractPreview, sessionId, visitorId])\n\n return {\n fields,\n offersState,\n previewState,\n selectedTerm,\n requiredAckKeys,\n allAcknowledged,\n setTermId,\n setPersonal,\n setAddress,\n toggleModule,\n setBlockAck,\n setAccountHolder,\n setIban,\n setConsent,\n clearIban,\n clearTermId,\n refetchOffers,\n fetchPreview,\n resetPreview,\n }\n}\n","import { useMemo, useState } from 'preact/hooks'\nimport { locale, useLocale } from '../../../../i18n/index'\nimport {\n useSubmitContractCreation,\n type ContractFlatFee,\n type ContractOptionalModule,\n type ContractSubmitResult,\n type RateBundleTermCard,\n} from '../../hooks/useMagicline'\nimport {\n formatContractDate,\n formatContractMoney,\n formatContractPeriod,\n formatModulePrice,\n formatModuleRenewal,\n formatPaymentFrequency,\n isValidEmail,\n isValidIban,\n localizeFeeName,\n maskIban,\n resolvePrivacyUrl,\n todayIsoDate,\n} from './formUtils'\nimport { GENDER_VALUES } from './magiclineConstants'\nimport {\n useContractCreationState,\n type ContractAddressFields,\n type ContractFormFields,\n type ContractPersonalFields,\n type ContractPricing,\n type OffersState,\n type PreviewState,\n} from './useContractCreationState'\nimport type { WidgetStrings } from '../../../../i18n/locales/en'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Wizard steps for the membership-signup flow. `upgrades` is conditional —\n * `buildWizardSteps` inserts it after `offer` only when the chosen term has at\n * least one paid optional module.\n */\ntype ContractStep = 'offer' | 'upgrades' | 'personal' | 'address' | 'payment' | 'review'\n\n/**\n * Build the active step list for the chosen term: the `upgrades` step is\n * present only when that term offers ≥1 optional module.\n */\nfunction buildWizardSteps(term: RateBundleTermCard | null): ContractStep[] {\n const hasUpgrades = term !== null && term.optionalModules.length > 0\n return hasUpgrades\n ? ['offer', 'upgrades', 'personal', 'address', 'payment', 'review']\n : ['offer', 'personal', 'address', 'payment', 'review']\n}\n\n/** Per-field error keys spanning every step. */\ntype ContractFieldErrors = Partial<Record<string, string>>\n\ninterface ContractCreationFormProps {\n formMessageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n projectId: Id<'projects'>\n /**\n * The reactive form-row status. The submit flips this to `submitted` at claim\n * time, so the LIVE result envelope (held in component state) always wins; this\n * is only consulted when there is no live result — i.e. a resumed/cold session\n * landing on an already-terminal row.\n */\n formStatus: 'open' | 'submitted' | 'failed'\n}\n\n/**\n * Inline Magicline membership-signup STEP WIZARD. Renders the contract-creation\n * flow as internal steps inside ONE chat card:\n *\n * Offer → Personal → Address → Payment → Review\n *\n * All form state (offers, selected term, personal/address/payment fields,\n * consents, server preview) lives in `useContractCreationState`, mounted ONCE\n * here above the step switch so navigating steps never refetches offers.\n *\n * The submit action is synchronous and authoritative: it claims the submission\n * (which flips the form row to `submitted` reactively), then dispatches and\n * returns a result envelope. Because the reactive flip would otherwise unmount\n * this form mid-await, the component owns its OWN `submitResult` and renders the\n * success / terminal UI from the returned envelope — `MagiclineFormMessage`\n * keeps this form mounted while it owns a live result.\n */\nexport function ContractCreationForm({\n formMessageId,\n sessionId,\n visitorId,\n projectId,\n formStatus,\n}: ContractCreationFormProps) {\n const t = useLocale()\n const widgetLocale = locale.value\n const submitContract = useSubmitContractCreation()\n const state = useContractCreationState({ sessionId, visitorId })\n const {\n fields,\n offersState,\n previewState,\n selectedTerm,\n requiredAckKeys,\n allAcknowledged,\n setTermId,\n setPersonal,\n setAddress,\n toggleModule,\n setBlockAck,\n setAccountHolder,\n setIban,\n setConsent,\n clearIban,\n clearTermId,\n refetchOffers,\n fetchPreview,\n resetPreview,\n } = state\n\n const [index, setIndex] = useState(0)\n const [fieldErrors, setFieldErrors] = useState<ContractFieldErrors>({})\n const [submitting, setSubmitting] = useState(false)\n const [submitResult, setSubmitResult] = useState<ContractSubmitResult | null>(null)\n /** A transient notice shown above the nav (price_changed / offer_unavailable). */\n const [notice, setNotice] = useState<string | null>(null)\n\n const privacyUrl = useMemo(() => resolvePrivacyUrl(), [])\n\n // ── Terminal / success result owns the whole card. ──────────────────────────\n if (submitResult !== null && submitResult.status === 'succeeded') {\n return <ContractSuccessCard customerNumber={submitResult.customerNumber} />\n }\n // A non-retryable failure ends the form as a terminal read-only message.\n if (\n submitResult !== null &&\n submitResult.status === 'failed' &&\n !submitResult.retryable\n ) {\n const message =\n submitResult.errorCode === 'duplicate_submission'\n ? t.magiclineDuplicateNotice\n : submitResult.errorCode === 'unknown_outcome'\n ? t.magiclineUnknownOutcome\n : submitResult.errorCode === 'live_submission_disabled'\n ? t.magiclineLiveSubmissionDisabled\n : t.magiclineFailedDetail\n return <ContractTerminalCard message={message} />\n }\n\n // Resumed / cold session: no live result, the row is already terminal, and we\n // are NOT mid-submit. (During a live submit the claim flips the row to\n // `submitted` while `submitResult` is still resolving — the `submitting` guard\n // keeps the form mounted so the awaited envelope can populate the result UI.)\n if (submitResult === null && !submitting && formStatus === 'submitted') {\n return <ContractSuccessCard customerNumber={null} />\n }\n if (submitResult === null && !submitting && formStatus === 'failed') {\n return <ContractTerminalCard message={t.magiclineFailedDetail} />\n }\n\n // The step list is derived from the chosen term so `upgrades` only appears\n // when that term offers optional modules. Selecting a different term reshapes\n // the list; `safeIndex` clamps a now-out-of-range index.\n const steps = useMemo(() => buildWizardSteps(selectedTerm), [selectedTerm])\n const safeIndex = Math.min(index, steps.length - 1)\n const step = steps[safeIndex]\n const isLast = safeIndex === steps.length - 1\n const isFirst = safeIndex === 0\n\n function validateStep(current: ContractStep): ContractFieldErrors {\n const errors: ContractFieldErrors = {}\n if (current === 'offer') {\n if (fields.termId === null) {\n errors.termId = t.magiclineOfferRequiredError\n }\n return errors\n }\n if (current === 'upgrades') {\n // Every SELECTED module that carries a consent must have its ackKey ticked\n // in `acknowledgedBlocks` (the single source of truth for every gating tick).\n if (selectedTerm !== null) {\n for (const moduleId of fields.selectedModuleIds) {\n const module = selectedTerm.optionalModules.find((m) => m.id === moduleId)\n if (module?.consent && fields.acknowledgedBlocks[module.consent.ackKey] !== true) {\n errors.upgrades = t.magiclineUpgradeConsentError\n break\n }\n }\n }\n return errors\n }\n if (current === 'personal') {\n const p = fields.personal\n if (p.firstName.trim() === '') {\n errors.firstName = t.magiclineRequiredError\n }\n if (p.lastName.trim() === '') {\n errors.lastName = t.magiclineRequiredError\n }\n if (p.email.trim() === '') {\n errors.email = t.magiclineRequiredError\n } else if (!isValidEmail(p.email)) {\n errors.email = t.magiclineEmailError\n }\n if (p.dateOfBirth.trim() === '') {\n errors.dateOfBirth = t.magiclineRequiredError\n }\n if (p.gender === '') {\n errors.gender = t.magiclineRequiredError\n }\n if (p.phone.trim() === '') {\n errors.phone = t.magiclineRequiredError\n }\n return errors\n }\n if (current === 'address') {\n const a = fields.address\n if (a.street.trim() === '') {\n errors.street = t.magiclineRequiredError\n }\n if (a.houseNumber.trim() === '') {\n errors.houseNumber = t.magiclineRequiredError\n }\n if (a.zipCode.trim() === '') {\n errors.zipCode = t.magiclineRequiredError\n }\n if (a.city.trim() === '') {\n errors.city = t.magiclineRequiredError\n }\n return errors\n }\n if (current === 'payment') {\n if (fields.payment.accountHolder.trim() === '') {\n errors.accountHolder = t.magiclineRequiredError\n }\n if (!isValidIban(fields.payment.iban)) {\n errors.iban = t.magiclineIbanInvalidError\n }\n if (!fields.consents.privacy) {\n errors.privacy = t.magiclineConsentError\n }\n if (!fields.consents.sepa) {\n errors.sepa = t.magiclineConsentError\n }\n return errors\n }\n return errors\n }\n\n function handleNext() {\n const errors = validateStep(step)\n if (Object.keys(errors).length > 0) {\n setFieldErrors(errors)\n return\n }\n setFieldErrors({})\n setNotice(null)\n const nextIndex = Math.min(safeIndex + 1, steps.length - 1)\n // Entering Review triggers the server price fetch.\n if (steps[nextIndex] === 'review') {\n fetchPreview()\n }\n setIndex(nextIndex)\n }\n\n function handleBack() {\n setFieldErrors({})\n setNotice(null)\n if (step === 'review') {\n resetPreview()\n }\n setIndex((prev) => Math.max(prev - 1, 0))\n }\n\n /** Re-run the preview after a price change (stays on Review). */\n function handleReviewRetry() {\n setNotice(null)\n fetchPreview()\n }\n\n async function handleSubmit() {\n if (submitting) {\n return\n }\n if (previewState.phase !== 'ready' || selectedTerm === null) {\n return\n }\n // Defence-in-depth: the submit button is already gated on `allAcknowledged`,\n // but re-prompt rather than dispatch if any required confirmation is unticked.\n if (!allAcknowledged) {\n setNotice(t.magiclineConfirmRequiredError)\n return\n }\n setSubmitting(true)\n setNotice(null)\n try {\n const result = await submitContract({\n sessionId,\n visitorId,\n projectId,\n formMessageId,\n fields: {\n firstname: fields.personal.firstName.trim(),\n lastname: fields.personal.lastName.trim(),\n email: fields.personal.email.trim(),\n phone: fields.personal.phone.trim(),\n dateOfBirth: fields.personal.dateOfBirth.trim(),\n gender: fields.personal.gender,\n street: fields.address.street.trim(),\n houseNumber: fields.address.houseNumber.trim(),\n zipCode: fields.address.zipCode.trim(),\n city: fields.address.city.trim(),\n rateBundleTermId: selectedTerm.termId,\n privacyConsent: fields.consents.privacy,\n sepaConsent: fields.consents.sepa,\n },\n bankAccount: {\n accountHolder: fields.payment.accountHolder.trim(),\n iban: fields.payment.iban,\n },\n // Only modules still offered by the selected term are sent.\n selectedModuleIds: selectedTerm.optionalModules\n .filter((module) => fields.selectedModuleIds.includes(module.id))\n .map((module) => module.id),\n // Required text-block + selected-module consent ackKeys (the submit\n // button is gated on all of these being ticked).\n acknowledgedAckKeys: requiredAckKeys,\n pricingFingerprint: previewState.pricing.fingerprint,\n })\n\n if (result.status === 'succeeded') {\n setSubmitResult(result)\n return\n }\n\n // ── Failure routing. ────────────────────────────────────────────────\n if (result.errorCode === 'price_changed') {\n // Re-fetch the preview, stay on Review, show a notice.\n setNotice(t.magiclinePriceChangedNotice)\n fetchPreview()\n setSubmitting(false)\n return\n }\n if (result.errorCode === 'offer_unavailable') {\n // Re-fetch offers and jump back to the Offer step with a notice. The\n // stale term selection is cleared so it cannot survive the refetch —\n // which also drops any module selection + acknowledgements.\n clearTermId()\n refetchOffers()\n resetPreview()\n setNotice(t.magiclineOfferUnavailableNotice)\n setIndex(0)\n setSubmitting(false)\n return\n }\n if (result.errorCode === 'confirmation_required') {\n // The UI normally prevents this; treat it as a validation re-prompt on\n // the Review step (where the confirmation checkboxes live).\n setNotice(t.magiclineConfirmationRequiredNotice)\n setSubmitting(false)\n return\n }\n if (result.errorCode === 'live_submission_disabled') {\n // Terminal — live submission is off for this project; no retry.\n setSubmitResult(result)\n return\n }\n if (!result.retryable) {\n // Terminal (unknown_outcome / duplicate / post-dispatch) — read-only.\n setSubmitResult(result)\n return\n }\n // Other retryable failure: keep the form editable, surface a banner, and\n // CLEAR the IBAN so a stale value is never reused.\n clearIban()\n setNotice(result.message !== '' ? result.message : t.magiclineFailedDetail)\n setSubmitting(false)\n } catch (err) {\n // A network throw on the submit action itself is treated as retryable. The\n // raw error is logged WITHOUT any field/IBAN values (none are in scope).\n console.error('[ContractCreationForm] Submit failed:', err)\n clearIban()\n setNotice(t.magiclineFailedDetail)\n setSubmitting(false)\n }\n }\n\n function onPrimary() {\n if (isLast) {\n void handleSubmit()\n } else {\n handleNext()\n }\n }\n\n const stepTitle = stepTitleFor(step, t)\n // On Review the primary button waits for a ready preview AND every required\n // contract / module confirmation being ticked before enabling.\n const reviewBlocked =\n step === 'review' && (previewState.phase !== 'ready' || !allAcknowledged)\n const primaryDisabled = submitting || reviewBlocked\n\n return (\n <div class=\"jex-inline-form jex-magicline-form\">\n <div class=\"jex-magicline-wizard-header\">\n <div class=\"jex-inline-form-title\">{t.magiclineContractTitle}</div>\n <div class=\"jex-magicline-wizard-progress\">\n <span class=\"jex-magicline-wizard-step-label\">{stepTitle}</span>\n <span class=\"jex-magicline-wizard-counter\">\n {t.magiclineStepCounter\n .replace('{n}', String(safeIndex + 1))\n .replace('{total}', String(steps.length))}\n </span>\n </div>\n <div class=\"jex-magicline-wizard-dots\" aria-hidden=\"true\">\n {steps.map((s, i) => (\n <span\n key={s}\n class={\n i === safeIndex\n ? 'jex-magicline-wizard-dot jex-magicline-wizard-dot-active'\n : 'jex-magicline-wizard-dot'\n }\n />\n ))}\n </div>\n </div>\n\n <div class=\"jex-form\" role=\"group\" aria-label={stepTitle}>\n {step === 'offer' ? (\n <OfferStep\n offersState={offersState}\n selectedTermId={fields.termId}\n widgetLocale={widgetLocale}\n disabled={submitting}\n error={fieldErrors.termId}\n onSelect={setTermId}\n onRetry={refetchOffers}\n />\n ) : null}\n\n {step === 'upgrades' && selectedTerm !== null ? (\n <UpgradesStep\n modules={selectedTerm.optionalModules}\n selectedModuleIds={fields.selectedModuleIds}\n acknowledgedBlocks={fields.acknowledgedBlocks}\n widgetLocale={widgetLocale}\n disabled={submitting}\n error={fieldErrors.upgrades}\n onToggle={toggleModule}\n onAck={setBlockAck}\n />\n ) : null}\n\n {step === 'personal' ? (\n <PersonalStep\n personal={fields.personal}\n errors={fieldErrors}\n disabled={submitting}\n setPersonal={setPersonal}\n />\n ) : null}\n\n {step === 'address' ? (\n <AddressStep\n address={fields.address}\n errors={fieldErrors}\n disabled={submitting}\n setAddress={setAddress}\n />\n ) : null}\n\n {step === 'payment' ? (\n <PaymentStep\n formMessageId={formMessageId}\n fields={fields}\n errors={fieldErrors}\n privacyUrl={privacyUrl}\n disabled={submitting}\n setAccountHolder={setAccountHolder}\n setIban={setIban}\n setConsent={setConsent}\n />\n ) : null}\n\n {step === 'review' ? (\n <ReviewStep\n fields={fields}\n term={selectedTerm}\n previewState={previewState}\n widgetLocale={widgetLocale}\n disabled={submitting}\n acknowledgedBlocks={fields.acknowledgedBlocks}\n onToggleAck={setBlockAck}\n onRetry={handleReviewRetry}\n />\n ) : null}\n\n {notice !== null ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{notice}</div>\n ) : null}\n\n <div class=\"jex-magicline-wizard-nav\">\n {!isFirst ? (\n <button\n type=\"button\"\n class=\"jex-magicline-wizard-back\"\n disabled={submitting}\n onClick={handleBack}\n >\n {t.magiclineWizardBack}\n </button>\n ) : null}\n <button\n type=\"button\"\n class=\"jex-form-submit jex-magicline-wizard-next\"\n disabled={primaryDisabled}\n onClick={onPrimary}\n >\n {isLast\n ? submitting\n ? t.magiclineSubmitting\n : t.magiclineSubmit\n : t.magiclineWizardNext}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\n// ── Result cards ─────────────────────────────────────────────────────────────\n\ninterface ContractSuccessCardProps {\n customerNumber: string | null\n}\n\nfunction ContractSuccessCard({ customerNumber }: ContractSuccessCardProps) {\n const t = useLocale()\n return (\n <div class=\"jex-inline-form-submitted\">\n <span class=\"jex-inline-form-check\">✓</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.magiclineSubmitted}</div>\n <div class=\"jex-inline-form-submitted-detail\">{t.magiclineContractSubmitted}</div>\n {customerNumber !== null && customerNumber !== '' ? (\n <div class=\"jex-inline-form-submitted-detail\">\n {t.magiclineCustomerNumber.replace('{number}', customerNumber)}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n\ninterface ContractTerminalCardProps {\n message: string\n}\n\nfunction ContractTerminalCard({ message }: ContractTerminalCardProps) {\n const t = useLocale()\n return (\n <div class=\"jex-inline-form-submitted jex-magicline-failed\">\n <span class=\"jex-inline-form-check jex-magicline-failed-icon\">!</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.magiclineFailed}</div>\n <div class=\"jex-inline-form-submitted-detail\">{message}</div>\n </div>\n </div>\n )\n}\n\n// ── Step components ────────────────────────────────────────────────────────\n\ninterface OfferStepProps {\n offersState: OffersState\n selectedTermId: number | null\n widgetLocale: 'en' | 'de'\n disabled: boolean\n error: string | undefined\n onSelect: (termId: number) => void\n onRetry: () => void\n}\n\nfunction OfferStep({\n offersState,\n selectedTermId,\n widgetLocale,\n disabled,\n error,\n onSelect,\n onRetry,\n}: OfferStepProps) {\n const t = useLocale()\n\n if (offersState.phase === 'loading') {\n return <div class=\"jex-magicline-slots-hint\" aria-live=\"polite\">{t.magiclineOffersLoading}</div>\n }\n if (offersState.phase === 'error') {\n return (\n <div class=\"jex-magicline-slots-error\">\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {t.magiclineOffersError}\n </div>\n <button type=\"button\" class=\"jex-magicline-retry\" disabled={disabled} onClick={onRetry}>\n {t.magiclineRetry}\n </button>\n </div>\n )\n }\n if (offersState.phase === 'empty') {\n return (\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {t.magiclineNoOffers}\n </div>\n )\n }\n\n // ready → render the term cards grouped by their bundle heading.\n const groups = groupTermsByBundle(offersState.terms)\n return (\n <>\n <div class=\"jex-magicline-radio-group\" role=\"radiogroup\" aria-label={t.magiclineStepOffer}>\n {groups.map((group) => (\n <div key={group.bundleId} class=\"jex-magicline-offer-group\">\n <div class=\"jex-magicline-offer-bundle-name\">{group.bundleName}</div>\n {group.bundleDescription !== null ? (\n <div class=\"jex-magicline-offer-bundle-desc\">{group.bundleDescription}</div>\n ) : null}\n {group.terms.map((term) => (\n <OfferTermCard\n key={term.termId}\n term={term}\n checked={selectedTermId === term.termId}\n widgetLocale={widgetLocale}\n disabled={disabled}\n onSelect={onSelect}\n />\n ))}\n <BundleDetails\n subDescription={group.bundleSubDescription}\n footnote={group.footnote}\n />\n </div>\n ))}\n </div>\n {error !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{error}</div>\n ) : null}\n </>\n )\n}\n\ninterface OfferTermCardProps {\n term: RateBundleTermCard\n checked: boolean\n widgetLocale: 'en' | 'de'\n disabled: boolean\n onSelect: (termId: number) => void\n}\n\nfunction OfferTermCard({ term, checked, widgetLocale, disabled, onSelect }: OfferTermCardProps) {\n const t = useLocale()\n const lengthLabel = formatContractPeriod(term.termValue, term.termUnit, widgetLocale)\n const priceLabel = formatContractMoney(term.price, term.currencyCode, widgetLocale)\n const starterFee = term.flatFees.find((fee) => fee.isStarterPackage)\n const otherFlatFees = term.flatFees.filter((fee) => !fee.isStarterPackage)\n return (\n <label\n class={\n checked\n ? 'jex-magicline-radio-card jex-magicline-radio-card-active'\n : 'jex-magicline-radio-card'\n }\n >\n <input\n type=\"radio\"\n name=\"jex-ml-offer\"\n checked={checked}\n disabled={disabled}\n onChange={() => { onSelect(term.termId) }}\n />\n <span class=\"jex-magicline-offer-term\">\n <span class=\"jex-magicline-offer-term-head\">\n <span class=\"jex-magicline-offer-term-length\">{lengthLabel}</span>\n <span class=\"jex-magicline-offer-term-price\">\n {priceLabel}{' '}\n {formatPaymentFrequency(\n term.paymentFrequency.value,\n term.paymentFrequency.unit,\n widgetLocale,\n )}\n </span>\n </span>\n {term.cancellationPeriod !== null ? (\n <span class=\"jex-magicline-offer-term-note\">\n {t.magiclineCancellationPeriod}:{' '}\n {formatContractPeriod(\n term.cancellationPeriod.value,\n term.cancellationPeriod.unit,\n widgetLocale,\n )}\n </span>\n ) : null}\n {starterFee !== undefined ? (\n <span class=\"jex-magicline-offer-term-note\">\n {t.magiclineStarterPackage}:{' '}\n {formatContractMoney(starterFee.price, term.currencyCode, widgetLocale)}\n </span>\n ) : null}\n {otherFlatFees.map((fee) => (\n <span key={fee.name} class=\"jex-magicline-offer-term-note\">\n {localizeFeeName(fee.name, t)}: {formatContractMoney(fee.price, term.currencyCode, widgetLocale)}\n </span>\n ))}\n {term.includedModuleNames.length > 0 ? (\n <span class=\"jex-magicline-offer-term-note\">\n {t.magiclineIncludedModules}: {term.includedModuleNames.join(', ')}\n </span>\n ) : null}\n </span>\n </label>\n )\n}\n\ninterface BundleDetailsProps {\n subDescription: string | null\n footnote: string | null\n}\n\n/**\n * Collapsed-by-default disclosure for a bundle's long sub-description and\n * footnote. The sub-description is parsed into list bullets; the footnote stays\n * as a single muted paragraph. Renders nothing when both are absent so a bundle\n * with no extra copy shows no empty \"Details\" toggle.\n */\nfunction BundleDetails({ subDescription, footnote }: BundleDetailsProps) {\n const t = useLocale()\n const bullets = parseBundleBullets(subDescription)\n const hasFootnote = footnote !== null && footnote.trim() !== ''\n if (bullets.length === 0 && !hasFootnote) {\n return null\n }\n return (\n <details class=\"jex-magicline-bundle-details\">\n <summary class=\"jex-magicline-bundle-details-summary\">{t.magiclineDetails}</summary>\n <div class=\"jex-magicline-bundle-details-body\">\n {bullets.length > 0 ? (\n <ul class=\"jex-magicline-bundle-details-list\">\n {bullets.map((bullet, i) => (\n <li key={`${i}-${bullet}`}>{bullet}</li>\n ))}\n </ul>\n ) : null}\n {hasFootnote ? (\n <p class=\"jex-magicline-bundle-details-footnote\">{footnote}</p>\n ) : null}\n </div>\n </details>\n )\n}\n\ninterface UpgradesStepProps {\n modules: ContractOptionalModule[]\n selectedModuleIds: number[]\n acknowledgedBlocks: Record<string, boolean>\n widgetLocale: 'en' | 'de'\n disabled: boolean\n error: string | undefined\n onToggle: (moduleId: number, selected: boolean, consentAckKey?: string) => void\n onAck: (ackKey: string, value: boolean) => void\n}\n\n/**\n * Optional paid add-on modules for the chosen term. Each card toggles its id in\n * `selectedModuleIds`; a selected module that carries a consent reveals a nested\n * consent checkbox whose ackKey MUST be ticked in `acknowledgedBlocks` to keep\n * the module selected.\n */\nfunction UpgradesStep({\n modules,\n selectedModuleIds,\n acknowledgedBlocks,\n widgetLocale,\n disabled,\n error,\n onToggle,\n onAck,\n}: UpgradesStepProps) {\n const t = useLocale()\n if (modules.length === 0) {\n return <div class=\"jex-magicline-slots-hint\">{t.magiclineUpgradesNone}</div>\n }\n return (\n <>\n <div class=\"jex-magicline-slots-hint\">{t.magiclineUpgradesIntro}</div>\n <div class=\"jex-magicline-upgrade-group\">\n {modules.map((module) => (\n <UpgradeModuleCard\n key={module.id}\n module={module}\n selected={selectedModuleIds.includes(module.id)}\n consentChecked={\n module.consent !== null && acknowledgedBlocks[module.consent.ackKey] === true\n }\n widgetLocale={widgetLocale}\n disabled={disabled}\n onToggle={onToggle}\n onAck={onAck}\n />\n ))}\n </div>\n {error !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{error}</div>\n ) : null}\n </>\n )\n}\n\ninterface UpgradeModuleCardProps {\n module: ContractOptionalModule\n selected: boolean\n consentChecked: boolean\n widgetLocale: 'en' | 'de'\n disabled: boolean\n onToggle: (moduleId: number, selected: boolean, consentAckKey?: string) => void\n onAck: (ackKey: string, value: boolean) => void\n}\n\nfunction UpgradeModuleCard({\n module,\n selected,\n consentChecked,\n widgetLocale,\n disabled,\n onToggle,\n onAck,\n}: UpgradeModuleCardProps) {\n const t = useLocale()\n const priceLabel = formatModulePrice(\n module.price,\n module.currencyCode,\n module.paymentFrequencyType,\n module.recurringUnit,\n widgetLocale,\n )\n const renewalLabel = formatModuleRenewal(module.extensionType, module.termExtension, widgetLocale)\n const termLabel = module.termLabel !== null && module.termLabel !== '' ? module.termLabel : t.magiclineUpgradeOneTime\n const consent = module.consent\n return (\n <div class={selected ? 'jex-magicline-upgrade-card jex-magicline-upgrade-card-active' : 'jex-magicline-upgrade-card'}>\n <label class=\"jex-magicline-upgrade-head\">\n <input\n type=\"checkbox\"\n checked={selected}\n disabled={disabled}\n onChange={(e) => { onToggle(module.id, e.currentTarget.checked, consent?.ackKey) }}\n />\n <span class=\"jex-magicline-upgrade-info\">\n <span class=\"jex-magicline-upgrade-name\">{module.name}</span>\n {module.description !== null && module.description !== '' ? (\n <span class=\"jex-magicline-upgrade-desc\">{module.description}</span>\n ) : null}\n <span class=\"jex-magicline-upgrade-price\">{priceLabel}</span>\n <span class=\"jex-magicline-upgrade-desc\">{termLabel}</span>\n {renewalLabel !== '' ? (\n <span class=\"jex-magicline-upgrade-desc\">{renewalLabel}</span>\n ) : null}\n </span>\n <span class=\"jex-magicline-upgrade-status\">\n {selected ? t.magiclineUpgradeAdded : t.magiclineUpgradeAdd}\n </span>\n </label>\n {selected && consent !== null ? (\n <ConsentRegion\n ackKey={consent.ackKey}\n title={consent.title}\n text={consent.text}\n attachmentLabel={consent.attachmentLabel}\n attachmentUrl={consent.attachmentUrl}\n checked={consentChecked}\n disabled={disabled}\n onToggle={onAck}\n showRequiredPill={true}\n />\n ) : null}\n </div>\n )\n}\n\ninterface PersonalStepProps {\n personal: ContractPersonalFields\n errors: ContractFieldErrors\n disabled: boolean\n setPersonal: (key: keyof ContractPersonalFields, value: string) => void\n}\n\nfunction PersonalStep({ personal, errors, disabled, setPersonal }: PersonalStepProps) {\n const t = useLocale()\n const maxDob = useMemo(() => todayIsoDate(), [])\n return (\n <>\n <div class=\"jex-magicline-row\">\n <TextField\n label={t.magiclineFirstName}\n value={personal.firstName}\n required\n disabled={disabled}\n error={errors.firstName}\n fieldKey=\"firstName\"\n onInput={(v) => { setPersonal('firstName', v) }}\n />\n <TextField\n label={t.magiclineLastName}\n value={personal.lastName}\n required\n disabled={disabled}\n error={errors.lastName}\n fieldKey=\"lastName\"\n onInput={(v) => { setPersonal('lastName', v) }}\n />\n </div>\n <TextField\n label={t.magiclineEmail}\n type=\"email\"\n value={personal.email}\n required\n disabled={disabled}\n error={errors.email}\n fieldKey=\"email\"\n onInput={(v) => { setPersonal('email', v) }}\n />\n <label class=\"jex-magicline-field\">\n <span class=\"jex-magicline-field-label\">{t.magiclineBirthDate}</span>\n <input\n class=\"jex-form-input\"\n type=\"date\"\n aria-label={t.magiclineBirthDate}\n value={personal.dateOfBirth}\n max={maxDob}\n required\n disabled={disabled}\n aria-invalid={errors.dateOfBirth !== undefined}\n onInput={(e) => { setPersonal('dateOfBirth', e.currentTarget.value) }}\n />\n {errors.dateOfBirth !== undefined ? (\n <span class=\"jex-magicline-error\" role=\"alert\">{errors.dateOfBirth}</span>\n ) : null}\n </label>\n <SelectField\n label={t.magiclineGender}\n value={personal.gender}\n required\n disabled={disabled}\n placeholder={t.magiclineGenderPlaceholder}\n error={errors.gender}\n onChange={(v) => { setPersonal('gender', v) }}\n options={GENDER_VALUES.map((value) => ({ value, label: genderLabel(value, t) }))}\n />\n <TextField\n label={t.magiclinePhone}\n type=\"tel\"\n value={personal.phone}\n required\n disabled={disabled}\n error={errors.phone}\n fieldKey=\"phone\"\n onInput={(v) => { setPersonal('phone', v) }}\n />\n </>\n )\n}\n\ninterface AddressStepProps {\n address: ContractAddressFields\n errors: ContractFieldErrors\n disabled: boolean\n setAddress: (key: keyof ContractAddressFields, value: string) => void\n}\n\nfunction AddressStep({ address, errors, disabled, setAddress }: AddressStepProps) {\n const t = useLocale()\n return (\n <>\n <div class=\"jex-magicline-row\">\n <TextField\n label={t.magiclineStreet}\n value={address.street}\n required\n disabled={disabled}\n error={errors.street}\n fieldKey=\"street\"\n onInput={(v) => { setAddress('street', v) }}\n />\n <TextField\n label={t.magiclineHouseNumber}\n value={address.houseNumber}\n required\n disabled={disabled}\n error={errors.houseNumber}\n fieldKey=\"houseNumber\"\n onInput={(v) => { setAddress('houseNumber', v) }}\n />\n </div>\n <div class=\"jex-magicline-row\">\n <TextField\n label={t.magiclineZip}\n value={address.zipCode}\n required\n disabled={disabled}\n error={errors.zipCode}\n fieldKey=\"zipCode\"\n onInput={(v) => { setAddress('zipCode', v) }}\n />\n <TextField\n label={t.magiclineCity}\n value={address.city}\n required\n disabled={disabled}\n error={errors.city}\n fieldKey=\"city\"\n onInput={(v) => { setAddress('city', v) }}\n />\n </div>\n {/* Country is fixed to Germany — shown as static text, never collected. */}\n <div class=\"jex-magicline-field\">\n <span class=\"jex-magicline-field-label\">{t.magiclineCountry}</span>\n <div class=\"jex-magicline-static-value\">{t.magiclineCountryStatic}</div>\n </div>\n </>\n )\n}\n\ninterface PaymentStepProps {\n formMessageId: Id<'conversations'>\n fields: ContractFormFields\n errors: ContractFieldErrors\n privacyUrl: string\n disabled: boolean\n setAccountHolder: (value: string) => void\n setIban: (value: string) => void\n setConsent: (key: 'privacy' | 'sepa', value: boolean) => void\n}\n\nfunction PaymentStep({\n formMessageId,\n fields,\n errors,\n privacyUrl,\n disabled,\n setAccountHolder,\n setIban,\n setConsent,\n}: PaymentStepProps) {\n const t = useLocale()\n const privacyId = `jex-ml-privacy-${formMessageId}`\n const sepaId = `jex-ml-sepa-${formMessageId}`\n return (\n <>\n <TextField\n label={t.magiclineAccountHolder}\n value={fields.payment.accountHolder}\n required\n disabled={disabled}\n error={errors.accountHolder}\n fieldKey=\"accountHolder\"\n onInput={setAccountHolder}\n />\n <TextField\n label={t.magiclineIban}\n value={fields.payment.iban}\n required\n disabled={disabled}\n error={errors.iban}\n fieldKey=\"iban\"\n onInput={setIban}\n />\n\n <label class=\"jex-magicline-consent\" for={privacyId}>\n <input\n id={privacyId}\n type=\"checkbox\"\n checked={fields.consents.privacy}\n disabled={disabled}\n aria-invalid={errors.privacy !== undefined}\n onChange={(e) => { setConsent('privacy', e.currentTarget.checked) }}\n />\n <span>\n {t.magiclineConsent}{' '}\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {t.magiclinePrivacyLinkText}\n </a>.\n </span>\n </label>\n\n <label class=\"jex-magicline-consent\" for={sepaId}>\n <input\n id={sepaId}\n type=\"checkbox\"\n checked={fields.consents.sepa}\n disabled={disabled}\n aria-invalid={errors.sepa !== undefined}\n onChange={(e) => { setConsent('sepa', e.currentTarget.checked) }}\n />\n <span>{t.magiclineSepaConsent}</span>\n </label>\n\n {errors.privacy !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{errors.privacy}</div>\n ) : null}\n {errors.sepa !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{errors.sepa}</div>\n ) : null}\n </>\n )\n}\n\ninterface ReviewStepProps {\n fields: ContractFormFields\n term: RateBundleTermCard | null\n previewState: PreviewState\n widgetLocale: 'en' | 'de'\n disabled: boolean\n acknowledgedBlocks: Record<string, boolean>\n onToggleAck: (ackKey: string, value: boolean) => void\n onRetry: () => void\n}\n\nfunction ReviewStep({\n fields,\n term,\n previewState,\n widgetLocale,\n disabled,\n acknowledgedBlocks,\n onToggleAck,\n onRetry,\n}: ReviewStepProps) {\n const t = useLocale()\n\n if (previewState.phase === 'loading' || previewState.phase === 'idle') {\n return <div class=\"jex-magicline-slots-hint\" aria-live=\"polite\">{t.magiclineReviewLoading}</div>\n }\n if (previewState.phase === 'error') {\n return (\n <div class=\"jex-magicline-slots-error\">\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {previewState.code === 'offer_unavailable'\n ? t.magiclineOfferUnavailableNotice\n : t.magiclineReviewError}\n </div>\n <button type=\"button\" class=\"jex-magicline-retry\" disabled={disabled} onClick={onRetry}>\n {t.magiclineRetry}\n </button>\n </div>\n )\n }\n\n // All pricing is rendered from the SERVER preview response (never the cached\n // term card) so the visitor confirms exactly what the backend re-verifies.\n const pricing: ContractPricing = previewState.pricing\n const volume = pricing.contractVolume\n const fullName = `${fields.personal.firstName} ${fields.personal.lastName}`.trim()\n const addr = fields.address\n const addressLine = [\n `${addr.street} ${addr.houseNumber}`.trim(),\n `${addr.zipCode} ${addr.city}`.trim(),\n t.magiclineCountryStatic,\n ]\n .filter((line) => line !== '')\n .join(', ')\n const offerLabel =\n term !== null\n ? `${term.bundleName} · ${formatContractPeriod(term.termValue, term.termUnit, widgetLocale)}`\n : '—'\n\n // Required contract text blocks — the only GATING confirmations on this step\n // (the module-consent tick is captured on the Upgrades step). Selected-module\n // consents below are a READ-ONLY recap of what was already accepted there.\n const requiredBlocks = term !== null ? term.textBlocks.filter((b) => b.isConfirmationRequired) : []\n // Non-confirmation text blocks are informational (e.g. billing-interval note);\n // shown as plain read-only text alongside the required checkboxes.\n const infoBlocks = term !== null ? term.textBlocks.filter((b) => !b.isConfirmationRequired) : []\n const selectedModuleConsents =\n term !== null\n ? term.optionalModules\n .filter((m) => fields.selectedModuleIds.includes(m.id) && m.consent !== null)\n .map((m) => ({ module: m, consent: m.consent as NonNullable<typeof m.consent> }))\n : []\n\n return (\n <>\n <dl class=\"jex-magicline-summary\">\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewOffer}</dt>\n <dd>{offerLabel}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewBasePrice}</dt>\n <dd>\n {formatContractMoney(pricing.basePrice, pricing.currencyCode, widgetLocale)}{' '}\n {formatPaymentFrequency(\n pricing.paymentFrequency.value,\n pricing.paymentFrequency.unit,\n widgetLocale,\n )}\n </dd>\n </div>\n {pricing.flatFees.map((fee: ContractFlatFee, i) => (\n <div key={`${fee.name}-${i}`} class=\"jex-magicline-summary-row\">\n <dt>{localizeFeeName(fee.name, t)}</dt>\n <dd>{formatContractMoney(fee.price, pricing.currencyCode, widgetLocale)}</dd>\n </div>\n ))}\n {pricing.preUseCharge > 0 ? (\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewPreUseCharge}</dt>\n <dd>{formatContractMoney(pricing.preUseCharge, pricing.currencyCode, widgetLocale)}</dd>\n </div>\n ) : null}\n </dl>\n\n {pricing.modules.length > 0 ? (\n <dl class=\"jex-magicline-summary jex-magicline-summary-section\">\n <div class=\"jex-magicline-summary-heading\">{t.magiclineReviewSelectedUpgrades}</div>\n {pricing.modules.map((module, i) => (\n <div key={`${module.moduleId}-${i}`} class=\"jex-magicline-summary-row\">\n <dt>{module.name}</dt>\n <dd>{formatContractMoney(module.amount, module.currencyCode, widgetLocale)}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n\n {volume !== null && volume.total !== null ? (\n <dl class=\"jex-magicline-summary jex-magicline-summary-section jex-magicline-summary-totals\">\n <div class=\"jex-magicline-summary-row jex-magicline-summary-total-row\">\n <dt>{t.magiclineReviewContractVolume}</dt>\n <dd>{formatContractMoney(volume.total, pricing.currencyCode, widgetLocale)}</dd>\n </div>\n </dl>\n ) : null}\n\n <dl class=\"jex-magicline-summary jex-magicline-summary-section\">\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewStartsOn}</dt>\n <dd>{formatContractDate(pricing.startDate, widgetLocale)}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummaryName}</dt>\n <dd>{fullName !== '' ? fullName : '—'}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummaryAddress}</dt>\n <dd>{addressLine}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewPayment}</dt>\n <dd>{maskIban(fields.payment.iban)}</dd>\n </div>\n </dl>\n\n {selectedModuleConsents.length > 0 ? (\n <div class=\"jex-magicline-terms\" role=\"group\" aria-label={t.magiclineReviewSelectedUpgrades}>\n <div class=\"jex-magicline-upgrades-recap-title\">\n {t.magiclineReviewSelectedUpgrades}\n </div>\n {selectedModuleConsents.map(({ module, consent }) => (\n <ConsentRecap\n key={consent.ackKey}\n title={consent.title !== '' ? consent.title : module.name}\n text={consent.text}\n attachmentLabel={consent.attachmentLabel}\n attachmentUrl={consent.attachmentUrl}\n />\n ))}\n </div>\n ) : null}\n\n {requiredBlocks.length > 0 || infoBlocks.length > 0 ? (\n <div class=\"jex-magicline-terms\" role=\"group\" aria-label={t.magiclineReviewTerms}>\n {requiredBlocks.length > 0 ? (\n <div class=\"jex-magicline-terms-prompt\">\n {t.magiclineConfirmPrompt}\n <span class=\"jex-magicline-required-pill\">{t.magiclineRequired}</span>\n </div>\n ) : null}\n {requiredBlocks.map((block) => (\n <ConsentRegion\n key={block.ackKey}\n ackKey={block.ackKey}\n title={block.title}\n text={block.text}\n attachmentLabel={block.attachmentLabel}\n attachmentUrl={block.attachmentUrl}\n checked={acknowledgedBlocks[block.ackKey] === true}\n disabled={disabled}\n onToggle={onToggleAck}\n />\n ))}\n {infoBlocks.map((block, i) => (\n <ConsentRecap\n key={`${block.title}-${i}`}\n title={block.title}\n text={block.text}\n attachmentLabel={block.attachmentLabel}\n attachmentUrl={block.attachmentUrl}\n />\n ))}\n </div>\n ) : null}\n </>\n )\n}\n\ninterface ConsentRegionProps {\n ackKey: string\n title: string\n text: string\n attachmentLabel: string | null\n attachmentUrl: string | null\n checked: boolean\n disabled: boolean\n onToggle: (ackKey: string, value: boolean) => void\n /** Show the inline \"Required\" pill — used on Upgrades where no group prompt carries it. */\n showRequiredPill?: boolean\n}\n\n/**\n * A gating consent region: a \"Required\" caption above a sibling consent\n * checkbox whose text is the checkbox's own clickable label. Used for module\n * consents on Upgrades and for contract text-block confirmations on Review.\n */\nfunction ConsentRegion({\n ackKey,\n title,\n text,\n attachmentLabel,\n attachmentUrl,\n checked,\n disabled,\n onToggle,\n showRequiredPill = false,\n}: ConsentRegionProps) {\n const t = useLocale()\n const id = `jex-ml-ack-${ackKey}`\n return (\n <div class=\"jex-magicline-consent-region\">\n {showRequiredPill ? (\n <span class=\"jex-magicline-required-pill\">{t.magiclineRequired}</span>\n ) : null}\n <label class=\"jex-magicline-consent\" for={id}>\n <input\n id={id}\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={(e) => { onToggle(ackKey, e.currentTarget.checked) }}\n />\n <span class=\"jex-magicline-consent-body\">\n {title !== '' ? <span class=\"jex-magicline-terms-title\">{title}</span> : null}\n <span class=\"jex-magicline-terms-content\">\n {text}\n {attachmentUrl !== null ? (\n <>\n {' '}\n <a href={attachmentUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {attachmentLabel !== null && attachmentLabel !== '' ? attachmentLabel : attachmentUrl}\n </a>\n </>\n ) : null}\n </span>\n </span>\n </label>\n </div>\n )\n}\n\ninterface ConsentRecapProps {\n title: string\n text: string\n attachmentLabel: string | null\n attachmentUrl: string | null\n}\n\n/**\n * Read-only recap of a module consent already accepted on the Upgrades step.\n * No checkbox — the gating tick lives upstream; this only restates the accepted\n * terms (with the attachment link) in the Review summary.\n */\nfunction ConsentRecap({ title, text, attachmentLabel, attachmentUrl }: ConsentRecapProps) {\n return (\n <div class=\"jex-magicline-consent-recap\">\n {title !== '' ? <span class=\"jex-magicline-terms-title\">{title}</span> : null}\n <span class=\"jex-magicline-terms-content\">\n {text}\n {attachmentUrl !== null ? (\n <>\n {' '}\n <a href={attachmentUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {attachmentLabel !== null && attachmentLabel !== '' ? attachmentLabel : attachmentUrl}\n </a>\n </>\n ) : null}\n </span>\n </div>\n )\n}\n\n// ── Reusable field primitives (local — mirror the trial wizard's shape) ──────\n\ninterface TextFieldProps {\n label: string\n value: string\n fieldKey: string\n type?: string\n required?: boolean\n disabled: boolean\n error: string | undefined\n onInput: (value: string) => void\n}\n\nfunction TextField({\n label,\n value,\n fieldKey,\n type = 'text',\n required = false,\n disabled,\n error,\n onInput,\n}: TextFieldProps) {\n const describedBy = error !== undefined ? `jex-ml-err-${fieldKey}` : undefined\n return (\n <div class=\"jex-magicline-field\">\n <input\n class=\"jex-form-input\"\n type={type}\n aria-label={label}\n placeholder={label}\n value={value}\n required={required}\n disabled={disabled}\n aria-invalid={error !== undefined}\n aria-describedby={describedBy}\n onInput={(e) => { onInput(e.currentTarget.value) }}\n />\n {error !== undefined ? (\n <span id={describedBy} class=\"jex-magicline-error\" role=\"alert\">{error}</span>\n ) : null}\n </div>\n )\n}\n\ninterface SelectOption {\n value: string\n label: string\n}\n\ninterface SelectFieldProps {\n label: string\n value: string\n required: boolean\n disabled: boolean\n placeholder: string\n error: string | undefined\n options: SelectOption[]\n onChange: (value: string) => void\n}\n\nfunction SelectField({\n label,\n value,\n required,\n disabled,\n placeholder,\n error,\n options,\n onChange,\n}: SelectFieldProps) {\n return (\n <div class=\"jex-magicline-field\">\n <select\n class=\"jex-form-input jex-magicline-select\"\n aria-label={label}\n value={value}\n required={required}\n disabled={disabled}\n aria-invalid={error !== undefined}\n onChange={(e) => { onChange(e.currentTarget.value) }}\n >\n <option value=\"\" disabled={required}>{placeholder}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>{option.label}</option>\n ))}\n </select>\n {error !== undefined ? (\n <span class=\"jex-magicline-error\" role=\"alert\">{error}</span>\n ) : null}\n </div>\n )\n}\n\n// ── Pure helpers ─────────────────────────────────────────────────────────────\n\ninterface BundleGroup {\n bundleId: number\n bundleName: string\n bundleDescription: string | null\n bundleSubDescription: string | null\n footnote: string | null\n terms: RateBundleTermCard[]\n}\n\n/**\n * Split a bundle sub-description into display bullets. Lines are separated by\n * newlines; a leading \"- \" / \"• \" marker is stripped. Blank lines are dropped so\n * the resulting list never shows empty items.\n */\nfunction parseBundleBullets(subDescription: string | null): string[] {\n if (subDescription === null) {\n return []\n }\n return subDescription\n .split('\\n')\n .map((line) => line.replace(/^\\s*[-•]\\s*/, '').trim())\n .filter((line) => line !== '')\n}\n\n/**\n * Group term cards under their bundle heading, preserving first-seen order for\n * both bundles and the terms within each bundle.\n */\nfunction groupTermsByBundle(terms: RateBundleTermCard[]): BundleGroup[] {\n const groups: BundleGroup[] = []\n const byId = new Map<number, BundleGroup>()\n for (const term of terms) {\n let group = byId.get(term.bundleId)\n if (!group) {\n group = {\n bundleId: term.bundleId,\n bundleName: term.bundleName,\n bundleDescription: term.bundleDescription,\n bundleSubDescription: term.bundleSubDescription,\n footnote: term.footnote,\n terms: [],\n }\n byId.set(term.bundleId, group)\n groups.push(group)\n }\n group.terms.push(term)\n }\n return groups\n}\n\n/** Localised step title for the wizard header. */\nfunction stepTitleFor(step: ContractStep, t: WidgetStrings): string {\n switch (step) {\n case 'offer': {\n return t.magiclineStepOffer\n }\n case 'upgrades': {\n return t.magiclineStepUpgrades\n }\n case 'personal': {\n return t.magiclineStepPersonal\n }\n case 'address': {\n return t.magiclineStepAddress\n }\n case 'payment': {\n return t.magiclineStepPayment\n }\n case 'review': {\n return t.magiclineStepReview\n }\n default: {\n return ''\n }\n }\n}\n\n/** Localised label for a gender enum value. */\nfunction genderLabel(value: 'MALE' | 'FEMALE' | 'UNISEX', t: WidgetStrings): string {\n if (value === 'MALE') {\n return t.magiclineGenderMale\n }\n if (value === 'FEMALE') {\n return t.magiclineGenderFemale\n }\n return t.magiclineGenderUnisex\n}\n","import { useQuery } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport { useLocale } from '../../../i18n/index'\nimport { TrialSessionBookingForm } from './magicline/TrialSessionBookingForm'\nimport { ContractCreationForm } from './magicline/ContractCreationForm'\nimport type { Doc, Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface MagiclineFormMessageProps {\n message: Doc<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\n/**\n * Inline Magicline integration form rendered inside the chat thread.\n *\n * Three states driven by `message.magiclineForm.status`:\n * - `submitted` → read-only success card (NOT re-submittable).\n * - `failed` → read-only failure card.\n * - `open` → renders the interactive form: `trialSessionBooking` →\n * TrialSessionBookingForm, `contractCreation` → ContractCreationForm. The\n * dormant `leadApplication` action is intentionally NOT routed (the file stays\n * on disk but is no longer imported).\n *\n * `contractCreation` is routed for EVERY status (not just `open`): its submit\n * action flips the row to `submitted` at claim time, so the form must stay\n * mounted to render its own result envelope (customer number / terminal notice).\n *\n * 409 retry: when a `slot_unavailable` 409 reopens the form (status flips\n * back to `open` while the linked submission carries `errorCode === \"slot_unavailable\"`),\n * the form shows a \"pick another time\" notice and reloads slots. This is detected\n * by reading `getSubmissionStatus` only when the form is `open` AND a\n * `submissionId` is present (otherwise the query is skipped).\n *\n * Mirrors FormMessage (escalation): reads the row, renders read-only when the\n * backend has flipped the status, otherwise renders the interactive form. The\n * form's own submit handler additionally guards against double-submit.\n */\nexport function MagiclineFormMessage({ message, sessionId, visitorId }: MagiclineFormMessageProps) {\n const t = useLocale()\n const form = message.magiclineForm\n\n // Read the submission status ONLY when the form is open with a linked\n // submission — that is the only state where a 409 retry can have reopened it.\n // Skipped otherwise (Convex 'skip' sentinel) so submitted/failed cards never\n // issue an extra query.\n const shouldCheckRetry = !!form && form.status === 'open' && !!form.submissionId\n const submissionStatus = useQuery(\n api.functions.magicline.public.getSubmissionStatus,\n shouldCheckRetry && form?.submissionId\n ? { sessionId, visitorId, submissionId: form.submissionId }\n : 'skip',\n )\n\n // Defensive: a magicline-form row without its payload can't render anything.\n if (!form) {\n return null\n }\n\n // Contract creation owns its full lifecycle inside ContractCreationForm: the\n // submit action flips the row to `submitted` at CLAIM time (mid-dispatch), so\n // a generic read-only card here would unmount the live form before its result\n // envelope (customer number / terminal notice) can render. We therefore route\n // EVERY contractCreation status to the form, which renders the interactive\n // wizard while `open`, its own live result UI once it owns a submit envelope,\n // and a read-only card from `formStatus` on a resumed/cold session.\n if (form.action === 'contractCreation') {\n if (!message.projectId) {\n // Without a project id the submit action can't run — fail closed.\n return null\n }\n return (\n <ContractCreationForm\n formMessageId={message._id}\n sessionId={sessionId}\n visitorId={visitorId}\n projectId={message.projectId}\n formStatus={form.status}\n />\n )\n }\n\n if (form.status === 'submitted') {\n return (\n <div class=\"jex-inline-form-submitted\">\n <span class=\"jex-inline-form-check\">✓</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.magiclineSubmitted}</div>\n <div class=\"jex-inline-form-submitted-detail\">{t.magiclineSubmittedDetail}</div>\n </div>\n </div>\n )\n }\n\n if (form.status === 'failed') {\n return (\n <div class=\"jex-inline-form-submitted jex-magicline-failed\">\n <span class=\"jex-inline-form-check jex-magicline-failed-icon\">!</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.magiclineFailed}</div>\n <div class=\"jex-inline-form-submitted-detail\">{t.magiclineFailedDetail}</div>\n </div>\n </div>\n )\n }\n\n // status === 'open' → interactive trial form. contractCreation is handled\n // above; leadApplication remains unwired (its form is intentionally not routed).\n if (form.action !== 'trialSessionBooking') {\n return null\n }\n\n // A reopened form whose linked submission failed with `slot_unavailable` is a\n // 409 retry — surface the notice so the visitor re-picks a time.\n const slotUnavailable =\n submissionStatus !== undefined &&\n submissionStatus !== null &&\n submissionStatus.errorCode === 'slot_unavailable'\n\n // while a 409-reopen's retry-status query is still resolving\n // (`undefined`), the wizard's Slot step must NOT decide its UI yet — otherwise\n // it can flash \"no slots\" before the slot-unavailable notice resolves. We only\n // gate when we are actually checking a reopened submission.\n const retryPending = shouldCheckRetry && submissionStatus === undefined\n\n return (\n <TrialSessionBookingForm\n formMessageId={message._id}\n sessionId={sessionId}\n visitorId={visitorId}\n slotUnavailable={slotUnavailable}\n retryPending={retryPending}\n />\n )\n}\n","import { useState } from 'preact/hooks'\nimport type { Doc } from '@repo/backend/convex/_generated/dataModel'\nimport { useLocale } from '../../../i18n/index'\n\ntype Source = NonNullable<Doc<'conversations'>['sources']>[number]\n\ninterface SourcesRowProps {\n sources: Source[]\n}\n\nconst ICONS: Record<Source['sourceType'], string> = {\n crawl: '🌐',\n file: '📄',\n snippet: '💡',\n qa: '❓',\n}\n\n/**\n * Visitor-facing pill row rendered below assistant messages. Server-side\n * filtering by `widgetConfigs.sourcesVisibility` (\"off\" | \"website\" | \"all\")\n * already trimmed the sources array before it reached the widget — this\n * component just renders whatever survived. If the array is empty, no row.\n *\n * Crawl pills are direct anchor links to the URL (visitor sees what we cited).\n * Non-crawl pills (file / snippet / qa) currently show as static badges since\n * we don't expose deep-links to the org Knowledge admin from the visitor side.\n */\nexport function SourcesRow({ sources }: SourcesRowProps) {\n const s = useLocale()\n const [expanded, setExpanded] = useState(false)\n\n if (sources.length === 0) {\n return null\n }\n\n return (\n <div class=\"jex-sources-row\">\n <button\n type=\"button\"\n class=\"jex-sources-toggle\"\n onClick={() => { setExpanded((e) => !e) }}\n aria-expanded={expanded}\n >\n <span class=\"jex-sources-icon\">📖</span>\n <span>\n {(sources.length === 1 ? s.sourcesCountOne : s.sourcesCountOther).replace(\n '{count}',\n String(sources.length),\n )}\n </span>\n <span class={`jex-sources-chevron${expanded ? ' jex-sources-chevron--open' : ''}`}>▾</span>\n </button>\n\n {expanded ? (\n <div class=\"jex-sources-pills\">\n {sources.map((s, i) => {\n const isCrawl = s.sourceType === 'crawl'\n const label = getPillLabel(s)\n const tooltip =\n isCrawl && s.url ? `${s.title}\\n${s.url}` : s.title\n\n const pillBody = (\n <>\n {typeof s.id === 'number' ? (\n <span class=\"jex-source-id\">{s.id}</span>\n ) : null}\n <span class=\"jex-source-type\">{ICONS[s.sourceType]}</span>\n <span class=\"jex-source-label\">{label}</span>\n <span class=\"jex-source-score\">· {s.score.toFixed(2)}</span>\n </>\n )\n\n if (isCrawl && s.url) {\n return (\n <a\n key={i}\n class=\"jex-source-pill\"\n href={s.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={tooltip}\n >\n {pillBody}\n </a>\n )\n }\n return (\n <span key={i} class=\"jex-source-pill\" title={tooltip}>\n {pillBody}\n </span>\n )\n })}\n </div>\n ) : null}\n </div>\n )\n}\n\n/**\n * Pill display label. Crawl pages on commerce sites typically share an\n * identical SEO `<title>` template (e.g. \"FIT-INN Trier | Premium\n * Supplements\"), so URL path/hostname disambiguates better than the title.\n * Full title remains in the tooltip.\n */\nfunction getPillLabel(source: Source): string {\n if (source.sourceType === 'crawl' && source.url) {\n try {\n const u = new URL(source.url)\n if (!u.pathname || u.pathname === '/') {\n return u.hostname\n }\n return u.pathname\n } catch {\n // Invalid URL — fall through to title.\n }\n }\n return source.title\n}\n","export function TypingIndicator() {\n return (\n <div class=\"jex-typing\">\n <span />\n <span />\n <span />\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'preact/hooks'\nimport { markActivity } from '../../../module/visitor/visitor.state'\nimport { BotMessage } from './BotMessage'\nimport { UserMessage } from './UserMessage'\nimport { FormMessage } from './FormMessage'\nimport { MagiclineFormMessage } from './MagiclineFormMessage'\nimport { SourcesRow } from './SourcesRow'\nimport { TypingIndicator } from './TypingIndicator'\nimport { useLocale } from '../../../i18n/index'\nimport { escalationFormStyle, navigate } from '../../../module/screens/screens.state'\nimport type { Doc, Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Strips legacy `[N]` citation markers from displayed body text. Phase 1\n * doesn't emit them server-side, but pre-existing rows persisted before\n * the citation system was removed may still contain them — this is a\n * safety net so visitors never see stray brackets in old messages.\n *\n * The leading optional whitespace prevents \" [3].\" from leaving an\n * orphaned space before a period.\n */\nconst STRIP_MARKER_RE = /\\s?\\[\\d+\\]/g\nfunction stripCitationMarkers(text: string): string {\n return text.replace(STRIP_MARKER_RE, '')\n}\n\ninterface MessageListProps {\n conversations: Doc<'conversations'>[] | undefined\n greeting: string\n /** True when a resume attempt didn't find the old session. */\n sessionNotFound?: boolean\n /** True when resume failed and visitor hasn't started fresh yet. */\n resumeFailed?: boolean\n /** Callback to start a fresh session after resume failure. */\n onStartFresh?: () => void\n /** Session ID for escalation form submission. */\n sessionId: Id<'contactSessions'> | null\n /** Visitor ID for escalation form submission. */\n visitorId: string | null\n}\n\n/** Scrollable message area — renders messages with streaming status support. */\nexport function MessageList({ conversations, greeting, sessionNotFound, resumeFailed, onStartFresh, sessionId, visitorId }: MessageListProps) {\n const s = useLocale()\n const bottomRef = useRef<HTMLDivElement>(null)\n const [dismissedFormId, setDismissedFormId] = useState<string | null>(null)\n\n // Bump activity when a NEW final (non-streaming) assistant reply lands.\n // Streaming chunks would re-fire on every token — guard via _id dedupe.\n const lastFinalIdRef = useRef<string | null>(null)\n useEffect(() => {\n if (!visitorId || !conversations || conversations.length === 0) { return }\n const last = conversations[conversations.length - 1]\n if (last.role === 'assistant' && last.status !== 'streaming' && last._id !== lastFinalIdRef.current) {\n lastFinalIdRef.current = last._id\n markActivity(visitorId)\n }\n }, [conversations, visitorId])\n\n useEffect(() => {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [conversations?.length, conversations?.at(-1)?.content])\n\n return (\n <div class=\"jex-chat-messages\">\n <BotMessage text={greeting} />\n\n {sessionNotFound && resumeFailed && onStartFresh ? (\n <div class=\"jex-session-prompt\">\n <div class=\"jex-session-prompt-text\">{s.sessionNotFoundPrompt}</div>\n <button\n class=\"jex-session-prompt-btn\"\n type=\"button\"\n onClick={() => { void onStartFresh() }}\n >\n {s.startNewConversation}\n </button>\n </div>\n ) : sessionNotFound ? (\n <div class=\"jex-session-notice\">\n {s.sessionNotFound}\n </div>\n ) : null}\n\n {conversations?.map((msg) => {\n // ── System notices (human-notice, escalation) ─────────────\n if (msg.contentType === 'human-notice') {\n // Translate in the visitor's locale via `noticeKind`. Legacy rows\n // with no kind fall back to the English `content` baked server-side.\n const noticeText =\n msg.noticeKind === 'agent-joined'\n ? s.noticeAgentJoined.replace('{name}', msg.noticeData?.agentName ?? '')\n : msg.noticeKind === 'human-requested'\n ? s.noticeHumanRequested\n : msg.noticeKind === 'human-requested-form'\n ? s.noticeHumanRequestedForm\n : msg.noticeKind === 'message-received'\n ? s.noticeMessageReceived\n : msg.noticeKind === 'agent-handling'\n ? s.noticeAgentHandling\n : msg.content\n return <BotMessage key={msg._id} text={noticeText} />\n }\n if (msg.contentType === 'escalation-form' && sessionId && visitorId) {\n // 'screen' mode: show a \"go to form\" button that navigates to full-screen form\n if (escalationFormStyle.value === 'screen' && !msg.formData) {\n // Visitor dismissed this card\n if (dismissedFormId === msg._id) { return null }\n\n return (\n <div key={msg._id} class=\"jex-inline-form jex-inline-form-card\">\n <div class=\"jex-inline-form-title\">{s.escalationPromptTitle}</div>\n <div class=\"jex-inline-form-subtitle\">{s.escalationPromptSubtitle}</div>\n <button\n class=\"jex-form-submit\"\n type=\"button\"\n onClick={() => { navigate({ id: 'escalation-form', formMessageId: msg._id, sessionId, visitorId }) }}\n >\n {s.escalationPromptSubmit}\n </button>\n <button\n class=\"jex-escalation-skip\"\n type=\"button\"\n onClick={() => { setDismissedFormId(msg._id) }}\n >\n {s.escalationSkip}\n </button>\n </div>\n )\n }\n // 'inline' mode (default): render the form card directly in chat\n return <FormMessage key={msg._id} message={msg} sessionId={sessionId} visitorId={visitorId} />\n }\n if (msg.contentType === 'magicline-form' && sessionId && visitorId) {\n return <MagiclineFormMessage key={msg._id} message={msg} sessionId={sessionId} visitorId={visitorId} />\n }\n if (msg.contentType === 'escalation-confirm') {\n // Rebuild the reference card in the visitor's locale. BotMessage\n // renders markdown (newlines + **bold**). Legacy rows without a\n // `noticeKind` fall back to the English `content` baked server-side.\n const confirmText =\n msg.noticeKind === 'escalation-confirmed'\n ? s.noticeEscalationConfirmed\n .replace('{name}', msg.noticeData?.visitorName ?? '')\n .replace('{email}', msg.noticeData?.visitorEmail ?? '')\n .replace('{ref}', msg.noticeData?.visitorId ?? '')\n : msg.content\n return <BotMessage key={msg._id} text={confirmText} />\n }\n\n // ── Standard messages ───────────────────────────────────\n if (msg.role === 'user') {\n return <UserMessage key={msg._id} text={msg.content} />\n }\n\n // Shared author props for all assistant message states\n const authorProps = {\n authorId: msg.authorId,\n authorName: msg.authorName,\n authorImage: msg.authorImage,\n }\n\n // Assistant message — render based on streaming status\n if (msg.status === 'streaming' && msg.content === '') {\n return <TypingIndicator key={msg._id} />\n }\n\n if (msg.status === 'streaming') {\n return <BotMessage key={msg._id} text={stripCitationMarkers(msg.content)} streaming {...authorProps} />\n }\n\n if (msg.status === 'error') {\n return (\n <BotMessage\n key={msg._id}\n text={msg.errorMessage ?? `${s.somethingWentWrong}. ${s.tryAgain}.`}\n error\n {...authorProps}\n />\n )\n }\n\n // Final assistant message — render bubble plus the source pills row.\n // Server-side filtering by widgetConfigs.sourcesVisibility (\"off\" |\n // \"website\" | \"all\") already trimmed the array, so SourcesRow just\n // renders whatever survived. Empty array → component returns null.\n return (\n <div key={msg._id}>\n <BotMessage text={stripCitationMarkers(msg.content)} {...authorProps} />\n {msg.sources && msg.sources.length > 0 ? (\n <SourcesRow sources={msg.sources} />\n ) : null}\n </div>\n )\n })}\n\n <div ref={bottomRef} />\n </div>\n )\n}\n","import { useEffect, useState } from 'preact/hooks'\n\ninterface LoadingScreenProps {\n message?: string\n}\n\n/**\n * Full-coverage overlay shown during async operations.\n * Defers first paint by 80ms to suppress single-frame flicker on fast resolves.\n */\nexport function LoadingScreen({ message }: LoadingScreenProps) {\n const [shown, setShown] = useState(false)\n\n useEffect(() => {\n const t = setTimeout(() => { setShown(true) }, 80)\n return () => { clearTimeout(t) }\n }, [])\n\n if (!shown) { return null }\n\n return (\n <div class=\"jex-overlay jex-loading\">\n <div class=\"jex-loading-spinner\" aria-hidden=\"true\" />\n {message && <p class=\"jex-loading-message\">{message}</p>}\n </div>\n )\n}\n","import { useQuery } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport type { Doc, Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface UseConversationArgs {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n}\n\nexport type SessionLiveStatus = 'active' | 'escalated' | 'assigned' | 'resolved'\n\ninterface UseConversationResult {\n /** Conversation rows; `undefined` until first server response (loading). */\n conversations: Doc<'conversations'>[] | undefined\n /** Live status of the contact session, or null while loading / no session. */\n sessionStatus: SessionLiveStatus | null\n /** True while the conversations query is in flight for a known session. */\n isLoading: boolean\n /** True while any bot/agent message is mid-stream. */\n isStreaming: boolean\n}\n\n/**\n * Conversation data hook — wraps the two Convex queries ChatScreen\n * needs (message list + live session status) so the component is\n * free of `api.functions.chat.public.*` paths.\n *\n * Both queries use the `'skip'` idle pattern until a session exists,\n * keeping subscription cost at zero before the first send.\n */\nexport function useConversation({ sessionId, visitorId }: UseConversationArgs): UseConversationResult {\n // Subscribe to the visitor's conversation rows for this session.\n const conversations = useQuery(\n api.functions.chat.public.conversations.listBySession,\n sessionId && visitorId ? { sessionId, visitorId } : 'skip',\n )\n\n // Subscribe to the session's live status (reacts to agent accept / resolve).\n const liveStatus = useQuery(\n api.functions.chat.public.sessions.getSessionStatus,\n sessionId && visitorId ? { sessionId, visitorId } : 'skip',\n )\n\n // Loading only matters once a session id exists — otherwise the\n // query is intentionally skipped and `undefined` is the correct\n // resting state, not a loading state.\n const isLoading = sessionId !== null && conversations === undefined\n // Any in-flight stream → freeze input + show typing affordance upstream.\n const isStreaming = conversations?.some((m) => m.status === 'streaming') ?? false\n\n return {\n conversations,\n sessionStatus: liveStatus ?? null,\n isLoading,\n isStreaming,\n }\n}\n","import { useEffect, useRef } from 'preact/hooks'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\nimport { MessageList } from './MessageList'\nimport { ChatInput } from '../composer'\nimport { LoadingScreen } from '../../../shared/ui/LoadingScreen'\nimport { hasAnyHistory, chatMountIntent, markActivity } from '../../../module/visitor/visitor.state'\nimport { useLocale } from '../../../i18n/index'\nimport { useConversation } from '../hooks/useConversation'\nimport type { SessionResult } from '../hooks/useConvexSession'\n\ninterface ChatScreenProps {\n greeting: string\n // Session state hoisted from WidgetShell — avoids duplicate useConvexSession subscriptions\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n isLoading: boolean\n sessionNotFound: boolean\n resumeFailed: boolean\n isOrgDeleted: boolean\n ensureSession: () => Promise<SessionResult | null>\n startFresh: () => Promise<SessionResult | null>\n}\n\n/**\n * Chat screen — renders immediately with greeting + input.\n * Session is created lazily on first send (no loading spinner on open).\n *\n * Owns the conversations query so both MessageList and ChatInput\n * can react to streaming status from a single subscription.\n *\n * Note: session state is hoisted into WidgetShell so the Header can show\n * HumanHandoffAction with the same sessionId/visitorId — no duplicate subscriptions.\n */\nexport function ChatScreen({ greeting, sessionId, visitorId, isLoading, sessionNotFound, resumeFailed, isOrgDeleted, ensureSession, startFresh }: ChatScreenProps) {\n const s = useLocale()\n\n // Single seam over the two queries ChatScreen needs (message list +\n // live session status). Hook handles the `'skip'` idle pattern.\n const { conversations, sessionStatus, isLoading: isQueryLoading, isStreaming } = useConversation({ sessionId, visitorId })\n\n // Snapshot mount intent once at first render.\n // peek() avoids subscribing to the signal; chatMountIntent clear is a side-effect — moved to useEffect.\n const mountIntent = useRef<'fresh' | 'resume'>(\n (() => {\n const v = chatMountIntent.peek()\n if (v !== null) { return v }\n // Treat null as 'fresh' for first-time visitors; 'resume' when arriving\n // with history (e.g. direct link into chat without HomeScreen action).\n return hasAnyHistory.peek() ? 'resume' : 'fresh'\n })(),\n ).current\n\n // Clear the signal after mount so subsequent mounts are unambiguous (side-effect — proper slot).\n useEffect(() => {\n chatMountIntent.value = null\n }, [])\n\n // Auto-resolve existing session so messages appear on resume (not just on send).\n // AFTER — eager unconditional create. Backend createOrResume is idempotent.\n useEffect(() => {\n void ensureSession()\n }, [ensureSession])\n\n // Bump TTL anchor every time ChatScreen mounts so reopening the widget\n // counts as activity. Prevents silent pruning of active sessions.\n useEffect(() => {\n if (visitorId) {\n markActivity(visitorId)\n }\n }, [visitorId])\n\n if (isOrgDeleted) {\n return (\n <div class=\"jex-chat-messages\">\n <div class=\"jex-session-notice\">{s.chatNoLongerAvailable}</div>\n </div>\n )\n }\n\n // LoadingScreen rules:\n // - resume intent → show until conversations query resolves\n // - fresh intent → show until sessionId is set (null until ensureSession resolves)\n const isFreshSessionLoading = mountIntent === 'fresh' && !sessionId\n // Resume covers TWO windows: (a) sessionId not yet resolved (mutation in flight),\n // (b) sessionId resolved but conversations query still loading.\n const isResumeLoading = mountIntent === 'resume' && (!sessionId || isQueryLoading)\n\n if (isFreshSessionLoading) {\n return <LoadingScreen message={s.startingConversation} />\n }\n if (isResumeLoading) {\n return <LoadingScreen message={s.resumeConversation} />\n }\n\n return (\n <>\n <MessageList\n conversations={conversations}\n greeting={greeting}\n sessionNotFound={sessionNotFound}\n resumeFailed={resumeFailed}\n onStartFresh={startFresh}\n sessionId={sessionId}\n visitorId={visitorId}\n />\n <ChatInput\n sessionId={sessionId}\n visitorId={visitorId}\n isLoading={isLoading}\n isStreaming={isStreaming}\n sessionStatus={sessionStatus}\n ensureSession={ensureSession}\n onStartFresh={startFresh}\n />\n </>\n )\n}\n","import { useState } from 'preact/hooks'\nimport { back } from '../../../module/screens/screens.state'\nimport { PLATFORM_PRIVACY_POLICY_URL, resolvedPrivacyPolicyUrl } from '../../../module/shell/shell.state'\nimport { locale as widgetLocale, useLocale } from '../../../i18n/index'\nimport { useEscalation } from '../hooks/useEscalation'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface EscalationFormScreenProps {\n formMessageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\n/**\n * Full-screen escalation form — alternative to the inline FormMessage.\n * Uses the same .jex-form-* styling as FormScreen but calls the real\n * submitEscalation mutation instead of a mock.\n *\n * Navigated to from MessageList when escalationFormStyle === 'screen'.\n * On submit: patches the form message, shows confirmation, then goes back to chat.\n */\nexport function EscalationFormScreen({ formMessageId, sessionId, visitorId }: EscalationFormScreenProps) {\n const t = useLocale()\n const rawPrivacyUrl = resolvedPrivacyPolicyUrl.value\n const privacyUrl = /^https?:\\/\\//i.test(rawPrivacyUrl) ? rawPrivacyUrl : PLATFORM_PRIVACY_POLICY_URL\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n\n // Bound to the escalation seam — single touch point shared with FormMessage.\n const submitEscalation = useEscalation()\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n\n async function handleSubmit(e: Event) {\n e.preventDefault()\n setSubmitting(true)\n setSubmitError(null)\n try {\n // Submit escalation — backend inserts escalation-confirm BotMessage inline.\n await submitEscalation({\n sessionId,\n visitorId,\n formMessageId,\n visitorName: name.trim(),\n visitorEmail: email.trim(),\n locale: widgetLocale.value,\n })\n // Pop back to chat; the freshly-inserted escalation-confirm row renders there.\n back()\n } catch (error) {\n console.error('[EscalationFormScreen] Submit failed:', error)\n // Keep form mounted; show inline error so visitor can retry.\n setSubmitError(t.escalationSubmitFailed)\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <div class=\"jex-form-screen\">\n <h2 class=\"jex-form-title\">{t.escalationFormTitle}</h2>\n <p class=\"jex-escalation-subtitle\">{t.escalationSubtitle}</p>\n {submitError && (\n <div class=\"jex-form-error\" role=\"alert\">{submitError}</div>\n )}\n <form class=\"jex-form\" onSubmit={(e) => { void handleSubmit(e) }}>\n <input\n class=\"jex-form-input\"\n type=\"text\"\n placeholder={t.escalationNameLabel}\n value={name}\n required\n onInput={(e) => { setName(e.currentTarget.value) }}\n />\n <input\n class=\"jex-form-input\"\n type=\"email\"\n placeholder={t.escalationEmailLabel}\n value={email}\n required\n onInput={(e) => { setEmail(e.currentTarget.value) }}\n />\n <button class=\"jex-form-submit\" type=\"submit\" disabled={submitting}>{t.escalationSubmit}</button>\n </form>\n <div class=\"jex-inline-form-consent\" style={{ textAlign: 'center', margin: '16px 0 8px 0' }}>\n {t.escalationConsent}{' '}\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {t.escalationPrivacyLinkText}\n </a>.\n </div>\n <button class=\"jex-escalation-skip\" type=\"button\" onClick={() => { back() }}>\n {t.escalationSkip}\n </button>\n </div>\n )\n}\n","import { useMutation } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\n\n/**\n * Handoff hook — single touch point for the headless\n * `createEscalationRequest` mutation.\n *\n * Returned function fires the request and the backend decides the\n * branch (skipForm vs. requires-form) via its return discriminator.\n * Caller is responsible for navigating + reading the bootstrap\n * token; the hook just abstracts the api path.\n */\nexport function useHandoff() {\n return useMutation(api.functions.chat.public.helpdesk.createEscalationRequest)\n}\n","import { useState } from 'preact/hooks'\nimport { navigate } from '../../../module/screens/screens.state'\nimport { bootstrapToken } from '../../../module/shell/shell.state'\nimport { locale as widgetLocale, useLocale } from '../../../i18n/index'\nimport { useHandoff } from '../hooks/useHandoff'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface HumanHandoffActionProps {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n}\n\n/**\n * Header button — \"Talk to human\".\n *\n * Calls createEscalationRequest. Backend decides:\n * - If session has visitor info → returns { skipForm:true, ticketRef } →\n * navigate to ConfirmationScreen (no form needed).\n * - Else → returns { skipForm:false, formMessageId } →\n * navigate to EscalationFormScreen (existing flow).\n *\n * Zero LLM tokens consumed on this path.\n */\nexport function HumanHandoffAction({ sessionId, visitorId }: HumanHandoffActionProps) {\n const t = useLocale()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Bound to the handoff seam — headless escalation mutation.\n const createRequest = useHandoff()\n\n async function handleClick() {\n if (!sessionId || !visitorId) { return }\n const token = bootstrapToken.value\n if (!token) { return }\n\n setBusy(true)\n setError(null)\n try {\n // Fire the headless escalation — backend chooses the branch.\n const result = await createRequest({\n sessionId,\n visitorId,\n bootstrapToken: token,\n locale: widgetLocale.value,\n })\n\n if (result.skipForm) {\n // Visitor info already on session — backend inserted escalation-confirm BotMessage.\n // Stay on chat; subscription picks up the row and renders it inline.\n return\n }\n // Need to collect name + email — route to existing form screen.\n navigate({ id: 'escalation-form', formMessageId: result.formMessageId, sessionId, visitorId })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // Distinguish rate-limit from generic failure to drive copy.\n setError(/RATE_LIMITED|Too many/.test(msg) ? t.handoffRateLimited : t.handoffFailed)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <>\n <button\n class=\"jex-header-handoff\"\n type=\"button\"\n onClick={() => { void handleClick() }}\n disabled={busy || !sessionId || !visitorId}\n aria-label={t.talkToHumanAria}\n title={t.talkToHuman}\n >\n {/* Headset glyph — icon-only saves header real-estate on mobile;\n label survives as title= tooltip + aria-label for a11y. */}\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 14v-3a9 9 0 0 1 18 0v3\" />\n <path d=\"M21 14a2 2 0 0 1-2 2h-1a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1h3z\" />\n <path d=\"M3 14a2 2 0 0 0 2 2h1a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1H3z\" />\n <path d=\"M21 14v3a4 4 0 0 1-4 4h-3\" />\n </svg>\n </button>\n {error && <div class=\"jex-handoff-error\" role=\"alert\">{error}</div>}\n </>\n )\n}\n","/**\n * Re-POST /widget/bootstrap to obtain a fresh bootstrap token after the\n * 1-hour TTL elapses mid-session. Reads cached inputs stashed by\n * useBootstrap, writes the new token into the shared signal, and returns\n * a discriminated result so callers can render a visitor-facing notice\n * (not just a console line).\n *\n * Call when a mutation rejects with UNAUTHORIZED_ORIGIN to obtain a fresh\n * token and retry.\n */\nimport { bootstrapWidget } from './widgetBootstrap'\nimport { bootstrapInputs, bootstrapToken } from '../module/shell/shell.state'\n\nexport type RefreshResult =\n | { ok: true; token: NonNullable<typeof bootstrapToken.value> }\n | { ok: false; reason: 'no-inputs' | 'unauthorized' | 'not_found' | 'rate_limited' | 'network' }\n\nexport async function refreshBootstrapToken(): Promise<RefreshResult> {\n const inputs = bootstrapInputs.value\n if (!inputs) {\n console.warn('[JexityChat] Bootstrap refresh skipped — inputs missing')\n return { ok: false, reason: 'no-inputs' }\n }\n\n const result = await bootstrapWidget(inputs.orgSlug, inputs.siteUrl, inputs.projSlug)\n if (!result.ok) {\n console.warn('[JexityChat] Bootstrap refresh failed:', result.error)\n return { ok: false, reason: result.error }\n }\n\n const fresh = result.token as NonNullable<typeof bootstrapToken.value>\n bootstrapToken.value = fresh\n return { ok: true, token: fresh }\n}\n","import { useRef, useCallback, useEffect } from 'preact/hooks'\nimport { useSignal } from '@preact/signals'\nimport { useMutation } from 'convex/react'\nimport { ConvexError } from 'convex/values'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\nimport { currentSessionRef, startNewSession } from '../../../module/visitor/visitor.state'\nimport { isSessionBusy, registerLockResetCallback } from '../../../module/visitor/idle-lock'\nimport { widgetSource, bootstrapToken } from '../../../module/shell/shell.state'\nimport { refreshBootstrapToken } from '../../../lib/refreshBootstrap'\nimport { sessionError, type SessionErrorReason } from '../state'\nimport { locale as widgetLocale } from '../../../i18n/index'\n\n/** Map a thrown error to a visitor-facing reason for the sessionError signal. */\nfunction reasonForError(err: unknown): SessionErrorReason {\n if (isBootstrapExpiredError(err)) { return 'unauthorized' }\n if (err instanceof Error && /network|fetch|failed to fetch/i.test(err.message)) {\n return 'network'\n }\n return 'unknown'\n}\n\n/**\n * True when the createOrResume mutation rejects with the server-side\n * UNAUTHORIZED_ORIGIN code — emitted when the 1-hour bootstrap token has\n * expired or the origin allow-list changed. Caller uses this to trigger\n * a one-shot bootstrap refresh and retry.\n */\nfunction isBootstrapExpiredError(err: unknown): boolean {\n if (!(err instanceof ConvexError)) { return false }\n const data = err.data as { code?: string } | undefined\n return data?.code === 'UNAUTHORIZED_ORIGIN'\n}\n\n// Resolves once bootstrapToken signal becomes defined, or null after timeout.\n// React entry bootstraps the token asynchronously via useBootstrap, so the\n// first ensureSession() can race ahead of the POST /widget/bootstrap response.\nfunction waitForBootstrapToken(timeoutMs = 10_000): Promise<typeof bootstrapToken.value | null> {\n if (bootstrapToken.value) {\n return Promise.resolve(bootstrapToken.value)\n }\n return new Promise((resolve) => {\n let settled = false\n const finish = (val: typeof bootstrapToken.value | null) => {\n if (settled) { return }\n settled = true\n clearTimeout(timer)\n dispose()\n resolve(val)\n }\n const timer = setTimeout(() => { finish(null) }, timeoutMs)\n const dispose = bootstrapToken.subscribe((val) => {\n if (val) { finish(val) }\n })\n })\n}\n\ntype SessionStatus = 'active' | 'escalated' | 'assigned' | 'resolved' | 'org_deleted' | null\n\nexport interface SessionResult {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\ninterface ConvexSession {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n isLoading: boolean\n /** True when a resume attempt didn't find the old session (old one not found). */\n sessionNotFound: boolean\n /** True when resume failed and visitor hasn't chosen to start new yet. */\n resumeFailed: boolean\n /** Session escalation status from backend. */\n sessionStatus: SessionStatus\n /** True when the session's org has been deleted — show dead-end message, hide input. */\n isOrgDeleted: boolean\n /** Call before the first send — creates/resumes a Convex session lazily. */\n ensureSession: () => Promise<SessionResult | null>\n /** Clears the failed resume state and starts a fresh session. */\n startFresh: () => Promise<SessionResult | null>\n /** Clears cached resolved session so next ensureSession() re-resolves from currentSessionRef.\n * Called by HomeScreen when visitor resumes a different history entry. */\n resetSession: () => void\n}\n\n/**\n * Lazy session hook — does NOT create a session on mount.\n * Call `ensureSession()` when the visitor sends their first message.\n *\n * Uses a ref to track the resolved session, avoiding stale closures\n * and preventing duplicate mutations on rapid double-sends.\n */\nexport function useConvexSession(orgSlug: string, projSlug?: string): ConvexSession {\n const resolvedRef = useRef<SessionResult | null>(null)\n const isLoading = useSignal(false)\n const sessionNotFound = useSignal(false)\n const resumeFailed = useSignal(false)\n const sessionStatus = useSignal<SessionStatus>(null)\n\n const createOrResumeMut = useMutation(api.functions.chat.public.sessions.createOrResume)\n\n // Auto-recovers from UNAUTHORIZED_ORIGIN (expired bootstrap token) by\n // re-POSTing /widget/bootstrap once and retrying.\n const callCreateOrResume = async (vid: string) => {\n const initialToken = await waitForBootstrapToken()\n if (!initialToken) {\n // 10s timeout — surface to UI so the visitor sees something instead\n // of a send button that does nothing.\n console.warn('[JexityChat] No bootstrap token after 10s — session creation blocked.')\n sessionError.value = 'no-token'\n return null\n }\n\n const buildArgs = (tok: NonNullable<typeof bootstrapToken.value>) => ({\n orgSlug,\n ...(projSlug ? { projSlug } : {}),\n visitorId: vid,\n bootstrapToken: tok,\n locale: widgetLocale.value,\n ...(widgetSource.value ? { source: widgetSource.value } : {}),\n })\n\n // Flag the privacy-lock watcher so its 60s poll skips this tick — the\n // wipe must not race an awaited createOrResume (would orphan resolvedRef).\n isSessionBusy.value = true\n let result\n try {\n try {\n result = await createOrResumeMut(buildArgs(initialToken))\n } catch (err) {\n if (!isBootstrapExpiredError(err)) { throw err }\n // Token expired mid-session — refresh once, then retry. If the\n // refresh itself errors (rate-limit, origin de-auth) we surface a\n // discriminated reason instead of letting the visitor see nothing.\n const refresh = await refreshBootstrapToken()\n if (!refresh.ok) {\n sessionError.value = refresh.reason === 'rate_limited' ? 'network' : 'unauthorized'\n return null\n }\n result = await createOrResumeMut(buildArgs(refresh.token))\n }\n } finally {\n isSessionBusy.value = false\n }\n\n // Success — clear any stale notice from a prior failure.\n sessionError.value = null\n sessionStatus.value = result.status\n const session: SessionResult = { sessionId: result.sessionId, visitorId: vid }\n resolvedRef.current = session\n return { session, result }\n }\n\n const ensureSession = useCallback(async (): Promise<SessionResult | null> => {\n // Already resolved — return immediately (ref avoids stale closure)\n if (resolvedRef.current) {\n return resolvedRef.current\n }\n\n // If resume already failed, don't auto-create — wait for startFresh()\n if (resumeFailed.value) {\n return null\n }\n\n isLoading.value = true\n const hadExistingRef = currentSessionRef.value !== null\n const vid = currentSessionRef.value ?? startNewSession()\n\n try {\n const outcome = await callCreateOrResume(vid)\n if (!outcome) { return null }\n\n // Detect resume failure: had a stored ref but server created a new session.\n if (hadExistingRef && outcome.result.isNew) {\n sessionNotFound.value = true\n resumeFailed.value = true\n }\n\n return outcome.session\n } catch (err) {\n console.error('[JexityChat] Failed to create session:', err)\n sessionError.value = reasonForError(err)\n return null\n } finally {\n isLoading.value = false\n }\n }, [orgSlug, projSlug, createOrResumeMut, isLoading, sessionNotFound, resumeFailed])\n\n // Clear cached resolved session so next ensureSession() re-resolves from currentSessionRef.\n // Called when HomeScreen routes to a different history entry — and also\n // by the privacy lock so the wipe clears this hook's resolvedRef.\n const resetSession = useCallback(() => {\n resolvedRef.current = null\n sessionNotFound.value = false\n resumeFailed.value = false\n }, [sessionNotFound, resumeFailed])\n\n // Mirror lock wipes into resolvedRef so a post-lock send can't reuse a\n // stale sessionId for a visitor whose ref was just cleared.\n useEffect(() => registerLockResetCallback(resetSession), [resetSession])\n\n // Start a fresh session after resume failure — visitor explicitly chose this\n const startFresh = useCallback(async (): Promise<SessionResult | null> => {\n resolvedRef.current = null\n resumeFailed.value = false\n sessionNotFound.value = false\n\n const vid = startNewSession()\n isLoading.value = true\n\n try {\n const outcome = await callCreateOrResume(vid)\n return outcome?.session ?? null\n } catch (err) {\n console.error('[JexityChat] Failed to create fresh session:', err)\n sessionError.value = reasonForError(err)\n return null\n } finally {\n isLoading.value = false\n }\n }, [orgSlug, projSlug, createOrResumeMut, isLoading, sessionNotFound, resumeFailed, sessionStatus])\n\n const resolved = resolvedRef.current\n return {\n sessionId: resolved?.sessionId ?? null,\n visitorId: resolved?.visitorId ?? null,\n isLoading: isLoading.value,\n sessionNotFound: sessionNotFound.value,\n resumeFailed: resumeFailed.value,\n sessionStatus: sessionStatus.value,\n isOrgDeleted: sessionStatus.value === 'org_deleted',\n ensureSession,\n startFresh,\n resetSession,\n }\n}\n","import { useState } from 'preact/hooks'\nimport { replace } from '../../../module/screens/screens.state'\nimport { useLocale } from '../../../i18n/index'\n\n/** Contact / ticket submission form. On submit: replace with loading, then confirmation/error. */\nexport function FormScreen() {\n const t = useLocale()\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [message, setMessage] = useState('')\n\n async function handleSubmit(e: Event) {\n e.preventDefault()\n replace({ id: 'loading', message: t.submittingTicket })\n\n // TODO: Phase 2 — replace with Convex mutation\n await new Promise<void>(resolve => { setTimeout(resolve, 1200) })\n const ref = 'JEX-' + Math.random().toString(36).slice(2, 8).toUpperCase()\n replace({ id: 'confirmation', ref })\n }\n\n return (\n <div class=\"jex-form-screen\">\n <h2 class=\"jex-form-title\">{t.submitTicket}</h2>\n <form class=\"jex-form\" onSubmit={(e) => { void handleSubmit(e) }}>\n <input\n class=\"jex-form-input\"\n type=\"text\"\n placeholder={t.yourName}\n value={name}\n required\n onInput={(e) => { setName(e.currentTarget.value) }}\n />\n <input\n class=\"jex-form-input\"\n type=\"email\"\n placeholder={t.yourEmail}\n value={email}\n required\n onInput={(e) => { setEmail(e.currentTarget.value) }}\n />\n <textarea\n class=\"jex-form-textarea\"\n placeholder={t.howCanWeHelp}\n value={message}\n required\n onInput={(e) => { setMessage(e.currentTarget.value) }}\n />\n <button class=\"jex-form-submit\" type=\"submit\">{t.submit}</button>\n </form>\n </div>\n )\n}\n","import { isOpen } from '../../../module/shell/shell.state'\nimport { useLocale } from '../../../i18n/index'\n\ninterface ConfirmationScreenProps {\n ticketRef: string\n}\n\n/** Shown after async ticket submission. Displays ref# and closes widget on Done. */\nexport function ConfirmationScreen({ ticketRef }: ConfirmationScreenProps) {\n const t = useLocale()\n return (\n <div class=\"jex-confirmation\">\n <div class=\"jex-confirmation-icon\" aria-hidden=\"true\">✓</div>\n <h2 class=\"jex-confirmation-title\">{t.ticketSubmitted}</h2>\n <p class=\"jex-confirmation-body\">{t.yourReferenceNumber}</p>\n <div class=\"jex-confirmation-ref\">{ticketRef}</div>\n <p class=\"jex-confirmation-hint\">{t.sentToEmailHint}</p>\n <button\n class=\"jex-confirmation-done\"\n onClick={() => { isOpen.value = false }}\n >\n {t.done}\n </button>\n </div>\n )\n}\n","import { useLocale } from '../../i18n/index'\n\ninterface ErrorScreenProps {\n message: string\n onRetry?: () => void\n onBack?: () => void\n}\n\n/** Full-coverage overlay shown when an async operation fails. */\nexport function ErrorScreen({ message, onRetry, onBack }: ErrorScreenProps) {\n const t = useLocale()\n return (\n <div class=\"jex-overlay jex-error\">\n <p class=\"jex-error-message\">{message}</p>\n <div class=\"jex-error-actions\">\n {onRetry && (\n <button class=\"jex-error-retry\" onClick={onRetry}>\n {t.tryAgain}\n </button>\n )}\n {onBack && (\n <button class=\"jex-error-back\" onClick={onBack}>\n {t.goBack}\n </button>\n )}\n </div>\n </div>\n )\n}\n","import { screenStack } from './screens.state'\nimport type { ScreenState } from './screens.state'\nimport { back, replace } from './screens.state'\nimport { HomeScreen } from '../../features/home/components/HomeScreen'\nimport { SelectionScreen } from '../../features/selection/components/SelectionScreen'\nimport { ChatScreen, EscalationFormScreen, type SessionResult } from '../../features/chat'\nimport { FormScreen } from '../../features/ticket/components/FormScreen'\nimport { ConfirmationScreen } from '../../features/ticket/components/ConfirmationScreen'\nimport { LoadingScreen } from '../../shared/ui/LoadingScreen'\nimport { ErrorScreen } from '../../shared/ui/ErrorScreen'\n\ninterface ScreenRouterProps {\n greeting: string\n title: string\n orgSlug: string\n projSlug?: string\n // Hoisted session state from WidgetShell — passed down to ChatScreen\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n isLoading: boolean\n sessionNotFound: boolean\n resumeFailed: boolean\n isOrgDeleted: boolean\n ensureSession: () => Promise<SessionResult | null>\n startFresh: () => Promise<SessionResult | null>\n resetSession: () => void\n}\n\n/** Renders only the active screen. No animation — add transitions later once routing is stable. */\nexport function ScreenRouter({ greeting, title, sessionId, visitorId, isLoading, sessionNotFound, resumeFailed, isOrgDeleted, ensureSession, startFresh, resetSession }: ScreenRouterProps) {\n const stack = screenStack.value\n const currentScreen = stack[stack.length - 1] as ScreenState\n\n const confirmationState = [...stack].reverse().find(\n (s): s is Extract<ScreenState, { id: 'confirmation' }> => s.id === 'confirmation'\n )\n\n return (\n <div class=\"jex-screen-container\">\n {currentScreen.id === 'home' && (\n <HomeScreen greeting={greeting} title={title} onStartFresh={startFresh} onResetSession={resetSession} />\n )}\n {currentScreen.id === 'selection' && (\n <SelectionScreen title={title} />\n )}\n {currentScreen.id === 'form' && (\n <FormScreen />\n )}\n {currentScreen.id === 'escalation-form' && (\n <EscalationFormScreen\n formMessageId={currentScreen.formMessageId}\n sessionId={currentScreen.sessionId}\n visitorId={currentScreen.visitorId}\n />\n )}\n {currentScreen.id === 'confirmation' && confirmationState && (\n <ConfirmationScreen ticketRef={confirmationState.ref} />\n )}\n {currentScreen.id === 'chat' && (\n <ChatScreen\n greeting={greeting}\n sessionId={sessionId}\n visitorId={visitorId}\n isLoading={isLoading}\n sessionNotFound={sessionNotFound}\n resumeFailed={resumeFailed}\n isOrgDeleted={isOrgDeleted}\n ensureSession={ensureSession}\n startFresh={startFresh}\n />\n )}\n {currentScreen.id === 'loading' && (\n <LoadingScreen message={currentScreen.message} />\n )}\n {currentScreen.id === 'error' && (\n <ErrorScreen\n message={currentScreen.message}\n onRetry={() => replace({ id: 'loading' })}\n onBack={back}\n />\n )}\n </div>\n )\n}\n","import { useEffect } from 'preact/hooks'\nimport {\n isOpen,\n PLATFORM_PRIVACY_POLICY_URL,\n privacyNoticeStyle,\n resolvedPrivacyPolicyUrl,\n} from './shell.state'\nimport { useRemoteConfig } from './hooks/useRemoteConfig'\nimport { useBootstrap } from './hooks/useBootstrap'\nimport { usePathGuard } from './hooks/usePathGuard'\nimport { usePreviewBridge } from './hooks/usePreviewBridge'\nimport { initVisitor } from '../visitor/visitor.state'\nimport { startIdleLockWatcher } from '../visitor/idle-lock'\nimport { screenStack, resetInitialStack } from '../screens/screens.state'\nimport { locale } from '../../i18n/index'\nimport { resolveWidgetLocale } from '../../i18n/resolve-widget-locale'\nimport { buildThemeStyle } from '../../shared/theme/build-theme'\nimport { Header } from '../../shared/ui/Header'\nimport { Footer } from '../../shared/ui/Footer'\nimport { FAB } from '../../shared/ui/FAB'\nimport { ScreenRouter } from '../screens/ScreenRouter'\nimport { mergeWidgetConfig } from '../../lib/widget-config'\nimport { useConvexSession, HumanHandoffAction } from '../../features/chat'\nimport type { JexityChatOptions } from '../../types'\n\ninterface WidgetShellProps {\n options: JexityChatOptions\n}\n\n/**\n * Outer shell: always runs bootstrap + path guard.\n * Only mounts WidgetContent (and its Convex subscriptions) when the path is allowed,\n * keeping hook counts stable in each component regardless of navigation.\n */\nexport function WidgetShell({ options }: WidgetShellProps) {\n useBootstrap({\n orgSlug: options.orgSlug,\n projSlug: options.projSlug,\n preToken: options.bootstrapToken,\n convexUrl: options.convexUrl,\n preAllowedUrls: options.allowedUrls ?? [],\n preExcludedPaths: options.excludePaths,\n })\n\n const isPathAllowed = usePathGuard()\n if (!isPathAllowed) { return null }\n return <WidgetContent options={options} />\n}\n\n/** Inner component — only mounted when path guard passes. All hooks here run unconditionally. */\nfunction WidgetContent({ options }: WidgetShellProps) {\n // Fetch widget config from Convex; aborts/resets on orgSlug/projSlug change or unmount\n const remoteConfig = useRemoteConfig(options.orgSlug, options.projSlug, options.convexUrl)\n\n // Dashboard preview iframe bridge — handles live locale updates from the Studio\n usePreviewBridge(options.parentOrigin)\n\n // One-time bootstrap: load visitor session ref from sessionStorage,\n // then re-seed the screen stack so returning visitors land on home.\n useEffect(() => {\n initVisitor()\n resetInitialStack()\n }, [])\n\n // Hoist session state so the Header can receive sessionId/visitorId for the\n // handoff button without a second subscription in ChatScreen.\n const { sessionId, visitorId, isLoading, sessionNotFound, resumeFailed, isOrgDeleted, ensureSession, startFresh, resetSession } = useConvexSession(options.orgSlug, options.projSlug)\n\n // Merge embed-script options with Convex remote config (embed takes precedence)\n const resolved = mergeWidgetConfig(options, remoteConfig)\n\n // Sync the resolved locale to the global signal (drives all i18n in the widget)\n useEffect(() => {\n locale.value = resolveWidgetLocale(resolved.locale)\n }, [resolved.locale])\n\n useEffect(() => {\n resolvedPrivacyPolicyUrl.value = resolved.privacyPolicyUrl ?? PLATFORM_PRIVACY_POLICY_URL\n privacyNoticeStyle.value = resolved.privacyNoticeStyle\n }, [resolved.privacyNoticeStyle, resolved.privacyPolicyUrl])\n\n // Mobile takeover scroll-lock — keeps the host page from scrolling under\n // the fullscreen sheet. Matches the CSS breakpoint in widget.css.\n // Embedded mode is skipped (host owns its scroll container).\n useEffect(() => {\n if (!isOpen.value) { return }\n if (resolved.mode === 'embedded') { return }\n const mql = window.matchMedia('(max-width: 480px), (pointer: coarse) and (max-width: 768px)')\n if (!mql.matches) { return }\n const prev = document.documentElement.style.overflow\n document.documentElement.style.overflow = 'hidden'\n return () => {\n document.documentElement.style.overflow = prev\n }\n }, [isOpen.value, resolved.mode])\n\n // GDPR privacy lock — wipes the conversation and shows a privacy notice\n // after 15 min of idle/hidden time, so the next person on a shared device\n // can't read prior messages. Embedded mode is owned by the host page and\n // is skipped — the host controls visibility and access.\n // try/catch: a sandboxed iframe or strict CSP could throw on setInterval\n // or addEventListener; failing the watcher must not unmount the widget.\n useEffect(() => {\n if (resolved.mode === 'embedded') { return }\n try {\n return startIdleLockWatcher()\n } catch (err) {\n console.warn('[JexityChat] Idle-lock watcher failed to start:', err)\n return undefined\n }\n }, [resolved.mode])\n\n // Layout helpers derived from resolved config\n const posLeft = resolved.position === 'bottom-left'\n const colorSchemeClass = resolved.colorScheme === 'dark' || resolved.colorScheme === 'light'\n ? resolved.colorScheme\n : ''\n\n // Build CSS custom-property map for the widget root element.\n // options is spread first for granular theme.bg/text/border overrides,\n // then resolved fields override the top-level shorthand values.\n const themeStyle = buildThemeStyle({\n ...options,\n primaryColor: resolved.primaryColor,\n accentColor: resolved.accentColor,\n fontFamily: resolved.fontFamily,\n fontSize: resolved.fontSize,\n borderRadius: resolved.borderRadius,\n windowWidth: resolved.windowWidth,\n windowHeight: resolved.windowHeight,\n })\n\n const embedded = resolved.mode === 'embedded'\n\n // Derive current screen for conditional header actions\n const stack = screenStack.value\n const currentScreen = stack[stack.length - 1]\n const isChatScreen = currentScreen?.id === 'chat'\n\n // Defer visibility until remote config loads to prevent FOUC\n // (default teal/bottom-right flashing before real config arrives).\n // Embedded + preview modes render immediately (config comes from host/bridge).\n const configReady = remoteConfig !== null || embedded || !!options.parentOrigin\n const shellStyle = configReady\n ? themeStyle\n : { ...themeStyle, visibility: 'hidden' as const }\n\n return (\n <div\n class={`jex-widget ${colorSchemeClass}`.trim()}\n style={shellStyle}\n >\n {embedded ? (\n <div class=\"jex-embedded\">\n <Header\n title={resolved.title}\n rightAction={isChatScreen ? <HumanHandoffAction sessionId={sessionId} visitorId={visitorId} /> : null}\n showClose={!embedded}\n />\n <ScreenRouter\n greeting={resolved.greeting}\n title={resolved.title}\n orgSlug={options.orgSlug}\n projSlug={options.projSlug}\n sessionId={sessionId}\n visitorId={visitorId}\n isLoading={isLoading}\n sessionNotFound={sessionNotFound}\n resumeFailed={resumeFailed}\n isOrgDeleted={isOrgDeleted}\n ensureSession={ensureSession}\n startFresh={startFresh}\n resetSession={resetSession}\n />\n {!resolved.hideBranding && <Footer />}\n </div>\n ) : (\n <div class={`jex-container${posLeft ? ' jex-pos-left' : ''}`}>\n {isOpen.value && (\n <div class=\"jex-chat-window\">\n <Header\n title={resolved.title}\n rightAction={isChatScreen ? <HumanHandoffAction sessionId={sessionId} visitorId={visitorId} /> : null}\n />\n <ScreenRouter\n greeting={resolved.greeting}\n title={resolved.title}\n orgSlug={options.orgSlug}\n projSlug={options.projSlug}\n sessionId={sessionId}\n visitorId={visitorId}\n isLoading={isLoading}\n sessionNotFound={sessionNotFound}\n resumeFailed={resumeFailed}\n isOrgDeleted={isOrgDeleted}\n ensureSession={ensureSession}\n startFresh={startFresh}\n resetSession={resetSession}\n />\n {!resolved.hideBranding && <Footer />}\n </div>\n )}\n <FAB\n iconOption={resolved.triggerIcon}\n radius={resolved.triggerRadius}\n label={resolved.triggerLabel}\n />\n </div>\n )}\n </div>\n )\n}\n","import widgetCss from './widget.css?inline'\n\n/**\n * Injects the widget's CSS into the given shadow root.\n *\n * We use a <style> element rather than Constructable StyleSheets because:\n * - Works in all browsers (Safari < 16.4 lacks adoptedStyleSheets support)\n * - Vite's ?inline import gives us the processed CSS as a string\n * - No external requests — fully bundled in the JS output\n */\nexport function injectStyles(shadowRoot: ShadowRoot): void {\n const style = document.createElement('style')\n style.textContent = widgetCss\n shadowRoot.appendChild(style)\n}\n","import { render } from 'preact'\nimport { ConvexProvider, ConvexReactClient } from 'convex/react'\nimport { WidgetShell } from './WidgetShell'\nimport { isOpen, widgetSource, bootstrapToken } from './shell.state'\nimport { screenStack } from '../screens/screens.state'\nimport { injectStyles } from '../../shared/theme/inject-styles'\nimport { toConvexCloudUrl } from '../../lib/convex-url'\nimport type { JexityChatOptions } from '../../types'\n\n// Singleton — one WebSocket connection shared across all mounts.\n// Runtime `options.convexUrl` (from `data-convex-url` on the script tag) takes\n// precedence over the build-time VITE_CONVEX_URL baked in by Vite.\nconst buildTimeUrl = import.meta.env.VITE_CONVEX_URL as string | undefined\nlet convexClient: ConvexReactClient | null = null\n\nfunction getOrCreateClient(runtimeUrl?: string): ConvexReactClient {\n const url = runtimeUrl ?? buildTimeUrl\n if (!url) {\n throw new Error('[jexity] No Convex URL — set VITE_CONVEX_URL at build time or data-convex-url on the script tag')\n }\n if (!convexClient) {\n convexClient = new ConvexReactClient(toConvexCloudUrl(url))\n }\n return convexClient\n}\n\n/**\n * LOW-LEVEL: Renders the widget into a Shadow DOM on the given host element.\n *\n * Why Shadow DOM?\n * The widget is injected into customer websites that have their own CSS.\n * Shadow DOM creates an isolated DOM subtree — styles on the host page\n * cannot leak in, and widget styles cannot leak out.\n *\n * Why injectStyles?\n * Stylesheets do not cross Shadow DOM boundaries automatically.\n * We must explicitly stamp the widget's CSS into the shadow root.\n *\n * Why reuse the existing shadow root?\n * Calling attachShadow() on an element that already has a shadow root\n * throws \"already has a shadow root\". The Studio playground re-mounts\n * on every config change, so we reuse the root instead of re-creating it.\n *\n * Returns a shutdown function that unmounts the Preact tree and resets state.\n * Called by createInstance() — entry points (esm.ts, iife.ts) should not\n * call this directly; use createInstance() instead.\n */\nexport function mountWidget(\n hostEl: HTMLElement,\n options: JexityChatOptions,\n): () => void {\n const shadow = hostEl.shadowRoot ?? hostEl.attachShadow({ mode: 'open' })\n\n // Clear previous render (safe on first mount — loop simply doesn't run)\n while (shadow.firstChild) {\n shadow.removeChild(shadow.firstChild)\n }\n\n // Stamp widget CSS into the shadow root (not visible outside this boundary)\n injectStyles(shadow)\n\n // Persist the source tag so useConvexSession can read it without prop drilling.\n widgetSource.value = options.source\n bootstrapToken.value = options.bootstrapToken as typeof bootstrapToken.value\n\n // Always start at HomeScreen so visitors can resume with a ref ID or start new.\n screenStack.value = [{ id: 'home' }]\n\n // In embedded mode, add class to shadow host for :host styling\n // and set isOpen so the chat window renders immediately (no FAB to toggle it).\n if (options.mode === 'embedded') {\n hostEl.classList.add('jex-mode-embedded')\n isOpen.value = true\n }\n\n const container = document.createElement('div')\n\n // Embedded mode: container must fill the shadow host for the height chain to work.\n if (options.mode === 'embedded') {\n container.style.cssText = 'width:100%;height:100%'\n }\n shadow.appendChild(container)\n\n // Hand off to Preact — everything below this line is React-style component code\n render(\n <ConvexProvider client={getOrCreateClient(options.convexUrl)}>\n <WidgetShell options={options} />\n </ConvexProvider>,\n container,\n )\n\n return function shutdown() {\n render(null, container) // unmounts the Preact tree and runs all cleanup effects\n isOpen.value = false\n widgetSource.value = undefined\n bootstrapToken.value = undefined\n screenStack.value = [{ id: 'home' }]\n }\n}\n","import { mountWidget } from './mount'\nimport { isOpen } from './shell.state'\nimport type { JexityChatOptions, JexityChatInstance } from '../../types'\n\n/**\n * HIGH-LEVEL: Creates a JexityChatInstance for the given host element.\n *\n * This is the function entry points (esm.ts, iife.ts) call to get a widget.\n * It wraps mountWidget() with the full public API:\n *\n * instance.open() — opens the chat window\n * instance.close() — closes the chat window\n * instance.toggle() — flips open/closed\n * instance.isOpen — current open state (getter)\n * instance.subscribe(cb) — notified whenever open state changes\n * instance.shutdown() — destroys the widget and cleans up everything\n *\n * How open/close state works:\n * `isOpen` is a Preact signal — a reactive value that any component can\n * subscribe to. When its value changes, only the components that read it\n * re-render (no prop drilling needed). `subscribe()` below taps into the\n * same signal so external callers (e.g. the React wrapper) can react to\n * open/close events without polling.\n *\n * The onRemove callback:\n * Passed by esm.ts to clean up the host <div> from document.body after\n * shutdown. Undefined when the caller manages the container themselves.\n */\nexport function createInstance(\n mountEl: HTMLElement,\n options: JexityChatOptions,\n onRemove?: () => void,\n): JexityChatInstance {\n const shutdownWidget = mountWidget(mountEl, options)\n\n // Collect external open/close listeners so we can notify them via subscribe()\n const listeners = new Set<(open: boolean) => void>()\n\n // Bridge the internal signal → external subscribe() callbacks.\n // disposeSignal() stops the bridge when the instance is shut down.\n const disposeSignal = isOpen.subscribe((value) => {\n for (const cb of listeners) { cb(value) }\n })\n\n const instance: JexityChatInstance = {\n shutdown() {\n disposeSignal() // stop listening to the signal\n listeners.clear() // drop all external subscribers\n shutdownWidget() // unmount Preact tree + reset state\n if (onRemove) { onRemove() } // clean up host element if needed\n },\n open() { isOpen.value = true },\n close() { isOpen.value = false },\n toggle() { isOpen.value = !isOpen.value },\n get isOpen() { return isOpen.value },\n subscribe(cb: (open: boolean) => void) {\n listeners.add(cb)\n return () => { listeners.delete(cb) }\n },\n }\n\n return instance\n}\n","import { createInstance } from '../module/shell/widget-instance'\nimport type { JexityChatOptions, JexityChatInstance } from '../types'\n\nexport type { JexityChatOptions, JexityChatInstance }\n\nlet activeInstance: JexityChatInstance | null = null\n\nexport function JexityChat(options: JexityChatOptions): JexityChatInstance {\n // Singleton: shut down previous instance if one exists\n if (activeInstance) {\n activeInstance.shutdown()\n }\n\n let mountEl: HTMLElement\n\n if (options.container) {\n mountEl =\n typeof options.container === 'string'\n ? document.querySelector<HTMLElement>(options.container)!\n : options.container\n } else {\n mountEl = document.createElement('div')\n mountEl.id = 'jexity-chat-widget'\n document.body.appendChild(mountEl)\n }\n\n const instance = createInstance(mountEl, options, () => {\n if (!options.container) { mountEl.remove() }\n if (activeInstance === instance) { activeInstance = null }\n })\n\n activeInstance = instance\n return instance\n}\n","import { JexityChat } from './esm'\nimport { bootstrapWidget, isUrlMatched } from '../lib/widgetBootstrap'\nimport { toConvexSiteUrl } from '../lib/convex-url'\nimport type { JexityChatOptions } from '../types'\n\nfunction getAttr(el: Element, name: string): string | undefined {\n return el.getAttribute(name) ?? undefined\n}\n\nasync function autoInit() {\n const script =\n document.currentScript ??\n document.querySelector<HTMLScriptElement>('script[data-org-slug]') ??\n document.querySelector<HTMLScriptElement>('script[data-org-id]')\n\n if (!script) { return }\n\n const orgSlug =\n script.getAttribute('data-org-slug') ??\n script.getAttribute('data-org-id') ??\n 'default-org'\n\n const projSlug = script.getAttribute('data-proj-slug') ?? undefined\n\n // ── Origin allowlist bootstrap ──────────────────────────────────────────\n const convexUrl =\n getAttr(script, 'data-convex-url') ??\n (import.meta.env.VITE_CONVEX_URL as string | undefined) ??\n ''\n\n const siteUrl = toConvexSiteUrl(convexUrl)\n const bootstrap = await bootstrapWidget(orgSlug, siteUrl, projSlug)\n\n if (!bootstrap.ok) {\n const origin = window.location.origin\n const scopeLabel = projSlug ? `project '${orgSlug}/${projSlug}'` : `org '${orgSlug}'`\n if (bootstrap.error === 'unauthorized') {\n console.warn(\n `[JexityChat] This domain is not authorized for ${scopeLabel}. ` +\n `Add '${origin}' under Allowed Domains in your Jexity dashboard.`,\n )\n } else if (bootstrap.error === 'not_found') {\n console.warn(\n `[JexityChat] No active widget config found for ${scopeLabel}. ` +\n `Check that the org slug is correct and the widget is enabled.`,\n )\n } else if (bootstrap.error === 'rate_limited') {\n console.warn(\n `[JexityChat] Bootstrap rate-limited for ${scopeLabel}. ` +\n `Retry after ${bootstrap.retryAfterSec ?? 60}s.`,\n )\n } else {\n console.warn(\n `[JexityChat] Bootstrap failed (network error). ` +\n `Check that the Convex deployment is reachable at ${siteUrl}.`,\n )\n }\n return // Do NOT mount the widget\n }\n\n // ── Path restriction check (page-load path — no SPA navigation) ────────\n if (\n bootstrap.allowedUrls.length > 0 &&\n !bootstrap.allowedUrls.some((url) => isUrlMatched(window.location.href, url))\n ) {\n const scopeLabel = projSlug ? `project '${orgSlug}/${projSlug}'` : `org '${orgSlug}'`\n console.warn(\n `[JexityChat] Widget hidden for ${scopeLabel} — current page does not match path rule. Allowed: ${bootstrap.allowedUrls.join(', ')}`,\n )\n return\n }\n\n // ── Mount widget with bootstrap token ───────────────────────────────────\n const options: JexityChatOptions = {\n orgSlug,\n projSlug,\n bootstrapToken: bootstrap.token,\n allowedUrls: bootstrap.allowedUrls,\n excludePaths: bootstrap.excludePaths,\n position: (getAttr(script, 'data-position') as JexityChatOptions['position']) ?? undefined,\n theme: (getAttr(script, 'data-theme') as JexityChatOptions['theme']) ?? undefined,\n greeting: getAttr(script, 'data-greeting'),\n title: getAttr(script, 'data-title'),\n primaryColor: getAttr(script, 'data-primary-color'),\n locale: getAttr(script, 'data-locale'),\n convexUrl: getAttr(script, 'data-convex-url'),\n }\n\n ;(window as unknown as Record<string, unknown>).JexityChat = JexityChat(options)\n}\n\nif (document.readyState === 'complete') {\n autoInit()\n} else {\n window.addEventListener('load', autoInit)\n}\n"],"names":["n","l","u","t","i","r","o","e","f","c","s","a","h","p","v","y","w","d","g","_","m","b","k","x","S","C","M","$","O","N","I","P","B","A","L","D","H","T","j","F","E","V","z","q","G","J","K","Q","R","U","W","Z","Y","X","nn","tn","en","rn","un","on","ln","cn","fn","an","sn","hn","dn","mn","pn","yn","_n","bn","Sn","gn","En","Cn","xn","Rn","lookup","revLookup","Arr","code","len","getLens","b64","validLen","placeHoldersLen","_byteLength","_b64","toByteArray","tmp","lens","arr","curByte","tripletToBase64","num","encodeChunk","uint8","start","end","output","fromByteArray","extraBytes","parts","maxChunkLength","len2","parseArgs","args","isSimpleObject","validateDeploymentUrl","deploymentUrl","value","isObject","prototype","isSimple","LITTLE_ENDIAN","MIN_INT64","MAX_INT64","ZERO","EIGHT","TWOFIFTYSIX","isSpecial","slowBigIntToBase64","hex","bytes","hexByte","Base64.fromByteArray","slowBase64ToBigInt","encoded","integerBytes","Base64.toByteArray","power","byte","modernBigIntToBase64","buffer","modernBase64ToBigInt","bigIntToBase64","base64ToBigInt","MAX_IDENTIFIER_LEN","validateObjectField","charCode","jsonToConvex","value2","entries","key","floatBytes","float","out","MAX_VALUE_FOR_ERROR_LEN","stringifyValueForError","str","_key","rest","truncateAt","codePoint","convexToJsonInternal","originalValue","context","includeTopLevelUndefined","contextText","errorMessageForUnsupportedType","theType","typeName","k1","_v1","k2","_v2","convexToJson","__defProp","__defNormalProp","obj","__publicField","_a","_b","IDENTIFYING_FIELD","ConvexError","data","version","INFO_COLOR","prefix_for_source","source","DefaultLogger","options","func","id","instantiateDefaultLogger","logger","level","instantiateNoopLogger","logForFunction","type","udfPath","message","prefix","match","logFatalError","errorMessage","createHybridErrorStacktrace","result","forwardData","error","canonicalizeUdfPath","pieces","moduleName","functionName","serializePathAndArgs","serializePaginatedPathAndArgs","initialNumItems","LocalSyncState","journal","componentPath","canonicalizedUdfPath","queryToken","existingEntry","queryId","query","baseVersion","newVersion","add","transition","modification","actingAs","auth","pathAndArgs","modifications","localQuery","querySet","authenticate","remove","RequestManager","markConnectionStateDirty","sent","resolve","status","response","requestInfo","udfType","line","onResolve","errorData","ts","completeRequests","requestId","allMessages","oldestInflightRequest","request","toReferencePath","extractReferencePath","reference","isFunctionHandle","getFunctionAddress","functionReference","functionAddress","referencePath","getFunctionName","address","name","makeFunctionReference","createApi","pathParts","handler","prop","newParts","found","path","exportName","anyApi","OptimisticLocalStoreImpl","queryResults","queryArgs","queryResult","queriesWithName","queryReference","OptimisticQueryResults","serverQueryResults","optimisticUpdatesToDrop","updateAndId","oldQueryResults","localStore","changedQueries","oldQuery","update","mutationId","Long","low","high","hi","lo","UZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_32_DBL","other","val","TWO_PWR_16_DBL","RemoteQuerySet","queryPath","u64ToLong","longToU64","raw","parseServerMessage","encodeClientMessage","CLOSE_NORMAL","CLOSE_GOING_AWAY","CLOSE_NO_STATUS","CLOSE_NOT_FOUND","firstTime","monotonicMillis","prettyNow","serverDisconnectErrors","classifyDisconnectError","WebSocketManager","uri","callbacks","webSocketConstructor","debug","state","chunk","expectedLength","fullJson","ws","timeSavedMs","messageLength","serverMessage","event","msg","reason","messageForLog","encodedMessage","backoff","scheduledAt","timeoutId","closeReason","_message","elapsed","baseBackoff","actualBackoff","jitter","transitionTransitTime","prettyTransitionTime","prettyMessageMB","bytesPerSecond","prettyBytesPerSecond","newSessionId","uuidv4","InvalidTokenError","b64DecodeUnicode","_m","base64UrlDecode","jwtDecode","token","pos","part","decoded","MAXIMUM_REFRESH_DELAY","MAX_TOKEN_CONFIRMATION_ATTEMPTS","AuthenticationManager","syncState","config","isRefreshing","fetchToken","onChange","onRefreshChange","decodedToken","iat","exp","tokenValiditySeconds","delay","refetchTokenTimeoutId","fetchArgs","originalConfigVersion","onAuthChange","newAuth","authStateForLog","markNames","mark","sessionId","detail","performanceMarkToJson","mark2","getMarksReport","allMarks","marks","entry","BaseConvexClient","onTransition","curConnectionState","cb","authRefreshTokenLeewaySeconds","origin","protocol","wsProtocol","wsUri","pauseSocket","unsavedChangesWarning","confirmationMessage","reconnectMetadata","querySetModification","authModification","completedRequests","completedMutationInfo","observedTs","remoteQueryResults","queryTokenToValue","changedQueryTokens","optimisticResult","authToken","fakeUserIdentity","argsObject","unsubscribe","modification2","wsConnectionState","mutationPromise","mutationArgs","optimisticUpdate","wrappedUpdate","localQueryStore","localResult","mightBeSent","actionArgs","report","timeOfOldestRequest","endpoint","asPaginationResult","PaginatedQueryClient","client","paginatedQuery","activePages","numItems","allResults","hasUndefined","isDone","pageToken","paginationResult","changedBaseTokens","changed","paginatedQueries","extendedTransition","lastPageToken","lastPageResult","loadMoreTransition","queryTokens","queryTokenSet","paginatedToken","getResult","paginatedQueryToken","ongoingSplits","pageKeyToQuery","pageKeys","pageKey","splitKey1","splitKey2","pageResult","splitCursor","continueCursor","paginationOpts","firstSubscription","secondSubscription","pageArgs","subscription","originalQuery","pageIndex","sub","lastPageKey","useSubscription","getCurrentValue","subscribe","setState","useState","valueToReturn","useEffect","didUnsubscribe","checkForUpdates","prevState","DEFAULT_EXTEND_SUBSCRIPTION_FOR","React","createMutation","mutationReference","mutation","assertNotAccidentalArgument","createAction","actionReference","ConvexReactClient","identity","argsAndOptions","callback","currentListeners","currentListeners2","queryOptions","extendSubscriptionFor","action","watch","existingResult","reject","sync","simple","paginated","updatedQueries","ConvexContext","useConvex","useContext","ConvexProvider","children","useQuery","skip","queryName","queries","useMemo","useQueries","useMutation","convex","useAction","QueriesObserver","createWatch","newQueries","identifier","paginationOptions","existingInfo","listener","info","useQueriesHelper","observer","useSignal","isOpen","signal","widgetSource","PLATFORM_PRIVACY_POLICY_URL","resolvedPrivacyPolicyUrl","privacyNoticeStyle","bootstrapToken","allowedUrls","excludedPaths","bootstrapInputs","toConvexCloudUrl","url","toConvexSiteUrl","normalizeHttpUrl","trimmed","parsed","mergeWidgetConfig","remote","title","privacyPolicyMode","normalizePrivacyNoticeStyle","style","fetchRemoteConfig","siteUrl","orgSlug","projSlug","urlObj","useRemoteConfig","runtimeConvexUrl","remoteConfig","setRemoteConfig","convexUrl","controller","load","cfg","err","bootstrapWidget","convexSiteUrl","resp","isPathExcluded","pathname","excludePaths","excluded","isUrlMatched","currentUrl","allowedUrl","current","allowed","allowedPath","currentPath","useBootstrap","preToken","preAllowedUrls","preExcludedPaths","resolvedConvexUrl","cancelled","scope","listeners","patched","ensureHistoryPatch","origPush","origReplace","addHistoryListener","usePathGuard","href","urls","isExcluded","de","SUPPORTED_LOCALES","WIDGET_DEFAULT_LOCALE","LOCALE_STORAGE_KEY","locale","STRINGS","useLocale","parseLocale","base","resolveWidgetLocale","configLocale","saved","browser","usePreviewBridge","parentOrigin","handleMessage","allowedOrigin","newLocale","SESSION_HISTORY_STORAGE_KEY","STORAGE_KEY","SESSION_HISTORY_TTL_MS","sessionHistory","currentSessionRef","hasAnyHistory","computed","chatMountIntent","generateRef","loadEnvelope","now","persist","envelope","initVisitor","pruned","startNewSession","ref","next","resumeSession","markActivity","screenStack","computeInitialStack","resetInitialStack","escalationFormStyle","navigate","screen","back","replace","POLL_MS","isLocked","isSessionBusy","resetCallbacks","registerLockResetCallback","lastActivityAtForCurrent","isIdle","threshold","last","lockSession","unlockSession","startIdleLockWatcher","hiddenSince","onVisibility","timer","buildThemeStyle","vars","primaryColor","theme","bg","text","border","BotIcon","size","jsx","HeaderLeft","HeaderTitle","jsxs","CloseIcon","HeaderCloseButton","HeaderActions","showClose","Header","rightAction","ZapIcon","Footer","MessageIcon","SparklesIcon","props","ICON_MAP","RADIUS_MAP","FAB","radius","iconOption","label","resolvedLabel","hasLabel","HomeScreen","onStartFresh","onResetSession","lookupRef","setLookupRef","handleStartChat","handleResumeEntry","handleLookupSubmit","SelectionScreen","mergeClasses","classes","className","index","array","toKebabCase","string","toCamelCase","p1","p2","toPascalCase","camelCase","defaultAttributes","hasA11yProp","Icon","color","strokeWidth","absoluteStrokeWidth","iconNode","tag","attrs","toChildArray","createLucideIcon","iconName","Component","CornerUpLeft","be","Re","Te","Oe","we","se","ie","ye","Pe","Se","$e","_e","oe","Le","ne","Me","ze","Ee","Ie","ae","Ae","Ce","le","Be","De","qe","ue","ve","He","pe","Ze","Ge","Ne","Qe","je","Fe","Ue","Ke","We","Xe","Je","ce","he","Ve","re","Ye","et","tt","ke","ge","fe","nt","ee","te","me","xe","marked","MarkdownContent","html","draftMessage","tagAgent","agentName","firstName","mention","rateLimitedUntilMs","nowMs","attachedImages","MAX_IMAGE_ATTACHMENTS","MAX_IMAGE_BYTES","genAttachmentId","addAttachedImages","files","incoming","room","file","removeAttachedImage","target","img","clearAttachedImages","createChildComponents","root","componentsGeneric","api","useSendMessage","visitorId","ensureSession","send","content","session","useRateLimitCountdown","until","tick","clear","isActive","remainingSeconds","RateLimitNotice","sessionError","SessionErrorNotice","SendIcon","MAX_TEXTAREA_PX","useComposerInput","onSend","textareaRef","useRef","fileInputRef","el","onKeyDown","onAttachClick","onFilesPicked","onCardClick","ComposerRow","isStreaming","disabled","inputDisabled","onFocus","input","images","hasInput","hasImages","sendActive","PrivacyNotice","variant","onAcknowledge","privacyUrl","ChatInput","isLoading","sessionStatus","noticeStyle","privacyGate","setPrivacyGate","sendMessage","isRateLimited","sendDisabled","requiresPrivacyAck","blocksComposer","openPrivacyExplicit","acknowledgePrivacyExplicit","handleSend","getInitials","BotMessage","streaming","authorId","authorName","authorImage","botAvatarUrl","isHuman","imgBroken","setImgBroken","onImgError","useCallback","replyLabel","bubbleClass","UserMessage","useEscalation","FormMessage","FormMessageInput","messageId","setName","email","setEmail","submitting","setSubmitting","rawPrivacyUrl","submitEscalation","handleSubmit","widgetLocale","useMagiclineSubmit","useTrialConfig","useTrialSlots","useRateBundles","useContractPreview","useSubmitContractCreation","LOCALE_STRINGS","EMAIL_RE","isValidEmail","ageFromIsoDate","isoDate","year","month","day","age","monthDelta","todayIsoDate","resolvePrivacyUrl","IBAN_LENGTHS","IBAN_GENERIC_MIN","IBAN_GENERIC_MAX","normalizeIban","isValidIban","normalized","country","rearranged","digits","ch","remainder","maskIban","head","tail","formatContractMoney","amount","currencyCode","bcp47","formatContractPeriod","unit","plural","singular","pluralWord","formatContractDate","date","formatPaymentFrequency","upper","template","formatModulePrice","paymentFrequencyType","recurringUnit","money","FEE_NAME_KEY_MAP","localizeFeeName","rawName","formatModuleRenewal","extensionType","termExtension","periodLabel","GENDER_VALUES","COUNTRY_OPTIONS","buildWizardSteps","plan","bookingWithoutTrainerAllowed","steps","INITIAL_FIELDS","fieldsReducer","useTrialBookingState","getTrialConfig","listTrialSlots","fields","dispatch","useReducer","configState","setConfigState","_prev","slotsState","setSlotsState","refreshKey","bumpRefresh","setField","setTrainerRequired","trainerRequired","refetchSlots","configReady","slot","TrialSessionBookingForm","formMessageId","slotUnavailable","retryPending","submitForm","resolveConfigMessage","TrialWizard","minimumAge","studioZoneId","initialIndex","setIndex","fieldErrors","setFieldErrors","submitError","setSubmitError","safeIndex","step","isLast","isFirst","validateStep","errors","handleNext","prev","handleBack","bag","buildFieldBag","onPrimary","stepTitle","stepTitleFor","consentId","TrainerStep","SlotStep","PersonalStep","AddressStep","ConfirmStep","slotId","onSelect","onRetry","Fragment","formatSlot","maxDob","TextField","optionalLabel","SelectField","genderLabel","option","consentError","slotLabel","fieldKey","required","onInput","describedBy","placeholder","backendMessage","startDateTime","zoneMatch","ianaZone","parseable","nextAcks","useContractCreationState","getRateBundles","getContractPreview","offersState","setOffersState","previewState","setPreviewState","offersKey","bumpOffers","previewKey","bumpPreview","setTermId","termId","setPersonal","setAddress","toggleModule","moduleId","selected","consentAckKey","setBlockAck","ackKey","setAccountHolder","setIban","setConsent","clearIban","clearTermId","refetchOffers","resetPreview","fetchPreview","selectedTerm","term","selectedModuleIds","acknowledgedBlocks","requiredAckKeys","keys","block","module","allAcknowledged","lastName","accountHolder","accountHolderTouched","startDate","previewArgs","ContractCreationForm","projectId","formStatus","submitContract","submitResult","setSubmitResult","notice","setNotice","ContractSuccessCard","ContractTerminalCard","nextIndex","handleReviewRetry","reviewBlocked","primaryDisabled","OfferStep","UpgradesStep","PaymentStep","ReviewStep","customerNumber","selectedTermId","groups","groupTermsByBundle","group","OfferTermCard","BundleDetails","checked","lengthLabel","priceLabel","starterFee","fee","otherFlatFees","subDescription","footnote","bullets","parseBundleBullets","hasFootnote","bullet","modules","onToggle","onAck","UpgradeModuleCard","consentChecked","renewalLabel","termLabel","consent","ConsentRegion","personal","privacyId","sepaId","onToggleAck","pricing","volume","fullName","addr","addressLine","offerLabel","requiredBlocks","infoBlocks","selectedModuleConsents","ConsentRecap","attachmentLabel","attachmentUrl","showRequiredPill","terms","byId","MagiclineFormMessage","form","shouldCheckRetry","submissionStatus","ICONS","SourcesRow","sources","expanded","setExpanded","isCrawl","getPillLabel","tooltip","pillBody","TypingIndicator","STRIP_MARKER_RE","stripCitationMarkers","MessageList","conversations","greeting","sessionNotFound","resumeFailed","bottomRef","dismissedFormId","setDismissedFormId","lastFinalIdRef","noticeText","confirmText","authorProps","LoadingScreen","shown","setShown","useConversation","liveStatus","ChatScreen","isOrgDeleted","startFresh","isQueryLoading","mountIntent","isFreshSessionLoading","isResumeLoading","EscalationFormScreen","useHandoff","HumanHandoffAction","busy","setBusy","setError","createRequest","handleClick","refreshBootstrapToken","inputs","fresh","reasonForError","isBootstrapExpiredError","waitForBootstrapToken","timeoutMs","settled","finish","dispose","useConvexSession","resolvedRef","createOrResumeMut","callCreateOrResume","vid","initialToken","buildArgs","tok","refresh","hadExistingRef","outcome","resetSession","resolved","FormScreen","setMessage","ConfirmationScreen","ticketRef","ErrorScreen","onBack","ScreenRouter","stack","currentScreen","confirmationState","WidgetShell","WidgetContent","posLeft","colorSchemeClass","themeStyle","embedded","isChatScreen","shellStyle","injectStyles","shadowRoot","widgetCss","buildTimeUrl","convexClient","getOrCreateClient","runtimeUrl","mountWidget","hostEl","shadow","container","render","createInstance","mountEl","onRemove","shutdownWidget","disposeSignal","activeInstance","JexityChat","instance","getAttr","autoInit","script","bootstrap","scopeLabel"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,67,68,69,70,71,72,73,74,75,76,81]}
|
|
1
|
+
{"version":3,"file":"widget.js","sources":["../../../node_modules/.pnpm/preact@10.27.2/node_modules/preact/dist/preact.module.js","../../../node_modules/.pnpm/preact@10.27.2/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../../../node_modules/.pnpm/preact@10.27.2/node_modules/preact/hooks/dist/hooks.module.js","../../../node_modules/.pnpm/preact@10.27.2/node_modules/preact/compat/dist/compat.module.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/values/base64.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/common/index.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/values/value.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/values/errors.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/values/compare_utf8.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/index.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/logging.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/udf_path_utils.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/local_state.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/request_manager.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/server/functionName.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/server/components/paths.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/server/api.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/optimistic_updates_impl.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/vendor/long.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/remote_query_set.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/protocol.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/web_socket_manager.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/session.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/vendor/jwt-decode/index.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/authentication_manager.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/metrics.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/client.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/pagination.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/browser/sync/paginated_query_client.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/react/use_subscription.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/react/client.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/react/queries_observer.js","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/react/use_queries.js","../../../node_modules/.pnpm/@preact+signals-core@1.13.0/node_modules/@preact/signals-core/dist/signals-core.module.js","../../../node_modules/.pnpm/@preact+signals@2.7.1_preact@10.27.2/node_modules/@preact/signals/dist/signals.module.js","../src/module/shell/shell.state.ts","../src/lib/convex-url.ts","../src/lib/widget-config.ts","../src/module/shell/hooks/useRemoteConfig.ts","../src/lib/widgetBootstrap.ts","../src/module/shell/hooks/useBootstrap.ts","../src/lib/history-patch.ts","../src/module/shell/hooks/usePathGuard.ts","../src/i18n/locales/en.ts","../src/i18n/locales/de.ts","../src/i18n/config.ts","../src/i18n/index.ts","../src/i18n/resolve-widget-locale.ts","../src/module/shell/hooks/usePreviewBridge.ts","../src/module/visitor/visitor.state.ts","../src/module/screens/screens.state.ts","../src/module/visitor/idle-lock.ts","../src/shared/theme/build-theme.ts","../src/shared/icons/BotIcon.tsx","../src/shared/ui/HeaderLeft.tsx","../src/shared/ui/HeaderTitle.tsx","../src/shared/icons/CloseIcon.tsx","../src/shared/ui/HeaderCloseButton.tsx","../src/shared/ui/HeaderActions.tsx","../src/shared/ui/Header.tsx","../src/shared/icons/ZapIcon.tsx","../src/shared/ui/Footer.tsx","../src/shared/icons/MessageIcon.tsx","../src/shared/icons/SparklesIcon.tsx","../src/shared/ui/FAB.tsx","../src/features/home/components/HomeScreen.tsx","../src/features/selection/components/SelectionScreen.tsx","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/mergeClasses.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/toKebabCase.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/toCamelCase.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/toPascalCase.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/defaultAttributes.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/shared/src/utils/hasA11yProp.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/Icon.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/createLucideIcon.js","../../../node_modules/.pnpm/lucide-preact@0.563.0_preact@10.27.2/node_modules/lucide-preact/dist/esm/icons/corner-up-left.js","../../../node_modules/.pnpm/marked@17.0.5/node_modules/marked/lib/marked.esm.js","../src/features/chat/components/MarkdownContent.tsx","../src/features/chat/composer/state/draft.ts","../src/features/chat/composer/state/rate-limit.ts","../src/features/chat/composer/state/attachments.ts","../../../node_modules/.pnpm/convex@1.41.0_react@19.2.4/node_modules/convex/dist/esm/server/components/index.js","../../../packages/backend/convex/_generated/api.js","../src/features/chat/composer/hooks/useSendMessage.ts","../src/features/chat/composer/hooks/useRateLimitCountdown.ts","../src/features/chat/composer/components/RateLimitNotice.tsx","../src/features/chat/state/session-error.ts","../src/features/chat/composer/components/SessionErrorNotice.tsx","../src/shared/icons/SendIcon.tsx","../src/features/chat/composer/hooks/useComposerInput.ts","../src/features/chat/composer/components/ComposerRow.tsx","../src/features/chat/composer/components/PrivacyNotice.tsx","../src/features/chat/composer/components/ChatInput.tsx","../src/features/chat/components/BotMessage.tsx","../src/features/chat/components/UserMessage.tsx","../src/features/chat/hooks/useEscalation.ts","../src/features/chat/components/FormMessage.tsx","../src/features/chat/hooks/useMagicline.ts","../src/features/chat/components/magicline/formUtils.ts","../src/features/chat/components/magicline/magiclineConstants.ts","../src/features/chat/components/magicline/buildWizardSteps.ts","../src/features/chat/components/magicline/useTrialBookingState.ts","../src/features/chat/components/magicline/TrialSessionBookingForm.tsx","../src/features/chat/components/magicline/useContractCreationState.ts","../src/features/chat/components/magicline/ContractCreationForm.tsx","../src/features/chat/components/MagiclineFormMessage.tsx","../src/features/chat/components/SourcesRow.tsx","../src/features/chat/components/TypingIndicator.tsx","../src/features/chat/components/MessageList.tsx","../src/shared/ui/LoadingScreen.tsx","../src/features/chat/hooks/useConversation.ts","../src/features/chat/components/ChatScreen.tsx","../src/features/chat/components/EscalationFormScreen.tsx","../src/features/chat/hooks/useHandoff.ts","../src/features/chat/components/HumanHandoffAction.tsx","../src/lib/refreshBootstrap.ts","../src/features/chat/hooks/useConvexSession.ts","../src/features/ticket/components/FormScreen.tsx","../src/features/ticket/components/ConfirmationScreen.tsx","../src/shared/ui/ErrorScreen.tsx","../src/module/screens/ScreenRouter.tsx","../src/module/shell/WidgetShell.tsx","../src/shared/theme/inject-styles.ts","../src/module/shell/mount.tsx","../src/module/shell/widget-instance.ts","../src/entries/esm.ts","../src/entries/iife.ts"],"sourcesContent":["var n,l,u,t,i,r,o,e,f,c,s,a,h,p={},v=[],y=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,w=Array.isArray;function d(n,l){for(var u in l)n[u]=l[u];return n}function g(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function _(l,u,t){var i,r,o,e={};for(o in u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:e[o]=u[o];if(arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(o in l.defaultProps)void 0===e[o]&&(e[o]=l.defaultProps[o]);return m(l,e,i,r,null)}function m(n,t,i,r,o){var e={type:n,props:t,key:i,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==o?++u:o,__i:-1,__u:0};return null==o&&null!=l.vnode&&l.vnode(e),e}function b(){return{current:null}}function k(n){return n.children}function x(n,l){this.props=n,this.context=l}function S(n,l){if(null==l)return n.__?S(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?S(n):null}function C(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return C(n)}}function M(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!$.__r++||r!=l.debounceRendering)&&((r=l.debounceRendering)||o)($)}function $(){for(var n,u,t,r,o,f,c,s=1;i.length;)i.length>s&&i.sort(e),n=i.shift(),s=i.length,n.__d&&(t=void 0,r=void 0,o=(r=(u=n).__v).__e,f=[],c=[],u.__P&&((t=d({},r)).__v=r.__v+1,l.vnode&&l.vnode(t),O(u.__P,t,r,u.__n,u.__P.namespaceURI,32&r.__u?[o]:null,f,null==o?S(r):o,!!(32&r.__u),c),t.__v=r.__v,t.__.__k[t.__i]=t,N(f,t,c),r.__e=r.__=null,t.__e!=o&&C(t)));$.__r=0}function I(n,l,u,t,i,r,o,e,f,c,s){var a,h,y,w,d,g,_,m=t&&t.__k||v,b=l.length;for(f=P(u,l,m,f,b),a=0;a<b;a++)null!=(y=u.__k[a])&&(h=-1==y.__i?p:m[y.__i]||p,y.__i=a,g=O(n,y,h,i,r,o,e,f,c,s),w=y.__e,y.ref&&h.ref!=y.ref&&(h.ref&&B(h.ref,null,y),s.push(y.ref,y.__c||w,y)),null==d&&null!=w&&(d=w),(_=!!(4&y.__u))||h.__k===y.__k?f=A(y,f,n,_):\"function\"==typeof y.type&&void 0!==g?f=g:w&&(f=w.nextSibling),y.__u&=-7);return u.__e=d,f}function P(n,l,u,t,i){var r,o,e,f,c,s=u.length,a=s,h=0;for(n.__k=new Array(i),r=0;r<i;r++)null!=(o=l[r])&&\"boolean\"!=typeof o&&\"function\"!=typeof o?(f=r+h,(o=n.__k[r]=\"string\"==typeof o||\"number\"==typeof o||\"bigint\"==typeof o||o.constructor==String?m(null,o,null,null,null):w(o)?m(k,{children:o},null,null,null):null==o.constructor&&o.__b>0?m(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):o).__=n,o.__b=n.__b+1,e=null,-1!=(c=o.__i=L(o,u,f,a))&&(a--,(e=u[c])&&(e.__u|=2)),null==e||null==e.__v?(-1==c&&(i>s?h--:i<s&&h++),\"function\"!=typeof o.type&&(o.__u|=4)):c!=f&&(c==f-1?h--:c==f+1?h++:(c>f?h--:h++,o.__u|=4))):n.__k[r]=null;if(a)for(r=0;r<s;r++)null!=(e=u[r])&&0==(2&e.__u)&&(e.__e==t&&(t=S(e)),D(e,e));return t}function A(n,l,u,t){var i,r;if(\"function\"==typeof n.type){for(i=n.__k,r=0;i&&r<i.length;r++)i[r]&&(i[r].__=n,l=A(i[r],l,u,t));return l}n.__e!=l&&(t&&(l&&n.type&&!l.parentNode&&(l=S(n)),u.insertBefore(n.__e,l||null)),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8==l.nodeType);return l}function H(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(w(n)?n.some(function(n){H(n,l)}):l.push(n)),l}function L(n,l,u,t){var i,r,o,e=n.key,f=n.type,c=l[u],s=null!=c&&0==(2&c.__u);if(null===c&&null==n.key||s&&e==c.key&&f==c.type)return u;if(t>(s?1:0))for(i=u-1,r=u+1;i>=0||r<l.length;)if(null!=(c=l[o=i>=0?i--:r++])&&0==(2&c.__u)&&e==c.key&&f==c.type)return o;return-1}function T(n,l,u){\"-\"==l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||y.test(l)?u:u+\"px\"}function j(n,l,u,t,i){var r,o;n:if(\"style\"==l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||T(n.style,l,\"\");if(u)for(l in u)t&&u[l]==t[l]||T(n.style,l,u[l])}else if(\"o\"==l[0]&&\"n\"==l[1])r=l!=(l=l.replace(f,\"$1\")),o=l.toLowerCase(),l=o in n||\"onFocusOut\"==l||\"onFocusIn\"==l?o.slice(2):l.slice(2),n.l||(n.l={}),n.l[l+r]=u,u?t?u.u=t.u:(u.u=c,n.addEventListener(l,r?a:s,r)):n.removeEventListener(l,r?a:s,r);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!=l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function F(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u.t)u.t=c++;else if(u.t<t.u)return;return t(l.event?l.event(u):u)}}}function O(n,u,t,i,r,o,e,f,c,s){var a,h,p,v,y,_,m,b,S,C,M,$,P,A,H,L,T,j=u.type;if(null!=u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),o=[f=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof j)try{if(b=u.props,S=\"prototype\"in j&&j.prototype.render,C=(a=j.contextType)&&i[a.__c],M=a?C?C.props.value:a.__:i,t.__c?m=(h=u.__c=t.__c).__=h.__E:(S?u.__c=h=new j(b,M):(u.__c=h=new x(b,M),h.constructor=j,h.render=E),C&&C.sub(h),h.props=b,h.state||(h.state={}),h.context=M,h.__n=i,p=h.__d=!0,h.__h=[],h._sb=[]),S&&null==h.__s&&(h.__s=h.state),S&&null!=j.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=d({},h.__s)),d(h.__s,j.getDerivedStateFromProps(b,h.__s))),v=h.props,y=h.state,h.__v=u,p)S&&null==j.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),S&&null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(S&&null==j.getDerivedStateFromProps&&b!==v&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(b,M),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(b,h.__s,M)||u.__v==t.__v){for(u.__v!=t.__v&&(h.props=b,h.state=h.__s,h.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.some(function(n){n&&(n.__=u)}),$=0;$<h._sb.length;$++)h.__h.push(h._sb[$]);h._sb=[],h.__h.length&&e.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(b,h.__s,M),S&&null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(v,y,_)})}if(h.context=M,h.props=b,h.__P=n,h.__e=!1,P=l.__r,A=0,S){for(h.state=h.__s,h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[]}else do{h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++A<25);h.state=h.__s,null!=h.getChildContext&&(i=d(d({},i),h.getChildContext())),S&&!p&&null!=h.getSnapshotBeforeUpdate&&(_=h.getSnapshotBeforeUpdate(v,y)),L=a,null!=a&&a.type===k&&null==a.key&&(L=V(a.props.children)),f=I(n,w(L)?L:[L],u,t,i,r,o,e,f,c,s),h.base=u.__e,u.__u&=-161,h.__h.length&&e.push(h),m&&(h.__E=h.__=null)}catch(n){if(u.__v=null,c||null!=o)if(n.then){for(u.__u|=c?160:128;f&&8==f.nodeType&&f.nextSibling;)f=f.nextSibling;o[o.indexOf(f)]=null,u.__e=f}else{for(T=o.length;T--;)g(o[T]);z(u)}else u.__e=t.__e,u.__k=t.__k,n.then||z(u);l.__e(n,u,t)}else null==o&&u.__v==t.__v?(u.__k=t.__k,u.__e=t.__e):f=u.__e=q(t.__e,u,t,i,r,o,e,c,s);return(a=l.diffed)&&a(u),128&u.__u?void 0:f}function z(n){n&&n.__c&&(n.__c.__e=!0),n&&n.__k&&n.__k.forEach(z)}function N(n,u,t){for(var i=0;i<t.length;i++)B(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function V(n){return\"object\"!=typeof n||null==n||n.__b&&n.__b>0?n:w(n)?n.map(V):d({},n)}function q(u,t,i,r,o,e,f,c,s){var a,h,v,y,d,_,m,b=i.props,k=t.props,x=t.type;if(\"svg\"==x?o=\"http://www.w3.org/2000/svg\":\"math\"==x?o=\"http://www.w3.org/1998/Math/MathML\":o||(o=\"http://www.w3.org/1999/xhtml\"),null!=e)for(a=0;a<e.length;a++)if((d=e[a])&&\"setAttribute\"in d==!!x&&(x?d.localName==x:3==d.nodeType)){u=d,e[a]=null;break}if(null==u){if(null==x)return document.createTextNode(k);u=document.createElementNS(o,x,k.is&&k),c&&(l.__m&&l.__m(t,e),c=!1),e=null}if(null==x)b===k||c&&u.data==k||(u.data=k);else{if(e=e&&n.call(u.childNodes),b=i.props||p,!c&&null!=e)for(b={},a=0;a<u.attributes.length;a++)b[(d=u.attributes[a]).name]=d.value;for(a in b)if(d=b[a],\"children\"==a);else if(\"dangerouslySetInnerHTML\"==a)v=d;else if(!(a in k)){if(\"value\"==a&&\"defaultValue\"in k||\"checked\"==a&&\"defaultChecked\"in k)continue;j(u,a,null,d,o)}for(a in k)d=k[a],\"children\"==a?y=d:\"dangerouslySetInnerHTML\"==a?h=d:\"value\"==a?_=d:\"checked\"==a?m=d:c&&\"function\"!=typeof d||b[a]===d||j(u,a,d,b[a],o);if(h)c||v&&(h.__html==v.__html||h.__html==u.innerHTML)||(u.innerHTML=h.__html),t.__k=[];else if(v&&(u.innerHTML=\"\"),I(\"template\"==t.type?u.content:u,w(y)?y:[y],t,i,r,\"foreignObject\"==x?\"http://www.w3.org/1999/xhtml\":o,e,f,e?e[0]:i.__k&&S(i,0),c,s),null!=e)for(a=e.length;a--;)g(e[a]);c||(a=\"value\",\"progress\"==x&&null==_?u.removeAttribute(\"value\"):null!=_&&(_!==u[a]||\"progress\"==x&&!_||\"option\"==x&&_!=b[a])&&j(u,a,_,b[a],o),a=\"checked\",null!=m&&m!=u[a]&&j(u,a,m,b[a],o))}return u}function B(n,u,t){try{if(\"function\"==typeof n){var i=\"function\"==typeof n.__u;i&&n.__u(),i&&null==u||(n.__u=n(u))}else n.current=u}catch(n){l.__e(n,t)}}function D(n,u,t){var i,r;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!=n.__e||B(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null}if(i=n.__k)for(r=0;r<i.length;r++)i[r]&&D(i[r],u,t||\"function\"!=typeof n.type);t||g(n.__e),n.__c=n.__=n.__e=void 0}function E(n,l,u){return this.constructor(n,u)}function G(u,t,i){var r,o,e,f;t==document&&(t=document.documentElement),l.__&&l.__(u,t),o=(r=\"function\"==typeof i)?null:i&&i.__k||t.__k,e=[],f=[],O(t,u=(!r&&i||t).__k=_(k,null,[u]),o||p,p,t.namespaceURI,!r&&i?[i]:o?null:t.firstChild?n.call(t.childNodes):null,e,!r&&i?i:o?o.__e:t.firstChild,r,f),N(e,u,f)}function J(n,l){G(n,l,J)}function K(l,u,t){var i,r,o,e,f=d({},l.props);for(o in l.type&&l.type.defaultProps&&(e=l.type.defaultProps),u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:f[o]=void 0===u[o]&&null!=e?e[o]:u[o];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),m(l.type,f,i||l.key,r||l.ref,null)}function Q(n){function l(n){var u,t;return this.getChildContext||(u=new Set,(t={})[l.__c]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&u.forEach(function(n){n.__e=!0,M(n)})},this.sub=function(n){u.add(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.delete(n),l&&l.call(n)}}),n.children}return l.__c=\"__cC\"+h++,l.__=n,l.Provider=l.__l=(l.Consumer=function(n,l){return n.children(l)}).contextType=l,l}n=v.slice,l={__e:function(n,l,u,t){for(var i,r,o;l=l.__;)if((i=l.__c)&&!i.__)try{if((r=i.constructor)&&null!=r.getDerivedStateFromError&&(i.setState(r.getDerivedStateFromError(n)),o=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),o=i.__d),o)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&null==n.constructor},x.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=d({},this.state),\"function\"==typeof n&&(n=n(d({},u),this.props)),n&&d(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),M(this))},x.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),M(this))},x.prototype.render=k,i=[],o=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,e=function(n,l){return n.__v.__b-l.__v.__b},$.__r=0,f=/(PointerCapture)$|Capture$/i,c=0,s=F(!1),a=F(!0),h=0;export{x as Component,k as Fragment,K as cloneElement,Q as createContext,_ as createElement,b as createRef,_ as h,J as hydrate,t as isValidElement,l as options,G as render,H as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\""\";break;case 38:f=\"&\";break;case 60:f=\"<\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,p=t;if(\"ref\"in p)for(c in p={},t)\"ref\"==c?a=t[c]:p[c]=t[c];var l={type:e,props:p,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===p[c]&&(p[c]=a[c]);return r.vnode&&r.vnode(l),l}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},p=/[A-Z]/g;function l(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(t=function(r){return null!==r&&\"object\"==typeof r&&\"function\"==typeof r.valueOf?r.valueOf():r}(t),\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var l=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(p,\"-$&\").toLowerCase()),s=\";\";\"number\"!=typeof a||l.startsWith(\"--\")||o.test(l)||(s=\"px;\"),i=i+l+\":\"+a+s}}return e+'=\"'+n(i)+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(\"\"+t)+'\"'}function s(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=s(r[e]);return r}}return n(\"\"+r)}export{u as jsx,l as jsxAttr,u as jsxDEV,s as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function p(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function d(n){return o=1,h(D,n)}function h(n,u,i){var o=p(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.__f)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=o.__c.props!==n;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),c&&c.call(this,n,t,r)||i};r.__f=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=p(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__H.__h.push(i))}function _(n,u){var i=p(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){if(\"function\"==typeof n){var r=n(t());return function(){n(null),r&&\"function\"==typeof r&&r()}}if(n)return n.current=t(),function(){return n.current=null}},null==r?r:r.concat(n))}function T(n,r){var u=p(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=p(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=p(t++,10),i=d();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=p(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,35);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,h as useReducer,A as useRef,d as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import{Component as n,createElement as t,options as e,toChildArray as r,Fragment as u,render as o,hydrate as i,createContext as l,createRef as c,cloneElement as f}from\"preact\";export{Component,Fragment,createContext,createElement,createRef}from\"preact\";import{useState as a,useLayoutEffect as s,useEffect as h,useCallback as v,useContext as d,useDebugValue as m,useId as p,useImperativeHandle as y,useMemo as _,useReducer as b,useRef as S}from\"preact/hooks\";export*from\"preact/hooks\";function g(n,t){for(var e in t)n[e]=t[e];return n}function E(n,t){for(var e in n)if(\"__source\"!==e&&!(e in t))return!0;for(var r in t)if(\"__source\"!==r&&n[r]!==t[r])return!0;return!1}function C(n,t){var e=t(),r=a({t:{__:e,u:t}}),u=r[0].t,o=r[1];return s(function(){u.__=e,u.u=t,x(u)&&o({t:u})},[n,e,t]),h(function(){return x(u)&&o({t:u}),n(function(){x(u)&&o({t:u})})},[n]),e}function x(n){var t,e,r=n.u,u=n.__;try{var o=r();return!((t=u)===(e=o)&&(0!==t||1/t==1/e)||t!=t&&e!=e)}catch(n){return!0}}function R(n){n()}function w(n){return n}function k(){return[!1,R]}var I=s;function N(n,t){this.props=n,this.context=t}function M(n,e){function r(n){var t=this.props.ref,r=t==n.ref;return!r&&t&&(t.call?t(null):t.current=null),e?!e(this.props,n)||!r:E(this.props,n)}function u(e){return this.shouldComponentUpdate=r,t(n,e)}return u.displayName=\"Memo(\"+(n.displayName||n.name)+\")\",u.prototype.isReactComponent=!0,u.__f=!0,u.type=n,u}(N.prototype=new n).isPureReactComponent=!0,N.prototype.shouldComponentUpdate=function(n,t){return E(this.props,n)||E(this.state,t)};var T=e.__b;e.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),T&&T(n)};var A=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.forward_ref\")||3911;function D(n){function t(t){var e=g({},t);return delete e.ref,n(e,t.ref||null)}return t.$$typeof=A,t.render=n,t.prototype.isReactComponent=t.__f=!0,t.displayName=\"ForwardRef(\"+(n.displayName||n.name)+\")\",t}var L=function(n,t){return null==n?null:r(r(n).map(t))},O={map:L,forEach:L,count:function(n){return n?r(n).length:0},only:function(n){var t=r(n);if(1!==t.length)throw\"Children.only\";return t[0]},toArray:r},F=e.__e;e.__e=function(n,t,e,r){if(n.then)for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),u.__c(n,t);F(n,t,e,r)};var U=e.unmount;function V(n,t,e){return n&&(n.__c&&n.__c.__H&&(n.__c.__H.__.forEach(function(n){\"function\"==typeof n.__c&&n.__c()}),n.__c.__H=null),null!=(n=g({},n)).__c&&(n.__c.__P===e&&(n.__c.__P=t),n.__c.__e=!0,n.__c=null),n.__k=n.__k&&n.__k.map(function(n){return V(n,t,e)})),n}function W(n,t,e){return n&&e&&(n.__v=null,n.__k=n.__k&&n.__k.map(function(n){return W(n,t,e)}),n.__c&&n.__c.__P===t&&(n.__e&&e.appendChild(n.__e),n.__c.__e=!0,n.__c.__P=e)),n}function P(){this.__u=0,this.o=null,this.__b=null}function j(n){var t=n.__.__c;return t&&t.__a&&t.__a(n)}function z(n){var e,r,u;function o(o){if(e||(e=n()).then(function(n){r=n.default||n},function(n){u=n}),u)throw u;if(!r)throw e;return t(r,o)}return o.displayName=\"Lazy\",o.__f=!0,o}function B(){this.i=null,this.l=null}e.unmount=function(n){var t=n.__c;t&&t.__R&&t.__R(),t&&32&n.__u&&(n.type=null),U&&U(n)},(P.prototype=new n).__c=function(n,t){var e=t.__c,r=this;null==r.o&&(r.o=[]),r.o.push(e);var u=j(r.__v),o=!1,i=function(){o||(o=!0,e.__R=null,u?u(l):l())};e.__R=i;var l=function(){if(!--r.__u){if(r.state.__a){var n=r.state.__a;r.__v.__k[0]=W(n,n.__c.__P,n.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.o.pop();)t.forceUpdate()}};r.__u++||32&t.__u||r.setState({__a:r.__b=r.__v.__k[0]}),n.then(i,i)},P.prototype.componentWillUnmount=function(){this.o=[]},P.prototype.render=function(n,e){if(this.__b){if(this.__v.__k){var r=document.createElement(\"div\"),o=this.__v.__k[0].__c;this.__v.__k[0]=V(this.__b,r,o.__O=o.__P)}this.__b=null}var i=e.__a&&t(u,null,n.fallback);return i&&(i.__u&=-33),[t(u,null,e.__a?null:n.children),i]};var H=function(n,t,e){if(++e[1]===e[0]&&n.l.delete(t),n.props.revealOrder&&(\"t\"!==n.props.revealOrder[0]||!n.l.size))for(e=n.i;e;){for(;e.length>3;)e.pop()();if(e[1]<e[0])break;n.i=e=e[2]}};function Z(n){return this.getChildContext=function(){return n.context},n.children}function Y(n){var e=this,r=n.h;if(e.componentWillUnmount=function(){o(null,e.v),e.v=null,e.h=null},e.h&&e.h!==r&&e.componentWillUnmount(),!e.v){for(var u=e.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;e.h=r,e.v={nodeType:1,parentNode:r,childNodes:[],__k:{__m:u.__m},contains:function(){return!0},insertBefore:function(n,t){this.childNodes.push(n),e.h.insertBefore(n,t)},removeChild:function(n){this.childNodes.splice(this.childNodes.indexOf(n)>>>1,1),e.h.removeChild(n)}}}o(t(Z,{context:e.context},n.__v),e.v)}function $(n,e){var r=t(Y,{__v:n,h:e});return r.containerInfo=e,r}(B.prototype=new n).__a=function(n){var t=this,e=j(t.__v),r=t.l.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),H(t,n,r)):u()};e?e(o):o()}},B.prototype.render=function(n){this.i=null,this.l=new Map;var t=r(n.children);n.revealOrder&&\"b\"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.l.set(t[e],this.i=[1,0,this.i]);return n.children},B.prototype.componentDidUpdate=B.prototype.componentDidMount=function(){var n=this;this.l.forEach(function(t,e){H(n,e,t)})};var q=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103,G=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,J=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,K=/[A-Z0-9]/g,Q=\"undefined\"!=typeof document,X=function(n){return(\"undefined\"!=typeof Symbol&&\"symbol\"==typeof Symbol()?/fil|che|rad/:/fil|che|ra/).test(n)};function nn(n,t,e){return null==t.__k&&(t.textContent=\"\"),o(n,t),\"function\"==typeof e&&e(),n?n.__c:null}function tn(n,t,e){return i(n,t),\"function\"==typeof e&&e(),n?n.__c:null}n.prototype.isReactComponent={},[\"componentWillMount\",\"componentWillReceiveProps\",\"componentWillUpdate\"].forEach(function(t){Object.defineProperty(n.prototype,t,{configurable:!0,get:function(){return this[\"UNSAFE_\"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n})}})});var en=e.event;function rn(){}function un(){return this.cancelBubble}function on(){return this.defaultPrevented}e.event=function(n){return en&&(n=en(n)),n.persist=rn,n.isPropagationStopped=un,n.isDefaultPrevented=on,n.nativeEvent=n};var ln,cn={enumerable:!1,configurable:!0,get:function(){return this.class}},fn=e.vnode;e.vnode=function(n){\"string\"==typeof n.type&&function(n){var t=n.props,e=n.type,u={},o=-1===e.indexOf(\"-\");for(var i in t){var l=t[i];if(!(\"value\"===i&&\"defaultValue\"in t&&null==l||Q&&\"children\"===i&&\"noscript\"===e||\"class\"===i||\"className\"===i)){var c=i.toLowerCase();\"defaultValue\"===i&&\"value\"in t&&null==t.value?i=\"value\":\"download\"===i&&!0===l?l=\"\":\"translate\"===c&&\"no\"===l?l=!1:\"o\"===c[0]&&\"n\"===c[1]?\"ondoubleclick\"===c?i=\"ondblclick\":\"onchange\"!==c||\"input\"!==e&&\"textarea\"!==e||X(t.type)?\"onfocus\"===c?i=\"onfocusin\":\"onblur\"===c?i=\"onfocusout\":J.test(i)&&(i=c):c=i=\"oninput\":o&&G.test(i)?i=i.replace(K,\"-$&\").toLowerCase():null===l&&(l=void 0),\"oninput\"===c&&u[i=c]&&(i=\"oninputCapture\"),u[i]=l}}\"select\"==e&&u.multiple&&Array.isArray(u.value)&&(u.value=r(t.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value)})),\"select\"==e&&null!=u.defaultValue&&(u.value=r(t.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value})),t.class&&!t.className?(u.class=t.class,Object.defineProperty(u,\"className\",cn)):(t.className&&!t.class||t.class&&t.className)&&(u.class=u.className=t.className),n.props=u}(n),n.$$typeof=q,fn&&fn(n)};var an=e.__r;e.__r=function(n){an&&an(n),ln=n.__c};var sn=e.diffed;e.diffed=function(n){sn&&sn(n);var t=n.props,e=n.__e;null!=e&&\"textarea\"===n.type&&\"value\"in t&&t.value!==e.value&&(e.value=null==t.value?\"\":t.value),ln=null};var hn={ReactCurrentDispatcher:{current:{readContext:function(n){return ln.__n[n.__c].props.value},useCallback:v,useContext:d,useDebugValue:m,useDeferredValue:w,useEffect:h,useId:p,useImperativeHandle:y,useInsertionEffect:I,useLayoutEffect:s,useMemo:_,useReducer:b,useRef:S,useState:a,useSyncExternalStore:C,useTransition:k}}},vn=\"18.3.1\";function dn(n){return t.bind(null,n)}function mn(n){return!!n&&n.$$typeof===q}function pn(n){return mn(n)&&n.type===u}function yn(n){return!!n&&!!n.displayName&&(\"string\"==typeof n.displayName||n.displayName instanceof String)&&n.displayName.startsWith(\"Memo(\")}function _n(n){return mn(n)?f.apply(null,arguments):n}function bn(n){return!!n.__k&&(o(null,n),!0)}function Sn(n){return n&&(n.base||1===n.nodeType&&n)||null}var gn=function(n,t){return n(t)},En=function(n,t){return n(t)},Cn=u,xn=mn,Rn={useState:a,useId:p,useReducer:b,useEffect:h,useLayoutEffect:s,useInsertionEffect:I,useTransition:k,useDeferredValue:w,useSyncExternalStore:C,startTransition:R,useRef:S,useImperativeHandle:y,useMemo:_,useCallback:v,useContext:d,useDebugValue:m,version:\"18.3.1\",Children:O,render:nn,hydrate:tn,unmountComponentAtNode:bn,createPortal:$,createElement:t,createContext:l,createFactory:dn,cloneElement:_n,createRef:c,Fragment:u,isValidElement:mn,isElement:xn,isFragment:pn,isMemo:yn,findDOMNode:Sn,Component:n,PureComponent:N,memo:M,forwardRef:D,flushSync:En,unstable_batchedUpdates:gn,StrictMode:Cn,Suspense:P,SuspenseList:B,lazy:z,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:hn};export{O as Children,N as PureComponent,Cn as StrictMode,P as Suspense,B as SuspenseList,hn as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,_n as cloneElement,dn as createFactory,$ as createPortal,Rn as default,Sn as findDOMNode,En as flushSync,D as forwardRef,tn as hydrate,xn as isElement,pn as isFragment,yn as isMemo,mn as isValidElement,z as lazy,M as memo,nn as render,R as startTransition,bn as unmountComponentAtNode,gn as unstable_batchedUpdates,w as useDeferredValue,I as useInsertionEffect,C as useSyncExternalStore,k as useTransition,vn as version};\n//# sourceMappingURL=compat.module.js.map\n","\"use strict\";\nvar lookup = [];\nvar revLookup = [];\nvar Arr = Uint8Array;\nvar code = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i];\n revLookup[code.charCodeAt(i)] = i;\n}\nrevLookup[\"-\".charCodeAt(0)] = 62;\nrevLookup[\"_\".charCodeAt(0)] = 63;\nfunction getLens(b64) {\n var len = b64.length;\n if (len % 4 > 0) {\n throw new Error(\"Invalid string. Length must be a multiple of 4\");\n }\n var validLen = b64.indexOf(\"=\");\n if (validLen === -1) validLen = len;\n var placeHoldersLen = validLen === len ? 0 : 4 - validLen % 4;\n return [validLen, placeHoldersLen];\n}\nexport function byteLength(b64) {\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction _byteLength(_b64, validLen, placeHoldersLen) {\n return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nexport function toByteArray(b64) {\n var tmp;\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));\n var curByte = 0;\n var len = placeHoldersLen > 0 ? validLen - 4 : validLen;\n var i;\n for (i = 0; i < len; i += 4) {\n tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)];\n arr[curByte++] = tmp >> 16 & 255;\n arr[curByte++] = tmp >> 8 & 255;\n arr[curByte++] = tmp & 255;\n }\n if (placeHoldersLen === 2) {\n tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4;\n arr[curByte++] = tmp & 255;\n }\n if (placeHoldersLen === 1) {\n tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2;\n arr[curByte++] = tmp >> 8 & 255;\n arr[curByte++] = tmp & 255;\n }\n return arr;\n}\nfunction tripletToBase64(num) {\n return lookup[num >> 18 & 63] + lookup[num >> 12 & 63] + lookup[num >> 6 & 63] + lookup[num & 63];\n}\nfunction encodeChunk(uint8, start, end) {\n var tmp;\n var output = [];\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16 & 16711680) + (uint8[i + 1] << 8 & 65280) + (uint8[i + 2] & 255);\n output.push(tripletToBase64(tmp));\n }\n return output.join(\"\");\n}\nexport function fromByteArray(uint8) {\n var tmp;\n var len = uint8.length;\n var extraBytes = len % 3;\n var parts = [];\n var maxChunkLength = 16383;\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(\n encodeChunk(\n uint8,\n i,\n i + maxChunkLength > len2 ? len2 : i + maxChunkLength\n )\n );\n }\n if (extraBytes === 1) {\n tmp = uint8[len - 1];\n parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 63] + \"==\");\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1];\n parts.push(\n lookup[tmp >> 10] + lookup[tmp >> 4 & 63] + lookup[tmp << 2 & 63] + \"=\"\n );\n }\n return parts.join(\"\");\n}\nexport function fromByteArrayUrlSafeNoPadding(uint8) {\n return fromByteArray(uint8).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n//# sourceMappingURL=base64.js.map\n","\"use strict\";\nexport function parseArgs(args) {\n if (args === void 0) {\n return {};\n }\n if (!isSimpleObject(args)) {\n throw new Error(\n `The arguments to a Convex function must be an object. Received: ${args}`\n );\n }\n return args;\n}\nexport function validateDeploymentUrl(deploymentUrl) {\n if (typeof deploymentUrl === \"undefined\") {\n throw new Error(\n `Client created with undefined deployment address. If you used an environment variable, check that it's set.`\n );\n }\n if (typeof deploymentUrl !== \"string\") {\n throw new Error(\n `Invalid deployment address: found ${deploymentUrl}\".`\n );\n }\n if (!(deploymentUrl.startsWith(\"http:\") || deploymentUrl.startsWith(\"https:\"))) {\n throw new Error(\n `Invalid deployment address: Must start with \"https://\" or \"http://\". Found \"${deploymentUrl}\".`\n );\n }\n try {\n new URL(deploymentUrl);\n } catch {\n throw new Error(\n `Invalid deployment address: \"${deploymentUrl}\" is not a valid URL. If you believe this URL is correct, use the \\`skipConvexDeploymentUrlCheck\\` option to bypass this.`\n );\n }\n if (deploymentUrl.endsWith(\".convex.site\")) {\n throw new Error(\n `Invalid deployment address: \"${deploymentUrl}\" ends with .convex.site, which is used for HTTP Actions. Convex deployment URLs typically end with .convex.cloud? If you believe this URL is correct, use the \\`skipConvexDeploymentUrlCheck\\` option to bypass this.`\n );\n }\n}\nexport function isSimpleObject(value) {\n const isObject = typeof value === \"object\";\n const prototype = Object.getPrototypeOf(value);\n const isSimple = prototype === null || prototype === Object.prototype || // Objects generated from other contexts (e.g. across Node.js `vm` modules) will not satisfy the previous\n // conditions but are still simple objects.\n prototype?.constructor?.name === \"Object\";\n return isObject && isSimple;\n}\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nimport * as Base64 from \"./base64.js\";\nimport { isSimpleObject } from \"../common/index.js\";\nconst LITTLE_ENDIAN = true;\nconst MIN_INT64 = BigInt(\"-9223372036854775808\");\nconst MAX_INT64 = BigInt(\"9223372036854775807\");\nconst ZERO = BigInt(\"0\");\nconst EIGHT = BigInt(\"8\");\nconst TWOFIFTYSIX = BigInt(\"256\");\nfunction isSpecial(n) {\n return Number.isNaN(n) || !Number.isFinite(n) || Object.is(n, -0);\n}\nexport function slowBigIntToBase64(value) {\n if (value < ZERO) {\n value -= MIN_INT64 + MIN_INT64;\n }\n let hex = value.toString(16);\n if (hex.length % 2 === 1) hex = \"0\" + hex;\n const bytes = new Uint8Array(new ArrayBuffer(8));\n let i = 0;\n for (const hexByte of hex.match(/.{2}/g).reverse()) {\n bytes.set([parseInt(hexByte, 16)], i++);\n value >>= EIGHT;\n }\n return Base64.fromByteArray(bytes);\n}\nexport function slowBase64ToBigInt(encoded) {\n const integerBytes = Base64.toByteArray(encoded);\n if (integerBytes.byteLength !== 8) {\n throw new Error(\n `Received ${integerBytes.byteLength} bytes, expected 8 for $integer`\n );\n }\n let value = ZERO;\n let power = ZERO;\n for (const byte of integerBytes) {\n value += BigInt(byte) * TWOFIFTYSIX ** power;\n power++;\n }\n if (value > MAX_INT64) {\n value += MIN_INT64 + MIN_INT64;\n }\n return value;\n}\nexport function modernBigIntToBase64(value) {\n if (value < MIN_INT64 || MAX_INT64 < value) {\n throw new Error(\n `BigInt ${value} does not fit into a 64-bit signed integer.`\n );\n }\n const buffer = new ArrayBuffer(8);\n new DataView(buffer).setBigInt64(0, value, true);\n return Base64.fromByteArray(new Uint8Array(buffer));\n}\nexport function modernBase64ToBigInt(encoded) {\n const integerBytes = Base64.toByteArray(encoded);\n if (integerBytes.byteLength !== 8) {\n throw new Error(\n `Received ${integerBytes.byteLength} bytes, expected 8 for $integer`\n );\n }\n const intBytesView = new DataView(integerBytes.buffer);\n return intBytesView.getBigInt64(0, true);\n}\nexport const bigIntToBase64 = DataView.prototype.setBigInt64 ? modernBigIntToBase64 : slowBigIntToBase64;\nexport const base64ToBigInt = DataView.prototype.getBigInt64 ? modernBase64ToBigInt : slowBase64ToBigInt;\nconst MAX_IDENTIFIER_LEN = 1024;\nfunction validateObjectField(k) {\n if (k.length > MAX_IDENTIFIER_LEN) {\n throw new Error(\n `Field name ${k} exceeds maximum field name length ${MAX_IDENTIFIER_LEN}.`\n );\n }\n if (k.startsWith(\"$\")) {\n throw new Error(`Field name ${k} starts with a '$', which is reserved.`);\n }\n for (let i = 0; i < k.length; i += 1) {\n const charCode = k.charCodeAt(i);\n if (charCode < 32 || charCode >= 127) {\n throw new Error(\n `Field name ${k} has invalid character '${k[i]}': Field names can only contain non-control ASCII characters`\n );\n }\n }\n}\nexport function jsonToConvex(value) {\n if (value === null) {\n return value;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((value2) => jsonToConvex(value2));\n }\n if (typeof value !== \"object\") {\n throw new Error(`Unexpected type of ${value}`);\n }\n const entries = Object.entries(value);\n if (entries.length === 1) {\n const key = entries[0][0];\n if (key === \"$bytes\") {\n if (typeof value.$bytes !== \"string\") {\n throw new Error(`Malformed $bytes field on ${value}`);\n }\n return Base64.toByteArray(value.$bytes).buffer;\n }\n if (key === \"$integer\") {\n if (typeof value.$integer !== \"string\") {\n throw new Error(`Malformed $integer field on ${value}`);\n }\n return base64ToBigInt(value.$integer);\n }\n if (key === \"$float\") {\n if (typeof value.$float !== \"string\") {\n throw new Error(`Malformed $float field on ${value}`);\n }\n const floatBytes = Base64.toByteArray(value.$float);\n if (floatBytes.byteLength !== 8) {\n throw new Error(\n `Received ${floatBytes.byteLength} bytes, expected 8 for $float`\n );\n }\n const floatBytesView = new DataView(floatBytes.buffer);\n const float = floatBytesView.getFloat64(0, LITTLE_ENDIAN);\n if (!isSpecial(float)) {\n throw new Error(`Float ${float} should be encoded as a number`);\n }\n return float;\n }\n if (key === \"$set\") {\n throw new Error(\n `Received a Set which is no longer supported as a Convex type.`\n );\n }\n if (key === \"$map\") {\n throw new Error(\n `Received a Map which is no longer supported as a Convex type.`\n );\n }\n }\n const out = {};\n for (const [k, v] of Object.entries(value)) {\n validateObjectField(k);\n out[k] = jsonToConvex(v);\n }\n return out;\n}\nconst MAX_VALUE_FOR_ERROR_LEN = 16384;\nexport function stringifyValueForError(value) {\n const str = JSON.stringify(value, (_key, value2) => {\n if (value2 === void 0) {\n return \"undefined\";\n }\n if (typeof value2 === \"bigint\") {\n return `${value2.toString()}n`;\n }\n return value2;\n });\n if (str.length > MAX_VALUE_FOR_ERROR_LEN) {\n const rest = \"[...truncated]\";\n let truncateAt = MAX_VALUE_FOR_ERROR_LEN - rest.length;\n const codePoint = str.codePointAt(truncateAt - 1);\n if (codePoint !== void 0 && codePoint > 65535) {\n truncateAt -= 1;\n }\n return str.substring(0, truncateAt) + rest;\n }\n return str;\n}\nfunction convexToJsonInternal(value, originalValue, context, includeTopLevelUndefined) {\n if (value === void 0) {\n const contextText = context && ` (present at path ${context} in original object ${stringifyValueForError(\n originalValue\n )})`;\n throw new Error(\n `undefined is not a valid Convex value${contextText}. To learn about Convex's supported types, see https://docs.convex.dev/using/types.`\n );\n }\n if (value === null) {\n return value;\n }\n if (typeof value === \"bigint\") {\n if (value < MIN_INT64 || MAX_INT64 < value) {\n throw new Error(\n `BigInt ${value} does not fit into a 64-bit signed integer.`\n );\n }\n return { $integer: bigIntToBase64(value) };\n }\n if (typeof value === \"number\") {\n if (isSpecial(value)) {\n const buffer = new ArrayBuffer(8);\n new DataView(buffer).setFloat64(0, value, LITTLE_ENDIAN);\n return { $float: Base64.fromByteArray(new Uint8Array(buffer)) };\n } else {\n return value;\n }\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return { $bytes: Base64.fromByteArray(new Uint8Array(value)) };\n }\n if (Array.isArray(value)) {\n return value.map(\n (value2, i) => convexToJsonInternal(value2, originalValue, context + `[${i}]`, false)\n );\n }\n if (value instanceof Set) {\n throw new Error(\n errorMessageForUnsupportedType(context, \"Set\", [...value], originalValue)\n );\n }\n if (value instanceof Map) {\n throw new Error(\n errorMessageForUnsupportedType(context, \"Map\", [...value], originalValue)\n );\n }\n if (!isSimpleObject(value)) {\n const theType = value?.constructor?.name;\n const typeName = theType ? `${theType} ` : \"\";\n throw new Error(\n errorMessageForUnsupportedType(context, typeName, value, originalValue)\n );\n }\n const out = {};\n const entries = Object.entries(value);\n entries.sort(([k1, _v1], [k2, _v2]) => k1 === k2 ? 0 : k1 < k2 ? -1 : 1);\n for (const [k, v] of entries) {\n if (v !== void 0) {\n validateObjectField(k);\n out[k] = convexToJsonInternal(v, originalValue, context + `.${k}`, false);\n } else if (includeTopLevelUndefined) {\n validateObjectField(k);\n out[k] = convexOrUndefinedToJsonInternal(\n v,\n originalValue,\n context + `.${k}`\n );\n }\n }\n return out;\n}\nfunction errorMessageForUnsupportedType(context, typeName, value, originalValue) {\n if (context) {\n return `${typeName}${stringifyValueForError(\n value\n )} is not a supported Convex type (present at path ${context} in original object ${stringifyValueForError(\n originalValue\n )}). To learn about Convex's supported types, see https://docs.convex.dev/using/types.`;\n } else {\n return `${typeName}${stringifyValueForError(\n value\n )} is not a supported Convex type.`;\n }\n}\nfunction convexOrUndefinedToJsonInternal(value, originalValue, context) {\n if (value === void 0) {\n return { $undefined: null };\n } else {\n if (originalValue === void 0) {\n throw new Error(\n `Programming error. Current value is ${stringifyValueForError(\n value\n )} but original value is undefined`\n );\n }\n return convexToJsonInternal(value, originalValue, context, false);\n }\n}\nexport function convexToJson(value) {\n return convexToJsonInternal(value, value, \"\", false);\n}\nexport function convexOrUndefinedToJson(value) {\n return convexOrUndefinedToJsonInternal(value, value, \"\");\n}\nexport function patchValueToJson(value) {\n return convexToJsonInternal(value, value, \"\", true);\n}\n//# sourceMappingURL=value.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nvar _a, _b;\nimport { stringifyValueForError } from \"./value.js\";\nconst IDENTIFYING_FIELD = Symbol.for(\"ConvexError\");\nexport class ConvexError extends (_b = Error, _a = IDENTIFYING_FIELD, _b) {\n constructor(data) {\n super(typeof data === \"string\" ? data : stringifyValueForError(data));\n __publicField(this, \"name\", \"ConvexError\");\n __publicField(this, \"data\");\n __publicField(this, _a, true);\n this.data = data;\n }\n}\n//# sourceMappingURL=errors.js.map\n","\"use strict\";\nexport function compareUTF8(a, b) {\n const aLength = a.length;\n const bLength = b.length;\n const length = Math.min(aLength, bLength);\n for (let i = 0; i < length; ) {\n const aCodePoint = a.codePointAt(i);\n const bCodePoint = b.codePointAt(i);\n if (aCodePoint !== bCodePoint) {\n if (aCodePoint < 128 && bCodePoint < 128) {\n return aCodePoint - bCodePoint;\n }\n const aLength2 = utf8Bytes(aCodePoint, aBytes);\n const bLength2 = utf8Bytes(bCodePoint, bBytes);\n return compareArrays(aBytes, aLength2, bBytes, bLength2);\n }\n i += utf16LengthForCodePoint(aCodePoint);\n }\n return aLength - bLength;\n}\nfunction compareArrays(a, aLength, b, bLength) {\n const length = Math.min(aLength, bLength);\n for (let i = 0; i < length; i++) {\n const aValue = a[i];\n const bValue = b[i];\n if (aValue !== bValue) {\n return aValue - bValue;\n }\n }\n return aLength - bLength;\n}\nexport function utf16LengthForCodePoint(aCodePoint) {\n return aCodePoint > 65535 ? 2 : 1;\n}\nconst arr = () => Array.from({ length: 4 }, () => 0);\nconst aBytes = arr();\nconst bBytes = arr();\nfunction utf8Bytes(codePoint, bytes) {\n if (codePoint < 128) {\n bytes[0] = codePoint;\n return 1;\n }\n let count;\n let offset;\n if (codePoint <= 2047) {\n count = 1;\n offset = 192;\n } else if (codePoint <= 65535) {\n count = 2;\n offset = 224;\n } else if (codePoint <= 1114111) {\n count = 3;\n offset = 240;\n } else {\n throw new Error(\"Invalid code point\");\n }\n bytes[0] = (codePoint >> 6 * count) + offset;\n let i = 1;\n for (; count > 0; count--) {\n const temp = codePoint >> 6 * (count - 1);\n bytes[i++] = 128 | temp & 63;\n }\n return i;\n}\nexport function greaterThan(a, b) {\n return compareUTF8(a, b) > 0;\n}\nexport function greaterThanEq(a, b) {\n return compareUTF8(a, b) >= 0;\n}\nexport function lessThan(a, b) {\n return compareUTF8(a, b) < 0;\n}\nexport function lessThanEq(a, b) {\n return compareUTF8(a, b) <= 0;\n}\n//# sourceMappingURL=compare_utf8.js.map\n","\"use strict\";\nexport const version = \"1.41.0\";\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nconst INFO_COLOR = \"color:rgb(0, 145, 255)\";\nfunction prefix_for_source(source) {\n switch (source) {\n case \"query\":\n return \"Q\";\n case \"mutation\":\n return \"M\";\n case \"action\":\n return \"A\";\n case \"any\":\n return \"?\";\n }\n}\nexport class DefaultLogger {\n constructor(options) {\n __publicField(this, \"_onLogLineFuncs\");\n __publicField(this, \"_verbose\");\n this._onLogLineFuncs = {};\n this._verbose = options.verbose;\n }\n addLogLineListener(func) {\n let id = Math.random().toString(36).substring(2, 15);\n for (let i = 0; i < 10; i++) {\n if (this._onLogLineFuncs[id] === void 0) {\n break;\n }\n id = Math.random().toString(36).substring(2, 15);\n }\n this._onLogLineFuncs[id] = func;\n return () => {\n delete this._onLogLineFuncs[id];\n };\n }\n logVerbose(...args) {\n if (this._verbose) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"debug\", `${(/* @__PURE__ */ new Date()).toISOString()}`, ...args);\n }\n }\n }\n log(...args) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"info\", ...args);\n }\n }\n warn(...args) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"warn\", ...args);\n }\n }\n error(...args) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"error\", ...args);\n }\n }\n}\nexport function instantiateDefaultLogger(options) {\n const logger = new DefaultLogger(options);\n logger.addLogLineListener((level, ...args) => {\n switch (level) {\n case \"debug\":\n console.debug(...args);\n break;\n case \"info\":\n console.log(...args);\n break;\n case \"warn\":\n console.warn(...args);\n break;\n case \"error\":\n console.error(...args);\n break;\n default: {\n level;\n console.log(...args);\n }\n }\n });\n return logger;\n}\nexport function instantiateNoopLogger(options) {\n return new DefaultLogger(options);\n}\nexport function logForFunction(logger, type, source, udfPath, message) {\n const prefix = prefix_for_source(source);\n if (typeof message === \"object\") {\n message = `ConvexError ${JSON.stringify(message.errorData, null, 2)}`;\n }\n if (type === \"info\") {\n const match = message.match(/^\\[.*?\\] /);\n if (match === null) {\n logger.error(\n `[CONVEX ${prefix}(${udfPath})] Could not parse console.log`\n );\n return;\n }\n const level = message.slice(1, match[0].length - 2);\n const args = message.slice(match[0].length);\n logger.log(`%c[CONVEX ${prefix}(${udfPath})] [${level}]`, INFO_COLOR, args);\n } else {\n logger.error(`[CONVEX ${prefix}(${udfPath})] ${message}`);\n }\n}\nexport function logFatalError(logger, message) {\n const errorMessage = `[CONVEX FATAL ERROR] ${message}`;\n logger.error(errorMessage);\n return new Error(errorMessage);\n}\nexport function createHybridErrorStacktrace(source, udfPath, result) {\n const prefix = prefix_for_source(source);\n return `[CONVEX ${prefix}(${udfPath})] ${result.errorMessage}\n Called by client`;\n}\nexport function forwardData(result, error) {\n error.data = result.errorData;\n return error;\n}\n//# sourceMappingURL=logging.js.map\n","\"use strict\";\nimport { convexToJson } from \"../../values/index.js\";\nexport function canonicalizeUdfPath(udfPath) {\n const pieces = udfPath.split(\":\");\n let moduleName;\n let functionName;\n if (pieces.length === 1) {\n moduleName = pieces[0];\n functionName = \"default\";\n } else {\n moduleName = pieces.slice(0, pieces.length - 1).join(\":\");\n functionName = pieces[pieces.length - 1];\n }\n if (moduleName.endsWith(\".js\")) {\n moduleName = moduleName.slice(0, -3);\n }\n return `${moduleName}:${functionName}`;\n}\nexport function serializePathAndArgs(udfPath, args) {\n return JSON.stringify({\n udfPath: canonicalizeUdfPath(udfPath),\n args: convexToJson(args)\n });\n}\nexport function serializePaginatedPathAndArgs(udfPath, args, options) {\n const { initialNumItems, id } = options;\n const result = JSON.stringify({\n type: \"paginated\",\n udfPath: canonicalizeUdfPath(udfPath),\n args: convexToJson(args),\n options: convexToJson({ initialNumItems, id })\n });\n return result;\n}\nexport function serializedQueryTokenIsPaginated(token) {\n return JSON.parse(token).type === \"paginated\";\n}\n//# sourceMappingURL=udf_path_utils.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { convexToJson } from \"../../values/index.js\";\nimport {\n canonicalizeUdfPath,\n serializePathAndArgs\n} from \"./udf_path_utils.js\";\nexport class LocalSyncState {\n constructor() {\n __publicField(this, \"nextQueryId\");\n __publicField(this, \"querySetVersion\");\n __publicField(this, \"querySet\");\n __publicField(this, \"queryIdToToken\");\n __publicField(this, \"identityVersion\");\n __publicField(this, \"auth\");\n __publicField(this, \"outstandingQueriesOlderThanRestart\");\n __publicField(this, \"outstandingAuthOlderThanRestart\");\n __publicField(this, \"paused\");\n __publicField(this, \"pendingQuerySetModifications\");\n this.nextQueryId = 0;\n this.querySetVersion = 0;\n this.identityVersion = 0;\n this.querySet = /* @__PURE__ */ new Map();\n this.queryIdToToken = /* @__PURE__ */ new Map();\n this.outstandingQueriesOlderThanRestart = /* @__PURE__ */ new Set();\n this.outstandingAuthOlderThanRestart = false;\n this.paused = false;\n this.pendingQuerySetModifications = /* @__PURE__ */ new Map();\n }\n hasSyncedPastLastReconnect() {\n return this.outstandingQueriesOlderThanRestart.size === 0 && !this.outstandingAuthOlderThanRestart;\n }\n markAuthCompletion() {\n this.outstandingAuthOlderThanRestart = false;\n }\n subscribe(udfPath, args, journal, componentPath) {\n const canonicalizedUdfPath = canonicalizeUdfPath(udfPath);\n const queryToken = serializePathAndArgs(canonicalizedUdfPath, args);\n const existingEntry = this.querySet.get(queryToken);\n if (existingEntry !== void 0) {\n existingEntry.numSubscribers += 1;\n return {\n queryToken,\n modification: null,\n unsubscribe: () => this.removeSubscriber(queryToken)\n };\n } else {\n const queryId = this.nextQueryId++;\n const query = {\n id: queryId,\n canonicalizedUdfPath,\n args,\n numSubscribers: 1,\n journal,\n componentPath\n };\n this.querySet.set(queryToken, query);\n this.queryIdToToken.set(queryId, queryToken);\n const baseVersion = this.querySetVersion;\n const newVersion = this.querySetVersion + 1;\n const add = {\n type: \"Add\",\n queryId,\n udfPath: canonicalizedUdfPath,\n args: [convexToJson(args)],\n journal,\n componentPath\n };\n if (this.paused) {\n this.pendingQuerySetModifications.set(queryId, add);\n } else {\n this.querySetVersion = newVersion;\n }\n const modification = {\n type: \"ModifyQuerySet\",\n baseVersion,\n newVersion,\n modifications: [add]\n };\n return {\n queryToken,\n modification,\n unsubscribe: () => this.removeSubscriber(queryToken)\n };\n }\n }\n transition(transition) {\n for (const modification of transition.modifications) {\n switch (modification.type) {\n case \"QueryUpdated\":\n case \"QueryFailed\": {\n this.outstandingQueriesOlderThanRestart.delete(modification.queryId);\n const journal = modification.journal;\n if (journal !== void 0) {\n const queryToken = this.queryIdToToken.get(modification.queryId);\n if (queryToken !== void 0) {\n this.querySet.get(queryToken).journal = journal;\n }\n }\n break;\n }\n case \"QueryRemoved\": {\n this.outstandingQueriesOlderThanRestart.delete(modification.queryId);\n break;\n }\n default: {\n modification;\n throw new Error(`Invalid modification ${modification.type}`);\n }\n }\n }\n }\n queryId(udfPath, args) {\n const canonicalizedUdfPath = canonicalizeUdfPath(udfPath);\n const queryToken = serializePathAndArgs(canonicalizedUdfPath, args);\n const existingEntry = this.querySet.get(queryToken);\n if (existingEntry !== void 0) {\n return existingEntry.id;\n }\n return null;\n }\n isCurrentOrNewerAuthVersion(version) {\n return version >= this.identityVersion;\n }\n getAuth() {\n return this.auth;\n }\n setAuth(value) {\n this.auth = {\n tokenType: \"User\",\n value\n };\n const baseVersion = this.identityVersion;\n if (!this.paused) {\n this.identityVersion = baseVersion + 1;\n }\n return {\n type: \"Authenticate\",\n baseVersion,\n ...this.auth\n };\n }\n setAdminAuth(value, actingAs) {\n const auth = {\n tokenType: \"Admin\",\n value,\n impersonating: actingAs\n };\n this.auth = auth;\n const baseVersion = this.identityVersion;\n if (!this.paused) {\n this.identityVersion = baseVersion + 1;\n }\n return {\n type: \"Authenticate\",\n baseVersion,\n ...auth\n };\n }\n clearAuth() {\n this.auth = void 0;\n this.markAuthCompletion();\n const baseVersion = this.identityVersion;\n if (!this.paused) {\n this.identityVersion = baseVersion + 1;\n }\n return {\n type: \"Authenticate\",\n tokenType: \"None\",\n baseVersion\n };\n }\n hasAuth() {\n return !!this.auth;\n }\n isNewAuth(value) {\n return this.auth?.value !== value;\n }\n queryPath(queryId) {\n const pathAndArgs = this.queryIdToToken.get(queryId);\n if (pathAndArgs) {\n return this.querySet.get(pathAndArgs).canonicalizedUdfPath;\n }\n return null;\n }\n queryArgs(queryId) {\n const pathAndArgs = this.queryIdToToken.get(queryId);\n if (pathAndArgs) {\n return this.querySet.get(pathAndArgs).args;\n }\n return null;\n }\n queryToken(queryId) {\n return this.queryIdToToken.get(queryId) ?? null;\n }\n queryJournal(queryToken) {\n return this.querySet.get(queryToken)?.journal;\n }\n restart() {\n this.unpause();\n this.outstandingQueriesOlderThanRestart.clear();\n const modifications = [];\n for (const localQuery of this.querySet.values()) {\n const add = {\n type: \"Add\",\n queryId: localQuery.id,\n udfPath: localQuery.canonicalizedUdfPath,\n args: [convexToJson(localQuery.args)],\n journal: localQuery.journal,\n componentPath: localQuery.componentPath\n };\n modifications.push(add);\n this.outstandingQueriesOlderThanRestart.add(localQuery.id);\n }\n this.querySetVersion = 1;\n const querySet = {\n type: \"ModifyQuerySet\",\n baseVersion: 0,\n newVersion: 1,\n modifications\n };\n if (!this.auth) {\n this.identityVersion = 0;\n return [querySet, void 0];\n }\n this.outstandingAuthOlderThanRestart = true;\n const authenticate = {\n type: \"Authenticate\",\n baseVersion: 0,\n ...this.auth\n };\n this.identityVersion = 1;\n return [querySet, authenticate];\n }\n pause() {\n this.paused = true;\n }\n resume() {\n const querySet = this.pendingQuerySetModifications.size > 0 ? {\n type: \"ModifyQuerySet\",\n baseVersion: this.querySetVersion,\n newVersion: ++this.querySetVersion,\n modifications: Array.from(\n this.pendingQuerySetModifications.values()\n )\n } : void 0;\n const authenticate = this.auth !== void 0 ? {\n type: \"Authenticate\",\n baseVersion: this.identityVersion++,\n ...this.auth\n } : void 0;\n this.unpause();\n return [querySet, authenticate];\n }\n unpause() {\n this.paused = false;\n this.pendingQuerySetModifications.clear();\n }\n removeSubscriber(queryToken) {\n const localQuery = this.querySet.get(queryToken);\n if (localQuery.numSubscribers > 1) {\n localQuery.numSubscribers -= 1;\n return null;\n } else {\n this.querySet.delete(queryToken);\n this.queryIdToToken.delete(localQuery.id);\n this.outstandingQueriesOlderThanRestart.delete(localQuery.id);\n const baseVersion = this.querySetVersion;\n const newVersion = this.querySetVersion + 1;\n const remove = {\n type: \"Remove\",\n queryId: localQuery.id\n };\n if (this.paused) {\n if (this.pendingQuerySetModifications.has(localQuery.id)) {\n this.pendingQuerySetModifications.delete(localQuery.id);\n } else {\n this.pendingQuerySetModifications.set(localQuery.id, remove);\n }\n } else {\n this.querySetVersion = newVersion;\n }\n return {\n type: \"ModifyQuerySet\",\n baseVersion,\n newVersion,\n modifications: [remove]\n };\n }\n }\n}\n//# sourceMappingURL=local_state.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { jsonToConvex } from \"../../values/index.js\";\nimport { logForFunction } from \"../logging.js\";\nexport class RequestManager {\n constructor(logger, markConnectionStateDirty) {\n this.logger = logger;\n this.markConnectionStateDirty = markConnectionStateDirty;\n __publicField(this, \"inflightRequests\");\n __publicField(this, \"requestsOlderThanRestart\");\n __publicField(this, \"inflightMutationsCount\", 0);\n __publicField(this, \"inflightActionsCount\", 0);\n this.inflightRequests = /* @__PURE__ */ new Map();\n this.requestsOlderThanRestart = /* @__PURE__ */ new Set();\n }\n request(message, sent) {\n const result = new Promise((resolve) => {\n const status = sent ? \"Requested\" : \"NotSent\";\n this.inflightRequests.set(message.requestId, {\n message,\n status: { status, requestedAt: /* @__PURE__ */ new Date(), onResult: resolve }\n });\n if (message.type === \"Mutation\") {\n this.inflightMutationsCount++;\n } else if (message.type === \"Action\") {\n this.inflightActionsCount++;\n }\n });\n this.markConnectionStateDirty();\n return result;\n }\n /**\n * Update the state after receiving a response.\n *\n * @returns A RequestId if the request is complete and its optimistic update\n * can be dropped, null otherwise.\n */\n onResponse(response) {\n const requestInfo = this.inflightRequests.get(response.requestId);\n if (requestInfo === void 0) {\n return null;\n }\n if (requestInfo.status.status === \"Completed\") {\n return null;\n }\n const udfType = requestInfo.message.type === \"Mutation\" ? \"mutation\" : \"action\";\n const udfPath = requestInfo.message.udfPath;\n for (const line of response.logLines) {\n logForFunction(this.logger, \"info\", udfType, udfPath, line);\n }\n const status = requestInfo.status;\n let result;\n let onResolve;\n if (response.success) {\n result = {\n success: true,\n logLines: response.logLines,\n value: jsonToConvex(response.result)\n };\n onResolve = () => status.onResult(result);\n } else {\n const errorMessage = response.result;\n const { errorData } = response;\n logForFunction(this.logger, \"error\", udfType, udfPath, errorMessage);\n result = {\n success: false,\n errorMessage,\n errorData: errorData !== void 0 ? jsonToConvex(errorData) : void 0,\n logLines: response.logLines\n };\n onResolve = () => status.onResult(result);\n }\n if (response.type === \"ActionResponse\" || !response.success) {\n onResolve();\n this.inflightRequests.delete(response.requestId);\n this.requestsOlderThanRestart.delete(response.requestId);\n if (requestInfo.message.type === \"Action\") {\n this.inflightActionsCount--;\n } else if (requestInfo.message.type === \"Mutation\") {\n this.inflightMutationsCount--;\n }\n this.markConnectionStateDirty();\n return { requestId: response.requestId, result };\n }\n requestInfo.status = {\n status: \"Completed\",\n result,\n ts: response.ts,\n onResolve\n };\n return null;\n }\n // Remove and returns completed requests.\n removeCompleted(ts) {\n const completeRequests = /* @__PURE__ */ new Map();\n for (const [requestId, requestInfo] of this.inflightRequests.entries()) {\n const status = requestInfo.status;\n if (status.status === \"Completed\" && status.ts.lessThanOrEqual(ts)) {\n status.onResolve();\n completeRequests.set(requestId, status.result);\n if (requestInfo.message.type === \"Mutation\") {\n this.inflightMutationsCount--;\n } else if (requestInfo.message.type === \"Action\") {\n this.inflightActionsCount--;\n }\n this.inflightRequests.delete(requestId);\n this.requestsOlderThanRestart.delete(requestId);\n }\n }\n if (completeRequests.size > 0) {\n this.markConnectionStateDirty();\n }\n return completeRequests;\n }\n restart() {\n this.requestsOlderThanRestart = new Set(this.inflightRequests.keys());\n const allMessages = [];\n for (const [requestId, value] of this.inflightRequests) {\n if (value.status.status === \"NotSent\") {\n value.status.status = \"Requested\";\n allMessages.push(value.message);\n continue;\n }\n if (value.message.type === \"Mutation\") {\n allMessages.push(value.message);\n } else if (value.message.type === \"Action\") {\n this.inflightRequests.delete(requestId);\n this.requestsOlderThanRestart.delete(requestId);\n this.inflightActionsCount--;\n if (value.status.status === \"Completed\") {\n throw new Error(\"Action should never be in 'Completed' state\");\n }\n value.status.onResult({\n success: false,\n errorMessage: \"Connection lost while action was in flight\",\n logLines: []\n });\n }\n }\n this.markConnectionStateDirty();\n return allMessages;\n }\n resume() {\n const allMessages = [];\n for (const [, value] of this.inflightRequests) {\n if (value.status.status === \"NotSent\") {\n value.status.status = \"Requested\";\n allMessages.push(value.message);\n continue;\n }\n }\n return allMessages;\n }\n /**\n * @returns true if there are any requests that have been requested but have\n * not be completed yet.\n */\n hasIncompleteRequests() {\n for (const requestInfo of this.inflightRequests.values()) {\n if (requestInfo.status.status === \"Requested\") {\n return true;\n }\n }\n return false;\n }\n /**\n * @returns true if there are any inflight requests, including ones that have\n * completed on the server, but have not been applied.\n */\n hasInflightRequests() {\n return this.inflightRequests.size > 0;\n }\n /**\n * @returns true if there are any inflight requests, that have been hanging around\n * since prior to the most recent restart.\n */\n hasSyncedPastLastReconnect() {\n return this.requestsOlderThanRestart.size === 0;\n }\n timeOfOldestInflightRequest() {\n if (this.inflightRequests.size === 0) {\n return null;\n }\n let oldestInflightRequest = Date.now();\n for (const request of this.inflightRequests.values()) {\n if (request.status.status !== \"Completed\") {\n if (request.status.requestedAt.getTime() < oldestInflightRequest) {\n oldestInflightRequest = request.status.requestedAt.getTime();\n }\n }\n }\n return new Date(oldestInflightRequest);\n }\n /**\n * @returns The number of mutations currently in flight.\n */\n inflightMutations() {\n return this.inflightMutationsCount;\n }\n /**\n * @returns The number of actions currently in flight.\n */\n inflightActions() {\n return this.inflightActionsCount;\n }\n}\n//# sourceMappingURL=request_manager.js.map\n","\"use strict\";\nexport const functionName = Symbol.for(\"functionName\");\n//# sourceMappingURL=functionName.js.map\n","\"use strict\";\nimport { functionName } from \"../functionName.js\";\nexport const toReferencePath = Symbol.for(\"toReferencePath\");\nexport function setReferencePath(obj, value) {\n obj[toReferencePath] = value;\n}\nexport function extractReferencePath(reference) {\n return reference[toReferencePath] ?? null;\n}\nexport function isFunctionHandle(s) {\n return s.startsWith(\"function://\");\n}\nexport function getFunctionAddress(functionReference) {\n let functionAddress;\n if (typeof functionReference === \"string\") {\n if (isFunctionHandle(functionReference)) {\n functionAddress = { functionHandle: functionReference };\n } else {\n functionAddress = { name: functionReference };\n }\n } else if (functionReference[functionName]) {\n functionAddress = { name: functionReference[functionName] };\n } else {\n const referencePath = extractReferencePath(functionReference);\n if (!referencePath) {\n throw new Error(`${functionReference} is not a functionReference`);\n }\n functionAddress = { reference: referencePath };\n }\n return functionAddress;\n}\n//# sourceMappingURL=paths.js.map\n","\"use strict\";\nimport { functionName } from \"./functionName.js\";\nimport { getFunctionAddress } from \"./components/paths.js\";\nexport function getFunctionName(functionReference) {\n const address = getFunctionAddress(functionReference);\n if (address.name === void 0) {\n if (address.functionHandle !== void 0) {\n throw new Error(\n `Expected function reference like \"api.file.func\" or \"internal.file.func\", but received function handle ${address.functionHandle}`\n );\n } else if (address.reference !== void 0) {\n throw new Error(\n `Expected function reference in the current component like \"api.file.func\" or \"internal.file.func\", but received reference ${address.reference}`\n );\n }\n throw new Error(\n `Expected function reference like \"api.file.func\" or \"internal.file.func\", but received ${JSON.stringify(address)}`\n );\n }\n if (typeof functionReference === \"string\") return functionReference;\n const name = functionReference[functionName];\n if (!name) {\n throw new Error(`${functionReference} is not a functionReference`);\n }\n return name;\n}\nexport function makeFunctionReference(name) {\n return { [functionName]: name };\n}\nfunction createApi(pathParts = []) {\n const handler = {\n get(_, prop) {\n if (typeof prop === \"string\") {\n const newParts = [...pathParts, prop];\n return createApi(newParts);\n } else if (prop === functionName) {\n if (pathParts.length < 2) {\n const found = [\"api\", ...pathParts].join(\".\");\n throw new Error(\n `API path is expected to be of the form \\`api.moduleName.functionName\\`. Found: \\`${found}\\``\n );\n }\n const path = pathParts.slice(0, -1).join(\"/\");\n const exportName = pathParts[pathParts.length - 1];\n if (exportName === \"default\") {\n return path;\n } else {\n return path + \":\" + exportName;\n }\n } else if (prop === Symbol.toStringTag) {\n return \"FunctionReference\";\n } else {\n return void 0;\n }\n }\n };\n return new Proxy({}, handler);\n}\nexport function filterApi(api) {\n return api;\n}\nexport function justInternal(api) {\n return api;\n}\nexport function justPublic(api) {\n return api;\n}\nexport function justQueries(api) {\n return api;\n}\nexport function justMutations(api) {\n return api;\n}\nexport function justActions(api) {\n return api;\n}\nexport function justPaginatedQueries(api) {\n return api;\n}\nexport function justSchedulable(api) {\n return api;\n}\nexport const anyApi = createApi();\n//# sourceMappingURL=api.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport {\n getFunctionName\n} from \"../../server/api.js\";\nimport { parseArgs } from \"../../common/index.js\";\nimport { createHybridErrorStacktrace, forwardData } from \"../logging.js\";\nimport {\n canonicalizeUdfPath,\n serializePathAndArgs\n} from \"./udf_path_utils.js\";\nimport { ConvexError } from \"../../values/errors.js\";\nclass OptimisticLocalStoreImpl {\n constructor(queryResults) {\n // A references of the query results in OptimisticQueryResults\n __publicField(this, \"queryResults\");\n // All of the queries modified by this class\n __publicField(this, \"modifiedQueries\");\n this.queryResults = queryResults;\n this.modifiedQueries = [];\n }\n getQuery(query, ...args) {\n const queryArgs = parseArgs(args[0]);\n const name = getFunctionName(query);\n const queryResult = this.queryResults.get(\n serializePathAndArgs(name, queryArgs)\n );\n if (queryResult === void 0) {\n return void 0;\n }\n return OptimisticLocalStoreImpl.queryValue(queryResult.result);\n }\n getAllQueries(query) {\n const queriesWithName = [];\n const name = getFunctionName(query);\n for (const queryResult of this.queryResults.values()) {\n if (queryResult.udfPath === canonicalizeUdfPath(name)) {\n queriesWithName.push({\n args: queryResult.args,\n value: OptimisticLocalStoreImpl.queryValue(queryResult.result)\n });\n }\n }\n return queriesWithName;\n }\n setQuery(queryReference, args, value) {\n const queryArgs = parseArgs(args);\n const name = getFunctionName(queryReference);\n const queryToken = serializePathAndArgs(name, queryArgs);\n let result;\n if (value === void 0) {\n result = void 0;\n } else {\n result = {\n success: true,\n value,\n // It's an optimistic update, so there are no function logs to show.\n logLines: []\n };\n }\n const query = {\n udfPath: name,\n args: queryArgs,\n result\n };\n this.queryResults.set(queryToken, query);\n this.modifiedQueries.push(queryToken);\n }\n static queryValue(result) {\n if (result === void 0) {\n return void 0;\n } else if (result.success) {\n return result.value;\n } else {\n return void 0;\n }\n }\n}\nexport class OptimisticQueryResults {\n constructor() {\n __publicField(this, \"queryResults\");\n __publicField(this, \"optimisticUpdates\");\n this.queryResults = /* @__PURE__ */ new Map();\n this.optimisticUpdates = [];\n }\n /**\n * Apply all optimistic updates on top of server query results\n */\n ingestQueryResultsFromServer(serverQueryResults, optimisticUpdatesToDrop) {\n this.optimisticUpdates = this.optimisticUpdates.filter((updateAndId) => {\n return !optimisticUpdatesToDrop.has(updateAndId.mutationId);\n });\n const oldQueryResults = this.queryResults;\n this.queryResults = new Map(serverQueryResults);\n const localStore = new OptimisticLocalStoreImpl(this.queryResults);\n for (const updateAndId of this.optimisticUpdates) {\n updateAndId.update(localStore);\n }\n const changedQueries = [];\n for (const [queryToken, query] of this.queryResults) {\n const oldQuery = oldQueryResults.get(queryToken);\n if (oldQuery === void 0 || oldQuery.result !== query.result) {\n changedQueries.push(queryToken);\n }\n }\n return changedQueries;\n }\n applyOptimisticUpdate(update, mutationId) {\n this.optimisticUpdates.push({\n update,\n mutationId\n });\n const localStore = new OptimisticLocalStoreImpl(this.queryResults);\n update(localStore);\n return localStore.modifiedQueries;\n }\n /**\n * \"Raw\" with respect to errors vs values, but query results still have\n * optimistic updates applied.\n *\n * @internal\n */\n rawQueryResult(queryToken) {\n const query = this.queryResults.get(queryToken);\n if (query === void 0) {\n return void 0;\n }\n return query.result;\n }\n queryResult(queryToken) {\n const query = this.queryResults.get(queryToken);\n if (query === void 0) {\n return void 0;\n }\n const result = query.result;\n if (result === void 0) {\n return void 0;\n } else if (result.success) {\n return result.value;\n } else {\n if (result.errorData !== void 0) {\n throw forwardData(\n result,\n new ConvexError(\n createHybridErrorStacktrace(\"query\", query.udfPath, result)\n )\n );\n }\n throw new Error(\n createHybridErrorStacktrace(\"query\", query.udfPath, result)\n );\n }\n }\n hasQueryResult(queryToken) {\n return this.queryResults.get(queryToken) !== void 0;\n }\n /**\n * @internal\n */\n queryLogs(queryToken) {\n const query = this.queryResults.get(queryToken);\n return query?.result?.logLines;\n }\n}\n//# sourceMappingURL=optimistic_updates_impl.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nexport class Long {\n constructor(low, high) {\n __publicField(this, \"low\");\n __publicField(this, \"high\");\n __publicField(this, \"__isUnsignedLong__\");\n this.low = low | 0;\n this.high = high | 0;\n this.__isUnsignedLong__ = true;\n }\n static isLong(obj) {\n return (obj && obj.__isUnsignedLong__) === true;\n }\n // prettier-ignore\n static fromBytesLE(bytes) {\n return new Long(\n bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24,\n bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24\n );\n }\n // prettier-ignore\n toBytesLE() {\n const hi = this.high;\n const lo = this.low;\n return [\n lo & 255,\n lo >>> 8 & 255,\n lo >>> 16 & 255,\n lo >>> 24,\n hi & 255,\n hi >>> 8 & 255,\n hi >>> 16 & 255,\n hi >>> 24\n ];\n }\n static fromNumber(value) {\n if (isNaN(value)) return UZERO;\n if (value < 0) return UZERO;\n if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE;\n return new Long(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0);\n }\n toString() {\n return (BigInt(this.high) * BigInt(TWO_PWR_32_DBL) + BigInt(this.low)).toString();\n }\n equals(other) {\n if (!Long.isLong(other)) other = Long.fromValue(other);\n if (this.high >>> 31 === 1 && other.high >>> 31 === 1) return false;\n return this.high === other.high && this.low === other.low;\n }\n notEquals(other) {\n return !this.equals(other);\n }\n comp(other) {\n if (!Long.isLong(other)) other = Long.fromValue(other);\n if (this.equals(other)) return 0;\n return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1;\n }\n lessThanOrEqual(other) {\n return this.comp(\n /* validates */\n other\n ) <= 0;\n }\n static fromValue(val) {\n if (typeof val === \"number\") return Long.fromNumber(val);\n return new Long(val.low, val.high);\n }\n}\nconst UZERO = new Long(0, 0);\nconst TWO_PWR_16_DBL = 1 << 16;\nconst TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\nconst TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\nconst MAX_UNSIGNED_VALUE = new Long(4294967295 | 0, 4294967295 | 0);\n//# sourceMappingURL=long.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { jsonToConvex } from \"../../values/index.js\";\nimport { Long } from \"../../vendor/long.js\";\nimport { logForFunction } from \"../logging.js\";\nexport class RemoteQuerySet {\n constructor(queryPath, logger) {\n __publicField(this, \"version\");\n __publicField(this, \"remoteQuerySet\");\n __publicField(this, \"queryPath\");\n __publicField(this, \"logger\");\n this.version = { querySet: 0, ts: Long.fromNumber(0), identity: 0 };\n this.remoteQuerySet = /* @__PURE__ */ new Map();\n this.queryPath = queryPath;\n this.logger = logger;\n }\n transition(transition) {\n const start = transition.startVersion;\n if (this.version.querySet !== start.querySet || this.version.ts.notEquals(start.ts) || this.version.identity !== start.identity) {\n throw new Error(\n `Invalid start version: ${start.ts.toString()}:${start.querySet}:${start.identity}, transitioning from ${this.version.ts.toString()}:${this.version.querySet}:${this.version.identity}`\n );\n }\n for (const modification of transition.modifications) {\n switch (modification.type) {\n case \"QueryUpdated\": {\n const queryPath = this.queryPath(modification.queryId);\n if (queryPath) {\n for (const line of modification.logLines) {\n logForFunction(this.logger, \"info\", \"query\", queryPath, line);\n }\n }\n const value = jsonToConvex(modification.value ?? null);\n this.remoteQuerySet.set(modification.queryId, {\n success: true,\n value,\n logLines: modification.logLines\n });\n break;\n }\n case \"QueryFailed\": {\n const queryPath = this.queryPath(modification.queryId);\n if (queryPath) {\n for (const line of modification.logLines) {\n logForFunction(this.logger, \"info\", \"query\", queryPath, line);\n }\n }\n const { errorData } = modification;\n this.remoteQuerySet.set(modification.queryId, {\n success: false,\n errorMessage: modification.errorMessage,\n errorData: errorData !== void 0 ? jsonToConvex(errorData) : void 0,\n logLines: modification.logLines\n });\n break;\n }\n case \"QueryRemoved\": {\n this.remoteQuerySet.delete(modification.queryId);\n break;\n }\n default: {\n modification;\n throw new Error(`Invalid modification ${modification.type}`);\n }\n }\n }\n this.version = transition.endVersion;\n }\n remoteQueryResults() {\n return this.remoteQuerySet;\n }\n timestamp() {\n return this.version.ts;\n }\n}\n//# sourceMappingURL=remote_query_set.js.map\n","\"use strict\";\nimport { Base64 } from \"../../values/index.js\";\nimport { Long } from \"../../vendor/long.js\";\nexport function u64ToLong(encoded) {\n const integerBytes = Base64.toByteArray(encoded);\n return Long.fromBytesLE(Array.from(integerBytes));\n}\nexport function longToU64(raw) {\n const integerBytes = new Uint8Array(raw.toBytesLE());\n return Base64.fromByteArray(integerBytes);\n}\nexport function parseServerMessage(encoded) {\n switch (encoded.type) {\n case \"FatalError\":\n case \"AuthError\":\n case \"ActionResponse\":\n case \"TransitionChunk\":\n case \"Ping\": {\n return { ...encoded };\n }\n case \"MutationResponse\": {\n if (encoded.success) {\n return { ...encoded, ts: u64ToLong(encoded.ts) };\n } else {\n return { ...encoded };\n }\n }\n case \"Transition\": {\n return {\n ...encoded,\n startVersion: {\n ...encoded.startVersion,\n ts: u64ToLong(encoded.startVersion.ts)\n },\n endVersion: {\n ...encoded.endVersion,\n ts: u64ToLong(encoded.endVersion.ts)\n }\n };\n }\n default: {\n encoded;\n }\n }\n return void 0;\n}\nexport function encodeClientMessage(message) {\n switch (message.type) {\n case \"Authenticate\":\n case \"ModifyQuerySet\":\n case \"Mutation\":\n case \"Action\":\n case \"Event\": {\n return { ...message };\n }\n case \"Connect\": {\n if (message.maxObservedTimestamp !== void 0) {\n return {\n ...message,\n maxObservedTimestamp: longToU64(message.maxObservedTimestamp)\n };\n } else {\n return { ...message, maxObservedTimestamp: void 0 };\n }\n }\n default: {\n message;\n }\n }\n return void 0;\n}\n//# sourceMappingURL=protocol.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport {\n encodeClientMessage,\n parseServerMessage\n} from \"./protocol.js\";\nconst CLOSE_NORMAL = 1e3;\nconst CLOSE_GOING_AWAY = 1001;\nconst CLOSE_NO_STATUS = 1005;\nconst CLOSE_NOT_FOUND = 4040;\nlet firstTime;\nfunction monotonicMillis() {\n if (firstTime === void 0) {\n firstTime = Date.now();\n }\n if (typeof performance === \"undefined\" || !performance.now) {\n return Date.now();\n }\n return Math.round(firstTime + performance.now());\n}\nfunction prettyNow() {\n return `t=${Math.round((monotonicMillis() - firstTime) / 100) / 10}s`;\n}\nconst serverDisconnectErrors = {\n // A known error, e.g. during a restart or push\n InternalServerError: { timeout: 1e3 },\n // ErrorMetadata::overloaded() messages that we realy should back off\n SubscriptionsWorkerFullError: { timeout: 3e3 },\n TooManyConcurrentRequests: { timeout: 3e3 },\n CommitterFullError: { timeout: 3e3 },\n AwsTooManyRequestsException: { timeout: 3e3 },\n ExecuteFullError: { timeout: 3e3 },\n SystemTimeoutError: { timeout: 3e3 },\n ExpiredInQueue: { timeout: 3e3 },\n // ErrorMetadata::feature_temporarily_unavailable() that typically indicate a deploy just happened\n VectorIndexesUnavailable: { timeout: 1e3 },\n SearchIndexesUnavailable: { timeout: 1e3 },\n TableSummariesUnavailable: { timeout: 1e3 },\n // More ErrorMetadata::overloaded()\n VectorIndexTooLarge: { timeout: 3e3 },\n SearchIndexTooLarge: { timeout: 3e3 },\n TooManyWritesInTimePeriod: { timeout: 3e3 }\n};\nfunction classifyDisconnectError(s) {\n if (s === void 0) return \"Unknown\";\n for (const prefix of Object.keys(\n serverDisconnectErrors\n )) {\n if (s.startsWith(prefix)) {\n return prefix;\n }\n }\n return \"Unknown\";\n}\nexport class WebSocketManager {\n constructor(uri, callbacks, webSocketConstructor, logger, markConnectionStateDirty, debug) {\n this.markConnectionStateDirty = markConnectionStateDirty;\n this.debug = debug;\n __publicField(this, \"socket\");\n __publicField(this, \"connectionCount\");\n __publicField(this, \"_hasEverConnected\", false);\n __publicField(this, \"lastCloseReason\");\n // State for assembling the split-up Transition currently being received.\n __publicField(this, \"transitionChunkBuffer\", null);\n /** Upon HTTPS/WSS failure, the first jittered backoff duration, in ms. */\n __publicField(this, \"defaultInitialBackoff\");\n /** We backoff exponentially, but we need to cap that--this is the jittered max. */\n __publicField(this, \"maxBackoff\");\n /** How many times have we failed consecutively? */\n __publicField(this, \"retries\");\n /** How long before lack of server response causes us to initiate a reconnect,\n * in ms */\n __publicField(this, \"serverInactivityThreshold\");\n __publicField(this, \"reconnectDueToServerInactivityTimeout\");\n /** Scheduled reconnect state: timeout handle and timing info */\n __publicField(this, \"scheduledReconnect\", null);\n __publicField(this, \"networkOnlineHandler\", null);\n /** Pending event to send after reconnecting due to network recovery */\n __publicField(this, \"pendingNetworkRecoveryInfo\", null);\n __publicField(this, \"uri\");\n __publicField(this, \"onOpen\");\n __publicField(this, \"onResume\");\n __publicField(this, \"onMessage\");\n __publicField(this, \"webSocketConstructor\");\n __publicField(this, \"logger\");\n __publicField(this, \"onServerDisconnectError\");\n this.webSocketConstructor = webSocketConstructor;\n this.socket = { state: \"disconnected\" };\n this.connectionCount = 0;\n this.lastCloseReason = \"InitialConnect\";\n this.defaultInitialBackoff = 1e3;\n this.maxBackoff = 16e3;\n this.retries = 0;\n this.serverInactivityThreshold = 6e4;\n this.reconnectDueToServerInactivityTimeout = null;\n this.uri = uri;\n this.onOpen = callbacks.onOpen;\n this.onResume = callbacks.onResume;\n this.onMessage = callbacks.onMessage;\n this.onServerDisconnectError = callbacks.onServerDisconnectError;\n this.logger = logger;\n this.setupNetworkListener();\n this.connect();\n }\n setSocketState(state) {\n this.socket = state;\n this._logVerbose(\n `socket state changed: ${this.socket.state}, paused: ${\"paused\" in this.socket ? this.socket.paused : void 0}`\n );\n this.markConnectionStateDirty();\n }\n setupNetworkListener() {\n if (typeof window === \"undefined\" || typeof window.addEventListener !== \"function\") {\n return;\n }\n if (this.networkOnlineHandler !== null) {\n return;\n }\n this.networkOnlineHandler = () => {\n this._logVerbose(\"network online event detected\");\n this.tryReconnectImmediately();\n };\n window.addEventListener(\"online\", this.networkOnlineHandler);\n this._logVerbose(\"network online event listener registered\");\n }\n cleanupNetworkListener() {\n if (this.networkOnlineHandler && typeof window !== \"undefined\" && typeof window.removeEventListener === \"function\") {\n window.removeEventListener(\"online\", this.networkOnlineHandler);\n this.networkOnlineHandler = null;\n this._logVerbose(\"network online event listener removed\");\n }\n }\n assembleTransition(chunk) {\n if (chunk.partNumber < 0 || chunk.partNumber >= chunk.totalParts || chunk.totalParts === 0 || this.transitionChunkBuffer && (this.transitionChunkBuffer.totalParts !== chunk.totalParts || this.transitionChunkBuffer.transitionId !== chunk.transitionId)) {\n this.transitionChunkBuffer = null;\n throw new Error(\"Invalid TransitionChunk\");\n }\n if (this.transitionChunkBuffer === null) {\n this.transitionChunkBuffer = {\n chunks: [],\n totalParts: chunk.totalParts,\n transitionId: chunk.transitionId\n };\n }\n if (chunk.partNumber !== this.transitionChunkBuffer.chunks.length) {\n const expectedLength = this.transitionChunkBuffer.chunks.length;\n this.transitionChunkBuffer = null;\n throw new Error(\n `TransitionChunk received out of order: expected part ${expectedLength}, got ${chunk.partNumber}`\n );\n }\n this.transitionChunkBuffer.chunks.push(chunk.chunk);\n if (this.transitionChunkBuffer.chunks.length === chunk.totalParts) {\n const fullJson = this.transitionChunkBuffer.chunks.join(\"\");\n this.transitionChunkBuffer = null;\n const transition = parseServerMessage(JSON.parse(fullJson));\n if (transition.type !== \"Transition\") {\n throw new Error(\n `Expected Transition, got ${transition.type} after assembling chunks`\n );\n }\n return transition;\n }\n return null;\n }\n connect() {\n if (this.socket.state === \"terminated\") {\n return;\n }\n if (this.socket.state !== \"disconnected\" && this.socket.state !== \"stopped\") {\n throw new Error(\n \"Didn't start connection from disconnected state: \" + this.socket.state\n );\n }\n const ws = new this.webSocketConstructor(this.uri);\n this._logVerbose(\"constructed WebSocket\");\n this.setSocketState({\n state: \"connecting\",\n ws,\n paused: \"no\"\n });\n this.resetServerInactivityTimeout();\n ws.onopen = () => {\n this.logger.logVerbose(\"begin ws.onopen\");\n if (this.socket.state !== \"connecting\") {\n throw new Error(\"onopen called with socket not in connecting state\");\n }\n this.setSocketState({\n state: \"ready\",\n ws,\n paused: this.socket.paused === \"yes\" ? \"uninitialized\" : \"no\"\n });\n this.resetServerInactivityTimeout();\n if (this.socket.paused === \"no\") {\n this._hasEverConnected = true;\n this.onOpen({\n connectionCount: this.connectionCount,\n lastCloseReason: this.lastCloseReason,\n clientTs: monotonicMillis()\n });\n }\n if (this.lastCloseReason !== \"InitialConnect\") {\n if (this.lastCloseReason) {\n this.logger.log(\n \"WebSocket reconnected at\",\n prettyNow(),\n \"after disconnect due to\",\n this.lastCloseReason\n );\n } else {\n this.logger.log(\"WebSocket reconnected at\", prettyNow());\n }\n }\n this.connectionCount += 1;\n this.lastCloseReason = null;\n if (this.pendingNetworkRecoveryInfo !== null) {\n const { timeSavedMs } = this.pendingNetworkRecoveryInfo;\n this.pendingNetworkRecoveryInfo = null;\n this.sendMessage({\n type: \"Event\",\n eventType: \"NetworkRecoveryReconnect\",\n event: { timeSavedMs }\n });\n this.logger.log(\n `Network recovery reconnect saved ~${Math.round(timeSavedMs / 1e3)}s of waiting`\n );\n }\n };\n ws.onerror = (error) => {\n this.transitionChunkBuffer = null;\n const message = error.message;\n if (message) {\n this.logger.log(`WebSocket error message: ${message}`);\n }\n };\n ws.onmessage = (message) => {\n this.resetServerInactivityTimeout();\n const messageLength = message.data.length;\n let serverMessage = parseServerMessage(JSON.parse(message.data));\n this._logVerbose(`received ws message with type ${serverMessage.type}`);\n if (serverMessage.type === \"Ping\") {\n return;\n }\n if (serverMessage.type === \"TransitionChunk\") {\n const transition = this.assembleTransition(serverMessage);\n if (!transition) {\n return;\n }\n serverMessage = transition;\n this._logVerbose(\n `assembled full ws message of type ${serverMessage.type}`\n );\n }\n if (this.transitionChunkBuffer !== null) {\n this.transitionChunkBuffer = null;\n this.logger.log(\n `Received unexpected ${serverMessage.type} while buffering TransitionChunks`\n );\n }\n if (serverMessage.type === \"Transition\") {\n this.reportLargeTransition({\n messageLength,\n transition: serverMessage\n });\n }\n const response = this.onMessage(serverMessage);\n if (response.hasSyncedPastLastReconnect) {\n this.retries = 0;\n this.markConnectionStateDirty();\n }\n };\n ws.onclose = (event) => {\n this._logVerbose(\"begin ws.onclose\");\n this.transitionChunkBuffer = null;\n if (this.lastCloseReason === null) {\n this.lastCloseReason = event.reason || `closed with code ${event.code}`;\n }\n if (event.code !== CLOSE_NORMAL && event.code !== CLOSE_GOING_AWAY && // This commonly gets fired on mobile apps when the app is backgrounded\n event.code !== CLOSE_NO_STATUS && event.code !== CLOSE_NOT_FOUND) {\n let msg = `WebSocket closed with code ${event.code}`;\n if (event.reason) {\n msg += `: ${event.reason}`;\n }\n this.logger.log(msg);\n if (this.onServerDisconnectError && event.reason) {\n this.onServerDisconnectError(msg);\n }\n }\n const reason = classifyDisconnectError(event.reason);\n this.scheduleReconnect(reason);\n return;\n };\n }\n /**\n * @returns The state of the {@link Socket}.\n */\n socketState() {\n return this.socket.state;\n }\n /**\n * @param message - A ClientMessage to send.\n * @returns Whether the message (might have been) sent.\n */\n sendMessage(message) {\n const messageForLog = {\n type: message.type,\n ...message.type === \"Authenticate\" && message.tokenType === \"User\" ? {\n value: `...${message.value.slice(-7)}`\n } : {}\n };\n if (this.socket.state === \"ready\" && this.socket.paused === \"no\") {\n const encodedMessage = encodeClientMessage(message);\n const request = JSON.stringify(encodedMessage);\n let sent = false;\n try {\n this.socket.ws.send(request);\n sent = true;\n } catch (error) {\n this.logger.log(\n `Failed to send message on WebSocket, reconnecting: ${error}`\n );\n this.closeAndReconnect(\"FailedToSendMessage\");\n }\n this._logVerbose(\n `${sent ? \"sent\" : \"failed to send\"} message with type ${message.type}: ${JSON.stringify(\n messageForLog\n )}`\n );\n return true;\n }\n this._logVerbose(\n `message not sent (socket state: ${this.socket.state}, paused: ${\"paused\" in this.socket ? this.socket.paused : void 0}): ${JSON.stringify(\n messageForLog\n )}`\n );\n return false;\n }\n resetServerInactivityTimeout() {\n if (this.socket.state === \"terminated\") {\n return;\n }\n if (this.reconnectDueToServerInactivityTimeout !== null) {\n clearTimeout(this.reconnectDueToServerInactivityTimeout);\n this.reconnectDueToServerInactivityTimeout = null;\n }\n this.reconnectDueToServerInactivityTimeout = setTimeout(() => {\n this.closeAndReconnect(\"InactiveServer\");\n }, this.serverInactivityThreshold);\n }\n scheduleReconnect(reason) {\n if (this.scheduledReconnect) {\n clearTimeout(this.scheduledReconnect.timeout);\n this.scheduledReconnect = null;\n }\n this.socket = { state: \"disconnected\" };\n const backoff = this.nextBackoff(reason);\n this.markConnectionStateDirty();\n this.logger.log(`Attempting reconnect in ${Math.round(backoff)}ms`);\n const scheduledAt = monotonicMillis();\n const timeoutId = setTimeout(() => {\n if (this.scheduledReconnect?.timeout === timeoutId) {\n this.scheduledReconnect = null;\n this.connect();\n }\n }, backoff);\n this.scheduledReconnect = {\n timeout: timeoutId,\n scheduledAt,\n backoffMs: backoff\n };\n }\n /**\n * Close the WebSocket and schedule a reconnect.\n *\n * This should be used when we hit an error and would like to restart the session.\n */\n closeAndReconnect(closeReason) {\n this._logVerbose(`begin closeAndReconnect with reason ${closeReason}`);\n switch (this.socket.state) {\n case \"disconnected\":\n case \"terminated\":\n case \"stopped\":\n return;\n case \"connecting\":\n case \"ready\": {\n this.lastCloseReason = closeReason;\n void this.close();\n this.scheduleReconnect(\"client\");\n return;\n }\n default: {\n this.socket;\n }\n }\n }\n /**\n * Close the WebSocket, being careful to clear the onclose handler to avoid re-entrant\n * calls. Use this instead of directly calling `ws.close()`\n *\n * It is the callers responsibility to update the state after this method is called so that the\n * closed socket is not accessible or used again after this method is called\n */\n close() {\n this.transitionChunkBuffer = null;\n switch (this.socket.state) {\n case \"disconnected\":\n case \"terminated\":\n case \"stopped\":\n return Promise.resolve();\n case \"connecting\": {\n const ws = this.socket.ws;\n ws.onmessage = (_message) => {\n this._logVerbose(\"Ignoring message received after close\");\n };\n return new Promise((r) => {\n ws.onclose = () => {\n this._logVerbose(\"Closed after connecting\");\n r();\n };\n ws.onopen = () => {\n this._logVerbose(\"Opened after connecting\");\n ws.close();\n };\n });\n }\n case \"ready\": {\n this._logVerbose(\"ws.close called\");\n const ws = this.socket.ws;\n ws.onmessage = (_message) => {\n this._logVerbose(\"Ignoring message received after close\");\n };\n const result = new Promise((r) => {\n ws.onclose = () => {\n r();\n };\n });\n ws.close();\n return result;\n }\n default: {\n this.socket;\n return Promise.resolve();\n }\n }\n }\n /**\n * Close the WebSocket and do not reconnect.\n * @returns A Promise that resolves when the WebSocket `onClose` callback is called.\n */\n terminate() {\n if (this.reconnectDueToServerInactivityTimeout) {\n clearTimeout(this.reconnectDueToServerInactivityTimeout);\n }\n if (this.scheduledReconnect) {\n clearTimeout(this.scheduledReconnect.timeout);\n this.scheduledReconnect = null;\n }\n this.cleanupNetworkListener();\n switch (this.socket.state) {\n case \"terminated\":\n case \"stopped\":\n case \"disconnected\":\n case \"connecting\":\n case \"ready\": {\n const result = this.close();\n this.setSocketState({ state: \"terminated\" });\n return result;\n }\n default: {\n this.socket;\n throw new Error(\n `Invalid websocket state: ${this.socket.state}`\n );\n }\n }\n }\n stop() {\n switch (this.socket.state) {\n case \"terminated\":\n return Promise.resolve();\n case \"connecting\":\n case \"stopped\":\n case \"disconnected\":\n case \"ready\": {\n this.cleanupNetworkListener();\n const result = this.close();\n this.socket = { state: \"stopped\" };\n return result;\n }\n default: {\n this.socket;\n return Promise.resolve();\n }\n }\n }\n /**\n * Create a new WebSocket after a previous `stop()`, unless `terminate()` was\n * called before.\n */\n tryRestart() {\n switch (this.socket.state) {\n case \"stopped\":\n break;\n case \"terminated\":\n case \"connecting\":\n case \"ready\":\n case \"disconnected\":\n this.logger.logVerbose(\"Restart called without stopping first\");\n return;\n default: {\n this.socket;\n }\n }\n this.setupNetworkListener();\n this.connect();\n }\n pause() {\n switch (this.socket.state) {\n case \"disconnected\":\n case \"stopped\":\n case \"terminated\":\n return;\n case \"connecting\":\n case \"ready\": {\n this.socket = { ...this.socket, paused: \"yes\" };\n return;\n }\n default: {\n this.socket;\n return;\n }\n }\n }\n /**\n * Try to reconnect immediately, canceling any scheduled reconnect.\n * This is useful when detecting network recovery.\n * Only takes action if we're in disconnected state (waiting to reconnect).\n */\n tryReconnectImmediately() {\n this._logVerbose(\"tryReconnectImmediately called\");\n if (this.socket.state !== \"disconnected\") {\n this._logVerbose(\n `tryReconnectImmediately called but socket state is ${this.socket.state}, no action taken`\n );\n return;\n }\n let timeSavedMs = null;\n if (this.scheduledReconnect) {\n const elapsed = monotonicMillis() - this.scheduledReconnect.scheduledAt;\n timeSavedMs = Math.max(0, this.scheduledReconnect.backoffMs - elapsed);\n this._logVerbose(\n `would have waited ${Math.round(timeSavedMs)}ms more (backoff was ${Math.round(this.scheduledReconnect.backoffMs)}ms, elapsed ${Math.round(elapsed)}ms)`\n );\n clearTimeout(this.scheduledReconnect.timeout);\n this.scheduledReconnect = null;\n this._logVerbose(\"canceled scheduled reconnect\");\n }\n this.logger.log(\"Network recovery detected, reconnecting immediately\");\n this.pendingNetworkRecoveryInfo = timeSavedMs !== null ? { timeSavedMs } : null;\n this.connect();\n }\n /**\n * Resume the state machine if previously paused.\n */\n resume() {\n switch (this.socket.state) {\n case \"connecting\":\n this.socket = { ...this.socket, paused: \"no\" };\n return;\n case \"ready\":\n if (this.socket.paused === \"uninitialized\") {\n this.socket = { ...this.socket, paused: \"no\" };\n this._hasEverConnected = true;\n this.onOpen({\n connectionCount: this.connectionCount,\n lastCloseReason: this.lastCloseReason,\n clientTs: monotonicMillis()\n });\n } else if (this.socket.paused === \"yes\") {\n this.socket = { ...this.socket, paused: \"no\" };\n this.onResume();\n }\n return;\n case \"terminated\":\n case \"stopped\":\n case \"disconnected\":\n return;\n default: {\n this.socket;\n }\n }\n this.connect();\n }\n connectionState() {\n return {\n isConnected: this.socket.state === \"ready\",\n hasEverConnected: this._hasEverConnected,\n connectionCount: this.connectionCount,\n connectionRetries: this.retries\n };\n }\n _logVerbose(message) {\n this.logger.logVerbose(message);\n }\n nextBackoff(reason) {\n const initialBackoff = reason === \"client\" ? 100 : reason === \"Unknown\" ? this.defaultInitialBackoff : serverDisconnectErrors[reason].timeout;\n const baseBackoff = initialBackoff * Math.pow(2, this.retries);\n this.retries += 1;\n const actualBackoff = Math.min(baseBackoff, this.maxBackoff);\n const jitter = actualBackoff * (Math.random() - 0.5);\n return actualBackoff + jitter;\n }\n reportLargeTransition({\n transition,\n messageLength\n }) {\n if (transition.clientClockSkew === void 0 || transition.serverTs === void 0) {\n return;\n }\n const transitionTransitTime = monotonicMillis() - // client time now\n // clientClockSkew = (server time + upstream latency) - client time\n // clientClockSkew is \"how many milliseconds behind (slow) is the client clock\"\n // but the latency of the Connect message inflates this, making it appear further behind\n transition.clientClockSkew - transition.serverTs / 1e6;\n const prettyTransitionTime = `${Math.round(transitionTransitTime)}ms`;\n const prettyMessageMB = `${Math.round(messageLength / 1e4) / 100}MB`;\n const bytesPerSecond = messageLength / (transitionTransitTime / 1e3);\n const prettyBytesPerSecond = `${Math.round(bytesPerSecond / 1e4) / 100}MB per second`;\n this._logVerbose(\n `received ${prettyMessageMB} transition in ${prettyTransitionTime} at ${prettyBytesPerSecond}`\n );\n if (messageLength > 2e7) {\n this.logger.log(\n `received query results totaling more that 20MB (${prettyMessageMB}) which will take a long time to download on slower connections`\n );\n } else if (transitionTransitTime > 2e4) {\n this.logger.log(\n `received query results totaling ${prettyMessageMB} which took more than 20s to arrive (${prettyTransitionTime})`\n );\n }\n if (this.debug) {\n this.sendMessage({\n type: \"Event\",\n eventType: \"ClientReceivedTransition\",\n event: { transitionTransitTime, messageLength }\n });\n }\n }\n}\n//# sourceMappingURL=web_socket_manager.js.map\n","\"use strict\";\nexport function newSessionId() {\n return uuidv4();\n}\nfunction uuidv4() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0, v = c === \"x\" ? r : r & 3 | 8;\n return v.toString(16);\n });\n}\n//# sourceMappingURL=session.js.map\n","\"use strict\";\nexport class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, (_m, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n })\n );\n}\nfunction base64UrlDecode(str) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n try {\n return b64DecodeUnicode(output);\n } catch {\n return atob(output);\n }\n}\nexport function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n options || (options = {});\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(\n `Invalid token specified: missing part #${pos + 1}`\n );\n }\n let decoded;\n try {\n decoded = base64UrlDecode(part);\n } catch (e) {\n throw new InvalidTokenError(\n `Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`\n );\n }\n try {\n return JSON.parse(decoded);\n } catch (e) {\n throw new InvalidTokenError(\n `Invalid token specified: invalid json for part #${pos + 1} (${e.message})`\n );\n }\n}\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { jwtDecode } from \"../../vendor/jwt-decode/index.js\";\nconst MAXIMUM_REFRESH_DELAY = 20 * 24 * 60 * 60 * 1e3;\nconst MAX_TOKEN_CONFIRMATION_ATTEMPTS = 2;\nexport class AuthenticationManager {\n constructor(syncState, callbacks, config) {\n __publicField(this, \"authState\", { state: \"noAuth\" });\n // Used to detect races involving `setConfig` calls\n // while a token is being fetched.\n __publicField(this, \"configVersion\", 0);\n // Shared by the BaseClient so that the auth manager can easily inspect it\n __publicField(this, \"syncState\");\n // Passed down by BaseClient, sends a message to the server\n __publicField(this, \"authenticate\");\n __publicField(this, \"stopSocket\");\n __publicField(this, \"tryRestartSocket\");\n __publicField(this, \"pauseSocket\");\n __publicField(this, \"resumeSocket\");\n // Passed down by BaseClient, sends a message to the server\n __publicField(this, \"clearAuth\");\n __publicField(this, \"logger\");\n __publicField(this, \"refreshTokenLeewaySeconds\");\n // Track last value to avoid redundant calls\n __publicField(this, \"lastRefreshChange\");\n // Number of times we have attempted to confirm the latest token. We retry up\n // to `MAX_TOKEN_CONFIRMATION_ATTEMPTS` times.\n __publicField(this, \"tokenConfirmationAttempts\", 0);\n this.syncState = syncState;\n this.authenticate = callbacks.authenticate;\n this.stopSocket = callbacks.stopSocket;\n this.tryRestartSocket = callbacks.tryRestartSocket;\n this.pauseSocket = callbacks.pauseSocket;\n this.resumeSocket = callbacks.resumeSocket;\n this.clearAuth = callbacks.clearAuth;\n this.logger = config.logger;\n this.refreshTokenLeewaySeconds = config.refreshTokenLeewaySeconds;\n this.lastRefreshChange = false;\n }\n notifyRefreshChange(isRefreshing) {\n if (this.authState.state !== \"noAuth\" && this.authState.state !== \"initialRefetch\" && this.authState.config.onRefreshChange && this.lastRefreshChange !== isRefreshing) {\n this.lastRefreshChange = isRefreshing;\n this.authState.config.onRefreshChange(isRefreshing);\n }\n }\n async setConfig(fetchToken, onChange, onRefreshChange) {\n this.resetAuthState();\n this._logVerbose(\"pausing WS for auth token fetch\");\n this.pauseSocket();\n const token = await this.fetchTokenAndGuardAgainstRace(fetchToken, {\n forceRefreshToken: false\n });\n if (token.isFromOutdatedConfig) {\n return;\n }\n const config = {\n fetchToken,\n onAuthChange: onChange,\n onRefreshChange\n };\n if (token.value) {\n this.setAuthState({\n state: \"waitingForServerConfirmationOfCachedToken\",\n config,\n hasRetried: false\n });\n this.authenticate(token.value);\n } else {\n this.setAuthState({\n state: \"initialRefetch\",\n config\n });\n await this.refetchToken();\n }\n this._logVerbose(\"resuming WS after auth token fetch\");\n this.resumeSocket();\n }\n onTransition(serverMessage) {\n if (!this.syncState.isCurrentOrNewerAuthVersion(\n serverMessage.endVersion.identity\n )) {\n return;\n }\n if (serverMessage.endVersion.identity <= serverMessage.startVersion.identity) {\n return;\n }\n this._logVerbose(\n `auth state is ${this.authState.state} when handling transition`\n );\n this.syncState.markAuthCompletion();\n if (this.authState.state === \"waitingForServerConfirmationOfCachedToken\") {\n this._logVerbose(\"server confirmed auth token is valid\");\n void this.refetchToken();\n this.authState.config.onAuthChange(true);\n return;\n }\n if (this.authState.state === \"waitingForServerConfirmationOfFreshToken\") {\n this._logVerbose(\"server confirmed new auth token is valid\");\n this.notifyRefreshChange(false);\n this.scheduleTokenRefetch(this.authState.token);\n this.tokenConfirmationAttempts = 0;\n if (!this.authState.hadAuth) {\n this.authState.config.onAuthChange(true);\n }\n }\n }\n onAuthError(serverMessage) {\n if (serverMessage.authUpdateAttempted === false && (this.authState.state === \"waitingForServerConfirmationOfFreshToken\" || this.authState.state === \"waitingForServerConfirmationOfCachedToken\")) {\n this._logVerbose(\"ignoring non-auth token expired error\");\n return;\n }\n const { baseVersion } = serverMessage;\n if (!this.syncState.isCurrentOrNewerAuthVersion(baseVersion + 1)) {\n this._logVerbose(\"ignoring auth error for previous auth attempt\");\n return;\n }\n void this.tryToReauthenticate(serverMessage);\n return;\n }\n // This is similar to `refetchToken` defined below, in fact we\n // don't represent them as different states, but it is different\n // in that we pause the WebSocket so that mutations\n // don't retry with bad auth.\n async tryToReauthenticate(serverMessage) {\n this._logVerbose(`attempting to reauthenticate: ${serverMessage.error}`);\n if (\n // No way to fetch another token, kaboom\n this.authState.state === \"noAuth\" || // We failed on a fresh token. After a small number of retries, we give up\n // and clear the auth state to avoid infinite retries.\n this.authState.state === \"waitingForServerConfirmationOfFreshToken\" && this.tokenConfirmationAttempts >= MAX_TOKEN_CONFIRMATION_ATTEMPTS\n ) {\n this.logger.error(\n `Failed to authenticate: \"${serverMessage.error}\", check your server auth config`\n );\n if (this.syncState.hasAuth()) {\n this.syncState.clearAuth();\n }\n if (this.authState.state !== \"noAuth\") {\n this.setAndReportAuthFailed(this.authState.config.onAuthChange);\n }\n return;\n }\n if (this.authState.state === \"waitingForServerConfirmationOfFreshToken\") {\n this.tokenConfirmationAttempts++;\n this._logVerbose(\n `retrying reauthentication, ${MAX_TOKEN_CONFIRMATION_ATTEMPTS - this.tokenConfirmationAttempts} attempts remaining`\n );\n }\n this.notifyRefreshChange(true);\n await this.stopSocket();\n if (this.authState.state === \"noAuth\") {\n return;\n }\n const token = await this.fetchTokenAndGuardAgainstRace(\n this.authState.config.fetchToken,\n {\n forceRefreshToken: true\n }\n );\n if (token.isFromOutdatedConfig) {\n return;\n }\n if (token.value && this.syncState.isNewAuth(token.value)) {\n this.authenticate(token.value);\n this.setAuthState({\n state: \"waitingForServerConfirmationOfFreshToken\",\n config: this.authState.config,\n token: token.value,\n hadAuth: this.authState.state === \"notRefetching\" || this.authState.state === \"waitingForScheduledRefetch\"\n });\n } else {\n this._logVerbose(\"reauthentication failed, could not fetch a new token\");\n if (this.syncState.hasAuth()) {\n this.syncState.clearAuth();\n }\n this.setAndReportAuthFailed(this.authState.config.onAuthChange);\n }\n this.tryRestartSocket();\n }\n // Force refetch the token and schedule another refetch\n // before the token expires - an active client should never\n // need to reauthenticate.\n async refetchToken() {\n if (this.authState.state === \"noAuth\") {\n return;\n }\n this._logVerbose(\"refetching auth token\");\n const token = await this.fetchTokenAndGuardAgainstRace(\n this.authState.config.fetchToken,\n {\n forceRefreshToken: true\n }\n );\n if (token.isFromOutdatedConfig) {\n return;\n }\n if (token.value) {\n if (this.syncState.isNewAuth(token.value)) {\n this.setAuthState({\n state: \"waitingForServerConfirmationOfFreshToken\",\n hadAuth: this.syncState.hasAuth(),\n token: token.value,\n config: this.authState.config\n });\n this.authenticate(token.value);\n } else {\n this.setAuthState({\n state: \"notRefetching\",\n config: this.authState.config\n });\n }\n } else {\n this._logVerbose(\"refetching token failed\");\n if (this.syncState.hasAuth()) {\n this.clearAuth();\n }\n this.setAndReportAuthFailed(this.authState.config.onAuthChange);\n }\n this._logVerbose(\n \"restarting WS after auth token fetch (if currently stopped)\"\n );\n this.tryRestartSocket();\n }\n scheduleTokenRefetch(token) {\n if (this.authState.state === \"noAuth\") {\n return;\n }\n const decodedToken = this.decodeToken(token);\n if (!decodedToken) {\n this.logger.error(\n \"Auth token is not a valid JWT, cannot refetch the token\"\n );\n return;\n }\n const { iat, exp } = decodedToken;\n if (!iat || !exp) {\n this.logger.error(\n \"Auth token does not have required fields, cannot refetch the token\"\n );\n return;\n }\n const tokenValiditySeconds = exp - iat;\n if (tokenValiditySeconds <= 2) {\n this.logger.error(\n \"Auth token does not live long enough, cannot refetch the token\"\n );\n return;\n }\n let delay = Math.min(\n MAXIMUM_REFRESH_DELAY,\n (tokenValiditySeconds - this.refreshTokenLeewaySeconds) * 1e3\n );\n if (delay <= 0) {\n this.logger.warn(\n `Refetching auth token immediately, configured leeway ${this.refreshTokenLeewaySeconds}s is larger than the token's lifetime ${tokenValiditySeconds}s`\n );\n delay = 0;\n }\n const refetchTokenTimeoutId = setTimeout(() => {\n this._logVerbose(\"running scheduled token refetch\");\n void this.refetchToken();\n }, delay);\n this.setAuthState({\n state: \"waitingForScheduledRefetch\",\n refetchTokenTimeoutId,\n config: this.authState.config\n });\n this._logVerbose(\n `scheduled preemptive auth token refetching in ${delay}ms`\n );\n }\n // Protects against simultaneous calls to `setConfig`\n // while we're fetching a token\n async fetchTokenAndGuardAgainstRace(fetchToken, fetchArgs) {\n const originalConfigVersion = ++this.configVersion;\n this._logVerbose(\n `fetching token with config version ${originalConfigVersion}`\n );\n const token = await fetchToken(fetchArgs);\n if (this.configVersion !== originalConfigVersion) {\n this._logVerbose(\n `stale config version, expected ${originalConfigVersion}, got ${this.configVersion}`\n );\n return { isFromOutdatedConfig: true };\n }\n return { isFromOutdatedConfig: false, value: token };\n }\n stop() {\n this.resetAuthState();\n this.configVersion++;\n this._logVerbose(`config version bumped to ${this.configVersion}`);\n }\n setAndReportAuthFailed(onAuthChange) {\n onAuthChange(false);\n this.resetAuthState();\n }\n // The sole path to `state === \"noAuth\"`; consumers rely on this firing\n // `notifyRefreshChange(false)` to pair any in-flight `(true)`. May run\n // when refresh state is already false.\n resetAuthState() {\n this.notifyRefreshChange(false);\n this.setAuthState({ state: \"noAuth\" });\n }\n setAuthState(newAuth) {\n const authStateForLog = newAuth.state === \"waitingForServerConfirmationOfFreshToken\" ? {\n hadAuth: newAuth.hadAuth,\n state: newAuth.state,\n token: `...${newAuth.token.slice(-7)}`\n } : { state: newAuth.state };\n this._logVerbose(\n `setting auth state to ${JSON.stringify(authStateForLog)}`\n );\n switch (newAuth.state) {\n case \"waitingForScheduledRefetch\":\n case \"notRefetching\":\n case \"noAuth\":\n this.tokenConfirmationAttempts = 0;\n break;\n case \"waitingForServerConfirmationOfFreshToken\":\n case \"waitingForServerConfirmationOfCachedToken\":\n case \"initialRefetch\":\n break;\n default: {\n newAuth;\n }\n }\n if (this.authState.state === \"waitingForScheduledRefetch\") {\n clearTimeout(this.authState.refetchTokenTimeoutId);\n }\n this.authState = newAuth;\n }\n decodeToken(token) {\n try {\n return jwtDecode(token);\n } catch (e) {\n this._logVerbose(\n `Error decoding token: ${e instanceof Error ? e.message : \"Unknown error\"}`\n );\n return null;\n }\n }\n _logVerbose(message) {\n this.logger.logVerbose(`${message} [v${this.configVersion}]`);\n }\n}\n//# sourceMappingURL=authentication_manager.js.map\n","\"use strict\";\nconst markNames = [\n \"convexClientConstructed\",\n \"convexWebSocketOpen\",\n \"convexFirstMessageReceived\"\n];\nexport function mark(name, sessionId) {\n const detail = { sessionId };\n if (typeof performance === \"undefined\" || !performance.mark) return;\n performance.mark(name, { detail });\n}\nfunction performanceMarkToJson(mark2) {\n let name = mark2.name.slice(\"convex\".length);\n name = name.charAt(0).toLowerCase() + name.slice(1);\n return {\n name,\n startTime: mark2.startTime\n };\n}\nexport function getMarksReport(sessionId) {\n if (typeof performance === \"undefined\" || !performance.getEntriesByName) {\n return [];\n }\n const allMarks = [];\n for (const name of markNames) {\n const marks = performance.getEntriesByName(name).filter((entry) => entry.entryType === \"mark\").filter((mark2) => mark2.detail.sessionId === sessionId);\n allMarks.push(...marks);\n }\n return allMarks.map(performanceMarkToJson);\n}\n//# sourceMappingURL=metrics.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { version } from \"../../index.js\";\nimport { convexToJson } from \"../../values/index.js\";\nimport {\n createHybridErrorStacktrace,\n forwardData,\n instantiateDefaultLogger,\n instantiateNoopLogger,\n logFatalError\n} from \"../logging.js\";\nimport { LocalSyncState } from \"./local_state.js\";\nimport { RequestManager } from \"./request_manager.js\";\nimport {\n OptimisticQueryResults\n} from \"./optimistic_updates_impl.js\";\nimport { RemoteQuerySet } from \"./remote_query_set.js\";\nimport { serializePathAndArgs } from \"./udf_path_utils.js\";\nimport { WebSocketManager } from \"./web_socket_manager.js\";\nimport { newSessionId } from \"./session.js\";\nimport {\n AuthenticationManager\n} from \"./authentication_manager.js\";\nimport { getMarksReport, mark } from \"./metrics.js\";\nimport { parseArgs, validateDeploymentUrl } from \"../../common/index.js\";\nimport { ConvexError } from \"../../values/errors.js\";\nimport { jwtDecode } from \"../../vendor/jwt-decode/index.js\";\nexport class BaseConvexClient {\n /**\n * @param address - The url of your Convex deployment, often provided\n * by an environment variable. E.g. `https://small-mouse-123.convex.cloud`.\n * @param onTransition - A callback receiving an array of query tokens\n * corresponding to query results that have changed -- additional handlers\n * can be added via `addOnTransitionHandler`.\n * @param options - See {@link BaseConvexClientOptions} for a full description.\n */\n constructor(address, onTransition, options) {\n __publicField(this, \"address\");\n __publicField(this, \"state\");\n __publicField(this, \"requestManager\");\n __publicField(this, \"webSocketManager\");\n __publicField(this, \"authenticationManager\");\n __publicField(this, \"remoteQuerySet\");\n __publicField(this, \"optimisticQueryResults\");\n __publicField(this, \"_transitionHandlerCounter\", 0);\n __publicField(this, \"_nextRequestId\");\n __publicField(this, \"_onTransitionFns\", /* @__PURE__ */ new Map());\n __publicField(this, \"_sessionId\");\n __publicField(this, \"firstMessageReceived\", false);\n __publicField(this, \"debug\");\n __publicField(this, \"logger\");\n __publicField(this, \"maxObservedTimestamp\");\n __publicField(this, \"connectionStateSubscribers\", /* @__PURE__ */ new Map());\n __publicField(this, \"nextConnectionStateSubscriberId\", 0);\n __publicField(this, \"_lastPublishedConnectionState\");\n /**\n * Call this whenever the connection state may have changed in a way that could\n * require publishing it. Schedules a possibly update.\n */\n __publicField(this, \"markConnectionStateDirty\", () => {\n void Promise.resolve().then(() => {\n const curConnectionState = this.connectionState();\n if (JSON.stringify(curConnectionState) !== JSON.stringify(this._lastPublishedConnectionState)) {\n this._lastPublishedConnectionState = curConnectionState;\n for (const cb of this.connectionStateSubscribers.values()) {\n cb(curConnectionState);\n }\n }\n });\n });\n // Instance property so that `mark()` doesn't need to be called as a method.\n __publicField(this, \"mark\", (name) => {\n if (this.debug) {\n mark(name, this.sessionId);\n }\n });\n if (typeof address === \"object\") {\n throw new Error(\n \"Passing a ClientConfig object is no longer supported. Pass the URL of the Convex deployment as a string directly.\"\n );\n }\n if (options?.skipConvexDeploymentUrlCheck !== true) {\n validateDeploymentUrl(address);\n }\n options = { ...options };\n const authRefreshTokenLeewaySeconds = options.authRefreshTokenLeewaySeconds ?? 10;\n let webSocketConstructor = options.webSocketConstructor;\n if (!webSocketConstructor && typeof WebSocket === \"undefined\") {\n throw new Error(\n \"No WebSocket global variable defined! To use Convex in an environment without WebSocket try the HTTP client: https://docs.convex.dev/api/classes/browser.ConvexHttpClient\"\n );\n }\n webSocketConstructor = webSocketConstructor || WebSocket;\n this.debug = options.reportDebugInfoToConvex ?? false;\n this.address = address;\n this.logger = options.logger === false ? instantiateNoopLogger({ verbose: options.verbose ?? false }) : options.logger !== true && options.logger ? options.logger : instantiateDefaultLogger({ verbose: options.verbose ?? false });\n const i = address.search(\"://\");\n if (i === -1) {\n throw new Error(\"Provided address was not an absolute URL.\");\n }\n const origin = address.substring(i + 3);\n const protocol = address.substring(0, i);\n let wsProtocol;\n if (protocol === \"http\") {\n wsProtocol = \"ws\";\n } else if (protocol === \"https\") {\n wsProtocol = \"wss\";\n } else {\n throw new Error(`Unknown parent protocol ${protocol}`);\n }\n const wsUri = `${wsProtocol}://${origin}/api/${version}/sync`;\n this.state = new LocalSyncState();\n this.remoteQuerySet = new RemoteQuerySet(\n (queryId) => this.state.queryPath(queryId),\n this.logger\n );\n this.requestManager = new RequestManager(\n this.logger,\n this.markConnectionStateDirty\n );\n const pauseSocket = () => {\n this.webSocketManager.pause();\n this.state.pause();\n };\n this.authenticationManager = new AuthenticationManager(\n this.state,\n {\n authenticate: (token) => {\n const message = this.state.setAuth(token);\n this.webSocketManager.sendMessage(message);\n return message.baseVersion;\n },\n stopSocket: () => this.webSocketManager.stop(),\n tryRestartSocket: () => this.webSocketManager.tryRestart(),\n pauseSocket,\n resumeSocket: () => this.webSocketManager.resume(),\n clearAuth: () => {\n this.clearAuth();\n }\n },\n {\n logger: this.logger,\n refreshTokenLeewaySeconds: authRefreshTokenLeewaySeconds\n }\n );\n this.optimisticQueryResults = new OptimisticQueryResults();\n this.addOnTransitionHandler((transition) => {\n onTransition(transition.queries.map((q) => q.token));\n });\n this._nextRequestId = 0;\n this._sessionId = newSessionId();\n const { unsavedChangesWarning } = options;\n if (typeof window === \"undefined\" || typeof window.addEventListener === \"undefined\") {\n if (unsavedChangesWarning === true) {\n throw new Error(\n \"unsavedChangesWarning requested, but window.addEventListener not found! Remove {unsavedChangesWarning: true} from Convex client options.\"\n );\n }\n } else if (unsavedChangesWarning !== false) {\n window.addEventListener(\"beforeunload\", (e) => {\n if (this.requestManager.hasIncompleteRequests()) {\n e.preventDefault();\n const confirmationMessage = \"Are you sure you want to leave? Your changes may not be saved.\";\n (e || window.event).returnValue = confirmationMessage;\n return confirmationMessage;\n }\n });\n }\n this.webSocketManager = new WebSocketManager(\n wsUri,\n {\n onOpen: (reconnectMetadata) => {\n this.mark(\"convexWebSocketOpen\");\n this.webSocketManager.sendMessage({\n ...reconnectMetadata,\n type: \"Connect\",\n sessionId: this._sessionId,\n maxObservedTimestamp: this.maxObservedTimestamp\n });\n this.remoteQuerySet = new RemoteQuerySet(\n (queryId) => this.state.queryPath(queryId),\n this.logger\n );\n const [querySetModification, authModification] = this.state.restart();\n if (authModification) {\n this.webSocketManager.sendMessage(authModification);\n }\n this.webSocketManager.sendMessage(querySetModification);\n for (const message of this.requestManager.restart()) {\n this.webSocketManager.sendMessage(message);\n }\n },\n onResume: () => {\n const [querySetModification, authModification] = this.state.resume();\n if (authModification) {\n this.webSocketManager.sendMessage(authModification);\n }\n if (querySetModification) {\n this.webSocketManager.sendMessage(querySetModification);\n }\n for (const message of this.requestManager.resume()) {\n this.webSocketManager.sendMessage(message);\n }\n },\n onMessage: (serverMessage) => {\n if (!this.firstMessageReceived) {\n this.firstMessageReceived = true;\n this.mark(\"convexFirstMessageReceived\");\n this.reportMarks();\n }\n switch (serverMessage.type) {\n case \"Transition\": {\n this.observedTimestamp(serverMessage.endVersion.ts);\n this.authenticationManager.onTransition(serverMessage);\n this.remoteQuerySet.transition(serverMessage);\n this.state.transition(serverMessage);\n const completedRequests = this.requestManager.removeCompleted(\n this.remoteQuerySet.timestamp()\n );\n this.notifyOnQueryResultChanges(completedRequests);\n break;\n }\n case \"MutationResponse\": {\n if (serverMessage.success) {\n this.observedTimestamp(serverMessage.ts);\n }\n const completedMutationInfo = this.requestManager.onResponse(serverMessage);\n if (completedMutationInfo !== null) {\n this.notifyOnQueryResultChanges(\n /* @__PURE__ */ new Map([\n [\n completedMutationInfo.requestId,\n completedMutationInfo.result\n ]\n ])\n );\n }\n break;\n }\n case \"ActionResponse\": {\n this.requestManager.onResponse(serverMessage);\n break;\n }\n case \"AuthError\": {\n this.authenticationManager.onAuthError(serverMessage);\n break;\n }\n case \"FatalError\": {\n const error = logFatalError(this.logger, serverMessage.error);\n void this.webSocketManager.terminate();\n throw error;\n }\n default: {\n serverMessage;\n }\n }\n return {\n hasSyncedPastLastReconnect: this.hasSyncedPastLastReconnect()\n };\n },\n onServerDisconnectError: options.onServerDisconnectError\n },\n webSocketConstructor,\n this.logger,\n this.markConnectionStateDirty,\n this.debug\n );\n this.mark(\"convexClientConstructed\");\n if (options.expectAuth) {\n pauseSocket();\n }\n }\n /**\n * Return true if there is outstanding work from prior to the time of the most recent restart.\n * This indicates that the client has not proven itself to have gotten past the issue that\n * potentially led to the restart. Use this to influence when to reset backoff after a failure.\n */\n hasSyncedPastLastReconnect() {\n const hasSyncedPastLastReconnect = this.requestManager.hasSyncedPastLastReconnect() && this.state.hasSyncedPastLastReconnect();\n return hasSyncedPastLastReconnect;\n }\n observedTimestamp(observedTs) {\n if (this.maxObservedTimestamp === void 0 || this.maxObservedTimestamp.lessThanOrEqual(observedTs)) {\n this.maxObservedTimestamp = observedTs;\n }\n }\n getMaxObservedTimestamp() {\n return this.maxObservedTimestamp;\n }\n /**\n * Compute the current query results based on the remoteQuerySet and the\n * current optimistic updates and call `onTransition` for all the changed\n * queries.\n *\n * @param completedMutations - A set of mutation IDs whose optimistic updates\n * are no longer needed.\n */\n notifyOnQueryResultChanges(completedRequests) {\n const remoteQueryResults = this.remoteQuerySet.remoteQueryResults();\n const queryTokenToValue = /* @__PURE__ */ new Map();\n for (const [queryId, result] of remoteQueryResults) {\n const queryToken = this.state.queryToken(queryId);\n if (queryToken !== null) {\n const query = {\n result,\n udfPath: this.state.queryPath(queryId),\n args: this.state.queryArgs(queryId)\n };\n queryTokenToValue.set(queryToken, query);\n }\n }\n const changedQueryTokens = this.optimisticQueryResults.ingestQueryResultsFromServer(\n queryTokenToValue,\n new Set(completedRequests.keys())\n );\n this.handleTransition({\n queries: changedQueryTokens.map((token) => {\n const optimisticResult = this.optimisticQueryResults.rawQueryResult(token);\n return {\n token,\n modification: {\n kind: \"Updated\",\n result: optimisticResult\n }\n };\n }),\n reflectedMutations: Array.from(completedRequests).map(\n ([requestId, result]) => ({\n requestId,\n result\n })\n ),\n timestamp: this.remoteQuerySet.timestamp()\n });\n }\n handleTransition(transition) {\n for (const fn of this._onTransitionFns.values()) {\n fn(transition);\n }\n }\n /**\n * Add a handler that will be called on a transition.\n *\n * Any external side effects (e.g. setting React state) should be handled here.\n *\n * @param fn\n *\n * @returns\n */\n addOnTransitionHandler(fn) {\n const id = this._transitionHandlerCounter++;\n this._onTransitionFns.set(id, fn);\n return () => this._onTransitionFns.delete(id);\n }\n /**\n * Get the current JWT auth token and decoded claims.\n */\n getCurrentAuthClaims() {\n const authToken = this.state.getAuth();\n let decoded = {};\n if (authToken && authToken.tokenType === \"User\") {\n try {\n decoded = authToken ? jwtDecode(authToken.value) : {};\n } catch {\n decoded = {};\n }\n } else {\n return void 0;\n }\n return { token: authToken.value, decoded };\n }\n /**\n * Set the authentication token to be used for subsequent queries and mutations.\n * `fetchToken` will be called automatically again if a token expires.\n * `fetchToken` should return `null` if the token cannot be retrieved, for example\n * when the user's rights were permanently revoked.\n * @param fetchToken - an async function returning the JWT-encoded OpenID Connect Identity Token\n * @param onChange - a callback that will be called when the authentication status changes\n * @param onRefreshChange - a callback called with `true` when the socket is paused to fetch a replacement token after a server rejection, and `false` when refresh completes\n */\n setAuth(fetchToken, onChange, onRefreshChange) {\n void this.authenticationManager.setConfig(\n fetchToken,\n onChange,\n onRefreshChange\n );\n }\n hasAuth() {\n return this.state.hasAuth();\n }\n /** @internal */\n setAdminAuth(value, fakeUserIdentity) {\n const message = this.state.setAdminAuth(value, fakeUserIdentity);\n this.webSocketManager.sendMessage(message);\n }\n clearAuth() {\n const message = this.state.clearAuth();\n this.webSocketManager.sendMessage(message);\n }\n /**\n * Subscribe to a query function.\n *\n * Whenever this query's result changes, the `onTransition` callback\n * passed into the constructor will be called.\n *\n * @param name - The name of the query.\n * @param args - An arguments object for the query. If this is omitted, the\n * arguments will be `{}`.\n * @param options - A {@link SubscribeOptions} options object for this query.\n \n * @returns An object containing a {@link QueryToken} corresponding to this\n * query and an `unsubscribe` callback.\n */\n subscribe(name, args, options) {\n const argsObject = parseArgs(args);\n const { modification, queryToken, unsubscribe } = this.state.subscribe(\n name,\n argsObject,\n options?.journal,\n options?.componentPath\n );\n if (modification !== null) {\n this.webSocketManager.sendMessage(modification);\n }\n return {\n queryToken,\n unsubscribe: () => {\n const modification2 = unsubscribe();\n if (modification2) {\n this.webSocketManager.sendMessage(modification2);\n }\n }\n };\n }\n /**\n * A query result based only on the current, local state.\n *\n * The only way this will return a value is if we're already subscribed to the\n * query or its value has been set optimistically.\n */\n localQueryResult(udfPath, args) {\n const argsObject = parseArgs(args);\n const queryToken = serializePathAndArgs(udfPath, argsObject);\n return this.optimisticQueryResults.queryResult(queryToken);\n }\n /**\n * Get query result by query token based on current, local state\n *\n * The only way this will return a value is if we're already subscribed to the\n * query or its value has been set optimistically.\n *\n * @internal\n */\n localQueryResultByToken(queryToken) {\n return this.optimisticQueryResults.queryResult(queryToken);\n }\n /**\n * Whether local query result is available for a token.\n *\n * This method does not throw if the result is an error.\n *\n * @internal\n */\n hasLocalQueryResultByToken(queryToken) {\n return this.optimisticQueryResults.hasQueryResult(queryToken);\n }\n /**\n * @internal\n */\n localQueryLogs(udfPath, args) {\n const argsObject = parseArgs(args);\n const queryToken = serializePathAndArgs(udfPath, argsObject);\n return this.optimisticQueryResults.queryLogs(queryToken);\n }\n /**\n * Retrieve the current {@link QueryJournal} for this query function.\n *\n * If we have not yet received a result for this query, this will be `undefined`.\n *\n * @param name - The name of the query.\n * @param args - The arguments object for this query.\n * @returns The query's {@link QueryJournal} or `undefined`.\n */\n queryJournal(name, args) {\n const argsObject = parseArgs(args);\n const queryToken = serializePathAndArgs(name, argsObject);\n return this.state.queryJournal(queryToken);\n }\n /**\n * Get the current {@link ConnectionState} between the client and the Convex\n * backend.\n *\n * @returns The {@link ConnectionState} with the Convex backend.\n */\n connectionState() {\n const wsConnectionState = this.webSocketManager.connectionState();\n return {\n hasInflightRequests: this.requestManager.hasInflightRequests(),\n isWebSocketConnected: wsConnectionState.isConnected,\n hasEverConnected: wsConnectionState.hasEverConnected,\n connectionCount: wsConnectionState.connectionCount,\n connectionRetries: wsConnectionState.connectionRetries,\n timeOfOldestInflightRequest: this.requestManager.timeOfOldestInflightRequest(),\n inflightMutations: this.requestManager.inflightMutations(),\n inflightActions: this.requestManager.inflightActions()\n };\n }\n /**\n * Subscribe to the {@link ConnectionState} between the client and the Convex\n * backend, calling a callback each time it changes.\n *\n * Subscribed callbacks will be called when any part of ConnectionState changes.\n * ConnectionState may grow in future versions (e.g. to provide a array of\n * inflight requests) in which case callbacks would be called more frequently.\n *\n * @returns An unsubscribe function to stop listening.\n */\n subscribeToConnectionState(cb) {\n const id = this.nextConnectionStateSubscriberId++;\n this.connectionStateSubscribers.set(id, cb);\n return () => {\n this.connectionStateSubscribers.delete(id);\n };\n }\n /**\n * Execute a mutation function.\n *\n * @param name - The name of the mutation.\n * @param args - An arguments object for the mutation. If this is omitted,\n * the arguments will be `{}`.\n * @param options - A {@link MutationOptions} options object for this mutation.\n \n * @returns - A promise of the mutation's result.\n */\n async mutation(name, args, options) {\n const result = await this.mutationInternal(name, args, options);\n if (!result.success) {\n if (result.errorData !== void 0) {\n throw forwardData(\n result,\n new ConvexError(\n createHybridErrorStacktrace(\"mutation\", name, result)\n )\n );\n }\n throw new Error(createHybridErrorStacktrace(\"mutation\", name, result));\n }\n return result.value;\n }\n /**\n * @internal\n */\n async mutationInternal(udfPath, args, options, componentPath) {\n const { mutationPromise } = this.enqueueMutation(\n udfPath,\n args,\n options,\n componentPath\n );\n return mutationPromise;\n }\n /**\n * @internal\n */\n enqueueMutation(udfPath, args, options, componentPath) {\n const mutationArgs = parseArgs(args);\n this.tryReportLongDisconnect();\n const requestId = this.nextRequestId;\n this._nextRequestId++;\n if (options !== void 0) {\n const optimisticUpdate = options.optimisticUpdate;\n if (optimisticUpdate !== void 0) {\n const wrappedUpdate = (localQueryStore) => {\n const result = optimisticUpdate(\n localQueryStore,\n mutationArgs\n );\n if (result instanceof Promise) {\n this.logger.warn(\n \"Optimistic update handler returned a Promise. Optimistic updates should be synchronous.\"\n );\n }\n };\n const changedQueryTokens = this.optimisticQueryResults.applyOptimisticUpdate(\n wrappedUpdate,\n requestId\n );\n const changedQueries = changedQueryTokens.map((token) => {\n const localResult = this.localQueryResultByToken(token);\n return {\n token,\n modification: {\n kind: \"Updated\",\n result: localResult === void 0 ? void 0 : {\n success: true,\n value: localResult,\n logLines: []\n }\n }\n };\n });\n this.handleTransition({\n queries: changedQueries,\n reflectedMutations: [],\n timestamp: this.remoteQuerySet.timestamp()\n });\n }\n }\n const message = {\n type: \"Mutation\",\n requestId,\n udfPath,\n componentPath,\n args: [convexToJson(mutationArgs)]\n };\n const mightBeSent = this.webSocketManager.sendMessage(message);\n const mutationPromise = this.requestManager.request(message, mightBeSent);\n return {\n requestId,\n mutationPromise\n };\n }\n /**\n * Execute an action function.\n *\n * @param name - The name of the action.\n * @param args - An arguments object for the action. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the action's result.\n */\n async action(name, args) {\n const result = await this.actionInternal(name, args);\n if (!result.success) {\n if (result.errorData !== void 0) {\n throw forwardData(\n result,\n new ConvexError(createHybridErrorStacktrace(\"action\", name, result))\n );\n }\n throw new Error(createHybridErrorStacktrace(\"action\", name, result));\n }\n return result.value;\n }\n /**\n * @internal\n */\n async actionInternal(udfPath, args, componentPath) {\n const actionArgs = parseArgs(args);\n const requestId = this.nextRequestId;\n this._nextRequestId++;\n this.tryReportLongDisconnect();\n const message = {\n type: \"Action\",\n requestId,\n udfPath,\n componentPath,\n args: [convexToJson(actionArgs)]\n };\n const mightBeSent = this.webSocketManager.sendMessage(message);\n return this.requestManager.request(message, mightBeSent);\n }\n /**\n * Close any network handles associated with this client and stop all subscriptions.\n *\n * Call this method when you're done with an {@link BaseConvexClient} to\n * dispose of its sockets and resources.\n *\n * @returns A `Promise` fulfilled when the connection has been completely closed.\n */\n async close() {\n this.authenticationManager.stop();\n return this.webSocketManager.terminate();\n }\n /**\n * Return the address for this client, useful for creating a new client.\n *\n * Not guaranteed to match the address with which this client was constructed:\n * it may be canonicalized.\n */\n get url() {\n return this.address;\n }\n /**\n * @internal\n */\n get nextRequestId() {\n return this._nextRequestId;\n }\n /**\n * @internal\n */\n get sessionId() {\n return this._sessionId;\n }\n /**\n * Reports performance marks to the server. This should only be called when\n * we have a functional websocket.\n */\n reportMarks() {\n if (this.debug) {\n const report = getMarksReport(this.sessionId);\n this.webSocketManager.sendMessage({\n type: \"Event\",\n eventType: \"ClientConnect\",\n event: report\n });\n }\n }\n tryReportLongDisconnect() {\n if (!this.debug) {\n return;\n }\n const timeOfOldestRequest = this.connectionState().timeOfOldestInflightRequest;\n if (timeOfOldestRequest === null || Date.now() - timeOfOldestRequest.getTime() <= 60 * 1e3) {\n return;\n }\n const endpoint = `${this.address}/api/debug_event`;\n fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Convex-Client\": `npm-${version}`\n },\n body: JSON.stringify({ event: \"LongWebsocketDisconnect\" })\n }).then((response) => {\n if (!response.ok) {\n this.logger.warn(\n \"Analytics request failed with response:\",\n response.body\n );\n }\n }).catch((error) => {\n this.logger.warn(\"Analytics response failed with error:\", error);\n });\n }\n}\n//# sourceMappingURL=client.js.map\n","\"use strict\";\nexport function asPaginationArgs(value) {\n if (typeof value.paginationOpts.numItems !== \"number\") {\n throw new Error(`Not valid paginated query args: ${JSON.stringify(value)}`);\n }\n return value;\n}\nexport function asPaginationResult(value) {\n if (typeof value !== \"object\" || value === null || !Array.isArray(value.page) || typeof value.isDone !== \"boolean\" || typeof value.continueCursor !== \"string\") {\n throw new Error(`Not a valid paginated query result: ${value?.toString()}`);\n }\n return value;\n}\n//# sourceMappingURL=pagination.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport {\n serializePaginatedPathAndArgs,\n canonicalizeUdfPath\n} from \"./udf_path_utils.js\";\nimport {\n asPaginationResult\n} from \"./pagination.js\";\nimport { Long } from \"../../vendor/long.js\";\nexport class PaginatedQueryClient {\n constructor(client, onTransition) {\n this.client = client;\n this.onTransition = onTransition;\n __publicField(this, \"paginatedQuerySet\", /* @__PURE__ */ new Map());\n // hold onto a real Transition so we can construct synthetic ones with that timestamp\n __publicField(this, \"lastTransitionTs\");\n this.lastTransitionTs = Long.fromNumber(0);\n this.client.addOnTransitionHandler(\n (transition) => this.onBaseTransition(transition)\n );\n }\n /**\n * Subscribe to a paginated query.\n *\n * @param name - The name of the paginated query function\n * @param args - Arguments for the query (excluding paginationOpts)\n * @param options - Pagination options including initialNumItems\n * @returns Object with paginatedQueryToken and unsubscribe function\n */\n subscribe(name, args, options) {\n const canonicalizedUdfPath = canonicalizeUdfPath(name);\n const token = serializePaginatedPathAndArgs(\n canonicalizedUdfPath,\n args,\n options\n );\n const unsubscribe = () => this.removePaginatedQuerySubscriber(token);\n const existingEntry = this.paginatedQuerySet.get(token);\n if (existingEntry) {\n existingEntry.numSubscribers += 1;\n return {\n paginatedQueryToken: token,\n unsubscribe\n };\n }\n this.paginatedQuerySet.set(token, {\n token,\n canonicalizedUdfPath,\n args,\n numSubscribers: 1,\n options: { initialNumItems: options.initialNumItems },\n nextPageKey: 0,\n pageKeys: [],\n pageKeyToQuery: /* @__PURE__ */ new Map(),\n ongoingSplits: /* @__PURE__ */ new Map(),\n skip: false,\n id: options.id\n });\n this.addPageToPaginatedQuery(token, null, options.initialNumItems);\n return {\n paginatedQueryToken: token,\n unsubscribe\n };\n }\n /**\n * Get current results for a paginated query based on local state.\n *\n * Throws an error when one of the pages has errored.\n */\n localQueryResult(name, args, options) {\n const canonicalizedUdfPath = canonicalizeUdfPath(name);\n const token = serializePaginatedPathAndArgs(\n canonicalizedUdfPath,\n args,\n options\n );\n return this.localQueryResultByToken(token);\n }\n /**\n * @internal\n */\n localQueryResultByToken(token) {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n return void 0;\n }\n const activePages = this.activePageQueryTokens(paginatedQuery);\n if (activePages.length === 0) {\n return {\n results: [],\n status: \"LoadingFirstPage\",\n loadMore: (numItems) => {\n return this.loadMoreOfPaginatedQuery(token, numItems);\n }\n };\n }\n let allResults = [];\n let hasUndefined = false;\n let isDone = false;\n for (const pageToken of activePages) {\n const result = this.client.localQueryResultByToken(pageToken);\n if (result === void 0) {\n hasUndefined = true;\n isDone = false;\n continue;\n }\n const paginationResult = asPaginationResult(result);\n allResults = allResults.concat(paginationResult.page);\n isDone = !!paginationResult.isDone;\n }\n let status;\n if (hasUndefined) {\n status = allResults.length === 0 ? \"LoadingFirstPage\" : \"LoadingMore\";\n } else if (isDone) {\n status = \"Exhausted\";\n } else {\n status = \"CanLoadMore\";\n }\n return {\n results: allResults,\n status,\n loadMore: (numItems) => {\n return this.loadMoreOfPaginatedQuery(token, numItems);\n }\n };\n }\n onBaseTransition(transition) {\n const changedBaseTokens = transition.queries.map((q) => q.token);\n const changed = this.queriesContainingTokens(changedBaseTokens);\n let paginatedQueries = [];\n if (changed.length > 0) {\n this.processPaginatedQuerySplits(\n changed,\n (token) => this.client.localQueryResultByToken(token)\n );\n paginatedQueries = changed.map((token) => ({\n token,\n modification: {\n kind: \"Updated\",\n result: this.localQueryResultByToken(token)\n }\n }));\n }\n const extendedTransition = {\n ...transition,\n paginatedQueries\n };\n this.onTransition(extendedTransition);\n }\n /**\n * Load more items for a paginated query.\n *\n * This *always* causes a transition, the status of the query\n * has probably changed from \"CanLoadMore\" to \"LoadingMore\".\n * Data might have changed too: maybe a subscription to this page\n * query already exists (unlikely but possible) or this page query\n * has an optimistic update providing some initial data.\n *\n * @internal\n */\n loadMoreOfPaginatedQuery(token, numItems) {\n this.mustGetPaginatedQuery(token);\n const lastPageToken = this.queryTokenForLastPageOfPaginatedQuery(token);\n const lastPageResult = this.client.localQueryResultByToken(lastPageToken);\n if (!lastPageResult) {\n return false;\n }\n const paginationResult = asPaginationResult(lastPageResult);\n if (paginationResult.isDone) {\n return false;\n }\n this.addPageToPaginatedQuery(\n token,\n paginationResult.continueCursor,\n numItems\n );\n const loadMoreTransition = {\n timestamp: this.lastTransitionTs,\n reflectedMutations: [],\n queries: [],\n paginatedQueries: [\n {\n token,\n modification: {\n kind: \"Updated\",\n result: this.localQueryResultByToken(token)\n }\n }\n ]\n };\n this.onTransition(loadMoreTransition);\n return true;\n }\n /**\n * @internal\n */\n queriesContainingTokens(queryTokens) {\n if (queryTokens.length === 0) {\n return [];\n }\n const changed = [];\n const queryTokenSet = new Set(queryTokens);\n for (const [paginatedToken, paginatedQuery] of this.paginatedQuerySet) {\n for (const pageToken of this.allQueryTokens(paginatedQuery)) {\n if (queryTokenSet.has(pageToken)) {\n changed.push(paginatedToken);\n break;\n }\n }\n }\n return changed;\n }\n /**\n * @internal\n */\n processPaginatedQuerySplits(changed, getResult) {\n for (const paginatedQueryToken of changed) {\n const paginatedQuery = this.mustGetPaginatedQuery(paginatedQueryToken);\n const { ongoingSplits, pageKeyToQuery, pageKeys } = paginatedQuery;\n for (const [pageKey, [splitKey1, splitKey2]] of ongoingSplits) {\n const bothNewPagesLoaded = getResult(pageKeyToQuery.get(splitKey1).queryToken) !== void 0 && getResult(pageKeyToQuery.get(splitKey2).queryToken) !== void 0;\n if (bothNewPagesLoaded) {\n this.completePaginatedQuerySplit(\n paginatedQuery,\n pageKey,\n splitKey1,\n splitKey2\n );\n }\n }\n for (const pageKey of pageKeys) {\n if (ongoingSplits.has(pageKey)) {\n continue;\n }\n const pageToken = pageKeyToQuery.get(pageKey).queryToken;\n const pageResult = getResult(pageToken);\n if (!pageResult) {\n continue;\n }\n const result = asPaginationResult(pageResult);\n const shouldSplit = result.splitCursor && (result.pageStatus === \"SplitRecommended\" || result.pageStatus === \"SplitRequired\" || // This client-driven page splitting condition will change in the future.\n result.page.length > paginatedQuery.options.initialNumItems * 2);\n if (shouldSplit) {\n this.splitPaginatedQueryPage(\n paginatedQuery,\n pageKey,\n result.splitCursor,\n // we just checked\n result.continueCursor\n );\n }\n }\n }\n }\n splitPaginatedQueryPage(paginatedQuery, pageKey, splitCursor, continueCursor) {\n const splitKey1 = paginatedQuery.nextPageKey++;\n const splitKey2 = paginatedQuery.nextPageKey++;\n const paginationOpts = {\n cursor: continueCursor,\n numItems: paginatedQuery.options.initialNumItems,\n id: paginatedQuery.id\n };\n const firstSubscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n {\n ...paginatedQuery.args,\n paginationOpts: {\n ...paginationOpts,\n cursor: null,\n // Start from beginning for first split\n endCursor: splitCursor\n }\n }\n );\n paginatedQuery.pageKeyToQuery.set(splitKey1, firstSubscription);\n const secondSubscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n {\n ...paginatedQuery.args,\n paginationOpts: {\n ...paginationOpts,\n cursor: splitCursor,\n endCursor: continueCursor\n }\n }\n );\n paginatedQuery.pageKeyToQuery.set(splitKey2, secondSubscription);\n paginatedQuery.ongoingSplits.set(pageKey, [splitKey1, splitKey2]);\n }\n /**\n * @internal\n */\n addPageToPaginatedQuery(token, continueCursor, numItems) {\n const paginatedQuery = this.mustGetPaginatedQuery(token);\n const pageKey = paginatedQuery.nextPageKey++;\n const paginationOpts = {\n cursor: continueCursor,\n numItems,\n id: paginatedQuery.id\n };\n const pageArgs = {\n ...paginatedQuery.args,\n paginationOpts\n };\n const subscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n pageArgs\n );\n paginatedQuery.pageKeys.push(pageKey);\n paginatedQuery.pageKeyToQuery.set(pageKey, subscription);\n return subscription;\n }\n removePaginatedQuerySubscriber(token) {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n return;\n }\n paginatedQuery.numSubscribers -= 1;\n if (paginatedQuery.numSubscribers > 0) {\n return;\n }\n for (const subscription of paginatedQuery.pageKeyToQuery.values()) {\n subscription.unsubscribe();\n }\n this.paginatedQuerySet.delete(token);\n }\n completePaginatedQuerySplit(paginatedQuery, pageKey, splitKey1, splitKey2) {\n const originalQuery = paginatedQuery.pageKeyToQuery.get(pageKey);\n paginatedQuery.pageKeyToQuery.delete(pageKey);\n const pageIndex = paginatedQuery.pageKeys.indexOf(pageKey);\n paginatedQuery.pageKeys.splice(pageIndex, 1, splitKey1, splitKey2);\n paginatedQuery.ongoingSplits.delete(pageKey);\n originalQuery.unsubscribe();\n }\n /** The query tokens for all active pages, in result order */\n activePageQueryTokens(paginatedQuery) {\n return paginatedQuery.pageKeys.map(\n (pageKey) => paginatedQuery.pageKeyToQuery.get(pageKey).queryToken\n );\n }\n allQueryTokens(paginatedQuery) {\n return Array.from(paginatedQuery.pageKeyToQuery.values()).map(\n (sub) => sub.queryToken\n );\n }\n queryTokenForLastPageOfPaginatedQuery(token) {\n const paginatedQuery = this.mustGetPaginatedQuery(token);\n const lastPageKey = paginatedQuery.pageKeys[paginatedQuery.pageKeys.length - 1];\n if (lastPageKey === void 0) {\n throw new Error(`No pages for paginated query ${token}`);\n }\n return paginatedQuery.pageKeyToQuery.get(lastPageKey).queryToken;\n }\n mustGetPaginatedQuery(token) {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n throw new Error(\"paginated query no longer exists for token \" + token);\n }\n return paginatedQuery;\n }\n}\n//# sourceMappingURL=paginated_query_client.js.map\n","\"use strict\";\nimport { useEffect, useState } from \"react\";\nexport function useSubscription({\n // (Synchronously) returns the current value of our subscription.\n getCurrentValue,\n // This function is passed an event handler to attach to the subscription.\n // It should return an unsubscribe function that removes the handler.\n subscribe\n}) {\n const [state, setState] = useState(() => ({\n getCurrentValue,\n subscribe,\n value: getCurrentValue()\n }));\n let valueToReturn = state.value;\n if (state.getCurrentValue !== getCurrentValue || state.subscribe !== subscribe) {\n valueToReturn = getCurrentValue();\n setState({\n getCurrentValue,\n subscribe,\n value: valueToReturn\n });\n }\n useEffect(() => {\n let didUnsubscribe = false;\n const checkForUpdates = () => {\n if (didUnsubscribe) {\n return;\n }\n setState((prevState) => {\n if (prevState.getCurrentValue !== getCurrentValue || prevState.subscribe !== subscribe) {\n return prevState;\n }\n const value = getCurrentValue();\n if (prevState.value === value) {\n return prevState;\n }\n return { ...prevState, value };\n });\n };\n const unsubscribe = subscribe(checkForUpdates);\n checkForUpdates();\n return () => {\n didUnsubscribe = true;\n unsubscribe();\n };\n }, [getCurrentValue, subscribe]);\n return valueToReturn;\n}\n//# sourceMappingURL=use_subscription.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { BaseConvexClient } from \"../browser/index.js\";\nimport React, { useCallback, useContext, useMemo } from \"react\";\nimport { convexToJson } from \"../values/index.js\";\nimport { useQueries } from \"./use_queries.js\";\nimport { useSubscription } from \"./use_subscription.js\";\nimport { parseArgs } from \"../common/index.js\";\nimport {\n getFunctionName,\n makeFunctionReference\n} from \"../server/api.js\";\nimport {\n instantiateDefaultLogger,\n instantiateNoopLogger\n} from \"../browser/logging.js\";\nimport {\n PaginatedQueryClient\n} from \"../browser/sync/paginated_query_client.js\";\nconst DEFAULT_EXTEND_SUBSCRIPTION_FOR = 5e3;\nif (typeof React === \"undefined\") {\n throw new Error(\"Required dependency 'react' not found\");\n}\nexport function createMutation(mutationReference, client, update) {\n function mutation(args) {\n assertNotAccidentalArgument(args);\n return client.mutation(mutationReference, args, {\n optimisticUpdate: update\n });\n }\n mutation.withOptimisticUpdate = function withOptimisticUpdate(optimisticUpdate) {\n if (update !== void 0) {\n throw new Error(\n `Already specified optimistic update for mutation ${getFunctionName(\n mutationReference\n )}`\n );\n }\n return createMutation(mutationReference, client, optimisticUpdate);\n };\n return mutation;\n}\nfunction createAction(actionReference, client) {\n return function(args) {\n return client.action(actionReference, args);\n };\n}\nexport class ConvexReactClient {\n /**\n * @param address - The url of your Convex deployment, often provided\n * by an environment variable. E.g. `https://small-mouse-123.convex.cloud`.\n * @param options - See {@link ConvexReactClientOptions} for a full description.\n */\n constructor(address, options) {\n __publicField(this, \"address\");\n __publicField(this, \"cachedSync\");\n __publicField(this, \"cachedPaginatedQueryClient\");\n __publicField(this, \"listeners\");\n __publicField(this, \"options\");\n // \"closed\" means this client is done, not just that the underlying WS connection is closed.\n __publicField(this, \"closed\", false);\n __publicField(this, \"_logger\");\n __publicField(this, \"adminAuth\");\n __publicField(this, \"fakeUserIdentity\");\n if (address === void 0) {\n throw new Error(\n \"No address provided to ConvexReactClient.\\nIf trying to deploy to production, make sure to follow all the instructions found at https://docs.convex.dev/production/hosting/\\nIf running locally, make sure to run `convex dev` and ensure the .env.local file is populated.\"\n );\n }\n if (typeof address !== \"string\") {\n throw new Error(\n `ConvexReactClient requires a URL like 'https://happy-otter-123.convex.cloud', received something of type ${typeof address} instead.`\n );\n }\n if (!address.includes(\"://\")) {\n throw new Error(\"Provided address was not an absolute URL.\");\n }\n this.address = address;\n this.listeners = /* @__PURE__ */ new Map();\n this._logger = options?.logger === false ? instantiateNoopLogger({ verbose: options?.verbose ?? false }) : options?.logger !== true && options?.logger ? options.logger : instantiateDefaultLogger({ verbose: options?.verbose ?? false });\n this.options = { ...options, logger: this._logger };\n }\n /**\n * Return the address for this client, useful for creating a new client.\n *\n * Not guaranteed to match the address with which this client was constructed:\n * it may be canonicalized.\n */\n get url() {\n return this.address;\n }\n /**\n * Lazily instantiate the `BaseConvexClient` so we don't create the WebSocket\n * when server-side rendering.\n *\n * @internal\n */\n get sync() {\n if (this.closed) {\n throw new Error(\"ConvexReactClient has already been closed.\");\n }\n if (this.cachedSync) {\n return this.cachedSync;\n }\n this.cachedSync = new BaseConvexClient(\n this.address,\n () => {\n },\n // Use the PaginatedQueryClient's transition instead.\n this.options\n );\n if (this.adminAuth) {\n this.cachedSync.setAdminAuth(this.adminAuth, this.fakeUserIdentity);\n }\n this.cachedPaginatedQueryClient = new PaginatedQueryClient(\n this.cachedSync,\n (transition) => this.handleTransition(transition)\n );\n return this.cachedSync;\n }\n /**\n * Lazily instantiate the `PaginatedQueryClient` so we don't create it\n * when server-side rendering.\n *\n * @internal\n */\n get paginatedQueryClient() {\n this.sync;\n if (this.cachedPaginatedQueryClient) {\n return this.cachedPaginatedQueryClient;\n }\n throw new Error(\"Should already be instantiated\");\n }\n /**\n * Set the authentication token to be used for subsequent queries and mutations.\n * `fetchToken` will be called automatically again if a token expires.\n * `fetchToken` should return `null` if the token cannot be retrieved, for example\n * when the user's rights were permanently revoked.\n * @param fetchToken - an async function returning the JWT-encoded OpenID Connect Identity Token\n * @param onChange - a callback that will be called when the authentication status changes\n * @param onRefreshChange - a callback called with `true` when the socket is paused to fetch a replacement token after a server rejection, and `false` when refresh completes\n */\n setAuth(fetchToken, onChange, onRefreshChange) {\n if (typeof fetchToken === \"string\") {\n throw new Error(\n \"Passing a string to ConvexReactClient.setAuth is no longer supported, please upgrade to passing in an async function to handle reauthentication.\"\n );\n }\n this.sync.setAuth(\n fetchToken,\n onChange ?? (() => {\n }),\n onRefreshChange\n );\n }\n /**\n * Clear the current authentication token if set.\n */\n clearAuth() {\n this.sync.clearAuth();\n }\n /**\n * @internal\n */\n setAdminAuth(token, identity) {\n this.adminAuth = token;\n this.fakeUserIdentity = identity;\n if (this.closed) {\n throw new Error(\"ConvexReactClient has already been closed.\");\n }\n if (this.cachedSync) {\n this.sync.setAdminAuth(token, identity);\n }\n }\n /**\n * Construct a new {@link Watch} on a Convex query function.\n *\n * **Most application code should not call this method directly. Instead use\n * the {@link useQuery} hook.**\n *\n * The act of creating a watch does nothing, a Watch is stateless.\n *\n * @param query - A {@link server.FunctionReference} for the public query to run.\n * @param args - An arguments object for the query. If this is omitted,\n * the arguments will be `{}`.\n * @param options - A {@link WatchQueryOptions} options object for this query.\n *\n * @returns The {@link Watch} object.\n */\n watchQuery(query, ...argsAndOptions) {\n const [args, options] = argsAndOptions;\n const name = getFunctionName(query);\n return {\n onUpdate: (callback) => {\n const { queryToken, unsubscribe } = this.sync.subscribe(\n name,\n args,\n options\n );\n const currentListeners = this.listeners.get(queryToken);\n if (currentListeners !== void 0) {\n currentListeners.add(callback);\n } else {\n this.listeners.set(queryToken, /* @__PURE__ */ new Set([callback]));\n }\n return () => {\n if (this.closed) {\n return;\n }\n const currentListeners2 = this.listeners.get(queryToken);\n currentListeners2.delete(callback);\n if (currentListeners2.size === 0) {\n this.listeners.delete(queryToken);\n }\n unsubscribe();\n };\n },\n localQueryResult: () => {\n if (this.cachedSync) {\n return this.cachedSync.localQueryResult(name, args);\n }\n return void 0;\n },\n localQueryLogs: () => {\n if (this.cachedSync) {\n return this.cachedSync.localQueryLogs(name, args);\n }\n return void 0;\n },\n journal: () => {\n if (this.cachedSync) {\n return this.cachedSync.queryJournal(name, args);\n }\n return void 0;\n }\n };\n }\n // Let's try out a queryOptions-style API.\n // This method is similar to the React Query API `queryClient.prefetchQuery()`.\n // In the future an ensureQueryData(): Promise<Data> method could exist.\n /**\n * Indicates likely future interest in a query subscription.\n *\n * The implementation currently immediately subscribes to a query. In the future this method\n * may prioritize some queries over others, fetch the query result without subscribing, or\n * do nothing in slow network connections or high load scenarios.\n *\n * To use this in a React component, call useQuery() and ignore the return value.\n *\n * @param queryOptions - A query (function reference from an api object) and its args, plus\n * an optional extendSubscriptionFor for how long to subscribe to the query.\n */\n prewarmQuery(queryOptions) {\n const extendSubscriptionFor = queryOptions.extendSubscriptionFor ?? DEFAULT_EXTEND_SUBSCRIPTION_FOR;\n const watch = this.watchQuery(queryOptions.query, queryOptions.args || {});\n const unsubscribe = watch.onUpdate(() => {\n });\n setTimeout(unsubscribe, extendSubscriptionFor);\n }\n /**\n * Construct a new {@link PaginatedWatch} on a Convex paginated query function.\n *\n * **Most application code should not call this method directly. Instead use\n * the {@link usePaginatedQuery} hook.**\n *\n * The act of creating a watch does nothing, a Watch is stateless.\n *\n * @param query - A {@link server.FunctionReference} for the public query to run.\n * @param args - An arguments object for the query. If this is omitted,\n * the arguments will be `{}`.\n * @param options - A {@link WatchPaginatedQueryOptions} options object for this query.\n *\n * @returns The {@link PaginatedWatch} object.\n *\n * @internal\n */\n watchPaginatedQuery(query, args, options) {\n const name = getFunctionName(query);\n return {\n onUpdate: (callback) => {\n const { paginatedQueryToken, unsubscribe } = this.paginatedQueryClient.subscribe(name, args || {}, options);\n const currentListeners = this.listeners.get(paginatedQueryToken);\n if (currentListeners !== void 0) {\n currentListeners.add(callback);\n } else {\n this.listeners.set(paginatedQueryToken, /* @__PURE__ */ new Set([callback]));\n }\n return () => {\n if (this.closed) {\n return;\n }\n const currentListeners2 = this.listeners.get(paginatedQueryToken);\n currentListeners2.delete(callback);\n if (currentListeners2.size === 0) {\n this.listeners.delete(paginatedQueryToken);\n }\n unsubscribe();\n };\n },\n localQueryResult: () => {\n return this.paginatedQueryClient.localQueryResult(name, args, options);\n }\n };\n }\n /**\n * Execute a mutation function.\n *\n * @param mutation - A {@link server.FunctionReference} for the public mutation\n * to run.\n * @param args - An arguments object for the mutation. If this is omitted,\n * the arguments will be `{}`.\n * @param options - A {@link MutationOptions} options object for the mutation.\n * @returns A promise of the mutation's result.\n */\n mutation(mutation, ...argsAndOptions) {\n const [args, options] = argsAndOptions;\n const name = getFunctionName(mutation);\n return this.sync.mutation(name, args, options);\n }\n /**\n * Execute an action function.\n *\n * @param action - A {@link server.FunctionReference} for the public action\n * to run.\n * @param args - An arguments object for the action. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the action's result.\n */\n action(action, ...args) {\n const name = getFunctionName(action);\n return this.sync.action(name, ...args);\n }\n /**\n * Fetch a query result once.\n *\n * **Most application code should subscribe to queries instead, using\n * the {@link useQuery} hook.**\n *\n * @param query - A {@link server.FunctionReference} for the public query\n * to run.\n * @param args - An arguments object for the query. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the query's result.\n */\n query(query, ...args) {\n const watch = this.watchQuery(query, ...args);\n const existingResult = watch.localQueryResult();\n if (existingResult !== void 0) {\n return Promise.resolve(existingResult);\n }\n return new Promise((resolve, reject) => {\n const unsubscribe = watch.onUpdate(() => {\n unsubscribe();\n try {\n resolve(watch.localQueryResult());\n } catch (e) {\n reject(e);\n }\n });\n });\n }\n /**\n * Get the current {@link ConnectionState} between the client and the Convex\n * backend.\n *\n * @returns The {@link ConnectionState} with the Convex backend.\n */\n connectionState() {\n return this.sync.connectionState();\n }\n /**\n * Subscribe to the {@link ConnectionState} between the client and the Convex\n * backend, calling a callback each time it changes.\n *\n * Subscribed callbacks will be called when any part of ConnectionState changes.\n * ConnectionState may grow in future versions (e.g. to provide a array of\n * inflight requests) in which case callbacks would be called more frequently.\n * ConnectionState may also *lose* properties in future versions as we figure\n * out what information is most useful. As such this API is considered unstable.\n *\n * @returns An unsubscribe function to stop listening.\n */\n subscribeToConnectionState(cb) {\n return this.sync.subscribeToConnectionState(cb);\n }\n /**\n * Get the logger for this client.\n *\n * @returns The {@link Logger} for this client.\n */\n get logger() {\n return this._logger;\n }\n /**\n * Close any network handles associated with this client and stop all subscriptions.\n *\n * Call this method when you're done with a {@link ConvexReactClient} to\n * dispose of its sockets and resources.\n *\n * @returns A `Promise` fulfilled when the connection has been completely closed.\n */\n async close() {\n this.closed = true;\n this.listeners = /* @__PURE__ */ new Map();\n if (this.cachedPaginatedQueryClient) {\n this.cachedPaginatedQueryClient = void 0;\n }\n if (this.cachedSync) {\n const sync = this.cachedSync;\n this.cachedSync = void 0;\n await sync.close();\n }\n }\n /**\n * Handle transitions from both base client and paginated client.\n * This ensures all transitions are processed synchronously and in order.\n */\n handleTransition(transition) {\n const simple = transition.queries.map((q) => q.token);\n const paginated = transition.paginatedQueries.map((q) => q.token);\n this.transition([...simple, ...paginated]);\n }\n transition(updatedQueries) {\n for (const queryToken of updatedQueries) {\n const callbacks = this.listeners.get(queryToken);\n if (callbacks) {\n for (const callback of callbacks) {\n callback();\n }\n }\n }\n }\n}\nconst ConvexContext = React.createContext(\n void 0\n // in the future this will be a mocked client for testing\n);\nexport function useConvex() {\n return useContext(ConvexContext);\n}\nexport const ConvexProvider = ({ client, children }) => {\n return React.createElement(\n ConvexContext.Provider,\n { value: client },\n children\n );\n};\nexport function useQuery(query, ...args) {\n const skip = args[0] === \"skip\";\n const argsObject = args[0] === \"skip\" ? {} : parseArgs(args[0]);\n const queryReference = typeof query === \"string\" ? makeFunctionReference(query) : query;\n const queryName = getFunctionName(queryReference);\n const queries = useMemo(\n () => skip ? {} : { query: { query: queryReference, args: argsObject } },\n // Stringify args so args that are semantically the same don't trigger a\n // rerender. Saves developers from adding `useMemo` on every args usage.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(convexToJson(argsObject)), queryName, skip]\n );\n const results = useQueries(queries);\n const result = results[\"query\"];\n if (result instanceof Error) {\n throw result;\n }\n return result;\n}\nexport function useQuery_experimental(options) {\n const throwOnError = options.throwOnError ?? false;\n const queryReference = typeof options.query === \"string\" ? makeFunctionReference(options.query) : options.query;\n const skip = options.args === \"skip\";\n const argsObject = !skip ? parseArgs(options.args) : {};\n const queryName = getFunctionName(queryReference);\n const queries = useMemo(\n () => skip ? {} : { query: { query: queryReference, args: argsObject } },\n // Stringify args so args that are semantically the same don't trigger a\n // rerender. Saves developers from adding `useMemo` on every args usage.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(convexToJson(argsObject)), queryName, skip]\n );\n const results = useQueries(queries);\n const result = results[\"query\"];\n if (result instanceof Error) {\n if (throwOnError) {\n throw result;\n }\n return {\n error: result,\n status: \"error\"\n };\n }\n if (result === void 0) {\n return {\n status: \"pending\"\n };\n }\n return {\n data: result,\n status: \"success\"\n };\n}\nexport function useMutation(mutation) {\n const mutationReference = typeof mutation === \"string\" ? makeFunctionReference(mutation) : mutation;\n const convex = useContext(ConvexContext);\n if (convex === void 0) {\n throw new Error(\n \"Could not find Convex client! `useMutation` must be used in the React component tree under `ConvexProvider`. Did you forget it? See https://docs.convex.dev/quick-start#set-up-convex-in-your-react-app\"\n );\n }\n return useMemo(\n () => createMutation(mutationReference, convex),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [convex, getFunctionName(mutationReference)]\n );\n}\nexport function useAction(action) {\n const convex = useContext(ConvexContext);\n const actionReference = typeof action === \"string\" ? makeFunctionReference(action) : action;\n if (convex === void 0) {\n throw new Error(\n \"Could not find Convex client! `useAction` must be used in the React component tree under `ConvexProvider`. Did you forget it? See https://docs.convex.dev/quick-start#set-up-convex-in-your-react-app\"\n );\n }\n return useMemo(\n () => createAction(actionReference, convex),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [convex, getFunctionName(actionReference)]\n );\n}\nexport function useConvexConnectionState() {\n const convex = useContext(ConvexContext);\n if (convex === void 0) {\n throw new Error(\n \"Could not find Convex client! `useConvexConnectionState` must be used in the React component tree under `ConvexProvider`. Did you forget it? See https://docs.convex.dev/quick-start#set-up-convex-in-your-react-app\"\n );\n }\n const getCurrentValue = useCallback(() => {\n return convex.connectionState();\n }, [convex]);\n const subscribe = useCallback(\n (callback) => {\n return convex.subscribeToConnectionState(() => {\n callback();\n });\n },\n [convex]\n );\n return useSubscription({ getCurrentValue, subscribe });\n}\nfunction assertNotAccidentalArgument(value) {\n if (typeof value === \"object\" && value !== null && \"bubbles\" in value && \"persist\" in value && \"isDefaultPrevented\" in value) {\n throw new Error(\n `Convex function called with SyntheticEvent object. Did you use a Convex function as an event handler directly? Event handlers like onClick receive an event object as their first argument. These SyntheticEvent objects are not valid Convex values. Try wrapping the function like \\`const handler = () => myMutation();\\` and using \\`handler\\` in the event handler.`\n );\n }\n}\n//# sourceMappingURL=client.js.map\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { convexToJson } from \"../values/index.js\";\nimport { getFunctionName } from \"../server/api.js\";\nexport class QueriesObserver {\n constructor(createWatch) {\n __publicField(this, \"createWatch\");\n __publicField(this, \"queries\");\n __publicField(this, \"listeners\");\n this.createWatch = createWatch;\n this.queries = {};\n this.listeners = /* @__PURE__ */ new Set();\n }\n setQueries(newQueries) {\n for (const identifier of Object.keys(newQueries)) {\n const { query, args, paginationOptions } = newQueries[identifier];\n getFunctionName(query);\n if (this.queries[identifier] === void 0) {\n this.addQuery(\n identifier,\n query,\n args,\n paginationOptions ? { paginationOptions } : {}\n );\n } else {\n const existingInfo = this.queries[identifier];\n if (getFunctionName(query) !== getFunctionName(existingInfo.query) || JSON.stringify(convexToJson(args)) !== JSON.stringify(convexToJson(existingInfo.args)) || JSON.stringify(paginationOptions) !== JSON.stringify(existingInfo.paginationOptions)) {\n this.removeQuery(identifier);\n this.addQuery(\n identifier,\n query,\n args,\n paginationOptions ? { paginationOptions } : {}\n );\n }\n }\n }\n for (const identifier of Object.keys(this.queries)) {\n if (newQueries[identifier] === void 0) {\n this.removeQuery(identifier);\n }\n }\n }\n subscribe(listener) {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n getLocalResults(queries) {\n const result = {};\n for (const identifier of Object.keys(queries)) {\n const { query, args } = queries[identifier];\n const paginationOptions = queries[identifier].paginationOptions;\n getFunctionName(query);\n const watch = this.createWatch(\n query,\n args,\n paginationOptions ? { paginationOptions } : {}\n );\n let value;\n try {\n value = watch.localQueryResult();\n } catch (e) {\n if (e instanceof Error) {\n value = e;\n } else {\n throw e;\n }\n }\n result[identifier] = value;\n }\n return result;\n }\n setCreateWatch(createWatch) {\n this.createWatch = createWatch;\n for (const identifier of Object.keys(this.queries)) {\n const { query, args, watch, paginationOptions } = this.queries[identifier];\n const journal = \"journal\" in watch ? watch.journal() : void 0;\n this.removeQuery(identifier);\n this.addQuery(identifier, query, args, {\n ...journal ? { journal } : [],\n ...paginationOptions ? { paginationOptions } : {}\n });\n }\n }\n destroy() {\n for (const identifier of Object.keys(this.queries)) {\n this.removeQuery(identifier);\n }\n this.listeners = /* @__PURE__ */ new Set();\n }\n addQuery(identifier, query, args, {\n paginationOptions,\n journal\n }) {\n if (this.queries[identifier] !== void 0) {\n throw new Error(\n `Tried to add a new query with identifier ${identifier} when it already exists.`\n );\n }\n const watch = this.createWatch(query, args, {\n ...journal ? { journal } : [],\n ...paginationOptions ? { paginationOptions } : {}\n });\n const unsubscribe = watch.onUpdate(() => this.notifyListeners());\n this.queries[identifier] = {\n query,\n args,\n watch,\n unsubscribe,\n ...paginationOptions ? { paginationOptions } : {}\n };\n }\n removeQuery(identifier) {\n const info = this.queries[identifier];\n if (info === void 0) {\n throw new Error(`No query found with identifier ${identifier}.`);\n }\n info.unsubscribe();\n delete this.queries[identifier];\n }\n notifyListeners() {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n//# sourceMappingURL=queries_observer.js.map\n","\"use strict\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useConvex } from \"./client.js\";\nimport { QueriesObserver } from \"./queries_observer.js\";\nimport { useSubscription } from \"./use_subscription.js\";\nexport function useQueries(queries) {\n const convex = useConvex();\n if (convex === void 0) {\n throw new Error(\n \"Could not find Convex client! `useQuery` must be used in the React component tree under `ConvexProvider`. Did you forget it? See https://docs.convex.dev/quick-start#set-up-convex-in-your-react-app\"\n );\n }\n const createWatch = useMemo(() => {\n return (query, args, {\n journal,\n paginationOptions\n }) => {\n if (paginationOptions) {\n return convex.watchPaginatedQuery(query, args, paginationOptions);\n } else {\n return convex.watchQuery(query, args, journal ? { journal } : {});\n }\n };\n }, [convex]);\n return useQueriesHelper(queries, createWatch);\n}\nexport function useQueriesHelper(queries, createWatch) {\n const [observer] = useState(() => new QueriesObserver(createWatch));\n if (observer.createWatch !== createWatch) {\n observer.setCreateWatch(createWatch);\n }\n useEffect(() => () => observer.destroy(), [observer]);\n const subscription = useMemo(\n () => ({\n getCurrentValue: () => {\n return observer.getLocalResults(queries);\n },\n subscribe: (callback) => {\n observer.setQueries(queries);\n return observer.subscribe(callback);\n }\n }),\n [observer, queries]\n );\n return useSubscription(subscription);\n}\n//# sourceMappingURL=use_queries.js.map\n","var i=Symbol.for(\"preact-signals\");function t(){if(!(s>1)){var i,t=!1;while(void 0!==h){var n=h;h=void 0;v++;while(void 0!==n){var r=n.o;n.o=void 0;n.f&=-3;if(!(8&n.f)&&a(n))try{n.c()}catch(n){if(!t){i=n;t=!0}}n=r}}v=0;s--;if(t)throw i}else s--}function n(i){if(s>0)return i();s++;try{return i()}finally{t()}}var r=void 0;function o(i){var t=r;r=void 0;try{return i()}finally{r=t}}var f,h=void 0,s=0,v=0,u=0;function e(i){if(void 0!==r){var t=i.n;if(void 0===t||t.t!==r){t={i:0,S:i,p:r.s,n:void 0,t:r,e:void 0,x:void 0,r:t};if(void 0!==r.s)r.s.n=t;r.s=t;i.n=t;if(32&r.f)i.S(t);return t}else if(-1===t.i){t.i=0;if(void 0!==t.n){t.n.p=t.p;if(void 0!==t.p)t.p.n=t.n;t.p=r.s;t.n=void 0;r.s.n=t;r.s=t}return t}}}function d(i,t){this.v=i;this.i=0;this.n=void 0;this.t=void 0;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}d.prototype.brand=i;d.prototype.h=function(){return!0};d.prototype.S=function(i){var t=this,n=this.t;if(n!==i&&void 0===i.e){i.x=n;this.t=i;if(void 0!==n)n.e=i;else o(function(){var i;null==(i=t.W)||i.call(t)})}};d.prototype.U=function(i){var t=this;if(void 0!==this.t){var n=i.e,r=i.x;if(void 0!==n){n.x=r;i.e=void 0}if(void 0!==r){r.e=n;i.x=void 0}if(i===this.t){this.t=r;if(void 0===r)o(function(){var i;null==(i=t.Z)||i.call(t)})}}};d.prototype.subscribe=function(i){var t=this;return m(function(){var n=t.value,o=r;r=void 0;try{i(n)}finally{r=o}},{name:\"sub\"})};d.prototype.valueOf=function(){return this.value};d.prototype.toString=function(){return this.value+\"\"};d.prototype.toJSON=function(){return this.value};d.prototype.peek=function(){var i=r;r=void 0;try{return this.value}finally{r=i}};Object.defineProperty(d.prototype,\"value\",{get:function(){var i=e(this);if(void 0!==i)i.i=this.i;return this.v},set:function(i){if(i!==this.v){if(v>100)throw new Error(\"Cycle detected\");this.v=i;this.i++;u++;s++;try{for(var n=this.t;void 0!==n;n=n.x)n.t.N()}finally{t()}}}});function c(i,t){return new d(i,t)}function a(i){for(var t=i.s;void 0!==t;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function l(i){for(var t=i.s;void 0!==t;t=t.n){var n=t.S.n;if(void 0!==n)t.r=n;t.S.n=t;t.i=-1;if(void 0===t.n){i.s=t;break}}}function y(i){var t=i.s,n=void 0;while(void 0!==t){var r=t.p;if(-1===t.i){t.S.U(t);if(void 0!==r)r.n=t.n;if(void 0!==t.n)t.n.p=r}else n=t;t.S.n=t.r;if(void 0!==t.r)t.r=void 0;t=r}i.s=n}function w(i,t){d.call(this,void 0);this.x=i;this.s=void 0;this.g=u-1;this.f=4;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}w.prototype=new d;w.prototype.h=function(){this.f&=-3;if(1&this.f)return!1;if(32==(36&this.f))return!0;this.f&=-5;if(this.g===u)return!0;this.g=u;this.f|=1;if(this.i>0&&!a(this)){this.f&=-2;return!0}var i=r;try{l(this);r=this;var t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++}}catch(i){this.v=i;this.f|=16;this.i++}r=i;y(this);this.f&=-2;return!0};w.prototype.S=function(i){if(void 0===this.t){this.f|=36;for(var t=this.s;void 0!==t;t=t.n)t.S.S(t)}d.prototype.S.call(this,i)};w.prototype.U=function(i){if(void 0!==this.t){d.prototype.U.call(this,i);if(void 0===this.t){this.f&=-33;for(var t=this.s;void 0!==t;t=t.n)t.S.U(t)}}};w.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var i=this.t;void 0!==i;i=i.x)i.t.N()}};Object.defineProperty(w.prototype,\"value\",{get:function(){if(1&this.f)throw new Error(\"Cycle detected\");var i=e(this);this.h();if(void 0!==i)i.i=this.i;if(16&this.f)throw this.v;return this.v}});function b(i,t){return new w(i,t)}function _(i){var n=i.u;i.u=void 0;if(\"function\"==typeof n){s++;var o=r;r=void 0;try{n()}catch(t){i.f&=-2;i.f|=8;p(i);throw t}finally{r=o;t()}}}function p(i){for(var t=i.s;void 0!==t;t=t.n)t.S.U(t);i.x=void 0;i.s=void 0;_(i)}function g(i){if(r!==this)throw new Error(\"Out-of-order effect\");y(this);r=i;this.f&=-2;if(8&this.f)p(this);t()}function S(i,t){this.x=i;this.u=void 0;this.s=void 0;this.o=void 0;this.f=32;this.name=null==t?void 0:t.name;if(f)f.push(this)}S.prototype.c=function(){var i=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var t=this.x();if(\"function\"==typeof t)this.u=t}finally{i()}};S.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;_(this);l(this);s++;var i=r;r=this;return g.bind(this,i)};S.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.o=h;h=this}};S.prototype.d=function(){this.f|=8;if(!(1&this.f))p(this)};S.prototype.dispose=function(){this.d()};function m(i,t){var n=new S(i,t);try{n.c()}catch(i){n.d();throw i}var r=n.d.bind(n);r[Symbol.dispose]=r;return r}function E(i){return function(){var t=arguments,r=this;return n(function(){return o(function(){return i.apply(r,[].slice.call(t))})})}}function x(){var i=f;f=[];return function(){var t=f;if(f&&i)i=i.concat(f);f=i;return t}}function C(i){return function(){var t,n,r=x();try{n=i.apply(void 0,[].slice.call(arguments))}catch(i){f=void 0;throw i}finally{t=r()}for(var o in n)if(\"function\"==typeof n[o])n[o]=E(n[o]);n[Symbol.dispose]=E(function(){if(t)for(var i=0;i<t.length;i++)t[i].dispose();t=void 0});return n}}export{w as Computed,S as Effect,d as Signal,E as action,n as batch,b as computed,C as createModel,m as effect,c as signal,o as untracked};//# sourceMappingURL=signals-core.module.js.map\n","import{Component as i,options as n,isValidElement as t,Fragment as r}from\"preact\";import{useMemo as o,useRef as f,useEffect as e}from\"preact/hooks\";import{effect as u,Signal as a,computed as c,signal as v,batch as s}from\"@preact/signals-core\";export{Signal,action,batch,computed,createModel,effect,signal,untracked}from\"@preact/signals-core\";var l,h,d,p=\"undefined\"!=typeof window&&!!window.__PREACT_SIGNALS_DEVTOOLS__,m=[],_=[];u(function(){l=this.N})();function g(i,t){n[i]=t.bind(null,n[i]||function(){})}function b(i){if(d){var n=d;d=void 0;n()}d=i&&i.S()}function y(i){var n=this,r=i.data,f=useSignal(r);f.value=r;var e=o(function(){var i=n,r=n.__v;while(r=r.__)if(r.__c){r.__c.__$f|=4;break}var o=c(function(){var i=f.value.value;return 0===i?0:!0===i?\"\":i||\"\"}),e=c(function(){return!Array.isArray(o.value)&&!t(o.value)}),a=u(function(){this.N=F;if(e.value){var n=o.value;if(i.__v&&i.__v.__e&&3===i.__v.__e.nodeType)i.__v.__e.data=n}}),v=n.__$u.d;n.__$u.d=function(){a();v.call(this)};return[e,o]},[]),a=e[0],v=e[1];return a.value?v.peek():v.value}y.displayName=\"ReactiveTextNode\";Object.defineProperties(a.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:y},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}});g(\"__b\",function(i,n){if(\"string\"==typeof n.type){var t,r=n.props;for(var o in r)if(\"children\"!==o){var f=r[o];if(f instanceof a){if(!t)n.__np=t={};t[o]=f;r[o]=f.peek()}}}i(n)});g(\"__r\",function(i,n){i(n);if(n.type!==r){b();var t,o=n.__c;if(o){o.__$f&=-2;if(void 0===(t=o.__$u))o.__$u=t=function(i,n){var t;u(function(){t=this},{name:n});t.c=i;return t}(function(){var i;if(p)null==(i=t.y)||i.call(t);o.__$f|=1;o.setState({})},\"function\"==typeof n.type?n.type.displayName||n.type.name:\"\")}h=o;b(t)}});g(\"__e\",function(i,n,t,r){b();h=void 0;i(n,t,r)});g(\"diffed\",function(i,n){b();h=void 0;var t;if(\"string\"==typeof n.type&&(t=n.__e)){var r=n.__np,o=n.props;if(r){var f=t.U;if(f)for(var e in f){var u=f[e];if(void 0!==u&&!(e in r)){u.d();f[e]=void 0}}else{f={};t.U=f}for(var a in r){var c=f[a],v=r[a];if(void 0===c){c=w(t,a,v,o);f[a]=c}else c.o(v,o)}}}i(n)});function w(i,n,t,r){var o=n in i&&void 0===i.ownerSVGElement,f=v(t);return{o:function(i,n){f.value=i;r=n},d:u(function(){this.N=F;var t=f.value.value;if(r[n]!==t){r[n]=t;if(o)i[n]=t;else if(null!=t&&(!1!==t||\"-\"===n[4]))i.setAttribute(n,t);else i.removeAttribute(n)}})}}g(\"unmount\",function(i,n){if(\"string\"==typeof n.type){var t=n.__e;if(t){var r=t.U;if(r){t.U=void 0;for(var o in r){var f=r[o];if(f)f.d()}}}}else{var e=n.__c;if(e){var u=e.__$u;if(u){e.__$u=void 0;u.d()}}}i(n)});g(\"__h\",function(i,n,t,r){if(r<3||9===r)n.__$f|=2;i(n,t,r)});i.prototype.shouldComponentUpdate=function(i,n){if(this.__R)return!0;var t=this.__$u,r=t&&void 0!==t.s;for(var o in n)return!0;if(this.__f||\"boolean\"==typeof this.u&&!0===this.u){var f=2&this.__$f;if(!(r||f||4&this.__$f))return!0;if(1&this.__$f)return!0}else{if(!(r||4&this.__$f))return!0;if(3&this.__$f)return!0}for(var e in i)if(\"__source\"!==e&&i[e]!==this.props[e])return!0;for(var u in this.props)if(!(u in i))return!0;return!1};function useSignal(i,n){return o(function(){return v(i,n)},[])}function useComputed(i,n){var t=f(i);t.current=i;h.__$f|=4;return o(function(){return c(function(){return t.current()},n)},[])}var k=\"undefined\"==typeof requestAnimationFrame?setTimeout:function(i){var n=function(){clearTimeout(t);cancelAnimationFrame(r);i()},t=setTimeout(n,35),r=requestAnimationFrame(n)},q=function(i){queueMicrotask(function(){queueMicrotask(i)})};function A(){s(function(){var i;while(i=m.shift())l.call(i)})}function T(){if(1===m.push(this))(n.requestAnimationFrame||k)(A)}function x(){s(function(){var i;while(i=_.shift())l.call(i)})}function F(){if(1===_.push(this))(n.requestAnimationFrame||q)(x)}function useSignalEffect(i,n){var t=f(i);t.current=i;e(function(){return u(function(){this.N=T;return t.current()},n)},[])}function M(i){var n=o(function(){return i()},[]);e(function(){return n[Symbol.dispose]},[n]);return n}export{useComputed,M as useModel,useSignal,useSignalEffect};//# sourceMappingURL=signals.module.js.map\n","import { signal } from '@preact/signals'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Whether the chat window is currently open.\n *\n * Lives in its own file because it is read and written across multiple layers:\n * - widget-instance.ts open() / close() / toggle() / subscribe()\n * - mount.tsx reset to false on shutdown\n * - WidgetShell.tsx conditionally renders the chat window\n * - FAB.tsx toggle button reads and flips this value\n *\n * Keeping it here prevents any one of those files from becoming the\n * \"source\" that others import from — none of them own it, they all share it.\n */\nexport const isOpen = signal(false)\n\n/** Session source tag, e.g. \"dashboard-test\". Set once during mount. */\nexport const widgetSource = signal<string | undefined>(undefined)\n\nexport const PLATFORM_PRIVACY_POLICY_URL = 'https://jexitychat.de/privacy'\n\nexport const resolvedPrivacyPolicyUrl = signal(PLATFORM_PRIVACY_POLICY_URL)\n\nexport const privacyNoticeStyle = signal<'chip' | 'explicit'>('chip')\n\n/** Bootstrap token issued by POST /widget/bootstrap. Read by useConvexSession. */\nexport const bootstrapToken = signal<Id<'widgetBootstrapTokens'> | undefined>(undefined)\n\n/**\n * Path-scoped allow URLs from the bootstrap response (e.g. [\"https://example.com/en\", \"https://example.com/ru\"]).\n * Multiple entries arise when a project has several path rules for the same origin.\n * Set once after bootstrap; consumed by usePathGuard. Empty = no path restriction.\n */\nexport const allowedUrls = signal<string[]>([])\n\n/**\n * Per-domain exclude paths from the bootstrap response.\n * Paths listed here hide the widget even when the domain/origin is allowed.\n * Set once after bootstrap; consumed by usePathGuard.\n */\nexport const excludedPaths = signal<string[]>([])\n\n/**\n * Inputs needed to re-POST /widget/bootstrap when the current token expires\n * mid-session. Populated by useBootstrap on mount (both IIFE preToken path\n * and ESM async-fetch path). Consumed by refreshBootstrapToken().\n */\nexport const bootstrapInputs = signal<{\n orgSlug: string\n projSlug: string | undefined\n siteUrl: string\n} | null>(null)\n","/**\n * Convex URL normalisation helpers.\n *\n * VITE_CONVEX_URL accepts either Convex URL format:\n * https://<name>.convex.cloud — WebSocket / REST API base\n * https://<name>.convex.site — HTTP Actions base\n *\n * These helpers normalise whichever format is provided to the one needed\n * by each consumer, so only a single env var is required.\n *\n * The \\b word-boundary in each regex prevents partial matches if the\n * hostname ever contains the pattern mid-string.\n */\n\n/** Returns the .convex.cloud URL regardless of which format is provided. */\nexport function toConvexCloudUrl(url: string): string {\n return url.replace(/\\.convex\\.site\\b/, '.convex.cloud')\n}\n\n/** Returns the .convex.site URL regardless of which format is provided. */\nexport function toConvexSiteUrl(url: string): string {\n return url.replace(/\\.convex\\.cloud\\b/, '.convex.site')\n}\n","import type { JexityChatOptions } from '../types'\n\ntype PrivacyNoticeStyle = 'chip' | 'explicit'\nimport type { WidgetLocale } from '../i18n/index'\n\n/**\n * Fully-resolved widget configuration — produced by merging embed-script\n * options with the Convex remote config (embed options take precedence).\n *\n * All fields with defaults are non-optional so consumers never need ?? chains.\n */\nexport interface ResolvedWidgetConfig {\n // Display\n title: string\n greeting: string\n locale: string | undefined\n // Position / appearance\n position: JexityChatOptions['position']\n colorScheme: JexityChatOptions['colorScheme']\n hideBranding: boolean\n privacyPolicyMode: NonNullable<JexityChatOptions['privacyPolicyMode']>\n privacyPolicyUrl: string | undefined\n privacyNoticeStyle: PrivacyNoticeStyle\n // Floating action button\n triggerIcon: NonNullable<JexityChatOptions['triggerIcon']>\n triggerRadius: NonNullable<JexityChatOptions['triggerRadius']>\n triggerLabel: string\n // Mode\n mode: NonNullable<JexityChatOptions['mode']>\n // Theme overrides (passed through to buildThemeStyle)\n primaryColor: string | undefined\n accentColor: string | undefined\n fontFamily: string | undefined\n fontSize: number | undefined\n borderRadius: string | undefined\n windowWidth: number | undefined\n windowHeight: number | undefined\n}\n\nfunction normalizeHttpUrl(url: string | undefined): string | undefined {\n const trimmed = url?.trim()\n if (!trimmed) { return undefined }\n try {\n const parsed = new URL(trimmed)\n if (parsed.protocol === 'http:' || parsed.protocol === 'https:') { return trimmed }\n } catch {\n return undefined\n }\n return undefined\n}\n\n/**\n * Merges embed-script options with the remote Convex config.\n * Embed-script values always take precedence; remote config fills the gaps.\n *\n * Centralising the merge here means AppShell never needs ?? chains,\n * and any new remote config field has exactly one place to wire it in.\n */\nexport function mergeWidgetConfig(\n options: JexityChatOptions,\n remote: RemoteConfig | null,\n): ResolvedWidgetConfig {\n const title = options.title ?? remote?.title ?? 'Assistant'\n const privacyPolicyMode = options.privacyPolicyMode ?? remote?.privacyPolicyMode ?? 'platform'\n const privacyNoticeStyle = normalizePrivacyNoticeStyle(\n options.privacyNoticeStyle ?? remote?.privacyNoticeStyle,\n )\n return {\n title,\n greeting: options.greeting ?? remote?.welcomeMessage ?? `Hi! I'm ${title}. How can I help?`,\n locale: options.locale ?? remote?.locale,\n position: options.position ?? remote?.position,\n colorScheme: options.colorScheme ?? remote?.colorScheme,\n hideBranding: options.hideBranding ?? remote?.hideBranding ?? false,\n privacyPolicyMode,\n privacyPolicyUrl: privacyPolicyMode === 'custom'\n ? normalizeHttpUrl(options.privacyPolicyUrl ?? remote?.privacyPolicyUrl)\n : undefined,\n privacyNoticeStyle,\n triggerIcon: options.triggerIcon ?? remote?.triggerIcon ?? 'chat',\n triggerRadius: options.triggerRadius ?? remote?.triggerRadius ?? 'full',\n triggerLabel: options.triggerLabel ?? remote?.triggerLabel ?? 'Chatte mit uns',\n mode: options.mode ?? 'floating',\n primaryColor: options.primaryColor ?? remote?.primaryColor,\n accentColor: options.accentColor ?? remote?.accentColor,\n fontFamily: options.fontFamily ?? remote?.fontFamily,\n fontSize: options.fontSize ?? remote?.fontSize,\n borderRadius: options.borderRadius ?? remote?.borderRadius,\n windowWidth: options.windowWidth ?? remote?.windowWidth,\n windowHeight: options.windowHeight ?? remote?.windowHeight,\n }\n}\n\nfunction normalizePrivacyNoticeStyle(style: JexityChatOptions['privacyNoticeStyle']): PrivacyNoticeStyle {\n return style === 'explicit' || style === 'sheet' ? 'explicit' : 'chip'\n}\n\n/**\n * Shape of the response from the public GET /widget/config endpoint.\n *\n * Uses Pick<JexityChatOptions, ...> so that field types stay in sync with\n * the embed-script options automatically — no need to duplicate type definitions.\n *\n * Extra fields (primaryColor, title, welcomeMessage) come from the database\n * and have no equivalent in JexityChatOptions, so they're defined separately.\n */\nexport type RemoteConfig = Pick<JexityChatOptions,\n | 'position' | 'colorScheme' | 'hideBranding'\n | 'accentColor' | 'fontFamily' | 'fontSize'\n | 'borderRadius' | 'windowWidth' | 'windowHeight'\n | 'triggerIcon' | 'triggerRadius' | 'triggerLabel'\n | 'privacyPolicyMode' | 'privacyPolicyUrl' | 'privacyNoticeStyle'\n> & {\n primaryColor: string // always set in DB\n title: string // mapped from widgetConfigs.name\n welcomeMessage: string // mapped from widgetConfigs.welcomeMessage\n locale?: WidgetLocale\n}\n\n/**\n * Fetches the widget's remote configuration from the Convex HTTP endpoint.\n *\n * @param siteUrl The .convex.site base URL (HTTP Actions domain).\n * @param orgSlug The organisation slug embedded in the script tag.\n * @param signal AbortSignal to cancel the request on component unmount.\n *\n * @returns The parsed config, or null if the org is not found (404) or the\n * server returns any non-OK status.\n */\nexport async function fetchRemoteConfig(\n siteUrl: string,\n orgSlug: string,\n signal: AbortSignal,\n projSlug?: string,\n): Promise<RemoteConfig | null> {\n const urlObj = new URL(`${siteUrl}/widget/config`)\n urlObj.searchParams.set('orgSlug', orgSlug)\n if (projSlug) {\n urlObj.searchParams.set('projSlug', projSlug)\n }\n const response = await fetch(urlObj.toString(), { signal })\n\n if (!response.ok) {\n return null\n }\n\n return response.json() as Promise<RemoteConfig>\n}\n","import { useState, useEffect } from 'preact/hooks'\nimport { toConvexSiteUrl } from '../../../lib/convex-url'\nimport { fetchRemoteConfig, type RemoteConfig } from '../../../lib/widget-config'\n\n/**\n * Fetches the widget's remote config from Convex for the given orgSlug.\n *\n * - Returns null on first render, then updates once the fetch resolves.\n * - Clears stale config immediately when orgSlug changes (prevents flashing\n * the previous org's title/colors while the new fetch is in flight).\n * - Aborts the in-flight request if orgSlug changes or the hook unmounts.\n * - Silent fail: any error (network, 404, parse) resolves to null so the\n * widget still renders using embed-script options as a fallback.\n */\nexport function useRemoteConfig(orgSlug: string, projSlug: string | undefined, runtimeConvexUrl?: string): RemoteConfig | null {\n const [remoteConfig, setRemoteConfig] = useState<RemoteConfig | null>(null)\n\n useEffect(() => {\n // Clear stale config immediately — the widget should not show the previous\n // org's title/colors while the new fetch is still in flight.\n setRemoteConfig(null)\n\n const convexUrl = runtimeConvexUrl ?? import.meta.env.VITE_CONVEX_URL\n const siteUrl = convexUrl ? toConvexSiteUrl(convexUrl) : undefined\n\n // No Convex URL configured or orgSlug missing — skip the fetch entirely\n if (!siteUrl || !orgSlug) { return }\n\n const controller = new AbortController()\n\n async function load(url: string): Promise<void> {\n try {\n const cfg = await fetchRemoteConfig(url, orgSlug, controller.signal, projSlug)\n if (cfg) { setRemoteConfig(cfg) }\n } catch (err) {\n // AbortError is expected when orgSlug changes or the widget unmounts.\n if (err instanceof Error && err.name === 'AbortError') { return }\n // Any other error (network failure, 404, parse error) is a silent fail.\n // The widget renders with embed-script options as a fallback.\n }\n }\n\n void load(siteUrl)\n\n return () => { controller.abort() }\n }, [orgSlug, projSlug, runtimeConvexUrl])\n\n return remoteConfig\n}\n","/**\n * Calls POST /widget/bootstrap on the Convex HTTP actions endpoint.\n * The browser automatically sends the real `Origin` header — JS cannot forge it.\n * Returns the bootstrap token (a Convex document ID) on success, or an error code.\n */\n\ntype BootstrapOk = { ok: true; token: string; excludePaths: string[]; allowedUrls: string[] }\ntype BootstrapErr = {\n ok: false\n error: 'unauthorized' | 'not_found' | 'network' | 'rate_limited'\n retryAfterSec?: number\n}\ntype BootstrapResult = BootstrapOk | BootstrapErr\n\nexport async function bootstrapWidget(\n orgSlug: string,\n convexSiteUrl: string,\n projSlug?: string,\n): Promise<BootstrapResult> {\n try {\n const resp = await fetch(`${convexSiteUrl}/widget/bootstrap`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(projSlug ? { orgSlug, projSlug } : { orgSlug }),\n credentials: 'omit',\n })\n\n if (resp.ok) {\n const data: { token: string; excludePaths: string[]; allowedUrls?: string[]; allowedUrl?: string } = await resp.json()\n const allowedUrls = data.allowedUrls ?? (data.allowedUrl ? [data.allowedUrl] : [])\n return { ok: true, token: data.token, excludePaths: data.excludePaths, allowedUrls }\n }\n\n if (resp.status === 403) {\n return { ok: false, error: 'unauthorized' }\n }\n if (resp.status === 404) {\n return { ok: false, error: 'not_found' }\n }\n if (resp.status === 429) {\n // Honor server's Retry-After header (seconds); fall back to 60s.\n const retryAfterSec = Number(resp.headers.get('Retry-After')) || 60\n return { ok: false, error: 'rate_limited', retryAfterSec }\n }\n\n return { ok: false, error: 'network' }\n } catch {\n return { ok: false, error: 'network' }\n }\n}\n\n// Keep in sync with packages/backend/convex/lib/widgetOrigin.ts\nexport function isPathExcluded(pathname: string, excludePaths: string[]): boolean {\n return excludePaths.some((excluded) => {\n if (excluded === '/') { return pathname === '/' }\n return pathname === excluded || pathname.startsWith(excluded + '/')\n })\n}\n\nexport function isUrlMatched(currentUrl: string, allowedUrl: string): boolean {\n try {\n const current = new URL(currentUrl)\n const allowed = new URL(allowedUrl)\n if (current.origin !== allowed.origin) { return false }\n const allowedPath = allowed.pathname.replace(/\\/$/, '')\n if (!allowedPath) { return true } // root-domain rule → allow all paths\n const currentPath = current.pathname.replace(/\\/$/, '')\n return currentPath === allowedPath || currentPath.startsWith(allowedPath + '/')\n } catch {\n return false\n }\n}\n","import { useEffect } from 'preact/hooks'\nimport { toConvexSiteUrl } from '../../../lib/convex-url'\nimport { bootstrapWidget } from '../../../lib/widgetBootstrap'\nimport { bootstrapToken, bootstrapInputs, allowedUrls, excludedPaths } from '../shell.state'\n\ninterface UseBootstrapOptions {\n orgSlug: string\n projSlug?: string\n preToken?: string\n convexUrl?: string\n preAllowedUrls?: string[]\n preExcludedPaths?: string[]\n}\n\n/**\n * If no pre-existing bootstrap token was passed via mount options (i.e. the\n * ESM/React path — JexityChatProvider), call POST /widget/bootstrap here and\n * populate the token signal so useConvexSession can create sessions.\n *\n * The IIFE entry bootstraps *before* mount and passes the token in via\n * options.bootstrapToken — in that case preToken is set, this hook no-ops\n * the initial fetch but still records the inputs so refreshBootstrapToken()\n * can re-POST when the 1-hour token TTL elapses mid-session.\n */\nexport function useBootstrap({\n orgSlug,\n projSlug,\n preToken,\n convexUrl,\n preAllowedUrls,\n preExcludedPaths,\n}: UseBootstrapOptions): void {\n useEffect(() => {\n const resolvedConvexUrl = convexUrl ?? (import.meta.env.VITE_CONVEX_URL as string | undefined)\n const siteUrl = resolvedConvexUrl ? toConvexSiteUrl(resolvedConvexUrl) : undefined\n if (!siteUrl || !orgSlug) { return }\n\n // Record inputs for refreshBootstrapToken() — needed by both entry paths\n // so auto-recovery works after the initial fetch (IIFE) or refetch (ESM).\n bootstrapInputs.value = { orgSlug, projSlug, siteUrl }\n\n if (preToken) {\n // Pre-bootstrapped path (IIFE or custom integration): store allowedUrls and\n // excludedPaths from mount options so usePathGuard can enforce path-scoped\n // rules without refetch.\n allowedUrls.value = preAllowedUrls ?? []\n excludedPaths.value = preExcludedPaths ?? []\n return\n }\n\n let cancelled = false\n void (async () => {\n const result = await bootstrapWidget(orgSlug, siteUrl, projSlug)\n if (cancelled) { return }\n if (result.ok) {\n bootstrapToken.value = result.token as typeof bootstrapToken.value\n allowedUrls.value = result.allowedUrls\n excludedPaths.value = result.excludePaths\n } else {\n const scope = projSlug ? `project '${orgSlug}/${projSlug}'` : `org '${orgSlug}'`\n if (result.error === 'unauthorized') {\n console.warn(\n `[JexityChat] Domain not authorized for ${scope}. Check the widget's domain rules.`,\n )\n } else if (result.error === 'not_found') {\n console.error(`[JexityChat] No active widget config found for ${scope}.`)\n } else if (result.error === 'rate_limited') {\n console.error(\n `[JexityChat] Bootstrap rate-limited for ${scope}. Retry after ${result.retryAfterSec ?? 60}s.`,\n )\n } else {\n console.error(`[JexityChat] Bootstrap failed: ${result.error}`)\n }\n }\n })()\n\n return () => { cancelled = true }\n }, [orgSlug, projSlug, preToken, convexUrl])\n}\n","/**\n * Singleton history patch — wraps pushState/replaceState once and notifies\n * all registered listeners on programmatic SPA navigation. Also forwards\n * popstate so listeners don't need to wire it themselves.\n */\n\nconst listeners = new Set<() => void>()\nlet patched = false\n\nfunction ensureHistoryPatch(): void {\n if (patched) { return }\n patched = true\n const origPush = history.pushState.bind(history)\n const origReplace = history.replaceState.bind(history)\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args)\n listeners.forEach(fn => fn())\n }\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args)\n listeners.forEach(fn => fn())\n }\n}\n\n/** Register a navigation listener. Returns a cleanup function. */\nexport function addHistoryListener(fn: () => void): () => void {\n listeners.add(fn)\n window.addEventListener('popstate', fn)\n ensureHistoryPatch()\n return () => {\n listeners.delete(fn)\n window.removeEventListener('popstate', fn)\n }\n}\n","import { useEffect } from 'preact/hooks'\nimport { useSignal } from '@preact/signals'\nimport { isUrlMatched, isPathExcluded } from '../../../lib/widgetBootstrap'\nimport { addHistoryListener } from '../../../lib/history-patch'\nimport { allowedUrls, excludedPaths } from '../shell.state'\n\n/**\n * Returns true when the widget is allowed to display on the current page.\n * If no path-scoped allowedUrls are set, always returns true.\n * Reacts to SPA navigation (popstate + history.pushState/replaceState).\n */\nexport function usePathGuard(): boolean {\n const href = useSignal(window.location.href)\n\n useEffect(() => {\n const update = () => { href.value = window.location.href }\n return addHistoryListener(update)\n }, [])\n\n const urls = allowedUrls.value\n const excluded = excludedPaths.value\n const pathname = new URL(href.value).pathname\n\n // Compute once — reused in warn effect and guard logic.\n const isExcluded = isPathExcluded(pathname, excluded)\n\n useEffect(() => {\n if (isExcluded) {\n console.warn(\n `[JexityChat] Widget hidden — current path is in the exclude list: ${pathname}`,\n )\n } else if (urls.length > 0 && !urls.some((url) => isUrlMatched(href.value, url))) {\n console.warn(\n `[JexityChat] Widget hidden — current page does not match path rule. Allowed: ${urls.join(', ')}`,\n )\n }\n }, [href.value, urls, excluded])\n\n // Exclude check takes priority — an excluded path hides the widget even if\n // the allow-rule would otherwise permit it.\n if (isExcluded) { return false }\n if (urls.length === 0) { return true }\n return urls.some((url) => isUrlMatched(href.value, url))\n}\n","// Keep in sync with de.ts — both must export the same WidgetStrings shape.\nexport interface WidgetStrings {\n title: string\n statusOnline: string\n inputPlaceholder: string\n aiThinking: string\n sendAriaLabel: string\n attachImagesAriaLabel: string\n attachComingSoon: string\n removeAttachmentAriaLabel: string\n openChatAriaLabel: string\n closeChatAriaLabel: string\n errorNetwork: string\n errorQuota: string\n errorRateLimited: string\n /** Shown when the widget couldn't get a bootstrap token (POST /widget/bootstrap failed or 10s wait timed out). */\n errorSessionNoToken: string\n /** Shown when the bootstrap token was rejected and a refresh also failed. */\n errorSessionUnauthorized: string\n localeLabelDe: string\n localeLabelEn: string\n resumeConversation: string\n startingConversation: string\n sessionNotFound: string\n startNewConversation: string\n chatWith: string\n haveReferenceNumber: string\n referencePlaceholder: string\n resume: string\n howCanWeHelp: string\n getInstantHelp: string\n submitTicket: string\n replyByEmail: string\n ticketSubmitted: string\n yourReferenceNumber: string\n sentToEmailHint: string\n done: string\n submittingTicket: string\n yourName: string\n yourEmail: string\n submit: string\n back: string\n // Escalation form (inline in chat thread)\n escalationFormTitle: string\n escalationNameLabel: string\n escalationEmailLabel: string\n escalationSubtitle: string\n escalationSubmit: string\n escalationSubmitting: string\n escalationSubmitted: string\n escalationConsent: string\n escalationPrivacyLinkText: string\n escalationSkip: string\n escalationPromptTitle: string\n escalationPromptSubtitle: string\n escalationPromptSubmit: string\n escalationSubmitFailed: string\n // Session resume prompt\n sessionNotFoundPrompt: string\n /** Privacy notice shown on Home after the idle/visibility lock wiped the chat. */\n sessionLocked: string\n // Resolved session\n sessionResolved: string\n tryAgain: string\n goBack: string\n somethingWentWrong: string\n fabLabel: string\n /** Shown when a session belongs to an org that has been deleted. */\n chatNoLongerAvailable: string\n // Handoff & resume list\n talkToHuman: string\n talkToHumanAria: string\n handoffPending: string\n handoffFailed: string\n handoffRateLimited: string\n resumeListLabel: string\n resumeListTimestamp: string\n // System notices (mirror backend `noticeKind`; `{name}` = joining agent)\n noticeAgentJoined: string\n noticeHumanRequested: string\n noticeHumanRequestedForm: string\n /** Markdown confirmation card. `{name}` `{email}` `{ref}` are interpolated. */\n noticeEscalationConfirmed: string\n /** Free-tier/quota fallback shown when no AI reply will come. */\n noticeMessageReceived: string\n /** Shown when a human agent owns the session and the AI is suppressed. */\n noticeAgentHandling: string\n /** Reply-to-agent button aria-label/title. `{name}` is interpolated. */\n replyTo: string\n /** Sources pill count. `{count}` is interpolated. */\n sourcesCountOne: string\n sourcesCountOther: string\n /** Privacy notice below composer. Split so the link can be wrapped in <a>. */\n privacyNoticePre: string\n privacyPolicyLinkText: string\n privacyChipText: string\n privacyExplicitTitle: string\n privacyExplicitBodyPre: string\n privacyExplicitButton: string\n // Magicline integration forms (inline in chat thread)\n magiclineTrialTitle: string\n magiclineLeadTitle: string\n magiclineFirstName: string\n magiclineLastName: string\n magiclineEmail: string\n magiclinePhone: string\n magiclineBirthDate: string\n magiclineInterest: string\n magiclineMessage: string\n magiclineSlotLabel: string\n magiclineSlotPlaceholder: string\n magiclineLoadingSlots: string\n magiclineNoSlots: string\n magiclineSubmit: string\n magiclineSubmitting: string\n magiclineSubmitted: string\n magiclineSubmittedDetail: string\n magiclineFailed: string\n magiclineFailedDetail: string\n magiclineConsent: string\n magiclinePrivacyLinkText: string\n magiclineRequiredError: string\n magiclineEmailError: string\n magiclineConsentError: string\n // Dynamic per-studio trial form (v2)\n magiclineConfigLoading: string\n magiclineConfigUnsupported: string\n magiclineConfigInconsistent: string\n magiclineConfigUnavailable: string\n magiclineGender: string\n magiclineGenderPlaceholder: string\n magiclineGenderMale: string\n magiclineGenderFemale: string\n magiclineGenderUnisex: string\n magiclineStreet: string\n magiclineHouseNumber: string\n magiclineZip: string\n magiclineCity: string\n magiclineCountry: string\n magiclineCountryPlaceholder: string\n magiclineNote: string\n /** Suffix appended to a config-driven field label when the studio marks it optional. */\n magiclineOptionalSuffix: string\n magiclineTrainerRequired: string\n magiclineMinAgeError: string\n magiclineSlotRequiredError: string\n magiclineSlotUnavailableNotice: string\n // Step wizard (v3)\n magiclineStepTrainer: string\n magiclineStepSlot: string\n magiclineStepPersonal: string\n magiclineStepAddress: string\n magiclineStepConfirm: string\n /** \"Step {n} of {total}\". `{n}` and `{total}` interpolated. */\n magiclineStepCounter: string\n magiclineWizardBack: string\n magiclineWizardNext: string\n magiclineTrainerWith: string\n magiclineTrainerWithout: string\n magiclineSummaryTrainer: string\n magiclineSummarySlot: string\n magiclineSummaryName: string\n magiclineRetry: string\n /** Distinct from `magiclineNoSlots` — a retryable load failure, not empty. */\n magiclineSlotsError: string\n\n // Membership signup wizard (contract creation)\n magiclineContractTitle: string\n magiclineStepOffer: string\n magiclineStepUpgrades: string\n magiclineStepPayment: string\n magiclineStepReview: string\n magiclineOffersLoading: string\n magiclineOffersError: string\n magiclineNoOffers: string\n /** \"{value} {unit}\" term length, e.g. \"12 months\". */\n magiclineTermLength: string\n // Payment-frequency suffixes used by formatPaymentFrequency\n /** \"per day\" (value === 1) */\n magiclineFreqPerDay: string\n /** \"per week\" (value === 1) */\n magiclineFreqPerWeek: string\n /** \"per month\" (value === 1) */\n magiclineFreqPerMonth: string\n /** \"per year\" (value === 1) */\n magiclineFreqPerYear: string\n /** \"every {n} days\" (value > 1) — \"{n}\" interpolated by caller */\n magiclineFreqEveryDays: string\n /** \"every {n} weeks\" (value > 1) — \"{n}\" interpolated by caller */\n magiclineFreqEveryWeeks: string\n /** \"every {n} months\" (value > 1) — \"{n}\" interpolated by caller */\n magiclineFreqEveryMonths: string\n /** \"every {n} years\" (value > 1) — \"{n}\" interpolated by caller */\n magiclineFreqEveryYears: string\n // Module price label suffixes\n /** \"per term\" price suffix for TERM_BASED modules */\n magiclineModulePerTerm: string\n /** \"one-time\" price suffix for NON_RECURRING / MONTH_DAY modules */\n magiclineModuleOneTime: string\n /** \"included\" label for FREE modules */\n magiclineModuleIncluded: string\n // Module renewal labels\n /** Renewal line when extensionType is \"NONE\" */\n magiclineRenewalNone: string\n /** \"Renewal: {n} {unit}\" prefix — \"{n}\" and \"{unit}\" interpolated by caller */\n magiclineRenewalTerm: string\n magiclineCancellationPeriod: string\n magiclineStarterPackage: string\n magiclineFlatFee: string\n magiclineIncludedModules: string\n /** Disclosure label for the collapsible bundle details on the offer step. */\n magiclineDetails: string\n /** Caption above a required consent checkbox (upgrade + contract block). */\n magiclineRequired: string\n // Optional upgrades (paid add-on modules) step\n magiclineUpgradesIntro: string\n magiclineUpgradesNone: string\n magiclineUpgradeAdd: string\n magiclineUpgradeAdded: string\n magiclineUpgradeOneTime: string\n magiclineUpgradeConsentError: string\n magiclineOfferRequiredError: string\n magiclineCountryStatic: string\n magiclineAccountHolder: string\n magiclineIban: string\n magiclineIbanInvalidError: string\n magiclineSepaConsent: string\n magiclineReviewLoading: string\n magiclineReviewError: string\n magiclineReviewOffer: string\n magiclineReviewPriceSummary: string\n magiclineReviewBasePrice: string\n magiclineReviewOneTimeFees: string\n magiclineReviewPreUseCharge: string\n magiclineReviewSelectedUpgrades: string\n magiclineReviewContractVolume: string\n magiclineReviewStartsOn: string\n magiclineReviewPayment: string\n magiclineReviewTerms: string\n /** Generic prompt above the contract confirmation checkboxes. */\n magiclineConfirmPrompt: string\n /** Validation error when a required confirmation is not ticked. */\n magiclineConfirmRequiredError: string\n magiclineSummaryAddress: string\n magiclineContractSubmitted: string\n /** \"{number}\" interpolated with the Magicline customer number. */\n magiclineCustomerNumber: string\n magiclinePriceChangedNotice: string\n magiclineOfferUnavailableNotice: string\n magiclineConfirmationRequiredNotice: string\n magiclineLiveSubmissionDisabled: string\n magiclineDuplicateNotice: string\n magiclineUnknownOutcome: string\n /** Localized label for the \"Startpaket\" flat fee returned by Magicline. */\n magiclineFeeStarterPackage: string\n /** Localized label for the \"Trainerpauschale\" flat fee returned by Magicline. */\n magiclineFeeTrainerFee: string\n // Voucher code (contract-creation Review step)\n /** Label for the voucher code input field. */\n magiclineVoucherLabel: string\n /** Placeholder for the voucher code input field. */\n magiclineVoucherPlaceholder: string\n /** Apply button label for the voucher field. */\n magiclineVoucherApply: string\n /** Inline discount line shown when a DISCOUNT voucher is applied. \"{discount}\" interpolated. */\n magiclineVoucherAppliedDiscount: string\n /** Notice shown below totals when a CREDIT voucher is applied. */\n magiclineVoucherCreditNotice: string\n /** Label above the voucher's remarks text. */\n magiclineVoucherRemarks: string\n /** Error banner when the voucher code is not valid. */\n magiclineVoucherInvalid: string\n /** Notice shown (and field hidden) when vouchers are disabled for this studio. */\n magiclineVoucherDisabled: string\n /** Total contract volume label when a DISCOUNT voucher is active (clarifies the total is pre-discount). */\n magiclineGesamtpreisBeforeDiscount: string\n}\n\nexport const en: WidgetStrings = {\n title: 'Assistant',\n statusOnline: 'Online \\u00b7 Responds in seconds',\n inputPlaceholder: 'Type a message\\u2026',\n aiThinking: 'AI is responding\\u2026',\n sendAriaLabel: 'Send message',\n attachImagesAriaLabel: 'Attach images',\n attachComingSoon: 'File attachments — coming soon',\n removeAttachmentAriaLabel: 'Remove attachment',\n openChatAriaLabel: 'Open chat',\n closeChatAriaLabel: 'Close chat',\n errorNetwork: 'Network error. Please try again.',\n errorQuota: 'Message limit reached. Please try again later.',\n errorRateLimited: 'Too many messages. Try again in {seconds}s.',\n errorSessionNoToken: 'Could not connect to chat. Check your connection and try again.',\n errorSessionUnauthorized: 'This chat is not authorised on this page. Please reload.',\n localeLabelDe: 'DE',\n localeLabelEn: 'EN',\n resumeConversation: 'Resuming conversation…',\n startingConversation: 'Starting conversation…',\n sessionNotFound: 'Your previous session was not found. Starting a new conversation.',\n startNewConversation: 'Start new conversation',\n chatWith: 'Chat with {title}',\n haveReferenceNumber: 'Have a reference number?',\n referencePlaceholder: 'e.g. JEX-A3B7C2',\n resume: 'Resume',\n howCanWeHelp: 'How can we help?',\n getInstantHelp: 'Get instant help',\n submitTicket: 'Submit a ticket',\n replyByEmail: \"We'll reply by email\",\n ticketSubmitted: 'Ticket submitted',\n yourReferenceNumber: 'Your reference number:',\n sentToEmailHint: \"We've sent it to your email. Use this number to follow up.\",\n done: 'Done',\n submittingTicket: 'Submitting your ticket\\u2026',\n yourName: 'Your name',\n yourEmail: 'Your email',\n submit: 'Submit',\n back: 'Go back',\n // Escalation form\n escalationFormTitle: 'Leave your details',\n escalationSubtitle: 'Our team will get back to you by email so you don\\u2019t have to wait here.',\n escalationNameLabel: 'Your name',\n escalationEmailLabel: 'Your email',\n escalationSubmit: 'Send to team',\n escalationSubmitting: 'Sending\\u2026',\n escalationSubmitted: 'Request submitted',\n escalationConsent: 'By submitting, you agree to our',\n escalationPrivacyLinkText: 'Privacy Policy',\n escalationSkip: 'Skip, I\\u2019ll wait here',\n escalationPromptTitle: 'Talk to our team',\n escalationPromptSubtitle: 'We can notify you by email when our team replies.',\n escalationPromptSubmit: 'Leave details',\n escalationSubmitFailed: 'Failed to submit. Please try again.',\n // Session resume prompt\n sessionNotFoundPrompt: 'Session not found. Would you like to start a new conversation?',\n sessionLocked: 'For your privacy, this conversation was closed after a period of inactivity. Enter your reference to resume, or start a new conversation.',\n // Resolved session\n sessionResolved: 'This conversation has been resolved.',\n tryAgain: 'Try again',\n goBack: 'Go back',\n somethingWentWrong: 'Something went wrong',\n fabLabel: 'Chat with us',\n chatNoLongerAvailable: 'This chat is no longer available.',\n // Handoff & resume list\n talkToHuman: 'Talk to human',\n talkToHumanAria: 'Talk to a human agent',\n handoffPending: 'Connecting you to a human agent…',\n handoffFailed: 'Could not request a human agent. Try again.',\n handoffRateLimited: 'You requested an agent recently. Please wait before trying again.',\n resumeListLabel: 'Continue conversation',\n resumeListTimestamp: '{minutes}m ago',\n noticeAgentJoined: '{name} has joined the conversation.',\n noticeHumanRequested: 'You requested to speak with a human agent.',\n noticeHumanRequestedForm: 'You requested to speak with a human agent. Please share your contact details below.',\n noticeEscalationConfirmed: 'Thank you {name}! A human agent will be available soon.\\nWe will contact you at {email} when an agent is ready.\\n\\nYour reference: **{ref}**\\nUse it to resume this conversation from any device.',\n noticeMessageReceived: 'Your message has been received. A team member will respond shortly.',\n noticeAgentHandling: 'Your conversation is with a human agent who will respond shortly.',\n replyTo: 'Reply to {name}',\n sourcesCountOne: '{count} source',\n sourcesCountOther: '{count} sources',\n privacyNoticePre: 'By chatting, you agree to our',\n privacyPolicyLinkText: 'Privacy Policy',\n privacyChipText: 'We respect your privacy - read our policy',\n privacyExplicitTitle: 'Before you send',\n privacyExplicitBodyPre: 'Messages are processed to assist you. By continuing you agree to our',\n privacyExplicitButton: 'Got it, continue',\n // Magicline integration forms\n magiclineTrialTitle: 'Book a trial session',\n magiclineLeadTitle: 'Request more information',\n magiclineFirstName: 'First name',\n magiclineLastName: 'Last name',\n magiclineEmail: 'Email',\n magiclinePhone: 'Phone',\n magiclineBirthDate: 'Date of birth',\n magiclineInterest: 'What are you interested in? (optional)',\n magiclineMessage: 'Message (optional)',\n magiclineSlotLabel: 'Preferred time',\n magiclineSlotPlaceholder: 'Select a time…',\n magiclineLoadingSlots: 'Loading available times…',\n magiclineNoSlots: 'No trial times are available right now. Please check back later or ask us for help.',\n magiclineSubmit: 'Submit',\n magiclineSubmitting: 'Submitting…',\n magiclineSubmitted: 'Request submitted',\n magiclineSubmittedDetail: 'We’ve received your request and will be in touch shortly.',\n magiclineFailed: 'Submission failed',\n magiclineFailedDetail: 'Something went wrong submitting your request. Please try again.',\n magiclineConsent: 'I agree to the processing of my data in accordance with the',\n magiclinePrivacyLinkText: 'Privacy Policy',\n magiclineRequiredError: 'Please fill in all required fields.',\n magiclineEmailError: 'Please enter a valid email address.',\n magiclineConsentError: 'Please accept the privacy policy to continue.',\n // Dynamic per-studio trial form (v2)\n magiclineConfigLoading: 'Loading the booking form…',\n magiclineConfigUnsupported: 'Online trial booking is not supported for this studio. Please ask us for help.',\n magiclineConfigInconsistent: 'The booking form is temporarily misconfigured. Please ask us for help.',\n magiclineConfigUnavailable: 'Trial booking is not available right now. Please try again later or ask us for help.',\n magiclineGender: 'Gender',\n magiclineGenderPlaceholder: 'Select gender…',\n magiclineGenderMale: 'Male',\n magiclineGenderFemale: 'Female',\n magiclineGenderUnisex: 'Diverse',\n magiclineStreet: 'Street',\n magiclineHouseNumber: 'House number',\n magiclineZip: 'Postal code',\n magiclineCity: 'City',\n magiclineCountry: 'Country',\n magiclineCountryPlaceholder: 'Select a country…',\n magiclineNote: 'Note (optional)',\n magiclineOptionalSuffix: ' (optional)',\n magiclineTrainerRequired: 'I want a trainer present',\n magiclineMinAgeError: 'You must be at least {age} years old to book a trial.',\n magiclineSlotRequiredError: 'Please select an available time.',\n magiclineSlotUnavailableNotice: 'That time is no longer available. Please pick another time below.',\n // Step wizard (v3)\n magiclineStepTrainer: 'Trainer',\n magiclineStepSlot: 'Choose a time',\n magiclineStepPersonal: 'Your details',\n magiclineStepAddress: 'Your address',\n magiclineStepConfirm: 'Confirm',\n magiclineStepCounter: 'Step {n} of {total}',\n magiclineWizardBack: 'Back',\n magiclineWizardNext: 'Next',\n magiclineTrainerWith: 'Trial session with trainer',\n magiclineTrainerWithout: 'Trial session without trainer',\n magiclineSummaryTrainer: 'Trainer',\n magiclineSummarySlot: 'Time',\n magiclineSummaryName: 'Name',\n magiclineRetry: 'Try again',\n magiclineSlotsError: 'We couldn’t load available times right now. Please try again.',\n // Membership signup wizard (contract creation)\n magiclineContractTitle: 'Become a member',\n magiclineStepOffer: 'Choose a membership',\n magiclineStepUpgrades: 'Add-ons',\n magiclineStepPayment: 'Payment',\n magiclineStepReview: 'Review',\n magiclineOffersLoading: 'Loading memberships…',\n magiclineOffersError: 'We couldn’t load the memberships right now. Please try again.',\n magiclineNoOffers: 'No memberships are available to sign up for online right now. Please ask us for help.',\n magiclineTermLength: '{value} {unit}',\n magiclineFreqPerDay: 'per day',\n magiclineFreqPerWeek: 'per week',\n magiclineFreqPerMonth: 'per month',\n magiclineFreqPerYear: 'per year',\n magiclineFreqEveryDays: 'every {n} days',\n magiclineFreqEveryWeeks: 'every {n} weeks',\n magiclineFreqEveryMonths: 'every {n} months',\n magiclineFreqEveryYears: 'every {n} years',\n magiclineModulePerTerm: 'per term',\n magiclineModuleOneTime: 'one-time',\n magiclineModuleIncluded: 'included',\n magiclineRenewalNone: 'No automatic renewal',\n magiclineRenewalTerm: 'Renewal: {n} {unit}',\n magiclineCancellationPeriod: 'Cancellation period',\n magiclineStarterPackage: 'Starter package',\n magiclineFlatFee: 'One-time fee',\n magiclineIncludedModules: 'Included',\n magiclineDetails: 'Details',\n magiclineRequired: 'Required',\n magiclineUpgradesIntro: 'Add optional upgrades to your membership.',\n magiclineUpgradesNone: 'No optional upgrades are available for this membership.',\n magiclineUpgradeAdd: 'Add',\n magiclineUpgradeAdded: 'Added',\n magiclineUpgradeOneTime: 'one-time',\n magiclineUpgradeConsentError: 'Please accept the terms for your selected upgrade to keep it.',\n magiclineOfferRequiredError: 'Please select a membership.',\n magiclineCountryStatic: 'Germany',\n magiclineAccountHolder: 'Account holder',\n magiclineIban: 'IBAN',\n magiclineIbanInvalidError: 'Please enter a valid IBAN.',\n magiclineSepaConsent: 'I authorise the studio to collect payments from my account by SEPA direct debit and instruct my bank to honour these debits.',\n magiclineReviewLoading: 'Calculating your price…',\n magiclineReviewError: 'We couldn’t calculate your price right now. Please try again.',\n magiclineReviewOffer: 'Membership',\n magiclineReviewPriceSummary: 'Price summary',\n magiclineReviewBasePrice: 'Price per month',\n magiclineReviewOneTimeFees: 'One-time fees',\n magiclineReviewPreUseCharge: 'Pre-use charge',\n magiclineReviewSelectedUpgrades: 'Your selected upgrades',\n magiclineReviewContractVolume: 'Total contract volume',\n magiclineReviewStartsOn: 'Starts on',\n magiclineReviewPayment: 'Payment',\n magiclineReviewTerms: 'Terms & conditions',\n magiclineConfirmPrompt: 'Please confirm the following to continue:',\n magiclineConfirmRequiredError: 'Please confirm all required terms before submitting.',\n magiclineSummaryAddress: 'Address',\n magiclineContractSubmitted: 'Your membership is confirmed and the studio will be in touch shortly.',\n magiclineCustomerNumber: 'Your customer number: {number}',\n magiclinePriceChangedNotice: 'The price has changed. Please review the new price and confirm again.',\n magiclineOfferUnavailableNotice: 'That membership is no longer available. Please choose another one.',\n magiclineConfirmationRequiredNotice: 'Please confirm all required terms before submitting.',\n magiclineLiveSubmissionDisabled: 'Live submission is disabled for this project — please contact the studio.',\n magiclineDuplicateNotice: 'A membership for this offer was already created recently.',\n magiclineUnknownOutcome: 'We couldn’t confirm your signup. The studio will verify it and contact you — please do not submit again.',\n magiclineFeeStarterPackage: 'Starter package',\n magiclineFeeTrainerFee: 'Trainer fee',\n // Voucher code (contract-creation Review step)\n magiclineVoucherLabel: 'Voucher code',\n magiclineVoucherPlaceholder: 'Enter voucher code…',\n magiclineVoucherApply: 'Apply',\n magiclineVoucherAppliedDiscount: 'Discount ({discount})',\n magiclineVoucherCreditNotice: 'Account credit applied — not deducted from contract total.',\n magiclineVoucherRemarks: 'Voucher remarks',\n magiclineVoucherInvalid: 'Voucher \"{code}\" is not valid. Please check the code and try again.',\n magiclineVoucherDisabled: 'Voucher codes are not available for this membership.',\n magiclineGesamtpreisBeforeDiscount: 'Total contract volume (before voucher discount)',\n}\n","import type { WidgetStrings } from './en'\n\nexport const de: WidgetStrings = {\n title: 'Assistent',\n statusOnline: 'Online \\u00b7 Antwortet in Sekunden',\n inputPlaceholder: 'Nachricht eingeben\\u2026',\n aiThinking: 'KI antwortet\\u2026',\n sendAriaLabel: 'Nachricht senden',\n attachImagesAriaLabel: 'Bilder anh\\u00e4ngen',\n attachComingSoon: 'Dateianh\\u00e4nge \\u2014 bald verf\\u00fcgbar',\n removeAttachmentAriaLabel: 'Anhang entfernen',\n openChatAriaLabel: 'Chat \\u00f6ffnen',\n closeChatAriaLabel: 'Chat schlie\\u00dfen',\n errorNetwork: 'Netzwerkfehler. Bitte versuche es erneut.',\n errorQuota: 'Nachrichtenlimit erreicht. Bitte versuche es sp\\u00e4ter erneut.',\n errorRateLimited: 'Zu viele Nachrichten. Bitte in {seconds} Sek. erneut versuchen.',\n errorSessionNoToken: 'Verbindung zum Chat fehlgeschlagen. Bitte Internet prüfen und erneut versuchen.',\n errorSessionUnauthorized: 'Dieser Chat ist auf dieser Seite nicht autorisiert. Bitte neu laden.',\n localeLabelDe: 'DE',\n localeLabelEn: 'EN',\n resumeConversation: 'Gespr\\u00e4ch wird fortgesetzt\\u2026',\n startingConversation: 'Konversation wird gestartet\\u2026',\n sessionNotFound: 'Ihre vorherige Sitzung wurde nicht gefunden. Ein neues Gespr\\u00e4ch wird gestartet.',\n startNewConversation: 'Neues Gespr\\u00e4ch beginnen',\n chatWith: 'Chatte mit {title}',\n haveReferenceNumber: 'Hast du eine Referenznummer?',\n referencePlaceholder: 'z.B. JEX-A3B7C2',\n resume: 'Fortsetzen',\n howCanWeHelp: 'Wie k\\u00f6nnen wir helfen?',\n getInstantHelp: 'Soforthilfe erhalten',\n submitTicket: 'Ticket einreichen',\n replyByEmail: 'Wir antworten per E-Mail',\n ticketSubmitted: 'Ticket eingereicht',\n yourReferenceNumber: 'Deine Referenznummer:',\n sentToEmailHint: 'Wir haben sie an deine E-Mail gesendet. Verwende diese Nummer f\\u00fcr R\\u00fcckfragen.',\n done: 'Fertig',\n submittingTicket: 'Dein Ticket wird \\u00fcbermittelt\\u2026',\n yourName: 'Dein Name',\n yourEmail: 'Deine E-Mail',\n submit: 'Absenden',\n back: 'Zur\\u00fcck',\n // Escalation form\n escalationFormTitle: 'Hinterlassen Sie Ihre Daten',\n escalationSubtitle: 'Unser Team meldet sich per E-Mail bei Ihnen \\u2014 Sie m\\u00fcssen nicht hier warten.',\n escalationNameLabel: 'Ihr Name',\n escalationEmailLabel: 'Ihre E-Mail',\n escalationSubmit: 'An Team senden',\n escalationSubmitting: 'Wird gesendet\\u2026',\n escalationSubmitted: 'Anfrage gesendet',\n escalationConsent: 'Mit dem Absenden stimmen Sie unserer',\n escalationPrivacyLinkText: 'Datenschutzerkl\\u00e4rung',\n escalationSkip: '\\u00dcberspringen, ich warte hier',\n escalationPromptTitle: 'Sprechen Sie mit unserem Team',\n escalationPromptSubtitle: 'Wir benachrichtigen Sie per E-Mail, wenn wir antworten.',\n escalationPromptSubmit: 'Daten hinterlassen',\n escalationSubmitFailed: 'Senden fehlgeschlagen. Bitte versuche es erneut.',\n // Session resume prompt\n sessionNotFoundPrompt: 'Sitzung nicht gefunden. M\\u00f6chten Sie ein neues Gespr\\u00e4ch beginnen?',\n sessionLocked: 'Aus Datenschutzgr\\u00fcnden wurde dieses Gespr\\u00e4ch nach einer Inaktivit\\u00e4tszeit geschlossen. Geben Sie Ihre Referenz ein, um fortzufahren, oder beginnen Sie ein neues Gespr\\u00e4ch.',\n // Resolved session\n sessionResolved: 'Diese Unterhaltung wurde abgeschlossen.',\n tryAgain: 'Erneut versuchen',\n goBack: 'Zur\\u00fcck',\n somethingWentWrong: 'Etwas ist schiefgelaufen',\n fabLabel: 'Chatte mit uns',\n chatNoLongerAvailable: 'Dieser Chat ist nicht mehr verf\\u00fcgbar.',\n // Handoff & resume list\n talkToHuman: 'Mit Mitarbeiter sprechen',\n talkToHumanAria: 'Mit einem menschlichen Mitarbeiter sprechen',\n handoffPending: 'Sie werden mit einem Mitarbeiter verbunden\\u2026',\n handoffFailed: 'Anfrage konnte nicht gesendet werden. Erneut versuchen.',\n handoffRateLimited: 'Sie haben k\\u00fcrzlich einen Mitarbeiter angefragt. Bitte warten Sie.',\n resumeListLabel: 'Unterhaltung fortsetzen',\n resumeListTimestamp: 'vor {minutes} Min.',\n noticeAgentJoined: '{name} ist der Unterhaltung beigetreten.',\n noticeHumanRequested: 'Sie haben darum gebeten, mit einem Mitarbeiter zu sprechen.',\n noticeHumanRequestedForm: 'Sie haben darum gebeten, mit einem Mitarbeiter zu sprechen. Bitte teilen Sie unten Ihre Kontaktdaten mit.',\n noticeEscalationConfirmed: 'Vielen Dank, {name}! Ein Mitarbeiter wird in Kürze verfügbar sein.\\nWir kontaktieren Sie unter {email}, sobald ein Mitarbeiter bereit ist.\\n\\nIhre Referenz: **{ref}**\\nVerwenden Sie sie, um diese Unterhaltung auf jedem Gerät fortzusetzen.',\n noticeMessageReceived: 'Ihre Nachricht ist eingegangen. Ein Mitarbeiter wird in Kürze antworten.',\n noticeAgentHandling: 'Ihre Unterhaltung wird von einem menschlichen Mitarbeiter betreut, der in Kürze antwortet.',\n replyTo: 'Antworten an {name}',\n sourcesCountOne: '{count} Quelle',\n sourcesCountOther: '{count} Quellen',\n privacyNoticePre: 'Mit dem Chatten stimmst du unserer',\n privacyPolicyLinkText: 'Datenschutzerklärung',\n privacyChipText: 'Wir respektieren Ihre Privatsphäre - Richtlinie lesen',\n privacyExplicitTitle: 'Vor dem Senden',\n privacyExplicitBodyPre: 'Nachrichten werden verarbeitet, um Ihnen zu helfen. Durch Fortfahren stimmen Sie unserer',\n privacyExplicitButton: 'Verstanden, fortfahren',\n // Magicline integration forms\n magiclineTrialTitle: 'Probetraining buchen',\n magiclineLeadTitle: 'Weitere Informationen anfordern',\n magiclineFirstName: 'Vorname',\n magiclineLastName: 'Nachname',\n magiclineEmail: 'E-Mail',\n magiclinePhone: 'Telefon',\n magiclineBirthDate: 'Geburtsdatum',\n magiclineInterest: 'Wofür interessieren Sie sich? (optional)',\n magiclineMessage: 'Nachricht (optional)',\n magiclineSlotLabel: 'Wunschtermin',\n magiclineSlotPlaceholder: 'Termin auswählen…',\n magiclineLoadingSlots: 'Verfügbare Termine werden geladen…',\n magiclineNoSlots: 'Derzeit sind keine Probetermine verfügbar. Bitte versuchen Sie es später erneut oder fragen Sie uns um Hilfe.',\n magiclineSubmit: 'Absenden',\n magiclineSubmitting: 'Wird gesendet…',\n magiclineSubmitted: 'Anfrage gesendet',\n magiclineSubmittedDetail: 'Wir haben Ihre Anfrage erhalten und melden uns in Kürze bei Ihnen.',\n magiclineFailed: 'Senden fehlgeschlagen',\n magiclineFailedDetail: 'Beim Senden Ihrer Anfrage ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.',\n magiclineConsent: 'Ich stimme der Verarbeitung meiner Daten gemäß der',\n magiclinePrivacyLinkText: 'Datenschutzerklärung',\n magiclineRequiredError: 'Bitte füllen Sie alle Pflichtfelder aus.',\n magiclineEmailError: 'Bitte geben Sie eine gültige E-Mail-Adresse ein.',\n magiclineConsentError: 'Bitte akzeptieren Sie die Datenschutzerklärung, um fortzufahren.',\n // Dynamisches studiospezifisches Probetraining-Formular (v2)\n magiclineConfigLoading: 'Buchungsformular wird geladen…',\n magiclineConfigUnsupported: 'Die Online-Buchung eines Probetrainings wird für dieses Studio nicht unterstützt. Bitte fragen Sie uns um Hilfe.',\n magiclineConfigInconsistent: 'Das Buchungsformular ist vorübergehend falsch konfiguriert. Bitte fragen Sie uns um Hilfe.',\n magiclineConfigUnavailable: 'Die Buchung eines Probetrainings ist derzeit nicht verfügbar. Bitte versuchen Sie es später erneut oder fragen Sie uns um Hilfe.',\n magiclineGender: 'Geschlecht',\n magiclineGenderPlaceholder: 'Geschlecht auswählen…',\n magiclineGenderMale: 'Männlich',\n magiclineGenderFemale: 'Weiblich',\n magiclineGenderUnisex: 'Divers',\n magiclineStreet: 'Straße',\n magiclineHouseNumber: 'Hausnummer',\n magiclineZip: 'Postleitzahl',\n magiclineCity: 'Stadt',\n magiclineCountry: 'Land',\n magiclineCountryPlaceholder: 'Land auswählen…',\n magiclineNote: 'Anmerkung (optional)',\n magiclineOptionalSuffix: ' (optional)',\n magiclineTrainerRequired: 'Ich wünsche einen Trainer vor Ort',\n magiclineMinAgeError: 'Sie müssen mindestens {age} Jahre alt sein, um ein Probetraining zu buchen.',\n magiclineSlotRequiredError: 'Bitte wählen Sie einen verfügbaren Termin aus.',\n magiclineSlotUnavailableNotice: 'Dieser Termin ist nicht mehr verfügbar. Bitte wählen Sie unten einen anderen Termin aus.',\n // Schritt-Assistent (v3)\n magiclineStepTrainer: 'Trainer',\n magiclineStepSlot: 'Termin wählen',\n magiclineStepPersonal: 'Ihre Daten',\n magiclineStepAddress: 'Ihre Adresse',\n magiclineStepConfirm: 'Bestätigen',\n magiclineStepCounter: 'Schritt {n} von {total}',\n magiclineWizardBack: 'Zurück',\n magiclineWizardNext: 'Weiter',\n magiclineTrainerWith: 'Probetraining mit Trainer',\n magiclineTrainerWithout: 'Probetraining ohne Trainer',\n magiclineSummaryTrainer: 'Trainer',\n magiclineSummarySlot: 'Termin',\n magiclineSummaryName: 'Name',\n magiclineRetry: 'Erneut versuchen',\n magiclineSlotsError: 'Die verfügbaren Termine konnten gerade nicht geladen werden. Bitte versuchen Sie es erneut.',\n // Mitgliedschafts-Assistent (Vertragsabschluss)\n magiclineContractTitle: 'Mitglied werden',\n magiclineStepOffer: 'Mitgliedschaft wählen',\n magiclineStepUpgrades: 'Zusatzoptionen',\n magiclineStepPayment: 'Zahlung',\n magiclineStepReview: 'Überprüfen',\n magiclineOffersLoading: 'Mitgliedschaften werden geladen…',\n magiclineOffersError: 'Die Mitgliedschaften konnten gerade nicht geladen werden. Bitte versuchen Sie es erneut.',\n magiclineNoOffers: 'Derzeit sind keine Mitgliedschaften für den Online-Abschluss verfügbar. Bitte fragen Sie uns um Hilfe.',\n magiclineTermLength: '{value} {unit}',\n magiclineFreqPerDay: 'pro Tag',\n magiclineFreqPerWeek: 'pro Woche',\n magiclineFreqPerMonth: 'pro Monat',\n magiclineFreqPerYear: 'pro Jahr',\n magiclineFreqEveryDays: 'alle {n} Tage',\n magiclineFreqEveryWeeks: 'alle {n} Wochen',\n magiclineFreqEveryMonths: 'alle {n} Monate',\n magiclineFreqEveryYears: 'alle {n} Jahre',\n magiclineModulePerTerm: 'pro Laufzeit',\n magiclineModuleOneTime: 'einmalig',\n magiclineModuleIncluded: 'inklusive',\n magiclineRenewalNone: 'Keine automatische Verlängerung',\n magiclineRenewalTerm: 'Verlängerung: {n} {unit}',\n magiclineCancellationPeriod: 'Kündigungsfrist',\n magiclineStarterPackage: 'Startpaket',\n magiclineFlatFee: 'Einmalige Gebühr',\n magiclineIncludedModules: 'Inklusive',\n magiclineDetails: 'Details',\n magiclineRequired: 'Erforderlich',\n magiclineUpgradesIntro: 'Fügen Sie Ihrer Mitgliedschaft optionale Zusatzoptionen hinzu.',\n magiclineUpgradesNone: 'Für diese Mitgliedschaft sind keine optionalen Zusatzoptionen verfügbar.',\n magiclineUpgradeAdd: 'Hinzufügen',\n magiclineUpgradeAdded: 'Hinzugefügt',\n magiclineUpgradeOneTime: 'einmalig',\n magiclineUpgradeConsentError: 'Bitte akzeptieren Sie die Bedingungen für Ihre gewählte Zusatzoption, um sie beizubehalten.',\n magiclineOfferRequiredError: 'Bitte wählen Sie eine Mitgliedschaft aus.',\n magiclineCountryStatic: 'Deutschland',\n magiclineAccountHolder: 'Kontoinhaber',\n magiclineIban: 'IBAN',\n magiclineIbanInvalidError: 'Bitte geben Sie eine gültige IBAN ein.',\n magiclineSepaConsent: 'Ich ermächtige das Studio, Zahlungen von meinem Konto per SEPA-Lastschrift einzuziehen, und weise mein Kreditinstitut an, diese Lastschriften einzulösen.',\n magiclineReviewLoading: 'Ihr Preis wird berechnet…',\n magiclineReviewError: 'Ihr Preis konnte gerade nicht berechnet werden. Bitte versuchen Sie es erneut.',\n magiclineReviewOffer: 'Mitgliedschaft',\n magiclineReviewPriceSummary: 'Preisübersicht',\n magiclineReviewBasePrice: 'Preis pro Monat',\n magiclineReviewOneTimeFees: 'Einmalige Gebühren',\n magiclineReviewPreUseCharge: 'Vorab-Nutzungsgebühr',\n magiclineReviewSelectedUpgrades: 'Deine gewählten Zusatzoptionen',\n magiclineReviewContractVolume: 'Gesamtes Vertragsvolumen',\n magiclineReviewStartsOn: 'Beginnt am',\n magiclineReviewPayment: 'Zahlung',\n magiclineReviewTerms: 'Vertragsbedingungen',\n magiclineConfirmPrompt: 'Bitte bestätigen Sie zum Fortfahren das Folgende:',\n magiclineConfirmRequiredError: 'Bitte bestätigen Sie alle erforderlichen Bedingungen vor dem Absenden.',\n magiclineSummaryAddress: 'Adresse',\n magiclineContractSubmitted: 'Ihre Mitgliedschaft ist bestätigt. Das Studio meldet sich in Kürze bei Ihnen.',\n magiclineCustomerNumber: 'Ihre Kundennummer: {number}',\n magiclinePriceChangedNotice: 'Der Preis hat sich geändert. Bitte prüfen Sie den neuen Preis und bestätigen Sie erneut.',\n magiclineOfferUnavailableNotice: 'Diese Mitgliedschaft ist nicht mehr verfügbar. Bitte wählen Sie eine andere aus.',\n magiclineConfirmationRequiredNotice: 'Bitte bestätigen Sie alle erforderlichen Bedingungen vor dem Absenden.',\n magiclineLiveSubmissionDisabled: 'Die Live-Übermittlung ist für dieses Projekt deaktiviert — bitte wenden Sie sich an das Studio.',\n magiclineDuplicateNotice: 'Für dieses Angebot wurde kürzlich bereits eine Mitgliedschaft erstellt.',\n magiclineUnknownOutcome: 'Wir konnten Ihre Anmeldung nicht bestätigen. Das Studio prüft sie und meldet sich bei Ihnen — bitte senden Sie das Formular nicht erneut ab.',\n magiclineFeeStarterPackage: 'Startpaket',\n magiclineFeeTrainerFee: 'Trainerpauschale',\n // Gutscheincode (Vertragsabschluss-Schritt: Überprüfen)\n magiclineVoucherLabel: 'Gutscheincode',\n magiclineVoucherPlaceholder: 'Gutscheincode eingeben…',\n magiclineVoucherApply: 'Einlösen',\n magiclineVoucherAppliedDiscount: 'Rabatt ({discount})',\n magiclineVoucherCreditNotice: 'Guthaben wird angerechnet — nicht vom Vertragsvolumen abgezogen.',\n magiclineVoucherRemarks: 'Hinweis zum Gutschein',\n magiclineVoucherInvalid: 'Gutscheincode „{code}\" ist nicht gültig. Bitte überprüfen Sie den Code und versuchen Sie es erneut.',\n magiclineVoucherDisabled: 'Gutscheincodes sind für diese Mitgliedschaft nicht verfügbar.',\n magiclineGesamtpreisBeforeDiscount: 'Gesamtes Vertragsvolumen (vor Gutscheinrabatt)',\n}\n","export type WidgetLocale = 'en' | 'de'\n\nexport interface LocaleConfig {\n value: WidgetLocale\n label: string\n flag: string\n}\n\nexport const SUPPORTED_LOCALES: LocaleConfig[] = [\n { value: 'de', label: 'Deutsch', flag: '🇩🇪' },\n { value: 'en', label: 'English', flag: '🇬🇧' },\n]\n\nexport const WIDGET_DEFAULT_LOCALE: WidgetLocale = 'de'\nexport const LOCALE_STORAGE_KEY = 'jex-locale'\n","import { signal } from '@preact/signals'\nimport { en, type WidgetStrings } from './locales/en'\nimport { de } from './locales/de'\n\nexport type { WidgetStrings }\nexport {\n type WidgetLocale,\n SUPPORTED_LOCALES as WIDGET_LOCALES,\n WIDGET_DEFAULT_LOCALE,\n LOCALE_STORAGE_KEY,\n} from './config'\n\n/**\n * Active locale for the widget UI.\n * Initialised to 'de' (default); overridden in WidgetShell on mount via resolveWidgetLocale.\n */\nexport const locale = signal<'en' | 'de'>('de')\n\nconst STRINGS: Record<string, WidgetStrings> = { en, de }\n\n/**\n * Returns the current locale's string dictionary.\n * Reactive — components that call this re-render when locale changes.\n *\n * Usage inside a Preact component:\n * const s = useLocale();\n * return <p>{s.inputPlaceholder}</p>;\n */\nexport function useLocale(): WidgetStrings {\n // Accessing locale.value inside render subscribes this component to changes.\n return STRINGS[locale.value] ?? en\n}\n\n/**\n * Switch the active locale and persist the visitor's choice to localStorage.\n * Call this from the footer toggle's onClick handler.\n */\nexport function setLocale(next: 'en' | 'de'): void {\n locale.value = next\n try {\n localStorage.setItem('jex-locale', next)\n } catch {\n // Storage blocked — still update the in-memory signal\n }\n}\n","import { \n type WidgetLocale, \n SUPPORTED_LOCALES, \n WIDGET_DEFAULT_LOCALE, \n LOCALE_STORAGE_KEY \n} from './config'\n\n/** Normalise a raw locale string (e.g. \"en-US\") to a WidgetLocale, or null. */\nfunction parseLocale(raw: string | null | undefined): WidgetLocale | null {\n if (!raw) { return null }\n const base = (raw.split('-')[0] ?? '').toLowerCase()\n const isValid = SUPPORTED_LOCALES.some(l => l.value === base)\n return isValid ? (base as WidgetLocale) : null\n}\n\n/**\n * Resolve the active locale using the priority chain:\n * 1. configLocale (explicit prop/dashboard override — HIGHEST)\n * 2. localStorage['jex-locale'] (visitor's persistent choice)\n * 3. navigator.language (browser auto-detect)\n * 4. 'de' (hardcoded default)\n * \n * Priority Note:\n * Explicit configuration (configLocale) now outranks localStorage. \n * This ensures that changing the language in the Dashboard or Playground \n * instantly reflects in the preview, even if the user previously selected\n * a different language inside the widget's persistent session.\n */\nexport function resolveWidgetLocale(configLocale?: string): WidgetLocale {\n // 1. Explicit UI Configuration (Dashboard/Playground override)\n const config = parseLocale(configLocale)\n if (config) { return config }\n\n // 2. Visitor's persistent saved choice\n try {\n const saved = parseLocale(localStorage.getItem(LOCALE_STORAGE_KEY))\n if (saved) { return saved }\n } catch {\n // localStorage blocked (e.g. Safari private mode)\n }\n\n // 3. Browser language fallback\n if (typeof navigator !== 'undefined') {\n const browser = parseLocale(navigator.language)\n if (browser) { return browser }\n }\n\n // 4. Global default\n return WIDGET_DEFAULT_LOCALE\n}\n","import { useEffect } from 'preact/hooks'\nimport { locale } from '../../../i18n/index'\nimport { resolveWidgetLocale } from '../../../i18n/resolve-widget-locale'\n\n/**\n * Listens for postMessage config updates sent from the dashboard preview iframe.\n *\n * This is a playground/dashboard-only concern — the `parentOrigin` option is\n * only set when the widget is embedded inside the dashboard preview panel.\n * Production embeds on customer websites never send this message type.\n *\n * Message shape:\n * { type: 'jexity:config', payload: { locale?: string } }\n *\n * Incoming locale strings are passed through `resolveWidgetLocale` so the full\n * priority chain (config → localStorage → browser → default) is respected,\n * and no type assertions are needed.\n */\nexport function usePreviewBridge(parentOrigin: string | undefined): void {\n useEffect(() => {\n function handleMessage(e: MessageEvent): void {\n // Reject messages from unexpected origins (security guard)\n const allowedOrigin = parentOrigin ?? window.location.origin\n if (e.origin !== allowedOrigin) { return }\n if (e.data?.type !== 'jexity:config') { return }\n\n const { locale: newLocale } = e.data.payload as { locale?: string }\n\n if (newLocale) {\n locale.value = resolveWidgetLocale(newLocale)\n }\n }\n\n window.addEventListener('message', handleMessage)\n return () => { window.removeEventListener('message', handleMessage) }\n }, [parentOrigin])\n}\n","import { signal, computed } from '@preact/signals'\n\n/** Exported so the privacy lock module can clear the same key on wipe. */\nexport const SESSION_HISTORY_STORAGE_KEY = 'jex-session-history'\nconst STORAGE_KEY = SESSION_HISTORY_STORAGE_KEY\nexport const SESSION_HISTORY_TTL_MS = 60 * 60 * 1000\n\nexport type SessionHistoryEntry = {\n ref: string\n startedAt: number\n lastActivityAt: number\n}\n\ntype HistoryEnvelope = { v: 1; entries: SessionHistoryEntry[] }\n\nexport const sessionHistory = signal<SessionHistoryEntry[]>([])\nexport const currentSessionRef = signal<string | null>(null)\n\n// Derived — used by ScreenRouter init + ChatScreen mount snapshot.\nexport const hasAnyHistory = computed(() => sessionHistory.value.length > 0)\n\n/**\n * Set by HomeScreen actions BEFORE navigating to chat, so ChatScreen\n * can render the correct LoadingScreen copy on mount. Consumed + cleared\n * by ChatScreen.\n *\n * - 'fresh' — visitor clicked \"Start new conversation\"\n * - 'resume' — visitor clicked a history entry or used the lookup form\n * - null — initial mount (first-time visitor lands on chat) OR not set\n */\nexport const chatMountIntent = signal<'fresh' | 'resume' | null>(null)\n\nfunction generateRef(): string {\n return 'JEX-' + Math.random().toString(36).slice(2, 8).toUpperCase()\n}\n\nfunction loadEnvelope(now: number): SessionHistoryEntry[] {\n try {\n const raw = sessionStorage.getItem(STORAGE_KEY)\n if (!raw) { return [] }\n const parsed = JSON.parse(raw) as HistoryEnvelope\n if (parsed.v !== 1 || !Array.isArray(parsed.entries)) { return [] }\n // Sliding TTL prune.\n return parsed.entries.filter((e) => now - e.lastActivityAt <= SESSION_HISTORY_TTL_MS)\n } catch {\n return []\n }\n}\n\nfunction persist(entries: SessionHistoryEntry[]): void {\n try {\n const envelope: HistoryEnvelope = { v: 1, entries }\n // Tab-scoped — sessionStorage wipes on tab close (GDPR posture preserved).\n sessionStorage.setItem(STORAGE_KEY, JSON.stringify(envelope))\n } catch { /* private mode / quota — best effort */ }\n}\n\n/** Call once on widget mount before computing initial screen. */\nexport function initVisitor(): void {\n const now = Date.now()\n // Load envelope + drop expired entries.\n const pruned = loadEnvelope(now)\n sessionHistory.value = pruned\n // Re-persist so the on-disk copy reflects the pruned list.\n persist(pruned)\n // Resume context = most-recent entry (sliding TTL guarantees it's still live).\n currentSessionRef.value = pruned[pruned.length - 1]?.ref ?? null\n}\n\n/** Generate a fresh ref, push to history, set as current. */\nexport function startNewSession(): string {\n const ref = generateRef()\n const now = Date.now()\n const next = [...sessionHistory.value, { ref, startedAt: now, lastActivityAt: now }]\n sessionHistory.value = next\n currentSessionRef.value = ref\n persist(next)\n return ref\n}\n\n/** Resume an existing entry — bumps lastActivityAt + sets current. */\nexport function resumeSession(ref: string): void {\n const now = Date.now()\n // Bump activity timestamp — new array so signal subscribers fire.\n const next = sessionHistory.value.map((e) =>\n e.ref === ref ? { ...e, lastActivityAt: now } : e,\n )\n sessionHistory.value = next\n currentSessionRef.value = ref\n persist(next)\n}\n\n/** Mark activity on the current session (visitor send or bot final reply). */\nexport function markActivity(ref: string): void {\n if (!ref) { return }\n const now = Date.now()\n const next = sessionHistory.value.map((e) =>\n e.ref === ref ? { ...e, lastActivityAt: now } : e,\n )\n sessionHistory.value = next\n persist(next)\n}\n","import { signal } from '@preact/signals'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\nimport { hasAnyHistory } from '../visitor/visitor.state'\n\nexport type ScreenState =\n | { id: 'home' }\n | { id: 'selection' }\n | { id: 'chat' }\n | { id: 'form' }\n | { id: 'escalation-form'; formMessageId: Id<'conversations'>; sessionId: Id<'contactSessions'>; visitorId: string }\n | { id: 'confirmation'; ref: string }\n | { id: 'loading'; message?: string }\n | { id: 'error'; message: string }\n\n// Initial stack is computed from history state. WidgetShell must call\n// initVisitor() BEFORE this module is read for the first time, OR call\n// resetInitialStack() after initVisitor() resolves.\nexport const screenStack = signal<ScreenState[]>(computeInitialStack())\n\nexport function computeInitialStack(): ScreenState[] {\n // Returning visitor → home (resume list visible).\n // First-time visitor → chat (zero-friction entry).\n return hasAnyHistory.value\n ? [{ id: 'home' }]\n : [{ id: 'chat' }]\n}\n\n/** Re-seed the stack after initVisitor() has populated history. */\nexport function resetInitialStack(): void {\n screenStack.value = computeInitialStack()\n}\n\n/**\n * Escalation form style:\n * - 'inline': form card rendered inside the chat thread (default)\n * - 'screen': full-screen form (navigates away from chat)\n *\n * Toggle this to compare both UX approaches.\n */\nexport const escalationFormStyle = signal<'inline' | 'screen'>('screen')\n\n/** Push a new screen onto the stack. */\nexport function navigate(screen: ScreenState): void {\n screenStack.value = [...screenStack.value, screen]\n}\n\n/** Pop the top screen. No-op if already at root. */\nexport function back(): void {\n if (screenStack.value.length > 1) {\n screenStack.value = screenStack.value.slice(0, -1)\n }\n}\n\n/** Swap the top of the stack. Used for loading→result transitions. */\nexport function replace(screen: ScreenState): void {\n screenStack.value = [...screenStack.value.slice(0, -1), screen]\n}\n","/**\n * Idle / privacy lock — GDPR safeguard for public-computer scenarios.\n *\n * If a visitor leaves the widget open and walks away, the next person on\n * the same browser tab could read shipping codes, support refs, or PII in\n * the chat history. Once the conversation has been idle for\n * `SESSION_HISTORY_TTL_MS` (15 min) — measured either as no activity while\n * visible OR cumulative hidden time — wipe the session history, clear the\n * current ref, drop the visitor back on Home, and raise `isLocked` so the\n * UI can show a privacy notice.\n *\n * The owner of the conversation can still resume by typing their JEX-XXXXXX\n * reference into the lookup form (they wrote it down). A stranger sees an\n * empty Home with no resumable entries — no leak.\n *\n * Two triggers, both reuse the per-ref `lastActivityAt` already maintained\n * by visitor.state.ts (`markActivity` runs on chat mount, on every visitor\n * send, and on every assistant final reply):\n *\n * 1. Visible-but-idle: a 60s poll checks the current ref's\n * lastActivityAt. Over threshold → lock.\n * 2. Hidden-too-long: visibilitychange records `hiddenSince`; on next\n * `visible`, if (now - hiddenSince) > threshold → lock.\n *\n * Race protection: callers writing to Convex (createOrResume in flight)\n * raise `isSessionBusy` so the poll skips a tick rather than wiping the\n * ref under an in-flight mutation. Hooks that cache a resolved session\n * (useConvexSession.resolvedRef) register a reset callback so the wipe\n * clears their cache too.\n */\nimport { signal } from '@preact/signals'\nimport {\n sessionHistory,\n currentSessionRef,\n SESSION_HISTORY_TTL_MS,\n SESSION_HISTORY_STORAGE_KEY,\n} from './visitor.state'\nimport { screenStack } from '../screens/screens.state'\n\nconst POLL_MS = 60_000\n\n/** True while the widget is showing the privacy-lock notice. */\nexport const isLocked = signal(false)\n\n/**\n * True while a session-creating mutation is in flight. The idle poll skips\n * a tick when this is set, so a wipe can't race an awaited createOrResume.\n */\nexport const isSessionBusy = signal(false)\n\n/** Per-hook callbacks run when the lock fires — clears caches like resolvedRef. */\ntype ResetCallback = () => void\nconst resetCallbacks = new Set<ResetCallback>()\n\n/** Register a callback fired on lock. Returns a deregister fn for useEffect cleanup. */\nexport function registerLockResetCallback(fn: ResetCallback): () => void {\n resetCallbacks.add(fn)\n return () => {\n resetCallbacks.delete(fn)\n }\n}\n\nfunction lastActivityAtForCurrent(): number | null {\n const ref = currentSessionRef.value\n if (!ref) { return null }\n const entry = sessionHistory.value.find((e) => e.ref === ref)\n return entry?.lastActivityAt ?? null\n}\n\nfunction isIdle(threshold: number): boolean {\n const last = lastActivityAtForCurrent()\n if (last === null) { return false }\n return Date.now() - last > threshold\n}\n\n/**\n * Wipe in-memory + persisted session refs, drop back to Home, raise the\n * lock flag, and notify hooks holding cached session references.\n * Idempotent — safe to call from both triggers.\n */\nexport function lockSession(): void {\n if (isLocked.value && sessionHistory.value.length === 0) { return }\n sessionHistory.value = []\n currentSessionRef.value = null\n try {\n sessionStorage.removeItem(SESSION_HISTORY_STORAGE_KEY)\n } catch (err) {\n // GDPR safeguard failed — sessionStorage clear errored (quota, exotic\n // sandbox). Surface so operator can see PII may persist across visitors.\n console.warn('[JexityChat] Idle-lock storage clear failed:', err)\n }\n for (const cb of resetCallbacks) {\n try {\n cb()\n } catch (err) {\n console.warn('[JexityChat] Lock reset callback threw:', err)\n }\n }\n screenStack.value = [{ id: 'home' }]\n isLocked.value = true\n}\n\n/** Called by HomeScreen actions — visitor explicitly engaged again. */\nexport function unlockSession(): void {\n if (!isLocked.value) { return }\n isLocked.value = false\n}\n\n/**\n * Start the watcher. Returns a teardown function for useEffect cleanup.\n * All timer / visibility state lives in the returned closure so StrictMode\n * double-invocation (or fast-refresh) cannot orphan a prior interval.\n */\nexport function startIdleLockWatcher(threshold: number = SESSION_HISTORY_TTL_MS): () => void {\n let hiddenSince: number | null = null\n\n const onVisibility = (): void => {\n if (document.visibilityState === 'hidden') {\n hiddenSince = Date.now()\n return\n }\n if (hiddenSince !== null && Date.now() - hiddenSince > threshold) {\n lockSession()\n }\n hiddenSince = null\n }\n\n document.addEventListener('visibilitychange', onVisibility)\n const timer = setInterval(() => {\n // Skip while a session-creating mutation is mid-flight so we don't\n // wipe currentSessionRef out from under it.\n if (isSessionBusy.value) { return }\n if (isIdle(threshold)) { lockSession() }\n }, POLL_MS)\n\n return () => {\n document.removeEventListener('visibilitychange', onVisibility)\n clearInterval(timer)\n hiddenSince = null\n }\n}\n","import type { JSX } from 'preact'\nimport type { JexityChatOptions } from '../../types'\n\n/** Maps JexityChatOptions theme fields → CSS custom properties on the widget root. */\nexport function buildThemeStyle(options: JexityChatOptions): JSX.CSSProperties | undefined {\n const vars: Record<string, string> = {}\n const { primaryColor, theme } = options\n\n if (primaryColor) {\n vars['--jex-primary'] = primaryColor\n vars['--jex-bg-trigger'] = primaryColor\n vars['--jex-bg-header'] = primaryColor\n vars['--jex-bg-msg-user'] = primaryColor\n vars['--jex-bg-send-btn'] = primaryColor\n }\n \n if (options.accentColor) {\n vars['--jex-accent'] = options.accentColor\n }\n\n if (theme?.bg) {\n const bg = theme.bg\n if (bg.trigger) { vars['--jex-bg-trigger'] = bg.trigger }\n if (bg.header) { vars['--jex-bg-header'] = bg.header }\n if (bg.msgUser) { vars['--jex-bg-msg-user'] = bg.msgUser }\n if (bg.msgBot) { vars['--jex-bg-msg-bot'] = bg.msgBot }\n if (bg.window) { vars['--jex-bg-window'] = bg.window }\n if (bg.sendBtn) { vars['--jex-bg-send-btn'] = bg.sendBtn }\n }\n if (theme?.text) {\n const text = theme.text\n if (text.header) { vars['--jex-text-header'] = text.header }\n if (text.msgUser) { vars['--jex-text-msg-user'] = text.msgUser }\n if (text.msgBot) { vars['--jex-text-msg-bot'] = text.msgBot }\n if (text.main) { vars['--jex-text-main'] = text.main }\n if (text.muted) { vars['--jex-text-muted'] = text.muted }\n }\n if (theme?.border) {\n const border = theme.border\n if (border.window) { vars['--jex-border-window'] = border.window }\n if (border.input) { vars['--jex-border-input'] = border.input }\n }\n\n // Layout & Typography (from Extended Config)\n if (options.fontFamily) { vars['--jex-font-family'] = options.fontFamily }\n if (options.fontSize) { vars['--jex-font-size'] = `${options.fontSize}px` }\n if (options.borderRadius) { vars['--jex-radius'] = options.borderRadius }\n if (options.windowWidth) { vars['--jex-window-width'] = `${options.windowWidth}px` }\n if (options.windowHeight) { vars['--jex-window-height'] = `${options.windowHeight}px` }\n\n return Object.keys(vars).length > 0 ? (vars as JSX.CSSProperties) : undefined\n}\n","export function BotIcon({ size = 24 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n )\n}\n","import { screenStack, back } from '../../module/screens/screens.state'\nimport { useLocale } from '../../i18n/index'\nimport { BotIcon } from '../icons/BotIcon'\n\n/**\n * Left slot of the chat header — either a chevron-back button when nested\n * screens are on the stack, or the bot avatar at the root screen.\n *\n * Single-responsibility split so the back/avatar toggle can be debugged\n * without touching title or right-side actions.\n */\nexport function HeaderLeft() {\n const t = useLocale()\n const canGoBack = screenStack.value.length > 1\n\n if (canGoBack) {\n return (\n <button\n class=\"jex-header-back\"\n onClick={back}\n aria-label={t.back || 'Go back'}\n >\n <svg width={20} height={20} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n )\n }\n\n return <BotIcon size={24} />\n}\n","import { useLocale } from '../../i18n/index'\n\ninterface HeaderTitleProps {\n title: string\n}\n\n/** Header text cluster — title + online-status line. */\nexport function HeaderTitle({ title }: HeaderTitleProps) {\n const t = useLocale()\n return (\n <div class=\"jex-header-info\">\n <h3>{title}</h3>\n <p>{t.statusOnline}</p>\n </div>\n )\n}\n","export function CloseIcon({ size = 28 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n )\n}\n","import { isOpen } from '../../module/shell/shell.state'\nimport { useLocale } from '../../i18n/index'\nimport { CloseIcon } from '../icons/CloseIcon'\n\n/**\n * Header close button — flips isOpen so the chat window unmounts.\n *\n * Always rendered in the header so the visitor has a close affordance even\n * in mobile fullscreen mode where the FAB is hidden by the CSS :has() rule.\n * Skipped in embedded mode where the host page owns visibility (rendered\n * conditionally by the Header parent).\n */\nexport function HeaderCloseButton() {\n const t = useLocale()\n return (\n <button\n class=\"jex-header-close\"\n type=\"button\"\n onClick={() => { isOpen.value = false }}\n aria-label={t.closeChatAriaLabel}\n title={t.closeChatAriaLabel}\n >\n <CloseIcon size={18} />\n </button>\n )\n}\n","import type { ComponentChildren } from 'preact'\nimport { HeaderCloseButton } from './HeaderCloseButton'\n\ninterface HeaderActionsProps {\n /** Optional action slot (typically HumanHandoffAction) rendered before the close button. */\n action?: ComponentChildren\n /** Whether to render the close button (skipped in embedded mode — host owns visibility). */\n showClose?: boolean\n}\n\n/** Right-cluster of the chat header: action slot + close button. */\nexport function HeaderActions({ action, showClose = true }: HeaderActionsProps) {\n if (!action && !showClose) { return null }\n return (\n <div class=\"jex-header-right\">\n {action}\n {showClose && <HeaderCloseButton />}\n </div>\n )\n}\n","import type { ComponentChildren } from 'preact'\nimport { HeaderLeft } from './HeaderLeft'\nimport { HeaderTitle } from './HeaderTitle'\nimport { HeaderActions } from './HeaderActions'\n\ninterface HeaderProps {\n title: string\n /** Slot for the action button (e.g. HumanHandoffAction). Sits left of close. */\n rightAction?: ComponentChildren\n /** Hide the close button in embedded mode where the host owns visibility. */\n showClose?: boolean\n}\n\n/**\n * Chat window header bar — composed of three independently-debuggable\n * subcomponents: left (back/avatar), title (text), and right actions.\n */\nexport function Header({ title, rightAction, showClose = true }: HeaderProps) {\n return (\n <header class=\"jex-chat-header\">\n <HeaderLeft />\n <HeaderTitle title={title} />\n <HeaderActions action={rightAction} showClose={showClose} />\n </header>\n )\n}\n","export function ZapIcon({ size = 14 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n )\n}\n","import { ZapIcon } from '../icons/ZapIcon'\n\n/** \"Powered by Jexity\" branding bar with locale switcher. */\nexport function Footer() {\n return (\n <div class=\"jex-widget-footer\">\n <a\n href=\"https://jexitychat.de\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"jex-branding\"\n >\n <ZapIcon size={14} />\n <span>\n Powered by <strong>Jexity</strong>\n </span>\n </a>\n </div>\n )\n}\n","export function MessageIcon({ size = 28 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )\n}\n","import type { JSX } from 'preact'\n\nexport function SparklesIcon({ size = 24, ...props }: JSX.SVGAttributes<SVGSVGElement> & { size?: number | string }) {\n return (\n <svg \n width={size} \n height={size} \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\" \n stroke-width=\"2\" \n stroke-linecap=\"round\" \n stroke-linejoin=\"round\"\n {...props}\n >\n <path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\" />\n </svg>\n )\n}\n","import { isOpen } from '../../module/shell/shell.state'\nimport { useLocale } from '../../i18n/index'\nimport { MessageIcon } from '../icons/MessageIcon'\nimport { CloseIcon } from '../icons/CloseIcon'\nimport { BotIcon } from '../icons/BotIcon'\nimport { SparklesIcon } from '../icons/SparklesIcon'\n\ninterface FABProps {\n radius?: 'none' | 'sm' | 'md' | 'lg' | 'full'\n iconOption?: 'chat' | 'bot' | 'sparkles'\n label?: string\n}\n\nconst ICON_MAP: Record<NonNullable<FABProps['iconOption']>, import('preact').VNode> = {\n chat: <MessageIcon size={28} />,\n bot: <BotIcon size={28} />,\n sparkles: <SparklesIcon size={28} />,\n}\n\nconst RADIUS_MAP: Record<NonNullable<FABProps['radius']>, string> = {\n none: '0px',\n sm: '0.5rem',\n md: '0.75rem',\n lg: '1.25rem',\n full: '9999px',\n}\n\n/** Floating action button — the circular or pill-shaped trigger. */\nexport function FAB({ radius = 'full', iconOption = 'chat', label }: FABProps) {\n const s = useLocale()\n const resolvedLabel = label ?? s.fabLabel\n const hasLabel = resolvedLabel !== ''\n\n return (\n <button\n class={`jex-floating-button ${!isOpen.value && hasLabel ? 'jex-has-label' : ''}`}\n style={{ borderRadius: RADIUS_MAP[radius] ?? '9999px' }}\n onClick={() => { isOpen.value = !isOpen.value }}\n aria-label={isOpen.value ? s.closeChatAriaLabel : s.openChatAriaLabel}\n >\n {isOpen.value ? (\n <CloseIcon size={28} />\n ) : (\n <div class=\"jex-fab-inner\">\n {ICON_MAP[iconOption]}\n {hasLabel && <span class=\"jex-fab-label\">{resolvedLabel}</span>}\n </div>\n )}\n </button>\n )\n}\n","import { useState } from 'preact/hooks'\nimport { navigate } from '../../../module/screens/screens.state'\nimport { sessionHistory, resumeSession, chatMountIntent } from '../../../module/visitor/visitor.state'\nimport { isLocked, unlockSession } from '../../../module/visitor/idle-lock'\nimport { useLocale } from '../../../i18n/index'\nimport { MessageIcon } from '../../../shared/icons/MessageIcon'\nimport type { SessionResult } from '../../chat/hooks/useConvexSession'\n\ninterface HomeScreenProps {\n greeting: string\n title: string\n // Reset useConvexSession's resolvedRef and start a fresh session.\n onStartFresh: () => Promise<SessionResult | null>\n // Clear cached resolved session so next ensureSession() picks up the new currentSessionRef.\n onResetSession: () => void\n}\n\n/**\n * Home / greeting screen.\n *\n * Session resume (GDPR):\n * - sessionHistory has entries → show multi-entry history list\n * - No history (new tab / after close) → show start chat + optional reference lookup\n */\nexport function HomeScreen({ title, onStartFresh, onResetSession }: HomeScreenProps) {\n const t = useLocale()\n const [lookupRef, setLookupRef] = useState('')\n\n function handleStartChat() {\n // Visitor explicitly engaging again — clear any privacy lock notice.\n unlockSession()\n // Intent BEFORE startFresh so ChatScreen renders \"Starting…\" not \"Resuming…\".\n chatMountIntent.value = 'fresh'\n // Clear stale resolvedRef so the lock-wiped history doesn't leak in.\n onResetSession()\n // Fire-and-forget — ChatScreen renders LoadingScreen until sessionId resolves.\n // Navigating immediately lets the loading state be visible during the mutation.\n void onStartFresh()\n navigate({ id: 'chat' })\n }\n\n function handleResumeEntry(ref: string) {\n unlockSession()\n chatMountIntent.value = 'resume'\n // Clear stale resolvedRef so ensureSession() re-resolves from the new currentSessionRef.\n onResetSession()\n // Bump TTL anchor + switch current ref + open chat.\n resumeSession(ref)\n navigate({ id: 'chat' })\n }\n\n function handleLookupSubmit(e: Event) {\n e.preventDefault()\n const trimmed = lookupRef.trim().toUpperCase()\n if (!trimmed) { return }\n unlockSession()\n chatMountIntent.value = 'resume'\n onResetSession()\n // Insert a synthetic entry so the lookup acts like a resume.\n resumeSession(trimmed)\n navigate({ id: 'chat' })\n }\n\n return (\n <div class=\"jex-home\">\n {/* Privacy-lock notice — shown after the idle/visibility watcher wiped\n the prior conversation. Cleared on the next visitor action. */}\n {isLocked.value && (\n <div class=\"jex-session-prompt\" role=\"status\">\n <div class=\"jex-session-prompt-text\">{t.sessionLocked}</div>\n </div>\n )}\n\n {/* Avatar + status indicator */}\n <div class=\"jex-home-hero\">\n <div class=\"jex-home-avatar\">\n <MessageIcon size={24} />\n <span class=\"jex-home-status-dot\" />\n </div>\n <div class=\"jex-home-hero-text\">\n <h2 class=\"jex-home-title\">{title}</h2>\n <span class=\"jex-home-status\">{t.statusOnline}</span>\n </div>\n </div>\n\n {/* Session lookup — always visible */}\n <form class=\"jex-home-lookup\" onSubmit={handleLookupSubmit}>\n <input\n class=\"jex-home-lookup-input\"\n type=\"text\"\n placeholder={t.referencePlaceholder}\n value={lookupRef}\n onInput={(e) => { setLookupRef(e.currentTarget.value) }}\n />\n <button\n class=\"jex-home-lookup-submit\"\n type=\"submit\"\n disabled={!lookupRef.trim()}\n >\n {t.resume}\n </button>\n </form>\n\n <div class=\"jex-home-actions\">\n {sessionHistory.value.length > 0 && (\n <div class=\"jex-home-history\">\n {sessionHistory.value\n .slice()\n .reverse()\n .map((entry) => (\n <button\n key={entry.ref}\n class=\"jex-home-resume-card\"\n onClick={() => { handleResumeEntry(entry.ref) }}\n >\n <div class=\"jex-home-resume-top\">\n <span class=\"jex-home-resume-label\">{t.resumeListLabel}</span>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"jex-home-resume-arrow\">\n <path d=\"M6 3l5 5-5 5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"jex-home-resume-ref\">{entry.ref}</span>\n <span class=\"jex-home-resume-meta\">\n {t.resumeListTimestamp.replace('{minutes}', String(Math.max(1, Math.round((Date.now() - entry.lastActivityAt) / 60000))))}\n </span>\n </button>\n ))}\n </div>\n )}\n\n <button class=\"jex-home-new-btn\" onClick={handleStartChat}>\n {sessionHistory.value.length > 0 ? t.startNewConversation : t.chatWith.replace('{title}', title)}\n </button>\n </div>\n </div>\n )\n}\n","import { navigate } from '../../../module/screens/screens.state'\nimport { useLocale } from '../../../i18n/index'\n\ninterface SelectionScreenProps {\n title: string\n}\n\n/** Contact method selection — chat vs. submit ticket. */\nexport function SelectionScreen({ title }: SelectionScreenProps) {\n const t = useLocale()\n return (\n <div class=\"jex-selection\">\n <h2 class=\"jex-selection-title\">{t.howCanWeHelp}</h2>\n <div class=\"jex-selection-options\">\n <button\n class=\"jex-selection-option\"\n onClick={() => navigate({ id: 'chat' })}\n >\n <span class=\"jex-selection-icon\">💬</span>\n <span class=\"jex-selection-label\">{t.chatWith.replace('{title}', title)}</span>\n <span class=\"jex-selection-sub\">{t.getInstantHelp}</span>\n </button>\n <button\n class=\"jex-selection-option\"\n onClick={() => navigate({ id: 'form' })}\n >\n <span class=\"jex-selection-icon\">📝</span>\n <span class=\"jex-selection-label\">{t.submitTicket}</span>\n <span class=\"jex-selection-sub\">{t.replyByEmail}</span>\n </button>\n </div>\n </div>\n )\n}\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": \"2\",\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { h, toChildArray } from 'preact';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\n\nconst Icon = ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n children,\n iconNode,\n class: classes = \"\",\n ...rest\n}) => h(\n \"svg\",\n {\n ...defaultAttributes,\n width: String(size),\n height: size,\n stroke: color,\n [\"stroke-width\"]: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n class: [\"lucide\", classes].join(\" \"),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [...iconNode.map(([tag, attrs]) => h(tag, attrs)), ...toChildArray(children)]\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { h } from 'preact';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = ({ class: classes = \"\", className = \"\", children, ...props }) => h(\n Icon,\n {\n ...props,\n iconNode,\n class: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${toKebabCase(iconName)}`,\n classes,\n className\n )\n },\n children\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-preact v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CornerUpLeft = createLucideIcon(\"corner-up-left\", [\n [\"path\", { d: \"M20 20v-7a4 4 0 0 0-4-4H4\", key: \"1nkjon\" }],\n [\"path\", { d: \"M9 14 4 9l5-5\", key: \"102s5s\" }]\n]);\n\nexport { CornerUpLeft as default };\n//# sourceMappingURL=corner-up-left.js.map\n","/**\n * marked v17.0.5 - a markdown parser\n * Copyright (c) 2018-2026, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction M(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=M();function G(u){T=u}var _={exec:()=>null};function k(u,e=\"\"){let t=typeof u==\"string\"?u:u.source,n={replace:(r,i)=>{let s=typeof i==\"string\"?i:i.source;return s=s.replace(m.caret,\"$1\"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var be=(()=>{try{return!!new RegExp(\"(?<=1)(?<!1)\")}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:u=>new RegExp(`^( {0,3}${u})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),hrRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),fencesBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\\`\\`\\`|~~~)`),headingBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}#`),htmlBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}<(?:[a-z].*>|!--)`,\"i\"),blockquoteBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}>`)},Re=/^(?:[ \\t]*(?:\\n|$))+/,Te=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Oe=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,C=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,we=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,Q=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,se=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,ie=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),ye=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),j=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,Pe=/^[^\\n]+/,F=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Se=k(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",F).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),$e=k(/^(bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g,Q).getRegex(),v=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",U=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,_e=k(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",U).replace(\"tag\",v).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),oe=k(j).replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),Le=k(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",oe).getRegex(),K={blockquote:Le,code:Te,def:Se,fences:Oe,heading:we,hr:C,html:_e,lheading:ie,list:$e,newline:Re,paragraph:oe,table:_,text:Pe},ne=k(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),Me={...K,lheading:ye,table:ne,paragraph:k(j).replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",ne).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex()},ze={...K,html:k(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",U).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:_,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:k(j).replace(\"hr\",C).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",ie).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Ee=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,Ie=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ae=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ae=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,z=/[\\p{P}\\p{S}]/u,H=/[\\s\\p{P}\\p{S}]/u,W=/[^\\s\\p{P}\\p{S}]/u,Ce=k(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,H).getRegex(),le=/(?!~)[\\p{P}\\p{S}]/u,Be=/(?!~)[\\s\\p{P}\\p{S}]/u,De=/(?:[^\\s\\p{P}\\p{S}]|~)/u,qe=k(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",be?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),ue=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,ve=k(ue,\"u\").replace(/punct/g,z).getRegex(),He=k(ue,\"u\").replace(/punct/g,le).getRegex(),pe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",Ze=k(pe,\"gu\").replace(/notPunctSpace/g,W).replace(/punctSpace/g,H).replace(/punct/g,z).getRegex(),Ge=k(pe,\"gu\").replace(/notPunctSpace/g,De).replace(/punctSpace/g,Be).replace(/punct/g,le).getRegex(),Ne=k(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,W).replace(/punctSpace/g,H).replace(/punct/g,z).getRegex(),Qe=k(/^~~?(?:((?!~)punct)|[^\\s~])/,\"u\").replace(/punct/g,z).getRegex(),je=\"^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)\",Fe=k(je,\"gu\").replace(/notPunctSpace/g,W).replace(/punctSpace/g,H).replace(/punct/g,z).getRegex(),Ue=k(/\\\\(punct)/,\"gu\").replace(/punct/g,z).getRegex(),Ke=k(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),We=k(U).replace(\"(?:-->|$)\",\"-->\").getRegex(),Xe=k(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",We).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),q=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/,Je=k(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace(\"label\",q).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),ce=k(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",q).replace(\"ref\",F).getRegex(),he=k(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",F).getRegex(),Ve=k(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",ce).replace(\"nolink\",he).getRegex(),re=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,X={_backpedal:_,anyPunctuation:Ue,autolink:Ke,blockSkip:qe,br:ae,code:Ie,del:_,delLDelim:_,delRDelim:_,emStrongLDelim:ve,emStrongRDelimAst:Ze,emStrongRDelimUnd:Ne,escape:Ee,link:Je,nolink:he,punctuation:Ce,reflink:ce,reflinkSearch:Ve,tag:Xe,text:Ae,url:_},Ye={...X,link:k(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",q).getRegex(),reflink:k(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",q).getRegex()},N={...X,emStrongRDelimAst:Ge,emStrongLDelim:He,delLDelim:Qe,delRDelim:Fe,url:k(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",re).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:k(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",re).getRegex()},et={...N,br:k(ae).replace(\"{2,}\",\"*\").getRegex(),text:k(N.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},B={normal:K,gfm:Me,pedantic:ze},E={normal:X,gfm:N,breaks:et,pedantic:Ye};var tt={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\"},ke=u=>tt[u];function O(u,e){if(e){if(m.escapeTest.test(u))return u.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(u))return u.replace(m.escapeReplaceNoEncode,ke);return u}function J(u){try{u=encodeURI(u).replace(m.percentDecode,\"%\")}catch{return null}return u}function V(u,e){let t=u.replace(m.findPipe,(i,s,a)=>{let o=!1,l=s;for(;--l>=0&&a[l]===\"\\\\\";)o=!o;return o?\"|\":\" |\"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,\"|\");return n}function I(u,e,t){let n=u.length;if(n===0)return\"\";let r=0;for(;r<n;){let i=u.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return u.slice(0,n-r)}function de(u,e){if(u.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<u.length;n++)if(u[n]===\"\\\\\")n++;else if(u[n]===e[0])t++;else if(u[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function ge(u,e=0){let t=e,n=\"\";for(let r of u)if(r===\"\t\"){let i=4-t%4;n+=\" \".repeat(i),t+=i}else n+=r,t++;return n}function fe(u,e,t,n,r){let i=e.href,s=e.title||null,a=u[1].replace(r.other.outputLinkReplace,\"$1\");n.state.inLink=!0;let o={type:u[0].charAt(0)===\"!\"?\"image\":\"link\",raw:t,href:i,title:s,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function nt(u,e,t){let n=u.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`\n`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[a]=s;return a.length>=r.length?i.slice(r.length):i}).join(`\n`)}var w=class{options;rules;lexer;constructor(e){this.options=e||T}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:t[0],codeBlockStyle:\"indented\",text:this.options.pedantic?n:I(n,`\n`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=nt(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=I(n,\"#\");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:\"heading\",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:I(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=I(t[0],`\n`).split(`\n`),r=\"\",i=\"\",s=[];for(;n.length>0;){let a=!1,o=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))o.push(n[l]),a=!0;else if(!a)o.push(n[l]);else break;n=n.slice(l);let p=o.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");r=r?`${r}\n${p}`:p,i=i?`${i}\n${c}`:c;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=d,n.length===0)break;let h=s.at(-1);if(h?.type===\"code\")break;if(h?.type===\"blockquote\"){let R=h,f=R.raw+`\n`+n.join(`\n`),S=this.blockquote(f);s[s.length-1]=S,r=r.substring(0,r.length-R.raw.length)+S.raw,i=i.substring(0,i.length-R.text.length)+S.text;break}else if(h?.type===\"list\"){let R=h,f=R.raw+`\n`+n.join(`\n`),S=this.list(f);s[s.length-1]=S,r=r.substring(0,r.length-h.raw.length)+S.raw,i=i.substring(0,i.length-R.raw.length)+S.raw,n=f.substring(s.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:\"list\",raw:\"\",ordered:r,start:r?+n.slice(0,-1):\"\",loose:!1,items:[]};n=r?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=r?n:\"[*+-]\");let s=this.rules.other.listItemRegex(n),a=!1;for(;e;){let l=!1,p=\"\",c=\"\";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let d=ge(t[2].split(`\n`,1)[0],t[1].length),h=e.split(`\n`,1)[0],R=!d.trim(),f=0;if(this.options.pedantic?(f=2,c=d.trimStart()):R?f=t[1].length+1:(f=d.search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=d.slice(f),f+=t[1].length),R&&this.rules.other.blankLine.test(h)&&(p+=h+`\n`,e=e.substring(h.length+1),l=!0),!l){let S=this.rules.other.nextBulletRegex(f),Y=this.rules.other.hrRegex(f),ee=this.rules.other.fencesBeginRegex(f),te=this.rules.other.headingBeginRegex(f),me=this.rules.other.htmlBeginRegex(f),xe=this.rules.other.blockquoteBeginRegex(f);for(;e;){let Z=e.split(`\n`,1)[0],A;if(h=Z,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting,\" \"),A=h):A=h.replace(this.rules.other.tabCharGlobal,\" \"),ee.test(h)||te.test(h)||me.test(h)||xe.test(h)||S.test(h)||Y.test(h))break;if(A.search(this.rules.other.nonSpaceChar)>=f||!h.trim())c+=`\n`+A.slice(f);else{if(R||d.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||ee.test(d)||te.test(d)||Y.test(d))break;c+=`\n`+h}R=!h.trim(),p+=Z+`\n`,e=e.substring(Z.length+1),d=A.slice(f)}}i.loose||(a?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(a=!0)),i.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),i.raw+=p}let o=i.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let l of i.items){if(this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]),l.task){if(l.text=l.text.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0]?.type===\"text\"||l.tokens[0]?.type===\"paragraph\"){l.tokens[0].raw=l.tokens[0].raw.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0].text=l.tokens[0].text.replace(this.rules.other.listReplaceTask,\"\");for(let c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,\"\");break}}let p=this.rules.other.listTaskCheckbox.exec(l.raw);if(p){let c={type:\"checkbox\",raw:p[0]+\" \",checked:p[0]!==\"[ ]\"};l.checked=c.checked,i.loose?l.tokens[0]&&[\"paragraph\",\"text\"].includes(l.tokens[0].type)&&\"tokens\"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=c.raw+l.tokens[0].raw,l.tokens[0].text=c.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(c)):l.tokens.unshift({type:\"paragraph\",raw:c.raw,text:c.raw,tokens:[c]}):l.tokens.unshift(c)}}if(!i.loose){let p=l.tokens.filter(d=>d.type===\"space\"),c=p.length>0&&p.some(d=>this.rules.other.anyLine.test(d.raw));i.loose=c}}if(i.loose)for(let l of i.items){l.loose=!0;for(let p of l.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:\"html\",block:!0,raw:t[0],pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:t[0],href:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=V(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],s={type:\"table\",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?s.align.push(\"right\"):this.rules.other.tableAlignCenter.test(a)?s.align.push(\"center\"):this.rules.other.tableAlignLeft.test(a)?s.align.push(\"left\"):s.align.push(null);for(let a=0;a<n.length;a++)s.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:s.align[a]});for(let a of i)s.rows.push(V(a,s.header.length).map((o,l)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:s.align[l]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:\"heading\",raw:t[0],depth:t[2].charAt(0)===\"=\"?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=I(n.slice(0,-1),\"\\\\\");if((n.length-s.length)%2===0)return}else{let s=de(t[2],\"()\");if(s===-2)return;if(s>-1){let o=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,o).trim(),t[3]=\"\"}}let r=t[2],i=\"\";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),fe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:i&&i.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:\"text\",raw:s,text:s}}return fe(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||!r[1]&&!r[2]&&!r[3]&&!r[4]||r[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[3]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=0,c=r[0][0]===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){l+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){p+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l+p);let d=[...r[0]][0].length,h=e.slice(0,s+r.index+d+o);if(Math.min(s,o)%2){let f=h.slice(1,-1);return{type:\"em\",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let R=h.slice(2,-2);return{type:\"strong\",raw:h,text:R,tokens:this.lexer.inlineTokens(R)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e,t,n=\"\"){let r=this.rules.inline.delLDelim.exec(e);if(!r)return;if(!(r[1]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=this.rules.inline.delRDelim;for(p.lastIndex=0,t=t.slice(-1*e.length+s);(r=p.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a||(o=[...a].length,o!==s))continue;if(r[3]||r[4]){l+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l);let c=[...r[0]][0].length,d=e.slice(0,s+r.index+c+o),h=d.slice(s,-s);return{type:\"del\",raw:d,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]===\"@\"?(n=t[1],r=\"mailto:\"+n):(n=t[1],r=n),{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]===\"@\")n=t[0],r=\"mailto:\"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(i!==t[0]);n=t[0],t[1]===\"www.\"?r=\"http://\"+t[0]:r=t[0]}return{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:t[0],escaped:n}}}};var x=class u{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||T,this.options.tokenizer=this.options.tokenizer||new w,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:B.normal,inline:E.normal};this.options.pedantic?(t.block=B.pedantic,t.inline=E.pedantic):this.options.gfm&&(t.block=B.gfm,this.options.breaks?t.inline=E.breaks:t.inline=E.gfm),this.tokenizer.rules=t}static get rules(){return{block:B,inline:E}}static lex(e,t){return new u(t).lex(e)}static lexInline(e,t){return new u(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\" \").replace(m.spaceLine,\"\"));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,a=e.slice(1),o;this.options.extensions.startBlock.forEach(l=>{o=l.call({lexer:this},a),typeof o==\"number\"&&o>=0&&(s=Math.min(s,o))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type===\"paragraph\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf(\"[\")+1,-1))&&(n=n.slice(0,r.index)+\"[\"+\"a\".repeat(r[0].length-2)+\"]\"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+\"++\"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)i=r[2]?r[2].length:0,n=n.slice(0,r.index+i)+\"[\"+\"a\".repeat(r[0].length-i-2)+\"]\"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,a=\"\";for(;e;){s||(a=\"\"),s=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type===\"text\"&&p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let l=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),d;this.options.extensions.startInline.forEach(h=>{d=h.call({lexer:this},c),typeof d==\"number\"&&d>=0&&(p=Math.min(p,d))}),p<1/0&&p>=0&&(l=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(l)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(a=o.raw.slice(-1)),s=!0;let p=t.at(-1);p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){let p=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return t}};var y=class{options;parser;constructor(e){this.options=e||T}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let r=(t||\"\").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,\"\")+`\n`;return r?'<pre><code class=\"language-'+O(r)+'\">'+(n?i:O(i,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?i:O(i,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,r=\"\";for(let a=0;a<e.items.length;a++){let o=e.items[a];r+=this.listitem(o)}let i=t?\"ol\":\"ul\",s=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+i+s+`>\n`+r+\"</\"+i+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let r=\"\";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n=\"\";for(let a=0;a<s.length;a++)n+=this.tablecell(s[a]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+r+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${O(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=J(e);if(i===null)return r;e=i;let s='<a href=\"'+e+'\"';return t&&(s+=' title=\"'+O(t)+'\"'),s+=\">\"+r+\"</a>\",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=J(e);if(i===null)return O(n);e=i;let s=`<img src=\"${e}\" alt=\"${O(n)}\"`;return t&&(s+=` title=\"${O(t)}\"`),s+=\">\",s}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:O(e.text)}};var $=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var b=class u{options;renderer;textRenderer;constructor(e){this.options=e||T,this.options.renderer=this.options.renderer||new y,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new $}static parse(e,t){return new u(t).parse(e)}static parseInline(e,t){return new u(t).parseInline(e)}parse(e){this.renderer.parser=this;let t=\"\";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let s=r,a=this.options.extensions.renderers[s.type].call({parser:this},s);if(a!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"def\",\"paragraph\",\"text\"].includes(s.type)){t+=a||\"\";continue}}let i=r;switch(i.type){case\"space\":{t+=this.renderer.space(i);break}case\"hr\":{t+=this.renderer.hr(i);break}case\"heading\":{t+=this.renderer.heading(i);break}case\"code\":{t+=this.renderer.code(i);break}case\"table\":{t+=this.renderer.table(i);break}case\"blockquote\":{t+=this.renderer.blockquote(i);break}case\"list\":{t+=this.renderer.list(i);break}case\"checkbox\":{t+=this.renderer.checkbox(i);break}case\"html\":{t+=this.renderer.html(i);break}case\"def\":{t+=this.renderer.def(i);break}case\"paragraph\":{t+=this.renderer.paragraph(i);break}case\"text\":{t+=this.renderer.text(i);break}default:{let s='Token with \"'+i.type+'\" type was not found.';if(this.options.silent)return console.error(s),\"\";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=\"\";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let a=this.options.extensions.renderers[i.type].call({parser:this},i);if(a!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(i.type)){n+=a||\"\";continue}}let s=i;switch(s.type){case\"escape\":{n+=t.text(s);break}case\"html\":{n+=t.html(s);break}case\"link\":{n+=t.link(s);break}case\"image\":{n+=t.image(s);break}case\"checkbox\":{n+=t.checkbox(s);break}case\"strong\":{n+=t.strong(s);break}case\"em\":{n+=t.em(s);break}case\"codespan\":{n+=t.codespan(s);break}case\"br\":{n+=t.br(s);break}case\"del\":{n+=t.del(s);break}case\"text\":{n+=t.text(s);break}default:{let a='Token with \"'+s.type+'\" type was not found.';if(this.options.silent)return console.error(a),\"\";throw new Error(a)}}}return n}};var P=class{options;block;constructor(e){this.options=e||T}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?x.lex:x.lexInline}provideParser(){return this.block?b.parse:b.parseInline}};var D=class{defaults=M();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=y;TextRenderer=$;Lexer=x;Tokenizer=w;Hooks=P;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case\"table\":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let a of s)n=n.concat(this.walkTokens(a.tokens,t));break}case\"list\":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let a=i[s].flat(1/0);n=n.concat(this.walkTokens(a,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error(\"extension name required\");if(\"renderer\"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=s.apply(this,a)),o}:t.renderers[i.name]=i.renderer}if(\"tokenizer\"in i){if(!i.level||i.level!==\"block\"&&i.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level===\"block\"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level===\"inline\"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}\"childTokens\"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new y(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if([\"options\",\"parser\"].includes(s))continue;let a=s,o=n.renderer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c||\"\"}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new w(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(s))continue;let a=s,o=n.tokenizer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new P;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if([\"options\",\"block\"].includes(s))continue;let a=s,o=n.hooks[a],l=i[a];P.passThroughHooks.has(s)?i[a]=p=>{if(this.defaults.async&&P.passThroughHooksRespectAsync.has(s))return(async()=>{let d=await o.call(i,p);return l.call(i,d)})();let c=o.call(i,p);return l.call(i,c)}:i[a]=(...p)=>{if(this.defaults.async)return(async()=>{let d=await o.apply(i,p);return d===!1&&(d=await l.apply(i,p)),d})();let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(s.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},a=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return a(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return a(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return a(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let o=s.hooks?await s.hooks.preprocess(n):n,p=await(s.hooks?await s.hooks.provideLexer():e?x.lex:x.lexInline)(o,s),c=s.hooks?await s.hooks.processAllTokens(p):p;s.walkTokens&&await Promise.all(this.walkTokens(c,s.walkTokens));let h=await(s.hooks?await s.hooks.provideParser():e?b.parse:b.parseInline)(c,s);return s.hooks?await s.hooks.postprocess(h):h})().catch(a);try{s.hooks&&(n=s.hooks.preprocess(n));let l=(s.hooks?s.hooks.provideLexer():e?x.lex:x.lexInline)(n,s);s.hooks&&(l=s.hooks.processAllTokens(l)),s.walkTokens&&this.walkTokens(l,s.walkTokens);let c=(s.hooks?s.hooks.provideParser():e?b.parse:b.parseInline)(l,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let r=\"<p>An error occurred:</p><pre>\"+O(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var L=new D;function g(u,e){return L.parse(u,e)}g.options=g.setOptions=function(u){return L.setOptions(u),g.defaults=L.defaults,G(g.defaults),g};g.getDefaults=M;g.defaults=T;g.use=function(...u){return L.use(...u),g.defaults=L.defaults,G(g.defaults),g};g.walkTokens=function(u,e){return L.walkTokens(u,e)};g.parseInline=L.parseInline;g.Parser=b;g.parser=b.parse;g.Renderer=y;g.TextRenderer=$;g.Lexer=x;g.lexer=x.lex;g.Tokenizer=w;g.Hooks=P;g.parse=g;var Qt=g.options,jt=g.setOptions,Ft=g.use,Ut=g.walkTokens,Kt=g.parseInline,Wt=g,Xt=b.parse,Jt=x.lex;export{P as Hooks,x as Lexer,D as Marked,b as Parser,y as Renderer,$ as TextRenderer,w as Tokenizer,T as defaults,M as getDefaults,Jt as lexer,g as marked,Qt as options,Wt as parse,Kt as parseInline,Xt as parser,jt as setOptions,Ft as use,Ut as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","import { useMemo } from 'preact/hooks'\nimport { marked } from 'marked'\n\n/** Configure marked for chat-style output */\nmarked.setOptions({\n breaks: true,\n gfm: true,\n})\n\ninterface MarkdownContentProps {\n text: string\n}\n\n/**\n * Renders markdown text as HTML using `marked`.\n * Used for bot messages so formatting (bold, lists, code, links) displays correctly.\n */\nexport function MarkdownContent({ text }: MarkdownContentProps) {\n const html = useMemo(() => {\n if (!text) { return '' }\n const raw = marked.parse(text)\n // marked.parse can return string | Promise<string>; with async: false (default) it's always string\n return typeof raw === 'string' ? raw : ''\n }, [text])\n\n // eslint-disable-next-line react/no-danger\n return <div class=\"jex-md\" dangerouslySetInnerHTML={{ __html: html }} />\n}\n","import { signal } from '@preact/signals'\n\n/**\n * Visitor's draft message — shared so the reply icon on agent messages\n * can prepend an `@<agent>` mention into the active input. ChatInput\n * binds its <textarea> to this signal; BotMessage's reply icon writes\n * to it via `tagAgent`.\n *\n * Module-scope signal is fine here: a widget instance has at most one\n * active composer, and visitors never have two widgets on the same page.\n */\nexport const draftMessage = signal('')\n\n/**\n * Prepends `@<firstName> ` to the current draft so the visitor can type\n * their question after the mention. If the draft already contains a\n * mention for the same agent, it's a no-op. Trailing whitespace from\n * the existing draft is preserved.\n */\nexport function tagAgent(agentName: string | undefined): void {\n if (!agentName) {\n return\n }\n const firstName = agentName.trim().split(/\\s+/)[0]\n if (!firstName) {\n return\n }\n const mention = `@${firstName} `\n const current = draftMessage.value\n if (current.includes(mention) || current.includes(`@${firstName}`)) {\n return\n }\n draftMessage.value = current.trimStart()\n ? `${mention}${current.trimStart()}`\n : mention\n}\n","import { signal } from '@preact/signals'\n\n/** Wall-clock ms when visitor may send again. null = unsubscribed. */\nexport const rateLimitedUntilMs = signal<number | null>(null)\n\n/**\n * Module-scope wall-clock ticker. Updated once per second by\n * RateLimitNotice while a rate-limit countdown is active, used to\n * derive remaining seconds. Lives at module scope so multiple\n * consumers share one timer if needed.\n */\nexport const nowMs = signal<number>(Date.now())\n","import { signal } from '@preact/signals'\n\n/**\n * Pending image attachments staged in the composer.\n *\n * Frontend-only state for now. The backend `send` mutation accepts a\n * single `content: string` — image upload + persistence (Convex storage,\n * message-level attachment array, agent vision-input wiring) is a\n * follow-up. When that lands, replace `previewUrl` with the uploaded\n * `storageId` and pass the array in `send(...)`.\n *\n * `previewUrl` is an `URL.createObjectURL(file)` blob — callers MUST\n * revoke it via `removeAttachedImage` / `clearAttachedImages` to avoid\n * leaking memory.\n */\nexport interface AttachedImage {\n id: string\n file: File\n previewUrl: string\n}\n\nexport const attachedImages = signal<AttachedImage[]>([])\n\nconst MAX_IMAGE_ATTACHMENTS = 4\nconst MAX_IMAGE_BYTES = 8 * 1024 * 1024 // 8MB per file\n\n/**\n * Generate a unique id for a staged attachment.\n *\n * `crypto.randomUUID()` is only available in **secure contexts** (HTTPS\n * or localhost). The widget embeds inside visitor host pages — any HTTP\n * embed (intranet, file://, dev/staging without TLS) would throw\n * `TypeError: crypto.randomUUID is not a function` and crash the\n * composer the moment the visitor attaches an image.\n *\n * The id is used only as a local key + lookup handle (not security),\n * so a Date.now + Math.random fallback is fine — collision risk inside\n * a single composer session capped at 4 entries is negligible.\n */\nfunction genAttachmentId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n return `att-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`\n}\n\n/** Appends image files (after size + count guards) and creates blob preview URLs. */\nexport function addAttachedImages(files: FileList | File[]): void {\n const incoming = Array.from(files).filter((f) => f.type.startsWith('image/') && f.size <= MAX_IMAGE_BYTES)\n if (incoming.length === 0) {\n return\n }\n const room = MAX_IMAGE_ATTACHMENTS - attachedImages.value.length\n if (room <= 0) {\n return\n }\n const next = incoming.slice(0, room).map((file) => ({\n // Falls back to a non-crypto id when host page is HTTP — see genAttachmentId.\n id: genAttachmentId(),\n file,\n previewUrl: URL.createObjectURL(file),\n }))\n attachedImages.value = [...attachedImages.value, ...next]\n}\n\n/** Removes one staged image by id and revokes its blob URL. */\nexport function removeAttachedImage(id: string): void {\n const target = attachedImages.value.find((img) => img.id === id)\n if (target) {\n URL.revokeObjectURL(target.previewUrl)\n }\n attachedImages.value = attachedImages.value.filter((img) => img.id !== id)\n}\n\n/** Revokes every staged blob URL and resets the list. Call after send + on unmount. */\nexport function clearAttachedImages(): void {\n for (const img of attachedImages.value) {\n URL.revokeObjectURL(img.previewUrl)\n }\n attachedImages.value = []\n}\n","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nimport { version } from \"../../index.js\";\nimport { performAsyncSyscall } from \"../impl/syscall.js\";\nimport {\n getFunctionAddress,\n setReferencePath,\n toReferencePath\n} from \"./paths.js\";\nimport { isValidator } from \"../../values/validator.js\";\nexport { getFunctionAddress } from \"./paths.js\";\nexport async function createFunctionHandle(functionReference) {\n const address = getFunctionAddress(functionReference);\n return await performAsyncSyscall(\"1.0/createFunctionHandle\", {\n ...address,\n version\n });\n}\nclass InstalledComponent {\n constructor(definition, name) {\n /**\n * @internal\n */\n __publicField(this, \"_definition\");\n /**\n * @internal\n */\n __publicField(this, \"_name\");\n this._definition = definition;\n this._name = name;\n setReferencePath(this, `_reference/childComponent/${name}`);\n }\n get exports() {\n return createExports(this._name, []);\n }\n}\nfunction createExports(name, pathParts) {\n const handler = {\n get(_, prop) {\n if (typeof prop === \"string\") {\n const newParts = [...pathParts, prop];\n return createExports(name, newParts);\n } else if (prop === toReferencePath) {\n let reference = `_reference/childComponent/${name}`;\n for (const part of pathParts) {\n reference += `/${part}`;\n }\n return reference;\n } else {\n return void 0;\n }\n }\n };\n return new Proxy({}, handler);\n}\nfunction createEnvRefs(ownerLabel, declared) {\n const handler = {\n get(_, prop) {\n if (typeof prop !== \"string\") {\n return void 0;\n }\n if (!declared || !Object.prototype.hasOwnProperty.call(declared, prop)) {\n throw new Error(\n `Env var \"${prop}\" is not declared on ${ownerLabel}. Add it to the \\`env\\` option of ${ownerLabel === \"this app\" ? \"defineApp\" : \"defineComponent\"}.`\n );\n }\n return { __envVarRef: prop };\n }\n };\n return new Proxy({}, handler);\n}\nfunction isEnvRef(value) {\n return typeof value === \"object\" && value !== null && typeof value.__envVarRef === \"string\";\n}\nfunction use(definition, options) {\n const importedComponentDefinition = definition;\n if (typeof importedComponentDefinition.componentDefinitionPath !== \"string\") {\n throw new Error(\n \"Component definition does not have the required componentDefinitionPath property. This code only works in Convex runtime.\"\n );\n }\n const name = options?.name ?? // added recently\n importedComponentDefinition.defaultName ?? // can be removed once backend is out\n importedComponentDefinition.componentDefinitionPath.split(\"/\").pop();\n if (typeof name !== \"string\") {\n throw new Error(\n `Component name must be a string. Received: ${typeof name}`\n );\n }\n if (name.length === 0) {\n throw new Error(\"Component name cannot be empty.\");\n }\n const httpPrefix = options?.httpPrefix;\n if (httpPrefix !== void 0) {\n if (!httpPrefix.startsWith(\"/\")) {\n throw new Error(\n `httpPrefix must start with \"/\". Received: \"${httpPrefix}\"`\n );\n }\n }\n const envValues = {};\n if (options?.env) {\n for (const [key, value] of Object.entries(options.env)) {\n if (value !== void 0) {\n envValues[key] = value;\n }\n }\n }\n this._childComponents.push([\n name,\n importedComponentDefinition,\n envValues,\n httpPrefix\n ]);\n return new InstalledComponent(definition, name);\n}\nfunction exportAppForAnalysis() {\n const definitionType = { type: \"app\" };\n const childComponents = serializeChildComponents(this._childComponents);\n const httpMounts = buildHttpMounts(this._childComponents);\n const envVars = this._env ? Object.entries(this._env).map(\n ([name, validator]) => [\n name,\n {\n type: \"value\",\n value: JSON.stringify(validator.json),\n ...validator.isOptional === \"optional\" ? { optional: true } : {}\n }\n ]\n ) : void 0;\n return {\n definitionType,\n ...this._httpPrefix !== void 0 ? { httpPrefix: normalizeHttpPrefix(this._httpPrefix) } : {},\n childComponents,\n httpMounts,\n exports: serializeExportTree(this._exportTree),\n ...envVars !== void 0 ? { envVars } : {}\n };\n}\nfunction serializeExportTree(tree) {\n const branch = [];\n for (const [key, child] of Object.entries(tree)) {\n let node;\n if (typeof child === \"string\") {\n node = { type: \"leaf\", leaf: child };\n } else {\n node = serializeExportTree(child);\n }\n branch.push([key, node]);\n }\n return { type: \"branch\", branch };\n}\nfunction normalizeHttpPrefix(prefix) {\n return prefix.endsWith(\"/\") ? prefix : prefix + \"/\";\n}\nfunction buildHttpMounts(childComponents) {\n const httpMounts = {};\n for (const [name, , , httpPrefix] of childComponents) {\n if (httpPrefix !== void 0) {\n const normalized = normalizeHttpPrefix(httpPrefix);\n httpMounts[normalized] = `_reference/childComponent/${name}`;\n }\n }\n return httpMounts;\n}\nfunction serializeChildComponents(childComponents) {\n return childComponents.map(([name, definition, p]) => {\n let env = null;\n if (p !== null) {\n env = [];\n for (const [name2, value] of Object.entries(p)) {\n if (value === void 0) {\n continue;\n }\n if (isEnvRef(value)) {\n env.push([name2, { type: \"envVar\", name: value.__envVarRef }]);\n } else if (typeof value === \"string\") {\n env.push([name2, { type: \"value\", value }]);\n } else {\n throw new Error(\n `Env var \"${name2}\" must be a string or an env var reference. Received: ${typeof value}`\n );\n }\n }\n }\n const path = definition.componentDefinitionPath;\n if (!path)\n throw new Error(\n \"no .componentPath for component definition \" + JSON.stringify(definition, null, 2)\n );\n return {\n name,\n path,\n args: [],\n env\n };\n });\n}\nfunction exportComponentForAnalysis() {\n const envVars = Object.entries(this._env).map(\n ([name, validator]) => [\n name,\n {\n type: \"value\",\n value: JSON.stringify(validator.json),\n ...validator.isOptional === \"optional\" ? { optional: true } : {}\n }\n ]\n );\n const definitionType = {\n type: \"childComponent\",\n name: this._name,\n args: []\n };\n const childComponents = serializeChildComponents(this._childComponents);\n const httpMounts = buildHttpMounts(this._childComponents);\n return {\n name: this._name,\n definitionType,\n childComponents,\n httpMounts,\n exports: serializeExportTree(this._exportTree),\n ...envVars.length > 0 ? { envVars } : {}\n };\n}\nexport function defineComponent(name, options) {\n const envValidators = {};\n if (options?.env) {\n for (const [key, decl] of Object.entries(options.env)) {\n if (decl !== null && decl !== void 0 && isValidator(decl)) {\n envValidators[key] = decl;\n } else {\n throw new Error(\n `Environment variable \"${key}\" must be defined with a validator (e.g. v.string()).`\n );\n }\n }\n }\n const ret = {\n _isRoot: false,\n _name: name,\n _env: envValidators,\n _childComponents: [],\n _exportTree: {},\n _onInitCallbacks: {},\n env: createEnvRefs(`component \"${name}\"`, options?.env),\n export: exportComponentForAnalysis,\n use,\n ...{}\n };\n return ret;\n}\nexport function defineApp(options) {\n const httpPrefix = options?.httpPrefix;\n if (httpPrefix !== void 0 && !httpPrefix.startsWith(\"/\")) {\n throw new Error(\n `httpPrefix must start with \"/\". Received: \"${httpPrefix}\"`\n );\n }\n const env = options?.env;\n if (env !== void 0) {\n for (const [name, validator] of Object.entries(env)) {\n if (!isValidator(validator)) {\n throw new Error(\n `Environment variable \"${name}\" must be defined with a validator (e.g. v.string()).`\n );\n }\n }\n }\n const ret = {\n _isRoot: true,\n _childComponents: [],\n _exportTree: {},\n ...httpPrefix !== void 0 ? { _httpPrefix: httpPrefix } : {},\n ...env !== void 0 ? { _env: env } : {},\n env: createEnvRefs(\"this app\", env),\n export: exportAppForAnalysis,\n use\n };\n return ret;\n}\nexport function currentSystemUdfInComponent(componentId) {\n return {\n [toReferencePath]: `_reference/currentSystemUdfInComponent/${componentId}`\n };\n}\nfunction createChildComponents(root, pathParts) {\n const handler = {\n get(_, prop) {\n if (typeof prop === \"string\") {\n const newParts = [...pathParts, prop];\n return createChildComponents(root, newParts);\n } else if (prop === toReferencePath) {\n if (pathParts.length < 1) {\n const found = [root, ...pathParts].join(\".\");\n throw new Error(\n `API path is expected to be of the form \\`${root}.childComponent.functionName\\`. Found: \\`${found}\\``\n );\n }\n return `_reference/childComponent/` + pathParts.join(\"/\");\n } else {\n return void 0;\n }\n }\n };\n return new Proxy({}, handler);\n}\nexport const componentsGeneric = () => createChildComponents(\"components\", []);\n//# sourceMappingURL=index.js.map\n","/* eslint-disable */\n/**\n * Generated `api` utility.\n *\n * THIS CODE IS AUTOMATICALLY GENERATED.\n *\n * To regenerate, run `npx convex dev`.\n * @module\n */\n\nimport { anyApi, componentsGeneric } from \"convex/server\";\n\n/**\n * A utility for referencing Convex functions in your app's API.\n *\n * Usage:\n * ```js\n * const myFunctionReference = api.myModule.myFunction;\n * ```\n */\nexport const api = anyApi;\nexport const internal = anyApi;\nexport const components = componentsGeneric();\n","import { useMutation } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\nimport { markActivity } from '../../../../module/visitor/visitor.state'\nimport { draftMessage, rateLimitedUntilMs, clearAttachedImages } from '../state'\n\ninterface UseSendMessageArgs {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n ensureSession: () => Promise<{ sessionId: Id<'contactSessions'>; visitorId: string } | null>\n}\n\n/**\n * Composer send-message hook — single seam over the Convex `send`\n * mutation.\n *\n * Owns:\n * - ensure-session lazy create (anonymous visitors commit on first send)\n * - rate_limit response → write `rateLimitedUntilMs` signal\n * - success → `markActivity` so the session stays in history list\n * - network / NOT_FOUND throws → log\n *\n * The returned function takes only `content` because the session\n * deps are captured at hook-call time. Composer state mutations\n * (clear draft, clear staged images) remain in the calling component\n * so the component still owns its composer reset.\n */\nexport function useSendMessage({ sessionId, visitorId, ensureSession }: UseSendMessageArgs) {\n // Bound to the public send mutation — single touch point if the\n // backend path moves.\n const send = useMutation(api.functions.chat.public.conversations.send)\n\n return async function sendMessage(content: string): Promise<void> {\n // Resolve session (existing or freshly created).\n const session = sessionId && visitorId\n ? { sessionId, visitorId }\n : await ensureSession()\n\n if (!session) {\n // ensureSession failed (network down / unauthorized / bootstrap\n // token missing). Visitor's draft + staged attachments stay so\n // they can retry once the SessionErrorNotice resolves — do not\n // silently destroy what they typed.\n return\n }\n\n // Composer reset happens AFTER the session is confirmed so a failed\n // session-create cannot wipe the visitor's text. Reset is still\n // BEFORE the send mutation so the textarea feels instant — if the\n // mutation later throws / rate-limits, the inline notices surface\n // it without the visitor losing their place mid-conversation.\n draftMessage.value = ''\n clearAttachedImages()\n\n try {\n // Fire the send mutation — backend returns a discriminator on\n // rate-limit instead of throwing, so we branch on `result.ok`.\n const result = await send({\n sessionId: session.sessionId,\n visitorId: session.visitorId,\n content,\n })\n\n // Narrow on `result.ok` first so any future failure variant (e.g.\n // 'session_closed', 'blocked') does NOT accidentally fall into\n // the markActivity branch. Only a confirmed success bumps TTL.\n if (result.ok) {\n // Bump sliding-TTL anchor so this session stays in history.\n markActivity(session.visitorId)\n } else if (result.reason === 'rate_limited') {\n // Write the countdown signal — RateLimitNotice subscribes to it.\n rateLimitedUntilMs.value = Date.now() + result.retryAfterMs\n }\n } catch (err) {\n // Non-rate-limit errors only (network, NOT_FOUND, etc.).\n console.error('[jexity] Failed to send message:', err)\n }\n }\n}\n","import { useEffect } from 'preact/hooks'\nimport { rateLimitedUntilMs, nowMs } from '../state'\n\ninterface UseRateLimitCountdownResult {\n /** True while a rate-limit window is open. */\n isActive: boolean\n /** Whole seconds remaining; 0 once the window expires. */\n remainingSeconds: number\n}\n\n/**\n * Rate-limit countdown — owns the per-second tick on `nowMs` and the\n * self-clearing setTimeout that resets `rateLimitedUntilMs` when the\n * retry-after window elapses.\n *\n * Splitting this out of RateLimitNotice puts timer ownership next to\n * the signal it drives (both live under `composer/state` /\n * `composer/hooks`). The notice becomes pure render.\n *\n * Reading both signals inside the hook body subscribes the calling\n * component to their updates, so the consumer re-renders once per\n * tick during a countdown — that is exactly what a countdown display\n * requires.\n */\nexport function useRateLimitCountdown(): UseRateLimitCountdownResult {\n const until = rateLimitedUntilMs.value\n const now = nowMs.value\n\n useEffect(() => {\n if (until === null) { return }\n\n // Tick the module-scope clock so subscribers re-render once per second.\n const tick = setInterval(() => { nowMs.value = Date.now() }, 1000)\n // Self-clear when the window expires; signal write triggers consumer re-render.\n const clear = setTimeout(() => { rateLimitedUntilMs.value = null }, Math.max(0, until - Date.now()))\n\n return () => {\n clearInterval(tick)\n clearTimeout(clear)\n }\n }, [until])\n\n const isActive = until !== null\n const remainingSeconds = isActive ? Math.max(0, Math.ceil((until - now) / 1000)) : 0\n\n return { isActive, remainingSeconds }\n}\n","import { useLocale } from '../../../../i18n/index'\nimport { useRateLimitCountdown } from '../hooks/useRateLimitCountdown'\n\n/**\n * Inline rate-limit countdown rendered above the chat input.\n *\n * Pure render. Timer ownership + auto-clear live in\n * `useRateLimitCountdown` so the notice never has to think about\n * intervals or signals directly.\n */\nexport function RateLimitNotice() {\n const s = useLocale()\n // Single seam over the per-second tick + auto-clear.\n const { isActive, remainingSeconds } = useRateLimitCountdown()\n\n if (!isActive) { return null }\n\n return (\n <div class=\"jex-rate-limit-notice\" role=\"status\" aria-live=\"polite\">\n {s.errorRateLimited.replace('{seconds}', String(remainingSeconds))}\n </div>\n )\n}\n","import { signal } from '@preact/signals'\n\n/**\n * Inline notice for session-creation failures. Visitor-facing widget can't\n * rely on console logs — every catch in useConvexSession / refreshBootstrap\n * that returns null must also write a reason here so ChatInput can render\n * a banner the visitor actually sees.\n *\n * - 'no-token' bootstrap token never arrived (initial POST failed,\n * network down, or 10s wait timed out)\n * - 'unauthorized' bootstrap token was rejected and refresh also failed\n * (origin de-authorised, clock skew, domain mis-config)\n * - 'network' transport error talking to Convex\n * - 'unknown' any other thrown error\n */\nexport type SessionErrorReason = 'no-token' | 'unauthorized' | 'network' | 'unknown'\n\nexport const sessionError = signal<SessionErrorReason | null>(null)\n","import { useLocale } from '../../../../i18n/index'\nimport { sessionError } from '../../state'\n\n/**\n * Inline banner rendered above the chat input when session creation fails.\n * Mirrors the RateLimitNotice pattern: module-scope signal, no prop drill,\n * self-clears on the next successful ensureSession() / startFresh() call.\n *\n * Visitor-facing widget — console logs are invisible to operators, so every\n * silent catch in useConvexSession / refreshBootstrap writes a reason here\n * and this component renders it. See state/session-error.ts for the reason enum.\n */\nexport function SessionErrorNotice() {\n const s = useLocale()\n const reason = sessionError.value\n if (reason === null) { return null }\n\n const message =\n reason === 'no-token' ? s.errorSessionNoToken\n : reason === 'unauthorized' ? s.errorSessionUnauthorized\n : reason === 'network' ? s.errorNetwork\n : s.somethingWentWrong\n\n return (\n <div class=\"jex-session-error-notice\" role=\"alert\" aria-live=\"assertive\">\n {message}\n </div>\n )\n}\n","export function SendIcon({ size = 18 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M22 2 11 13\" />\n <path d=\"M22 2 15 22 11 13 2 9l20-7z\" />\n </svg>\n )\n}\n","import { useEffect, useRef } from 'preact/hooks'\nimport { draftMessage, addAttachedImages } from '../state'\n\nconst MAX_TEXTAREA_PX = 132\n\ninterface UseComposerInputArgs {\n /** Called when the visitor presses Enter (without Shift). */\n onSend: () => void\n}\n\ninterface UseComposerInputResult {\n textareaRef: ReturnType<typeof useRef<HTMLTextAreaElement>>\n fileInputRef: ReturnType<typeof useRef<HTMLInputElement>>\n /** Enter → send, Shift+Enter → newline. */\n onKeyDown: (e: KeyboardEvent) => void\n /** Proxy click into the hidden native file input. */\n onAttachClick: () => void\n /** Validate + stage selected files, then reset the input value. */\n onFilesPicked: (e: Event) => void\n /** Focus the textarea when the visitor clicks empty card padding. */\n onCardClick: (e: MouseEvent) => void\n}\n\n/**\n * Composer input behaviours — the four side effects that used to live\n * inline in ComposerRow.tsx:\n *\n * 1. Autosize the textarea up to MAX_TEXTAREA_PX, then scroll.\n * 2. Send-on-Enter (preserving Shift+Enter for newline).\n * 3. Attach button → hidden <input type=\"file\"> proxy.\n * 4. Click-on-empty-card → focus the textarea (Intercom pattern).\n *\n * Returning refs + handlers keeps ComposerRow purely declarative —\n * it wires the result onto the DOM and never touches a useEffect or\n * useRef of its own. The hook reads `draftMessage` directly because\n * the autosize effect depends on the draft value, and that\n * dependency is composer-internal.\n */\nexport function useComposerInput({ onSend }: UseComposerInputArgs): UseComposerInputResult {\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n // Autosize: collapse to 0 then grow to scrollHeight, capped at MAX_TEXTAREA_PX.\n // Reading `draftMessage.value` subscribes the effect to draft updates.\n useEffect(() => {\n const el = textareaRef.current\n if (!el) {\n return\n }\n el.style.height = '0'\n const next = Math.min(el.scrollHeight, MAX_TEXTAREA_PX)\n el.style.height = `${next}px`\n el.style.overflowY = el.scrollHeight > MAX_TEXTAREA_PX ? 'auto' : 'hidden'\n }, [draftMessage.value])\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSend()\n }\n }\n\n function onAttachClick() {\n fileInputRef.current?.click()\n }\n\n function onFilesPicked(e: Event) {\n const target = e.currentTarget as HTMLInputElement\n if (target.files && target.files.length > 0) {\n // Stage selected images in shared composer state (8MB / 4-image cap).\n addAttachedImages(target.files)\n }\n // Reset so re-selecting the same file fires onChange.\n target.value = ''\n }\n\n function onCardClick(e: MouseEvent) {\n // Click on empty card padding focuses the textarea.\n // Buttons / textarea / chip images keep their native click behaviour.\n const target = e.target as HTMLElement\n if (target === e.currentTarget || !target.closest('button, textarea, img')) {\n textareaRef.current?.focus()\n }\n }\n\n return { textareaRef, fileInputRef, onKeyDown, onAttachClick, onFilesPicked, onCardClick }\n}\n","import { useLocale } from '../../../../i18n/index'\nimport { SendIcon } from '../../../../shared/icons/SendIcon'\nimport { draftMessage, attachedImages, removeAttachedImage } from '../state'\nimport { useComposerInput } from '../hooks/useComposerInput'\n\ninterface ComposerRowProps {\n isStreaming: boolean\n disabled: boolean\n inputDisabled: boolean\n onSend: () => void\n onFocus?: () => void\n}\n\n/**\n * Composer row — autosize textarea, attach button, staged image chips,\n * and a state-driven send button rendered inside one focus-within card.\n *\n * Pure presentation. All side effects (autosize, file picker proxy,\n * focus-on-empty-click, Enter-to-send) live in `useComposerInput`.\n * The component reads two composer signals (`draftMessage`,\n * `attachedImages`) for render-time conditionals and writes through\n * the hook + `removeAttachedImage`.\n *\n * Design notes:\n * - The whole card owns the border + focus-within highlight so the\n * send button can never overflow at narrow viewports.\n * - Send button has two visual states: \"muted\" (no draft / images)\n * and \"active\" (something to send). Streaming locks the textarea\n * via `inputDisabled` upstream; the button stays muted because\n * hasInput is false after clear-on-send.\n */\nexport function ComposerRow({ isStreaming, disabled, inputDisabled, onSend, onFocus }: ComposerRowProps) {\n const s = useLocale()\n const input = draftMessage\n const images = attachedImages\n // Behaviour seam — refs + handlers managed in the hook.\n const { textareaRef, fileInputRef, onKeyDown, onAttachClick, onFilesPicked, onCardClick } = useComposerInput({ onSend })\n\n const hasInput = input.value.trim().length > 0\n const hasImages = images.value.length > 0\n const sendActive = (hasInput || hasImages) && !disabled\n\n return (\n <div class=\"jex-composer-card\" onClick={onCardClick}>\n {hasImages && (\n <div class=\"jex-composer-attachments\" role=\"list\">\n {images.value.map((img) => (\n <div key={img.id} class=\"jex-attachment-chip\" role=\"listitem\">\n <img src={img.previewUrl} alt={img.file.name} class=\"jex-attachment-thumb\" />\n <button\n type=\"button\"\n class=\"jex-attachment-remove\"\n aria-label={s.removeAttachmentAriaLabel}\n onClick={() => { removeAttachedImage(img.id) }}\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n <textarea\n ref={textareaRef}\n class=\"jex-composer-textarea\"\n aria-label={s.inputPlaceholder}\n placeholder={isStreaming ? s.aiThinking : s.inputPlaceholder}\n value={input.value}\n rows={1}\n onInput={(e) => { input.value = e.currentTarget.value }}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n disabled={inputDisabled}\n />\n\n <div class=\"jex-composer-actions\">\n <div class=\"jex-composer-actions-left\">\n {/* Hidden native file input — attach button proxies its click. */}\n <input\n ref={fileInputRef}\n class=\"jex-visually-hidden\"\n type=\"file\"\n accept=\"image/*\"\n multiple\n onChange={onFilesPicked}\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n {/*\n * Attach button is intentionally disabled until the backend\n * wiring lands. Plan:\n * docs/superpowers/plans/2026-05-22-widget-attachments.md\n * To re-enable: drop the `disabled={true}` override + swap\n * aria-label / title back to attachImagesAriaLabel.\n */}\n <button\n type=\"button\"\n class=\"jex-attach-btn\"\n aria-label={s.attachComingSoon}\n title={s.attachComingSoon}\n disabled={true}\n onClick={onAttachClick}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n </button>\n </div>\n\n <button\n class={`jex-send-btn${sendActive ? ' jex-send-btn-active' : ''}`}\n type=\"button\"\n onClick={onSend}\n aria-label={s.sendAriaLabel}\n disabled={disabled || (!hasInput && !hasImages)}\n >\n <SendIcon size={16} />\n </button>\n </div>\n </div>\n )\n}\n","import { useLocale } from '../../../../i18n/index'\nimport { resolvedPrivacyPolicyUrl } from '../../../../module/shell/shell.state'\n\ninterface PrivacyNoticeProps {\n variant: 'chip' | 'explicit'\n isOpen?: boolean\n onAcknowledge?: () => void\n}\n\n/** Visitor-facing privacy notice shown above the composer. */\nexport function PrivacyNotice({ variant, isOpen = false, onAcknowledge }: PrivacyNoticeProps) {\n const s = useLocale()\n const privacyUrl = resolvedPrivacyPolicyUrl.value\n\n if (variant === 'explicit') {\n if (!isOpen) {\n return null\n }\n\n return (\n <div class=\"jex-privacy-explicit\" role=\"dialog\" aria-label={s.privacyExplicitTitle}>\n <div class=\"jex-privacy-explicit-content\">\n <div class=\"jex-privacy-explicit-icon\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n </div>\n <div class=\"jex-privacy-explicit-copy\">\n <div class=\"jex-privacy-explicit-title\">{s.privacyExplicitTitle}</div>\n <p class=\"jex-privacy-explicit-body\">\n {s.privacyExplicitBodyPre}{' '}\n <a\n href={privacyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"jex-privacy-notice-link\"\n >\n {s.privacyPolicyLinkText}\n </a>.\n </p>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"jex-privacy-explicit-button\"\n onClick={onAcknowledge}\n >\n {s.privacyExplicitButton}\n </button>\n </div>\n )\n }\n\n return (\n <p class=\"jex-privacy-chip\">\n <span class=\"jex-privacy-chip-icon\" aria-hidden=\"true\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n </span>\n <a\n href={privacyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"jex-privacy-chip-link\"\n >\n {s.privacyChipText}\n </a>\n </p>\n )\n}\n","import { useEffect, useState } from 'preact/hooks'\nimport { useLocale } from '../../../../i18n/index'\nimport { privacyNoticeStyle } from '../../../../module/shell/shell.state'\nimport { draftMessage, rateLimitedUntilMs } from '../state'\nimport { useSendMessage } from '../hooks/useSendMessage'\nimport { RateLimitNotice } from './RateLimitNotice'\nimport { SessionErrorNotice } from './SessionErrorNotice'\nimport { ComposerRow } from './ComposerRow'\nimport { PrivacyNotice } from './PrivacyNotice'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface ChatInputProps {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n isLoading: boolean\n isStreaming: boolean\n sessionStatus: 'active' | 'escalated' | 'assigned' | 'resolved' | null\n ensureSession: () => Promise<{ sessionId: Id<'contactSessions'>; visitorId: string } | null>\n onStartFresh: () => void\n}\n\n/** Composer area: stacks inline notices above a single focus-within input row. */\nexport function ChatInput({\n sessionId,\n visitorId,\n isLoading,\n isStreaming,\n sessionStatus,\n ensureSession,\n onStartFresh,\n}: ChatInputProps) {\n const s = useLocale()\n const input = draftMessage\n const noticeStyle = privacyNoticeStyle.value\n const [privacyGate, setPrivacyGate] = useState({ open: false, acknowledged: false })\n const sendMessage = useSendMessage({ sessionId, visitorId, ensureSession })\n\n const isRateLimited = rateLimitedUntilMs.value !== null && rateLimitedUntilMs.value > Date.now()\n const sendDisabled = isLoading || isStreaming || isRateLimited\n const requiresPrivacyAck = noticeStyle === 'explicit' && !privacyGate.acknowledged\n const blocksComposer = noticeStyle === 'explicit' && privacyGate.open\n\n function openPrivacyExplicit() {\n if (requiresPrivacyAck) {\n setPrivacyGate(g => ({ ...g, open: true }))\n }\n }\n\n function acknowledgePrivacyExplicit() {\n setPrivacyGate({ open: false, acknowledged: true })\n }\n\n useEffect(() => {\n setPrivacyGate({ open: false, acknowledged: false })\n }, [sessionId])\n\n if (sessionStatus === 'resolved') {\n return (\n <div class=\"jex-chat-input-resolved\">\n <div class=\"jex-resolved-notice\">{s.sessionResolved}</div>\n <button\n class=\"jex-resolved-new-btn\"\n type=\"button\"\n onClick={() => { void onStartFresh() }}\n >\n {s.startNewConversation}\n </button>\n </div>\n )\n }\n\n async function handleSend() {\n const content = input.value.trim()\n if (!content || sendDisabled) { return }\n if (requiresPrivacyAck) {\n setPrivacyGate(g => ({ ...g, open: true }))\n return\n }\n\n await sendMessage(content)\n }\n\n return (\n <div class=\"jex-chat-input\">\n <RateLimitNotice />\n <SessionErrorNotice />\n {noticeStyle === 'chip' && <PrivacyNotice variant=\"chip\" />}\n <div class={`jex-chat-input-composer-gate${blocksComposer ? ' jex-chat-input-composer-gate-open' : ''}`}>\n <ComposerRow\n isStreaming={isStreaming}\n disabled={sendDisabled}\n inputDisabled={isLoading || isStreaming || blocksComposer}\n onSend={handleSend}\n onFocus={openPrivacyExplicit}\n />\n {noticeStyle === 'explicit' && (\n <PrivacyNotice\n variant=\"explicit\"\n isOpen={privacyGate.open}\n onAcknowledge={acknowledgePrivacyExplicit}\n />\n )}\n </div>\n </div>\n )\n}\n","import { useCallback, useState } from 'preact/hooks'\nimport { CornerUpLeft } from 'lucide-preact'\nimport { MarkdownContent } from './MarkdownContent'\nimport { BotIcon } from '../../../shared/icons/BotIcon'\nimport { tagAgent } from '../composer'\nimport { useLocale } from '../../../i18n/index'\n\ninterface BotMessageProps {\n text: string\n streaming?: boolean\n error?: boolean\n /** BetterAuth user ID — present only for human agent replies */\n authorId?: string\n /** Denormalized agent display name */\n authorName?: string\n /** Denormalized agent profile image URL */\n authorImage?: string\n /** Custom bot avatar URL from widgetConfigs (future — falls back to BotIcon) */\n botAvatarUrl?: string\n}\n\n/** Extract up to 2 initials from a display name. Returns '?' for empty/whitespace input. */\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (parts.length === 0) { return '?' }\n return parts.map(p => p[0]).join('').slice(0, 2).toUpperCase()\n}\n\nexport function BotMessage({ text, streaming, error, authorId, authorName, authorImage, botAvatarUrl }: BotMessageProps) {\n const s = useLocale()\n const isHuman = !!authorId\n const [imgBroken, setImgBroken] = useState(false)\n const onImgError = useCallback(() => setImgBroken(true), [])\n const replyLabel = s.replyTo.replace('{name}', authorName ?? '')\n\n const bubbleClass = [\n 'jex-message bot',\n error ? 'jex-message-error' : '',\n ].filter(Boolean).join(' ')\n\n // Avatar: human agent (photo → initials) or bot (custom URL → default icon)\n const renderAvatar = () => {\n if (isHuman && authorImage && !imgBroken) {\n return <img src={authorImage} alt={authorName ?? ''} class=\"jex-avatar-img\" onError={onImgError} />\n }\n if (isHuman) {\n return <span class=\"jex-avatar-initials\">{getInitials(authorName ?? '')}</span>\n }\n if (botAvatarUrl && !imgBroken) {\n return <img src={botAvatarUrl} alt=\"\" class=\"jex-avatar-img\" onError={onImgError} />\n }\n return <BotIcon size={14} />\n }\n\n return (\n <div class=\"jex-message-row bot\">\n <div class={`jex-avatar ${isHuman ? 'jex-avatar-agent' : 'jex-avatar-bot'}`}>\n {renderAvatar()}\n </div>\n\n <div class=\"jex-message-content\">\n <div class={bubbleClass}>\n <MarkdownContent text={text} />\n {streaming && <span class=\"jex-streaming-cursor\" />}\n </div>\n {isHuman && authorName && (\n <div class=\"jex-message-author-row\">\n <span class=\"jex-message-author\">{authorName}</span>\n <button\n type=\"button\"\n class=\"jex-reply-tag-btn\"\n aria-label={replyLabel}\n title={replyLabel}\n onClick={() => { tagAgent(authorName) }}\n >\n <CornerUpLeft size={12} />\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","interface UserMessageProps {\n text: string\n}\n\nexport function UserMessage({ text }: UserMessageProps) {\n return <div class=\"jex-message user\">{text}</div>\n}\n","import { useMutation } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\n\n/**\n * Escalation submit hook — single touch point for the\n * `submitEscalation` mutation.\n *\n * Returned function inserts the visitor's name + email onto the\n * escalation form-message row and triggers the backend's inline\n * escalation-confirm BotMessage insertion. Two consumers today\n * (FormMessage + EscalationFormScreen); each owns its own\n * submitting / error UI.\n *\n * Components that want error UI must catch the rejection themselves;\n * this hook intentionally does not encapsulate error state because\n * the two consumers render error differently (inline alert vs.\n * silent log + form-reset).\n */\nexport function useEscalation() {\n return useMutation(api.functions.chat.public.helpdesk.submitEscalation)\n}\n","import { useState } from 'preact/hooks'\nimport { locale as widgetLocale, useLocale } from '../../../i18n/index'\nimport { PLATFORM_PRIVACY_POLICY_URL, resolvedPrivacyPolicyUrl } from '../../../module/shell/shell.state'\nimport { useEscalation } from '../hooks/useEscalation'\nimport type { Doc, Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface FormMessageProps {\n message: Doc<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\n/**\n * Inline escalation form rendered inside the chat thread.\n *\n * Two states:\n * - Not submitted (formData undefined): interactive form with name + email\n * - Submitted (formData exists): read-only card showing submitted data\n *\n * Follows the same patterns as FormScreen.tsx:\n * - Preact hooks for state, onInput for controlled fields\n * - .jex-* CSS classes, reuses .jex-form-input and .jex-form-submit\n */\nexport function FormMessage({ message, sessionId, visitorId }: FormMessageProps) {\n const t = useLocale()\n\n // Already submitted — render full-width centered action card\n if (message.formData) {\n return (\n <div class=\"jex-inline-form-submitted\">\n <span class=\"jex-inline-form-check\">✓</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.escalationSubmitted}</div>\n <div class=\"jex-inline-form-submitted-detail\">\n {message.formData.visitorName} · {message.formData.visitorEmail}\n </div>\n </div>\n </div>\n )\n }\n\n // Not yet submitted — render interactive form\n return (\n <div class=\"jex-message-row bot\">\n <FormMessageInput\n messageId={message._id}\n sessionId={sessionId}\n visitorId={visitorId}\n />\n </div>\n )\n}\n\n// ── Interactive form (extracted to keep FormMessage clean) ─────────────────\n\ninterface FormMessageInputProps {\n messageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\nfunction FormMessageInput({ messageId, sessionId, visitorId }: FormMessageInputProps) {\n const t = useLocale()\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [submitting, setSubmitting] = useState(false)\n const rawPrivacyUrl = resolvedPrivacyPolicyUrl.value\n const privacyUrl = /^https?:\\/\\//i.test(rawPrivacyUrl) ? rawPrivacyUrl : PLATFORM_PRIVACY_POLICY_URL\n\n // Bound to the escalation seam — single touch point shared with EscalationFormScreen.\n const submitEscalation = useEscalation()\n\n async function handleSubmit(e: Event) {\n e.preventDefault()\n if (submitting) { return }\n\n setSubmitting(true)\n try {\n await submitEscalation({\n sessionId,\n visitorId,\n formMessageId: messageId,\n visitorName: name.trim(),\n visitorEmail: email.trim(),\n locale: widgetLocale.value,\n })\n } catch (error) {\n console.error('[FormMessage] Submit failed:', error)\n setSubmitting(false)\n }\n // On success, the mutation patches formData on the message.\n // Convex subscription triggers re-render → FormMessage shows read-only state.\n // No need to manually update state.\n }\n\n return (\n <div class=\"jex-inline-form\">\n <div class=\"jex-inline-form-title\">{t.escalationFormTitle}</div>\n <form class=\"jex-form\" onSubmit={(e) => { void handleSubmit(e) }}>\n <input\n class=\"jex-form-input\"\n type=\"text\"\n placeholder={t.escalationNameLabel}\n value={name}\n required\n disabled={submitting}\n onInput={(e) => { setName(e.currentTarget.value) }}\n />\n <input\n class=\"jex-form-input\"\n type=\"email\"\n placeholder={t.escalationEmailLabel}\n value={email}\n required\n disabled={submitting}\n onInput={(e) => { setEmail(e.currentTarget.value) }}\n />\n <button class=\"jex-form-submit\" type=\"submit\" disabled={submitting}>\n {submitting ? t.escalationSubmitting : t.escalationSubmit}\n </button>\n </form>\n <div class=\"jex-inline-form-consent\">\n {t.escalationConsent}{' '}\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {t.escalationPrivacyLinkText}\n </a>.\n </div>\n </div>\n )\n}\n","import { useAction, useMutation } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Safe trial slot shape returned by `listTrialSlots`. The backend validator\n * also carries `endDateTime`/`rawId`/`title`, but the widget only ever reads\n * `startDateTime` (submitted as the `slotId` field + used as the option key),\n * so we keep the widget type honest and narrow.\n */\nexport interface TrialSlot {\n startDateTime: string\n}\n\n/**\n * Result of `listTrialSlots`. `status` distinguishes a healthy empty list\n * (`ok` + zero slots → no availability) from a backend/availability failure\n * (`unavailable` / `network_error` → retryable). The widget no longer reads a\n * separate `ok` boolean — `status === 'ok'` is the single success signal.\n * Extra backend fields are intentionally dropped from this mirror.\n */\nexport interface TrialSlotsResult {\n status: 'ok' | 'unavailable' | 'network_error'\n slots: TrialSlot[]\n}\n\nexport type ListTrialSlots = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n trainerRequired: boolean\n}) => Promise<TrialSlotsResult>\n\n/** Per-field visibility/requirement flag from the resolved studio plan. */\nexport interface TrialFieldFlag {\n visible: boolean\n required: boolean\n}\n\n/** Resolved per-studio trial plan (only present when status === \"ok\"). */\nexport interface TrialConfigPlan {\n firstname: TrialFieldFlag\n lastname: TrialFieldFlag\n email: TrialFieldFlag\n phone: TrialFieldFlag\n dateOfBirth: TrialFieldFlag\n gender: TrialFieldFlag\n /** Governs street/houseNumber/city/country as a group. */\n address: TrialFieldFlag\n zip: TrialFieldFlag\n}\n\nexport type TrialConfigResult =\n | {\n status: 'ok'\n plan: TrialConfigPlan\n minimumAge: number\n bookingWithoutTrainerAllowed: boolean\n /** Stored studio IANA timezone (or null) for bare-UTC slot display. */\n studioZoneId: string | null\n }\n | {\n status: 'unsupported' | 'inconsistent' | 'unavailable'\n message: string\n }\n\nexport type GetTrialConfig = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}) => Promise<TrialConfigResult>\n\n/**\n * Magicline widget seam — single touch point for the public Magicline widget\n * functions.\n *\n * - `useMagiclineSubmit` wraps the `submitForm` mutation. The mutation inserts\n * the submission row, patches the form card to `submitted`, and schedules the\n * Node submit action. Consumers own their own submitting / error UI.\n * - `useTrialConfig` wraps the `getTrialConfig` action — the dynamic form fetches\n * the per-studio field plan on mount and renders fields accordingly.\n * - `useTrialSlots` wraps the `listTrialSlots` action. It is fail-safe on the\n * backend (never throws, always returns a result object), but the network\n * call itself can still reject; callers should catch and treat a rejection\n * the same as an `unavailable` status. It now forwards the visitor's\n * `trainerRequired` preference (re-fetched when the toggle changes).\n *\n * Mirrors `useEscalation` / `useHandoff`: thin api-path abstraction, no state.\n */\nexport function useMagiclineSubmit() {\n return useMutation(api.functions.magicline.public.submitForm)\n}\n\nexport function useTrialConfig(): GetTrialConfig {\n return useAction(api.functions.magicline.actions.getTrialConfig)\n}\n\nexport function useTrialSlots(): ListTrialSlots {\n return useAction(api.functions.magicline.actions.listTrialSlots)\n}\n\n// ── Contract creation (membership signup) ───────────────────────────────────\n\n/** A one-time / flat fee attached to a rate-bundle term. */\nexport interface ContractFlatFee {\n name: string\n price: number\n isStarterPackage: boolean\n paymentFrequencyLabel: string | null\n identifier: string | null\n}\n\n/** Attachment kind carried by a renderable text block. */\nexport type ContractAttachmentType = 'NONE' | 'URL' | 'FILE'\n\n/**\n * A free-text block (terms, conditions) attached to a rate-bundle term. A block\n * flagged `isConfirmationRequired` must be acknowledged before submit; the\n * widget echoes its `ackKey` back in `acknowledgedAckKeys`.\n */\nexport interface ContractTextBlock {\n id: number | null\n title: string\n text: string\n isConfirmationRequired: boolean\n attachmentType: ContractAttachmentType\n attachmentLabel: string | null\n attachmentUrl: string | null\n ackKey: string\n}\n\n/** Consent block attached to a single paid optional module. */\nexport interface ContractModuleConsent {\n ackKey: string\n title: string\n text: string\n attachmentLabel: string | null\n attachmentUrl: string | null\n}\n\n/** Payment-frequency classification for a paid optional module. */\nexport type ModulePaymentFrequencyType =\n | 'RECURRING'\n | 'NON_RECURRING'\n | 'MONTH_DAY'\n | 'TERM_BASED'\n | 'FREE'\n\n/** Renewal classification for a paid optional module's duration. */\nexport type ModuleExtensionType =\n | 'NONE'\n | 'TERM_EXTENSION'\n | 'SUBSEQUENT_RATE_DETAIL'\n\n/**\n * A paid optional module the visitor can add to a term. `price`/`currencyCode`\n * render with the same money formatter as the base price. When a `consent` is\n * present and the module is selected, its `ackKey` joins the required set. The\n * four display-only fields drive the price/renewal wording: `paymentFrequencyType`\n * + `recurringUnit` come from the payment-frequency path, `extensionType` +\n * `termExtension` from the duration path.\n */\nexport interface ContractOptionalModule {\n id: number\n name: string\n description: string | null\n price: number\n currencyCode: string\n termLabel: string | null\n paymentFrequencyType: ModulePaymentFrequencyType | null\n recurringUnit: 'DAY' | 'WEEK' | 'MONTH' | 'YEAR' | null\n extensionType: ModuleExtensionType | null\n termExtension: { value: number; unit: string } | null\n consent: ContractModuleConsent | null\n}\n\n/** A recurring period (payment frequency / cancellation period). */\nexport interface ContractPeriod {\n value: number\n unit: string\n}\n\n/**\n * One selectable membership offer — a rate-bundle TERM card. Terms are grouped\n * by `bundleId` / `bundleName` in the Offer step; each term is the radio-select\n * unit (its `termId` is what the preview + submit actions consume).\n */\nexport interface RateBundleTermCard {\n bundleId: number\n bundleName: string\n bundleDescription: string | null\n bundleSubDescription: string | null\n footnote: string | null\n termId: number\n termValue: number\n termUnit: string\n price: number\n currencyCode: string\n paymentFrequency: ContractPeriod\n cancellationPeriod: ContractPeriod | null\n defaultContractStartDate: string | null\n flatFees: ContractFlatFee[]\n includedModuleNames: string[]\n optionalModules: ContractOptionalModule[]\n textBlocks: ContractTextBlock[]\n}\n\n/**\n * Result of `getRateBundles`. `ok` carries the eligible term cards (an EMPTY\n * list is still `ok` → the widget shows a friendly no-offers state) plus the\n * server-authoritative `allowVoucherCodes` flag for fail-closed widget gating.\n * `unavailable` covers ownership / availability / network failures.\n */\nexport type RateBundlesResult =\n | { status: 'ok'; terms: RateBundleTermCard[]; allowVoucherCodes: boolean }\n | { status: 'unavailable'; message: string }\n\nexport type GetRateBundles = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}) => Promise<RateBundlesResult>\n\n/** Personal + address fields shared by the preview action (no bank data). */\nexport interface ContractCustomerFields {\n firstname: string\n lastname: string\n email: string\n dateOfBirth: string\n gender: string\n phone: string\n street: string\n houseNumber: string\n zipCode: string\n city: string\n}\n\n/** One selected paid module row in the preview pricing breakdown. */\nexport interface ContractPreviewModule {\n moduleId: number\n name: string\n amount: number\n currencyCode: string\n paymentFrequencyLabel: string | null\n}\n\n/** Aggregate contract-volume totals; null when Magicline omits them. */\nexport interface ContractVolume {\n total: number | null\n averagePerMonth: number | null\n averagePerFrequencyTerm: number | null\n}\n\n/**\n * A text block carried by a voucher (DISCOUNT or CREDIT). When confirmation is\n * required the ackKey is prefixed `voucher:` and joins the required set.\n */\nexport interface VoucherTextBlock {\n ackKey: string\n title: string\n text: string\n attachmentLabel: string | null\n attachmentUrl: string | null\n}\n\n/**\n * Voucher resolved by the backend when a valid code is applied. Mirrors the\n * backend `v.union(<DISCOUNT>, <CREDIT>, null)` validator shape. Null means no\n * voucher was applied (code omitted or resulted in no discount).\n */\nexport type ContractVoucher =\n | {\n voucherType: 'DISCOUNT'\n discountValue: number\n discountType: 'AMOUNT' | 'PERCENTAGE'\n discountedBasePrice: number\n discountedPreviewCharge: number\n omitStarterPackage: boolean\n remarks: string | null\n textBlocks: VoucherTextBlock[]\n }\n | {\n voucherType: 'CREDIT'\n creditValue: number\n remarks: string | null\n textBlocks: VoucherTextBlock[]\n }\n | null\n\n/**\n * Result of `getContractPreview`. `ok` carries the server-resolved pricing\n * (base, fees, selected `modules`, aggregate `contractVolume`) plus the\n * `pricingFingerprint` the submit action re-verifies. The non-ok branch\n * distinguishes a missing-consent / invalid-field client error from an\n * `offer_unavailable` (re-fetch offers) or a generic `unavailable`.\n */\nexport type ContractPreviewResult =\n | {\n status: 'ok'\n basePrice: number\n preUseCharge: number\n currencyCode: string\n flatFees: ContractFlatFee[]\n modules: ContractPreviewModule[]\n contractVolume: ContractVolume | null\n startDate: string\n /** Payment frequency of the revalidated term; renders the base-price period. */\n paymentFrequency: ContractPeriod\n pricingFingerprint: string\n /**\n * Resolved voucher when a `voucherCode` was supplied and accepted. Null when\n * no code was sent or the backend returned no discount/credit block.\n */\n voucher: ContractVoucher\n }\n | {\n status:\n | 'consent_required'\n | 'invalid_fields'\n | 'offer_unavailable'\n | 'unavailable'\n | 'voucher_invalid'\n | 'voucher_disabled'\n message: string\n }\n\nexport type GetContractPreview = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n termId: number\n startDate: string\n fields: ContractCustomerFields\n /** Chosen paid optional-module ids; omitted/empty when none selected. */\n selectedModuleIds?: number[]\n privacyConsent: boolean\n sepaConsent: boolean\n /** Voucher code to validate and apply to the preview pricing. */\n voucherCode?: string\n}) => Promise<ContractPreviewResult>\n\n/**\n * Result of `submitContractCreation`. `succeeded` carries the safe identifiers\n * (Magicline customer number for the success bubble). `failed` carries a safe\n * `errorCode` and a `retryable` flag — pre-dispatch failures may be retried by\n * the visitor; post-dispatch outcomes (`unknown_outcome`) never are.\n */\nexport type ContractSubmitResult =\n | { status: 'succeeded'; externalId: string | null; customerNumber: string | null }\n | { status: 'failed'; errorCode: string; message: string; retryable: boolean }\n\n/**\n * Submit args. `bankAccount` (accountHolder + IBAN) is the ONLY place the IBAN\n * ever travels — it is a transient action arg, never persisted or logged.\n */\nexport type SubmitContractCreation = (args: {\n sessionId: Id<'contactSessions'>\n visitorId: string\n projectId: Id<'projects'>\n formMessageId: Id<'conversations'>\n fields: {\n firstname: string\n lastname: string\n email: string\n phone: string\n dateOfBirth: string\n gender: string\n street: string\n houseNumber: string\n zipCode: string\n city: string\n rateBundleTermId: number\n privacyConsent: boolean\n sepaConsent: boolean\n }\n bankAccount: { accountHolder: string; iban: string }\n /** Chosen paid optional-module ids; omitted/empty when none selected. */\n selectedModuleIds?: number[]\n /** ackKeys the visitor confirmed (required text blocks + selected-module consents). */\n acknowledgedAckKeys?: string[]\n pricingFingerprint: string\n /** Applied voucher code to redeem on submission. */\n voucherCode?: string\n}) => Promise<ContractSubmitResult>\n\nexport function useRateBundles(): GetRateBundles {\n return useAction(api.functions.magicline.actions.getRateBundles)\n}\n\nexport function useContractPreview(): GetContractPreview {\n return useAction(api.functions.magicline.actions.getContractPreview)\n}\n\nexport function useSubmitContractCreation(): SubmitContractCreation {\n return useAction(api.functions.magicline.actions.submitContractCreation)\n}\n","import { PLATFORM_PRIVACY_POLICY_URL, resolvedPrivacyPolicyUrl } from '../../../../module/shell/shell.state'\nimport { en } from '../../../../i18n/locales/en'\nimport type { WidgetStrings } from '../../../../i18n/locales/en'\nimport { de } from '../../../../i18n/locales/de'\n\nconst LOCALE_STRINGS = { en, de } as const\n\n/** Basic RFC-lite email check — mirrors the widget's escalation expectations. */\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nexport function isValidEmail(value: string): boolean {\n return EMAIL_RE.test(value.trim())\n}\n\n/**\n * Whole-years age from an ISO `YYYY-MM-DD` date-of-birth string at `now`.\n * Returns `null` when the value is empty or unparseable (callers treat a null\n * age as \"not yet entered\", deferring to required-field handling). Client-side\n * UX only — the backend re-validates minimum age against the studio plan.\n *\n * The Y/M/D parts are parsed manually via `split('-')` instead of\n * `new Date('YYYY-MM-DD')`. The string form is parsed as UTC midnight, so\n * comparing it with LOCAL getters (`now.getDate()` etc.) shifts the day by one\n * in negative-offset timezones and mis-gates min-age on the birthday boundary.\n * Parsing the parts directly keeps the comparison purely calendar-based.\n */\nexport function ageFromIsoDate(isoDate: string, now: Date = new Date()): number | null {\n const trimmed = isoDate.trim()\n if (trimmed === '') {\n return null\n }\n const parts = trimmed.split('-')\n if (parts.length !== 3) {\n return null\n }\n const year = Number(parts[0])\n const month = Number(parts[1])\n const day = Number(parts[2])\n if (\n !Number.isInteger(year) ||\n !Number.isInteger(month) ||\n !Number.isInteger(day) ||\n month < 1 ||\n month > 12 ||\n day < 1 ||\n day > 31\n ) {\n return null\n }\n let age = now.getFullYear() - year\n // month is 1-based here; now.getMonth() is 0-based, so compare year-relative.\n const monthDelta = now.getMonth() + 1 - month\n if (monthDelta < 0 || (monthDelta === 0 && now.getDate() < day)) {\n age -= 1\n }\n return age\n}\n\n/** Today's date as an ISO `YYYY-MM-DD` string in LOCAL time (for `<input max>`). */\nexport function todayIsoDate(now: Date = new Date()): string {\n const year = now.getFullYear()\n const month = String(now.getMonth() + 1).padStart(2, '0')\n const day = String(now.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\n/**\n * Resolve the privacy-policy URL the same way FormMessage does: prefer the\n * org-configured URL when it is absolute, otherwise fall back to the platform\n * default.\n */\nexport function resolvePrivacyUrl(): string {\n const raw = resolvedPrivacyPolicyUrl.value\n return /^https?:\\/\\//i.test(raw) ? raw : PLATFORM_PRIVACY_POLICY_URL\n}\n\n/**\n * Per-country IBAN length table. Countries not listed fall back to the generic\n * 15–34 character range. Mirrors the backend `IBAN_LENGTHS` so a client-side\n * pass means the server-side `validateIban` agrees (both run the same mod-97).\n */\nconst IBAN_LENGTHS: Record<string, number> = {\n DE: 22,\n AT: 20,\n CH: 21,\n GB: 22,\n FR: 27,\n NL: 18,\n BE: 16,\n ES: 24,\n IT: 27,\n PL: 28,\n SE: 24,\n NO: 15,\n DK: 18,\n FI: 18,\n PT: 25,\n}\n\nconst IBAN_GENERIC_MIN = 15\nconst IBAN_GENERIC_MAX = 34\n\n/** Strip whitespace and uppercase — the canonical IBAN form for validation. */\nexport function normalizeIban(raw: string): string {\n return raw.replace(/\\s+/g, '').toUpperCase()\n}\n\n/**\n * Client-side IBAN check mirroring the backend `validateIban` exactly:\n * 1. length against the per-country table (or the generic 15–34 bound);\n * 2. the ISO 13616 mod-97 check (move first 4 chars to the end, expand\n * letters A=10..Z=35, chunked reduction to stay in safe-integer range).\n *\n * Pure UX gate — the backend re-validates. The raw IBAN is never logged here.\n */\nexport function isValidIban(raw: string): boolean {\n const normalized = normalizeIban(raw)\n const country = normalized.slice(0, 2)\n const expectedLength = IBAN_LENGTHS[country]\n if (expectedLength !== undefined) {\n if (normalized.length !== expectedLength) {\n return false\n }\n } else if (normalized.length < IBAN_GENERIC_MIN || normalized.length > IBAN_GENERIC_MAX) {\n return false\n }\n\n const rearranged = normalized.slice(4) + normalized.slice(0, 4)\n let digits = ''\n for (const ch of rearranged) {\n const code = ch.charCodeAt(0)\n if (code >= 65 && code <= 90) {\n digits += String(code - 55)\n } else if (code >= 48 && code <= 57) {\n digits += ch\n } else {\n // Any non-alphanumeric character is invalid.\n return false\n }\n }\n\n let remainder = 0\n for (let i = 0; i < digits.length; i += 9) {\n const chunk = String(remainder) + digits.slice(i, i + 9)\n remainder = Number(chunk) % 97\n }\n return remainder === 1\n}\n\n/**\n * Mask an IBAN for the review summary: show the first 4 and last 4 characters\n * of the normalized value, bullets in between, regrouped into 4-char blocks.\n * e.g. `DE89 3704 0044 0532 0130 00` → `DE89 •••• •••• •••• •••• 00`. Used for\n * display ONLY — the raw IBAN never leaves component memory through this path.\n */\nexport function maskIban(raw: string): string {\n const normalized = normalizeIban(raw)\n if (normalized.length <= 8) {\n return normalized\n }\n const head = normalized.slice(0, 4)\n const tail = normalized.slice(-4)\n const masked = head + '•'.repeat(normalized.length - 8) + tail\n return masked.replace(/(.{4})/g, '$1 ').trim()\n}\n\n/**\n * Format a Magicline money amount with its currency code, localised to the\n * widget locale. Magicline rate-bundle / flat-fee prices are decimal MAJOR\n * units (e.g. `29` → \"29,00 €\"), so the value is rendered as-is — never divided.\n * Falls back to a bare numeric string when the currency code is unsupported by\n * the runtime's `Intl`.\n */\nexport function formatContractMoney(\n amount: number,\n currencyCode: string,\n widgetLocale: 'en' | 'de',\n): string {\n const bcp47 = widgetLocale === 'de' ? 'de-DE' : 'en-GB'\n try {\n return new Intl.NumberFormat(bcp47, {\n style: 'currency',\n currency: currencyCode,\n }).format(amount)\n } catch {\n return `${amount.toFixed(2)} ${currencyCode}`\n }\n}\n\n/**\n * Localised \"{value} {unit}\" period label, e.g. \"12 months\" / \"12 Monate\". The\n * Magicline period unit is an uppercase enum (`DAY` / `WEEK` / `MONTH` / `YEAR`);\n * unknown units fall back to a lowercased raw unit so the label degrades safely.\n */\nexport function formatContractPeriod(\n value: number,\n unit: string,\n widgetLocale: 'en' | 'de',\n): string {\n const plural = value !== 1\n const table: Record<string, Record<'en' | 'de', [string, string]>> = {\n DAY: { en: ['day', 'days'], de: ['Tag', 'Tage'] },\n WEEK: { en: ['week', 'weeks'], de: ['Woche', 'Wochen'] },\n MONTH: { en: ['month', 'months'], de: ['Monat', 'Monate'] },\n YEAR: { en: ['year', 'years'], de: ['Jahr', 'Jahre'] },\n }\n const entry = table[unit.toUpperCase()]\n if (!entry) {\n return `${value} ${unit.toLowerCase()}`\n }\n const [singular, pluralWord] = entry[widgetLocale]\n return `${value} ${plural ? pluralWord : singular}`\n}\n\n/**\n * Format an ISO date (`YYYY-MM-DD` or a full datetime) for display in the\n * review summary, localised to the widget locale. Falls back to the raw value\n * when unparseable so a malformed start date never blanks the summary row.\n */\nexport function formatContractDate(isoDate: string, widgetLocale: 'en' | 'de'): string {\n const trimmed = isoDate.trim()\n if (trimmed === '') {\n return '—'\n }\n const bcp47 = widgetLocale === 'de' ? 'de-DE' : 'en-GB'\n const date = new Date(trimmed)\n if (Number.isNaN(date.getTime())) {\n return isoDate\n }\n return date.toLocaleDateString(bcp47, { day: '2-digit', month: 'long', year: 'numeric' })\n}\n\n/**\n * Recurring-price frequency suffix for a rate-bundle term price, e.g.\n * \"per week\" / \"pro Woche\" (value === 1) or \"every 3 weeks\" / \"alle 3 Wochen\"\n * (value > 1). Used as a suffix after a formatted money amount in offer cards\n * and the review base-price line.\n *\n * Supported units: DAY / WEEK / MONTH / YEAR (Magicline uppercase enum).\n * Unknown units fall back to a lowercased raw unit so the label degrades safely.\n */\nexport function formatPaymentFrequency(\n value: number,\n unit: string,\n widgetLocale: 'en' | 'de',\n): string {\n const t = LOCALE_STRINGS[widgetLocale]\n const upper = unit.toUpperCase()\n if (value === 1) {\n const perMap: Record<string, string> = {\n DAY: t.magiclineFreqPerDay,\n WEEK: t.magiclineFreqPerWeek,\n MONTH: t.magiclineFreqPerMonth,\n YEAR: t.magiclineFreqPerYear,\n }\n return perMap[upper] ?? unit.toLowerCase()\n }\n const everyMap: Record<string, string> = {\n DAY: t.magiclineFreqEveryDays,\n WEEK: t.magiclineFreqEveryWeeks,\n MONTH: t.magiclineFreqEveryMonths,\n YEAR: t.magiclineFreqEveryYears,\n }\n const template = everyMap[upper]\n if (template === undefined) {\n return `${value} ${unit.toLowerCase()}`\n }\n return template.replace('{n}', String(value))\n}\n\n/**\n * Formatted price label for an optional module, combining the money amount with\n * the appropriate frequency or type suffix. Mirrors Fit Inn's formatPriceLabel.\n *\n * paymentFrequencyType values:\n * \"TERM_BASED\" → \"{money} per term\"\n * \"RECURRING\" → \"{money} \" + formatPaymentFrequency(1, recurringUnit)\n * \"NON_RECURRING\" → \"{money} one-time\"\n * \"MONTH_DAY\" → \"{money} one-time\"\n * \"FREE\" → \"included\"\n * null / other → bare money string\n */\nexport function formatModulePrice(\n amount: number,\n currencyCode: string,\n paymentFrequencyType: string | null,\n recurringUnit: string | null,\n widgetLocale: 'en' | 'de',\n): string {\n const t = LOCALE_STRINGS[widgetLocale]\n const money = formatContractMoney(amount, currencyCode, widgetLocale)\n switch (paymentFrequencyType) {\n case 'TERM_BASED':\n return `${money} ${t.magiclineModulePerTerm}`\n case 'RECURRING': {\n const unit = recurringUnit ?? 'MONTH'\n return `${money} ${formatPaymentFrequency(1, unit, widgetLocale)}`\n }\n case 'NON_RECURRING':\n return `${money} ${t.magiclineModuleOneTime}`\n case 'MONTH_DAY':\n return `${money} ${t.magiclineModuleOneTime}`\n case 'FREE':\n return t.magiclineModuleIncluded\n default:\n return money\n }\n}\n\n/**\n * Formatted voucher discount label. PERCENTAGE type produces \"-{value}%\";\n * AMOUNT type produces \"-{formatted money}\" via `formatContractMoney`.\n *\n * Used in the Review step to show the active voucher's saving alongside the\n * discounted base price.\n */\nexport function formatVoucherDiscount(\n discountValue: number,\n discountType: 'AMOUNT' | 'PERCENTAGE',\n currencyCode: string,\n locale: 'en' | 'de',\n): string {\n if (discountType === 'PERCENTAGE') {\n return `-${discountValue}%`\n }\n return `-${formatContractMoney(discountValue, currencyCode, locale)}`\n}\n\n/**\n * Known Magicline flat-fee names mapped to WidgetStrings keys.\n * Keys are normalized (trimmed + lowercased) raw fee names as returned by the\n * Magicline /preview and rate-bundle endpoints; values are WidgetStrings keys.\n * Both the German studio name and the connectdemo English variant map to the\n * same key so the correct locale label is shown regardless of studio language.\n */\nconst FEE_NAME_KEY_MAP: Record<string, keyof WidgetStrings> = {\n startpaket: 'magiclineFeeStarterPackage',\n 'starter package': 'magiclineFeeStarterPackage',\n trainerpauschale: 'magiclineFeeTrainerFee',\n}\n\n/**\n * Localize a raw Magicline flat-fee name. When the normalized name is in the\n * known-fee map, the locale string for that key is returned. Otherwise the\n * original raw name is returned unchanged so unmapped fees degrade safely.\n */\nexport function localizeFeeName(rawName: string, t: WidgetStrings): string {\n const normalized = rawName.trim().toLowerCase()\n const key = FEE_NAME_KEY_MAP[normalized]\n if (key !== undefined) {\n return t[key] as string\n }\n return rawName\n}\n\n/**\n * Renewal label for an optional module extension type. Returns an empty string\n * when the type produces no visible renewal line (SUBSEQUENT_RATE_DETAIL, null).\n *\n * extensionType values:\n * \"NONE\" → \"No automatic renewal\"\n * \"TERM_EXTENSION\" → \"Renewal: {n} {unit}\" (via the period table)\n * \"SUBSEQUENT_RATE_DETAIL\"→ \"\" (no line rendered)\n * null → \"\" (no line rendered)\n */\nexport function formatModuleRenewal(\n extensionType: string | null,\n termExtension: { value: number; unit: string } | null,\n widgetLocale: 'en' | 'de',\n): string {\n const t = LOCALE_STRINGS[widgetLocale]\n if (extensionType === 'NONE') {\n return t.magiclineRenewalNone\n }\n if (extensionType === 'TERM_EXTENSION' && termExtension !== null) {\n // formatContractPeriod returns \"{value} {unitWord}\" — reuse it directly as\n // the full \"{n} {unit}\" interpolation since the template wraps both.\n const periodLabel = formatContractPeriod(termExtension.value, termExtension.unit, widgetLocale)\n return t.magiclineRenewalTerm.replace('{n} {unit}', periodLabel)\n }\n return ''\n}\n","/**\n * Widget-side Magicline constants. The widget cannot import the backend\n * `model.ts` (it is bundled separately), so the controlled `<select>` enums are\n * mirrored here. Every value below is a member of the backend `GENDER_ENUM` /\n * `COUNTRY_ENUM` so a submission re-validates server-side without surprises.\n */\n\n/** Magicline gender enum (controlled select). Mirrors backend `GENDER_ENUM`. */\nexport const GENDER_VALUES = ['MALE', 'FEMALE', 'UNISEX'] as const\nexport type GenderValue = (typeof GENDER_VALUES)[number]\n\n/**\n * Curated subset of the backend `COUNTRY_ENUM` for the country `<select>`.\n * Magicline's full enum has 250+ ISO codes; surfacing all of them in a widget\n * dropdown is poor UX. We ship the DACH region plus common neighbours — every\n * code here is a valid `COUNTRY_ENUM` member, so the server-side check passes.\n */\nexport interface CountryOption {\n code: string\n label: string\n}\n\nexport const COUNTRY_OPTIONS: readonly CountryOption[] = [\n { code: 'DE', label: 'Germany / Deutschland' },\n { code: 'AT', label: 'Austria / Österreich' },\n { code: 'CH', label: 'Switzerland / Schweiz' },\n { code: 'LI', label: 'Liechtenstein' },\n { code: 'LU', label: 'Luxembourg / Luxemburg' },\n { code: 'NL', label: 'Netherlands / Niederlande' },\n { code: 'BE', label: 'Belgium / Belgien' },\n { code: 'FR', label: 'France / Frankreich' },\n { code: 'IT', label: 'Italy / Italien' },\n { code: 'ES', label: 'Spain / Spanien' },\n { code: 'PL', label: 'Poland / Polen' },\n { code: 'CZ', label: 'Czechia / Tschechien' },\n { code: 'DK', label: 'Denmark / Dänemark' },\n { code: 'GB', label: 'United Kingdom' },\n { code: 'US', label: 'United States' },\n] as const\n","import type { TrialConfigPlan } from '../../hooks/useMagicline'\n\n/**\n * Ordered wizard step identifiers. The widget renders these as internal steps\n * inside ONE card (not one chat message per step).\n */\nexport type WizardStep = 'trainer' | 'slot' | 'personal' | 'address' | 'confirm'\n\n/**\n * Pure helper — resolves the ordered list of VISIBLE wizard steps for a studio\n * plan. Steps with no visible fields are skipped so the visitor never lands on\n * an empty page and the \"Step n of N\" counter shrinks accordingly.\n *\n * Skip rules:\n * - `trainer` — skipped unless the studio allows trainer-free bookings\n * (`bookingWithoutTrainerAllowed === true`); otherwise the choice is forced\n * and there is nothing to ask.\n * - `slot` — always shown (a slot is mandatory).\n * - `personal` — always shown (firstname/lastname are always visible+required).\n * - `address` — skipped when neither the address group nor the zip field is\n * visible per the plan.\n * - `confirm` — always shown (note + consent + summary + submit).\n *\n * Visibility is derived ONLY from the same `plan` the fields use — no second\n * source of truth.\n */\nexport function buildWizardSteps(\n plan: TrialConfigPlan,\n bookingWithoutTrainerAllowed: boolean,\n): WizardStep[] {\n const steps: WizardStep[] = []\n if (bookingWithoutTrainerAllowed) {\n steps.push('trainer')\n }\n steps.push('slot')\n steps.push('personal')\n if (plan.address.visible || plan.zip.visible) {\n steps.push('address')\n }\n steps.push('confirm')\n return steps\n}\n","import { useCallback, useEffect, useReducer } from 'preact/hooks'\nimport {\n useTrialConfig,\n useTrialSlots,\n type TrialConfigPlan,\n type TrialSlot,\n} from '../../hooks/useMagicline'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/** Resolved per-studio config (only present once the fetch succeeds). */\nexport interface ResolvedConfig {\n plan: TrialConfigPlan\n minimumAge: number\n bookingWithoutTrainerAllowed: boolean\n /** Studio IANA timezone (or null) — used to display bare-UTC slot times. */\n studioZoneId: string | null\n}\n\n/**\n * Config status as a CODE, not a resolved message. The view resolves the\n * code to a localised string at render time so a locale toggle mid-fill never\n * re-runs the config fetch and never nukes the filled form to an error card.\n */\nexport type ConfigStatusCode = 'unsupported' | 'inconsistent' | 'unavailable'\n\nexport type ConfigState =\n | { phase: 'loading' }\n | { phase: 'ready'; config: ResolvedConfig }\n | { phase: 'error'; code: ConfigStatusCode; backendMessage: string }\n\n/**\n * Slots lifecycle. `empty` (healthy, zero availability) is split from\n * `error` (unavailable / network_error / rejection) so the Slot step can show\n * a Retry affordance on `error` and a no-slots message on `empty`.\n */\nexport type SlotsState =\n | { phase: 'loading' }\n | { phase: 'ready'; slots: TrialSlot[] }\n | { phase: 'empty' }\n | { phase: 'error' }\n\n/** The flat field bag — all controlled inputs default to \"\". */\nexport interface TrialFormFields {\n firstName: string\n lastName: string\n email: string\n phone: string\n birthDate: string\n gender: string\n street: string\n houseNumber: string\n zip: string\n city: string\n country: string\n note: string\n slotId: string\n consent: boolean\n /** Trainer required defaults to TRUE (safest); preselected \"with trainer\". */\n trainerRequired: boolean\n}\n\nconst INITIAL_FIELDS: TrialFormFields = {\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n birthDate: '',\n gender: '',\n street: '',\n houseNumber: '',\n zip: '',\n city: '',\n country: '',\n note: '',\n slotId: '',\n consent: false,\n trainerRequired: true,\n}\n\ntype FieldAction =\n | { type: 'set'; key: keyof TrialFormFields; value: string | boolean }\n /** Trainer choice changes clear the picked slot in the SAME action. */\n | { type: 'setTrainer'; trainerRequired: boolean }\n /** Drop a slot selection that is no longer in the fresh list. */\n | { type: 'clearSlotIfAbsent'; available: string[] }\n\nfunction fieldsReducer(state: TrialFormFields, action: FieldAction): TrialFormFields {\n switch (action.type) {\n case 'set': {\n return { ...state, [action.key]: action.value }\n }\n case 'setTrainer': {\n // Clear the picked slot here (not in a mount effect) so a restored\n // selection survives, but a deliberate trainer change re-gates slots.\n return { ...state, trainerRequired: action.trainerRequired, slotId: '' }\n }\n case 'clearSlotIfAbsent': {\n if (state.slotId !== '' && !action.available.includes(state.slotId)) {\n return { ...state, slotId: '' }\n }\n return state\n }\n default: {\n return state\n }\n }\n}\n\nexport interface UseTrialBookingStateOptions {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\nexport interface TrialBookingState {\n fields: TrialFormFields\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n setTrainerRequired: (trainerRequired: boolean) => void\n configState: ConfigState\n slotsState: SlotsState\n /** Re-fetch slots with the current `trainerRequired` (Retry button). */\n refetchSlots: () => void\n}\n\n/**\n * Single fetch-once container for the trial-booking wizard.\n *\n * - Config is fetched ONCE on mount. A locale toggle does NOT re-fetch it\n * (no `t` in deps; status stored as a code).\n * - Slots are fetched once config is ready and again whenever `trainerRequired`\n * flips OR `refetchSlots` is called. A `refreshKey` counter drives the slot\n * effect so the Retry button can re-run it without other deps changing.\n * - Wizard STEP components read this shared state — mounting a step never\n * re-fetches config or slots (the fetches live on this single hook instance,\n * which is mounted once by the container, above the step switch).\n */\nexport function useTrialBookingState({\n sessionId,\n visitorId,\n}: UseTrialBookingStateOptions): TrialBookingState {\n const getTrialConfig = useTrialConfig()\n const listTrialSlots = useTrialSlots()\n\n const [fields, dispatch] = useReducer(fieldsReducer, INITIAL_FIELDS)\n const [configState, setConfigState] = useReducer(\n (_prev: ConfigState, next: ConfigState) => next,\n { phase: 'loading' } satisfies ConfigState,\n )\n const [slotsState, setSlotsState] = useReducer(\n (_prev: SlotsState, next: SlotsState) => next,\n { phase: 'loading' } satisfies SlotsState,\n )\n // Bumping this counter forces the slot effect to re-run (Retry / refetch).\n const [refreshKey, bumpRefresh] = useReducer((n: number) => n + 1, 0)\n\n const setField = useCallback((key: keyof TrialFormFields, value: string | boolean) => {\n dispatch({ type: 'set', key, value })\n }, [])\n\n const setTrainerRequired = useCallback((trainerRequired: boolean) => {\n // Clears slotId + triggers a slot refetch (refreshKey bump) atomically.\n dispatch({ type: 'setTrainer', trainerRequired })\n bumpRefresh()\n }, [])\n\n const refetchSlots = useCallback(() => {\n bumpRefresh()\n }, [])\n\n // ── Config: fetch ONCE on mount. No `t` in deps. ──────────────────────────\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const result = await getTrialConfig({ sessionId, visitorId })\n if (cancelled) {\n return\n }\n if (result.status === 'ok') {\n setConfigState({\n phase: 'ready',\n config: {\n plan: result.plan,\n minimumAge: result.minimumAge,\n bookingWithoutTrainerAllowed: result.bookingWithoutTrainerAllowed,\n studioZoneId: result.studioZoneId,\n },\n })\n } else {\n setConfigState({\n phase: 'error',\n code: result.status,\n backendMessage: result.message,\n })\n }\n } catch {\n if (!cancelled) {\n setConfigState({ phase: 'error', code: 'unavailable', backendMessage: '' })\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [getTrialConfig, sessionId, visitorId])\n\n // ── Slots: once config is ready + whenever trainerRequired / refreshKey\n // changes. Clears an orphaned selection from a re-fetched list. ─────────\n const configReady = configState.phase === 'ready'\n const { trainerRequired } = fields\n useEffect(() => {\n if (!configReady) {\n return\n }\n let cancelled = false\n setSlotsState({ phase: 'loading' })\n void (async () => {\n try {\n const result = await listTrialSlots({ sessionId, visitorId, trainerRequired })\n if (cancelled) {\n return\n }\n if (result.status === 'ok') {\n if (result.slots.length > 0) {\n setSlotsState({ phase: 'ready', slots: result.slots })\n dispatch({\n type: 'clearSlotIfAbsent',\n available: result.slots.map((slot) => slot.startDateTime),\n })\n } else {\n setSlotsState({ phase: 'empty' })\n }\n } else {\n // unavailable / network_error → retryable error state.\n setSlotsState({ phase: 'error' })\n }\n } catch {\n if (!cancelled) {\n setSlotsState({ phase: 'error' })\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [configReady, listTrialSlots, sessionId, visitorId, trainerRequired, refreshKey])\n\n return {\n fields,\n setField,\n setTrainerRequired,\n configState,\n slotsState,\n refetchSlots,\n }\n}\n","import { useMemo, useState } from 'preact/hooks'\nimport { locale, useLocale } from '../../../../i18n/index'\nimport { useMagiclineSubmit, type TrialConfigPlan, type TrialSlot } from '../../hooks/useMagicline'\nimport { ageFromIsoDate, isValidEmail, resolvePrivacyUrl, todayIsoDate } from './formUtils'\nimport { COUNTRY_OPTIONS, GENDER_VALUES } from './magiclineConstants'\nimport { buildWizardSteps, type WizardStep } from './buildWizardSteps'\nimport {\n useTrialBookingState,\n type ConfigStatusCode,\n type ResolvedConfig,\n type SlotsState,\n type TrialFormFields,\n} from './useTrialBookingState'\nimport type { WidgetStrings } from '../../../../i18n/locales/en'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface TrialSessionBookingFormProps {\n formMessageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n /** Set when the form was reopened after a `slot_unavailable` 409. */\n slotUnavailable?: boolean\n /**\n * True while the 409 retry-status query is still resolving. The Slot\n * step waits for this to clear before deciding its UI so a reopened form\n * doesn't flash \"no slots\" before the slot-unavailable notice resolves.\n */\n retryPending?: boolean\n}\n\n/** Per-field error map keyed by field name. */\ntype FieldErrors = Partial<Record<keyof TrialFormFields, string>>\n\n/**\n * Inline Magicline trial-session booking STEP WIZARD. Renders the\n * dynamic per-studio form as internal steps inside ONE chat card:\n *\n * Trainer → Slot → Personal → Address → Confirm\n *\n * Steps with no visible fields are auto-skipped (see `buildWizardSteps`). The\n * trainer step is shown only when the studio allows trainer-free bookings.\n *\n * State (config, slots, all field values) is lifted into `useTrialBookingState`\n * which is mounted ONCE here, above the step switch — so navigating between\n * steps never refetches config or slots. Config is fetched once on open;\n * slots are fetched on open and whenever the trainer choice changes.\n *\n * The selected slot's `startDateTime` is sent as the `slotId` field — the\n * backend transformer maps `slotId` → Magicline `startDateTime`.\n */\nexport function TrialSessionBookingForm({\n formMessageId,\n sessionId,\n visitorId,\n slotUnavailable = false,\n retryPending = false,\n}: TrialSessionBookingFormProps) {\n const t = useLocale()\n const submitForm = useMagiclineSubmit()\n const { fields, setField, setTrainerRequired, configState, slotsState, refetchSlots } =\n useTrialBookingState({ sessionId, visitorId })\n\n // ── Loading / error states own the whole card (no wizard). ───────────────\n if (configState.phase === 'loading') {\n return (\n <div class=\"jex-inline-form jex-magicline-form\">\n <div class=\"jex-inline-form-title\">{t.magiclineTrialTitle}</div>\n <div class=\"jex-magicline-slots-hint\">{t.magiclineConfigLoading}</div>\n </div>\n )\n }\n\n if (configState.phase === 'error') {\n return (\n <div class=\"jex-inline-form jex-magicline-form\">\n <div class=\"jex-inline-form-title\">{t.magiclineTrialTitle}</div>\n <div class=\"jex-magicline-slots-hint\" role=\"alert\">\n {resolveConfigMessage(configState.code, configState.backendMessage, t)}\n </div>\n </div>\n )\n }\n\n return (\n <TrialWizard\n formMessageId={formMessageId}\n sessionId={sessionId}\n visitorId={visitorId}\n slotUnavailable={slotUnavailable}\n retryPending={retryPending}\n config={configState.config}\n fields={fields}\n setField={setField}\n setTrainerRequired={setTrainerRequired}\n slotsState={slotsState}\n refetchSlots={refetchSlots}\n submitForm={submitForm}\n />\n )\n}\n\ninterface TrialWizardProps {\n formMessageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n slotUnavailable: boolean\n retryPending: boolean\n config: ResolvedConfig\n fields: TrialFormFields\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n setTrainerRequired: (trainerRequired: boolean) => void\n slotsState: SlotsState\n refetchSlots: () => void\n submitForm: ReturnType<typeof useMagiclineSubmit>\n}\n\n/**\n * The wizard body — rendered only once config is `ready`. Owns the step index,\n * per-step validation, and submit. All FORM state lives one level up so it is\n * fetched once and preserved across step navigation.\n */\nfunction TrialWizard({\n formMessageId,\n sessionId,\n visitorId,\n slotUnavailable,\n retryPending,\n config,\n fields,\n setField,\n setTrainerRequired,\n slotsState,\n refetchSlots,\n submitForm,\n}: TrialWizardProps) {\n const t = useLocale()\n const { plan, minimumAge, bookingWithoutTrainerAllowed, studioZoneId } = config\n\n const steps = useMemo(\n () => buildWizardSteps(plan, bookingWithoutTrainerAllowed),\n [plan, bookingWithoutTrainerAllowed],\n )\n\n // On a 409 reopen, start at the Slot step so the visitor re-picks a time.\n const initialIndex = slotUnavailable ? Math.max(steps.indexOf('slot'), 0) : 0\n const [index, setIndex] = useState(initialIndex)\n const [fieldErrors, setFieldErrors] = useState<FieldErrors>({})\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n\n const privacyUrl = useMemo(() => resolvePrivacyUrl(), [])\n\n const safeIndex = Math.min(index, steps.length - 1)\n const step = steps[safeIndex]\n const isLast = safeIndex === steps.length - 1\n const isFirst = safeIndex === 0\n\n function validateStep(current: WizardStep): FieldErrors {\n const errors: FieldErrors = {}\n if (current === 'slot') {\n if (fields.slotId === '') {\n errors.slotId = t.magiclineSlotRequiredError\n }\n return errors\n }\n if (current === 'personal') {\n if (fields.firstName.trim() === '') {\n errors.firstName = t.magiclineRequiredError\n }\n if (fields.lastName.trim() === '') {\n errors.lastName = t.magiclineRequiredError\n }\n if (plan.email.visible && plan.email.required && fields.email.trim() === '') {\n errors.email = t.magiclineRequiredError\n }\n if (fields.email.trim() !== '' && !isValidEmail(fields.email)) {\n errors.email = t.magiclineEmailError\n }\n if (plan.phone.visible && plan.phone.required && fields.phone.trim() === '') {\n errors.phone = t.magiclineRequiredError\n }\n if (plan.gender.visible && plan.gender.required && fields.gender === '') {\n errors.gender = t.magiclineRequiredError\n }\n if (plan.dateOfBirth.visible) {\n if (plan.dateOfBirth.required && fields.birthDate.trim() === '') {\n errors.birthDate = t.magiclineRequiredError\n }\n if (fields.birthDate.trim() !== '') {\n const age = ageFromIsoDate(fields.birthDate)\n if (age !== null && age < 0) {\n // future DOB → negative age.\n errors.birthDate = t.magiclineRequiredError\n } else if (minimumAge > 0 && age !== null && age < minimumAge) {\n errors.birthDate = t.magiclineMinAgeError.replace('{age}', String(minimumAge))\n }\n }\n }\n return errors\n }\n if (current === 'address') {\n // only enforce when visible && required.\n if (plan.address.visible && plan.address.required) {\n if (fields.street.trim() === '') {\n errors.street = t.magiclineRequiredError\n }\n if (fields.houseNumber.trim() === '') {\n errors.houseNumber = t.magiclineRequiredError\n }\n if (fields.city.trim() === '') {\n errors.city = t.magiclineRequiredError\n }\n if (fields.country === '') {\n errors.country = t.magiclineRequiredError\n }\n }\n if (plan.zip.visible && plan.zip.required && fields.zip.trim() === '') {\n errors.zip = t.magiclineRequiredError\n }\n return errors\n }\n if (current === 'confirm') {\n if (!fields.consent) {\n errors.consent = t.magiclineConsentError\n }\n return errors\n }\n return errors\n }\n\n function handleNext() {\n const errors = validateStep(step)\n if (Object.keys(errors).length > 0) {\n setFieldErrors(errors)\n return\n }\n setFieldErrors({})\n setIndex((prev) => Math.min(prev + 1, steps.length - 1))\n }\n\n function handleBack() {\n setFieldErrors({})\n setSubmitError(null)\n setIndex((prev) => Math.max(prev - 1, 0))\n }\n\n async function handleSubmit() {\n if (submitting) {\n return\n }\n const errors = validateStep('confirm')\n if (Object.keys(errors).length > 0) {\n setFieldErrors(errors)\n return\n }\n setFieldErrors({})\n setSubmitError(null)\n setSubmitting(true)\n try {\n const bag = buildFieldBag(plan, fields)\n await submitForm({\n sessionId,\n visitorId,\n formMessageId,\n action: 'trialSessionBooking',\n fields: bag,\n })\n // On success the mutation patches magiclineForm.status → submitted; the\n // Convex subscription re-renders MagiclineFormMessage into read-only.\n } catch (err) {\n console.error('[TrialSessionBookingForm] Submit failed:', err)\n setSubmitError(t.magiclineFailedDetail)\n setSubmitting(false)\n }\n }\n\n function onPrimary() {\n if (isLast) {\n void handleSubmit()\n } else {\n handleNext()\n }\n }\n\n const stepTitle = stepTitleFor(step, t)\n const consentId = `jex-ml-consent-${formMessageId}`\n\n return (\n <div class=\"jex-inline-form jex-magicline-form\">\n <div class=\"jex-magicline-wizard-header\">\n <div class=\"jex-inline-form-title\">{t.magiclineTrialTitle}</div>\n <div class=\"jex-magicline-wizard-progress\">\n <span class=\"jex-magicline-wizard-step-label\">{stepTitle}</span>\n <span class=\"jex-magicline-wizard-counter\">\n {t.magiclineStepCounter\n .replace('{n}', String(safeIndex + 1))\n .replace('{total}', String(steps.length))}\n </span>\n </div>\n <div class=\"jex-magicline-wizard-dots\" aria-hidden=\"true\">\n {steps.map((s, i) => (\n <span\n key={s}\n class={\n i === safeIndex\n ? 'jex-magicline-wizard-dot jex-magicline-wizard-dot-active'\n : 'jex-magicline-wizard-dot'\n }\n />\n ))}\n </div>\n </div>\n\n <div class=\"jex-form\" role=\"group\" aria-label={stepTitle}>\n {step === 'trainer' ? (\n <TrainerStep\n formMessageId={formMessageId}\n trainerRequired={fields.trainerRequired}\n disabled={submitting}\n onChange={setTrainerRequired}\n />\n ) : null}\n\n {step === 'slot' ? (\n <SlotStep\n slotsState={slotsState}\n slotId={fields.slotId}\n studioZoneId={studioZoneId}\n disabled={submitting}\n retryPending={retryPending}\n slotUnavailable={slotUnavailable}\n error={fieldErrors.slotId}\n onSelect={(value) => { setField('slotId', value) }}\n onRetry={refetchSlots}\n />\n ) : null}\n\n {step === 'personal' ? (\n <PersonalStep\n plan={plan}\n fields={fields}\n errors={fieldErrors}\n disabled={submitting}\n setField={setField}\n />\n ) : null}\n\n {step === 'address' ? (\n <AddressStep\n plan={plan}\n fields={fields}\n errors={fieldErrors}\n disabled={submitting}\n setField={setField}\n />\n ) : null}\n\n {step === 'confirm' ? (\n <ConfirmStep\n consentId={consentId}\n privacyUrl={privacyUrl}\n studioZoneId={studioZoneId}\n fields={fields}\n disabled={submitting}\n consentError={fieldErrors.consent}\n setField={setField}\n />\n ) : null}\n\n {submitError !== null ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{submitError}</div>\n ) : null}\n\n <div class=\"jex-magicline-wizard-nav\">\n {!isFirst ? (\n <button\n type=\"button\"\n class=\"jex-magicline-wizard-back\"\n disabled={submitting}\n onClick={handleBack}\n >\n {t.magiclineWizardBack}\n </button>\n ) : null}\n <button\n type=\"button\"\n class=\"jex-form-submit jex-magicline-wizard-next\"\n disabled={submitting}\n onClick={onPrimary}\n >\n {isLast\n ? submitting\n ? t.magiclineSubmitting\n : t.magiclineSubmit\n : t.magiclineWizardNext}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\n// ── Step components ────────────────────────────────────────────────────────\n\ninterface TrainerStepProps {\n formMessageId: Id<'conversations'>\n trainerRequired: boolean\n disabled: boolean\n onChange: (trainerRequired: boolean) => void\n}\n\nfunction TrainerStep({ formMessageId, trainerRequired, disabled, onChange }: TrainerStepProps) {\n const t = useLocale()\n const name = `jex-ml-trainer-${formMessageId}`\n return (\n <div class=\"jex-magicline-radio-group\" role=\"radiogroup\" aria-label={t.magiclineStepTrainer}>\n <label\n class={\n trainerRequired\n ? 'jex-magicline-radio-card jex-magicline-radio-card-active'\n : 'jex-magicline-radio-card'\n }\n >\n <input\n type=\"radio\"\n name={name}\n checked={trainerRequired}\n disabled={disabled}\n onChange={() => { onChange(true) }}\n />\n <span>{t.magiclineTrainerWith}</span>\n </label>\n <label\n class={\n !trainerRequired\n ? 'jex-magicline-radio-card jex-magicline-radio-card-active'\n : 'jex-magicline-radio-card'\n }\n >\n <input\n type=\"radio\"\n name={name}\n checked={!trainerRequired}\n disabled={disabled}\n onChange={() => { onChange(false) }}\n />\n <span>{t.magiclineTrainerWithout}</span>\n </label>\n </div>\n )\n}\n\ninterface SlotStepProps {\n slotsState: SlotsState\n slotId: string\n /** Studio IANA timezone (or null) for bare-UTC slot labels. */\n studioZoneId: string | null\n disabled: boolean\n retryPending: boolean\n slotUnavailable: boolean\n error: string | undefined\n onSelect: (value: string) => void\n onRetry: () => void\n}\n\nfunction SlotStep({\n slotsState,\n slotId,\n studioZoneId,\n disabled,\n retryPending,\n slotUnavailable,\n error,\n onSelect,\n onRetry,\n}: SlotStepProps) {\n const t = useLocale()\n return (\n <>\n {slotUnavailable ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{t.magiclineSlotUnavailableNotice}</div>\n ) : null}\n\n {/* wait for the 409 retry-status query before deciding the UI. */}\n {retryPending || slotsState.phase === 'loading' ? (\n <div class=\"jex-magicline-slots-hint\" aria-live=\"polite\">{t.magiclineLoadingSlots}</div>\n ) : slotsState.phase === 'ready' ? (\n <select\n class=\"jex-form-input jex-magicline-select\"\n aria-label={t.magiclineSlotLabel}\n value={slotId}\n required\n disabled={disabled}\n aria-invalid={error !== undefined}\n onChange={(e) => { onSelect(e.currentTarget.value) }}\n >\n <option value=\"\" disabled>{t.magiclineSlotPlaceholder}</option>\n {slotsState.slots.map((slot) => (\n <option key={slot.startDateTime} value={slot.startDateTime}>\n {formatSlot(slot.startDateTime, locale.value, studioZoneId)}\n </option>\n ))}\n </select>\n ) : slotsState.phase === 'error' ? (\n // distinct error state with a Retry affordance.\n <div class=\"jex-magicline-slots-error\">\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {t.magiclineSlotsError}\n </div>\n <button\n type=\"button\"\n class=\"jex-magicline-retry\"\n disabled={disabled}\n onClick={onRetry}\n >\n {t.magiclineRetry}\n </button>\n </div>\n ) : (\n // empty → healthy no-availability message (no retry, can't advance).\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {t.magiclineNoSlots}\n </div>\n )}\n\n {error !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{error}</div>\n ) : null}\n </>\n )\n}\n\ninterface PersonalStepProps {\n plan: TrialConfigPlan\n fields: TrialFormFields\n errors: FieldErrors\n disabled: boolean\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n}\n\nfunction PersonalStep({ plan, fields, errors, disabled, setField }: PersonalStepProps) {\n const t = useLocale()\n const maxDob = useMemo(() => todayIsoDate(), [])\n return (\n <>\n <div class=\"jex-magicline-row\">\n <TextField\n label={t.magiclineFirstName}\n value={fields.firstName}\n required\n disabled={disabled}\n error={errors.firstName}\n fieldKey=\"firstName\"\n onInput={(v) => { setField('firstName', v) }}\n />\n <TextField\n label={t.magiclineLastName}\n value={fields.lastName}\n required\n disabled={disabled}\n error={errors.lastName}\n fieldKey=\"lastName\"\n onInput={(v) => { setField('lastName', v) }}\n />\n </div>\n\n {plan.email.visible ? (\n <TextField\n label={optionalLabel(t.magiclineEmail, plan.email.required, t)}\n type=\"email\"\n value={fields.email}\n required={plan.email.required}\n disabled={disabled}\n error={errors.email}\n fieldKey=\"email\"\n onInput={(v) => { setField('email', v) }}\n />\n ) : null}\n\n {plan.phone.visible ? (\n <TextField\n label={optionalLabel(t.magiclinePhone, plan.phone.required, t)}\n type=\"tel\"\n value={fields.phone}\n required={plan.phone.required}\n disabled={disabled}\n error={errors.phone}\n fieldKey=\"phone\"\n onInput={(v) => { setField('phone', v) }}\n />\n ) : null}\n\n {plan.dateOfBirth.visible ? (\n <label class=\"jex-magicline-field\">\n <span class=\"jex-magicline-field-label\">\n {optionalLabel(t.magiclineBirthDate, plan.dateOfBirth.required, t)}\n </span>\n <input\n class=\"jex-form-input\"\n type=\"date\"\n aria-label={optionalLabel(t.magiclineBirthDate, plan.dateOfBirth.required, t)}\n value={fields.birthDate}\n max={maxDob}\n required={plan.dateOfBirth.required}\n disabled={disabled}\n aria-invalid={errors.birthDate !== undefined}\n onInput={(e) => { setField('birthDate', e.currentTarget.value) }}\n />\n {errors.birthDate !== undefined ? (\n <span class=\"jex-magicline-error\" role=\"alert\">{errors.birthDate}</span>\n ) : null}\n </label>\n ) : null}\n\n {plan.gender.visible ? (\n <SelectField\n label={optionalLabel(t.magiclineGender, plan.gender.required, t)}\n value={fields.gender}\n required={plan.gender.required}\n disabled={disabled}\n placeholder={optionalLabel(t.magiclineGenderPlaceholder, plan.gender.required, t)}\n error={errors.gender}\n onChange={(v) => { setField('gender', v) }}\n options={GENDER_VALUES.map((value) => ({ value, label: genderLabel(value, t) }))}\n />\n ) : null}\n </>\n )\n}\n\ninterface AddressStepProps {\n plan: TrialConfigPlan\n fields: TrialFormFields\n errors: FieldErrors\n disabled: boolean\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n}\n\nfunction AddressStep({ plan, fields, errors, disabled, setField }: AddressStepProps) {\n const t = useLocale()\n return (\n <>\n {plan.address.visible ? (\n <>\n <div class=\"jex-magicline-row\">\n <TextField\n label={optionalLabel(t.magiclineStreet, plan.address.required, t)}\n value={fields.street}\n required={plan.address.required}\n disabled={disabled}\n error={errors.street}\n fieldKey=\"street\"\n onInput={(v) => { setField('street', v) }}\n />\n <TextField\n label={optionalLabel(t.magiclineHouseNumber, plan.address.required, t)}\n value={fields.houseNumber}\n required={plan.address.required}\n disabled={disabled}\n error={errors.houseNumber}\n fieldKey=\"houseNumber\"\n onInput={(v) => { setField('houseNumber', v) }}\n />\n </div>\n <TextField\n label={optionalLabel(t.magiclineCity, plan.address.required, t)}\n value={fields.city}\n required={plan.address.required}\n disabled={disabled}\n error={errors.city}\n fieldKey=\"city\"\n onInput={(v) => { setField('city', v) }}\n />\n <SelectField\n label={optionalLabel(t.magiclineCountry, plan.address.required, t)}\n value={fields.country}\n required={plan.address.required}\n disabled={disabled}\n placeholder={optionalLabel(t.magiclineCountryPlaceholder, plan.address.required, t)}\n error={errors.country}\n onChange={(v) => { setField('country', v) }}\n options={COUNTRY_OPTIONS.map((option) => ({ value: option.code, label: option.label }))}\n />\n </>\n ) : null}\n\n {plan.zip.visible ? (\n <TextField\n label={optionalLabel(t.magiclineZip, plan.zip.required, t)}\n value={fields.zip}\n required={plan.zip.required}\n disabled={disabled}\n error={errors.zip}\n fieldKey=\"zip\"\n onInput={(v) => { setField('zip', v) }}\n />\n ) : null}\n </>\n )\n}\n\ninterface ConfirmStepProps {\n consentId: string\n privacyUrl: string\n /** Studio IANA timezone (or null) for the bare-UTC summary slot label. */\n studioZoneId: string | null\n fields: TrialFormFields\n disabled: boolean\n consentError: string | undefined\n setField: (key: keyof TrialFormFields, value: string | boolean) => void\n}\n\nfunction ConfirmStep({\n consentId,\n privacyUrl,\n studioZoneId,\n fields,\n disabled,\n consentError,\n setField,\n}: ConfirmStepProps) {\n const t = useLocale()\n const slotLabel =\n fields.slotId !== '' ? formatSlot(fields.slotId, locale.value, studioZoneId) : '—'\n const name = `${fields.firstName} ${fields.lastName}`.trim()\n return (\n <>\n <dl class=\"jex-magicline-summary\">\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummaryTrainer}</dt>\n <dd>{fields.trainerRequired ? t.magiclineTrainerWith : t.magiclineTrainerWithout}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummarySlot}</dt>\n <dd>{slotLabel}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummaryName}</dt>\n <dd>{name !== '' ? name : '—'}</dd>\n </div>\n </dl>\n\n <textarea\n class=\"jex-form-textarea\"\n aria-label={t.magiclineNote}\n placeholder={t.magiclineNote}\n value={fields.note}\n disabled={disabled}\n onInput={(e) => { setField('note', e.currentTarget.value) }}\n />\n\n <label class=\"jex-magicline-consent\" for={consentId}>\n <input\n id={consentId}\n type=\"checkbox\"\n checked={fields.consent}\n disabled={disabled}\n aria-invalid={consentError !== undefined}\n onChange={(e) => { setField('consent', e.currentTarget.checked) }}\n />\n <span>\n {t.magiclineConsent}{' '}\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {t.magiclinePrivacyLinkText}\n </a>.\n </span>\n </label>\n\n {consentError !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{consentError}</div>\n ) : null}\n </>\n )\n}\n\n// ── Reusable field primitives ────────────────────────────────────────────────\n\ninterface TextFieldProps {\n label: string\n value: string\n fieldKey: keyof TrialFormFields\n type?: string\n required?: boolean\n disabled: boolean\n error: string | undefined\n onInput: (value: string) => void\n}\n\nfunction TextField({\n label,\n value,\n fieldKey,\n type = 'text',\n required = false,\n disabled,\n error,\n onInput,\n}: TextFieldProps) {\n const describedBy = error !== undefined ? `jex-ml-err-${fieldKey}` : undefined\n return (\n <div class=\"jex-magicline-field\">\n <input\n class=\"jex-form-input\"\n type={type}\n aria-label={label}\n placeholder={label}\n value={value}\n required={required}\n disabled={disabled}\n aria-invalid={error !== undefined}\n aria-describedby={describedBy}\n onInput={(e) => { onInput(e.currentTarget.value) }}\n />\n {error !== undefined ? (\n <span id={describedBy} class=\"jex-magicline-error\" role=\"alert\">{error}</span>\n ) : null}\n </div>\n )\n}\n\ninterface SelectOption {\n value: string\n label: string\n}\n\ninterface SelectFieldProps {\n label: string\n value: string\n required: boolean\n disabled: boolean\n placeholder: string\n error: string | undefined\n options: SelectOption[]\n onChange: (value: string) => void\n}\n\nfunction SelectField({\n label,\n value,\n required,\n disabled,\n placeholder,\n error,\n options,\n onChange,\n}: SelectFieldProps) {\n return (\n <div class=\"jex-magicline-field\">\n <select\n class=\"jex-form-input jex-magicline-select\"\n aria-label={label}\n value={value}\n required={required}\n disabled={disabled}\n aria-invalid={error !== undefined}\n onChange={(e) => { onChange(e.currentTarget.value) }}\n >\n {/* a disabled placeholder makes an OPTIONAL select un-clearable,\n so only render it disabled when the field is required. */}\n <option value=\"\" disabled={required}>{placeholder}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>{option.label}</option>\n ))}\n </select>\n {error !== undefined ? (\n <span class=\"jex-magicline-error\" role=\"alert\">{error}</span>\n ) : null}\n </div>\n )\n}\n\n// ── Pure helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Label for a config-driven field: appends the localised \"(optional)\" suffix\n * when the studio's plan does NOT mark the field as required, so the visible\n * label always matches the actual validation behaviour.\n */\nfunction optionalLabel(label: string, required: boolean, t: WidgetStrings): string {\n return required ? label : label + t.magiclineOptionalSuffix\n}\n\n/** Localised step title for the wizard header. */\nfunction stepTitleFor(step: WizardStep, t: WidgetStrings): string {\n switch (step) {\n case 'trainer': {\n return t.magiclineStepTrainer\n }\n case 'slot': {\n return t.magiclineStepSlot\n }\n case 'personal': {\n return t.magiclineStepPersonal\n }\n case 'address': {\n return t.magiclineStepAddress\n }\n case 'confirm': {\n return t.magiclineStepConfirm\n }\n default: {\n return ''\n }\n }\n}\n\n/** Resolve a config status CODE to a localised message at render time. */\nfunction resolveConfigMessage(\n code: ConfigStatusCode,\n backendMessage: string,\n t: WidgetStrings,\n): string {\n if (backendMessage.trim() !== '') {\n return backendMessage\n }\n if (code === 'unsupported') {\n return t.magiclineConfigUnsupported\n }\n if (code === 'inconsistent') {\n return t.magiclineConfigInconsistent\n }\n return t.magiclineConfigUnavailable\n}\n\n/**\n * Build the LOWERCASE field bag for `submitForm`. Only includes fields the plan\n * collects; firstname/lastname/slotId/trainerRequired/privacyConsent always\n * present. Mirrors the v2 payload exactly (no backend contract change).\n */\nfunction buildFieldBag(\n plan: TrialConfigPlan,\n fields: TrialFormFields,\n): Record<string, string | number | boolean | null> {\n const bag: Record<string, string | number | boolean | null> = {\n firstname: fields.firstName.trim(),\n lastname: fields.lastName.trim(),\n slotId: fields.slotId,\n trainerRequired: fields.trainerRequired,\n privacyConsent: fields.consent,\n }\n if (plan.email.visible && fields.email.trim() !== '') {\n bag.email = fields.email.trim()\n }\n if (plan.phone.visible && fields.phone.trim() !== '') {\n bag.phone = fields.phone.trim()\n }\n if (plan.dateOfBirth.visible && fields.birthDate.trim() !== '') {\n bag.dateOfBirth = fields.birthDate.trim()\n }\n if (plan.gender.visible && fields.gender !== '') {\n bag.gender = fields.gender\n }\n if (plan.address.visible) {\n if (fields.street.trim() !== '') {\n bag.street = fields.street.trim()\n }\n if (fields.houseNumber.trim() !== '') {\n bag.houseNumber = fields.houseNumber.trim()\n }\n if (fields.city.trim() !== '') {\n bag.city = fields.city.trim()\n }\n if (fields.country !== '') {\n bag.country = fields.country\n }\n }\n if (plan.zip.visible && fields.zip.trim() !== '') {\n bag.zip = fields.zip.trim()\n }\n if (fields.note.trim() !== '') {\n bag.note = fields.note.trim()\n }\n return bag\n}\n\n/** Localised label for a gender enum value. */\nfunction genderLabel(value: 'MALE' | 'FEMALE' | 'UNISEX', t: WidgetStrings): string {\n if (value === 'MALE') {\n return t.magiclineGenderMale\n }\n if (value === 'FEMALE') {\n return t.magiclineGenderFemale\n }\n return t.magiclineGenderUnisex\n}\n\n/**\n * Human-readable label for a Magicline slot start time. Magicline returns\n * either a zoned ISO string like `2026-06-12T08:00:00.000+02:00[Europe/Berlin]`\n * — the non-standard `[Zone]` suffix breaks `Date` parsing in some engines, so\n * it is stripped and used as the display zone — or a bare UTC instant like\n * `2026-06-10T16:00:00.000Z` (older tenants), which must be shown in the\n * STUDIO's timezone, not the viewer's. Display-zone precedence:\n *\n * slot's own `[Zone]` bracket → `studioZoneId` (stored on the connection)\n * → viewer-local last resort.\n *\n * A short zone name is appended. Falls back to the raw value if unparseable.\n *\n * The BCP-47 locale tag is threaded in from the widget locale signal\n * (`de` → `de-DE`, `en` → `en-GB`) so a German UI never shows English dates.\n * The submitted slot value remains the raw `startDateTime` — only the label is\n * formatted here.\n */\nfunction formatSlot(\n startDateTime: string,\n widgetLocale: 'en' | 'de',\n studioZoneId?: string | null,\n): string {\n const bcp47 = widgetLocale === 'de' ? 'de-DE' : 'en-GB'\n const zoneMatch = startDateTime.match(/\\[([^\\]]+)\\]\\s*$/)\n const ianaZone = zoneMatch ? zoneMatch[1] : (studioZoneId ?? undefined)\n const parseable = startDateTime.replace(/\\[[^\\]]+\\]\\s*$/, '')\n const date = new Date(parseable)\n if (Number.isNaN(date.getTime())) {\n return startDateTime\n }\n try {\n return date.toLocaleString(bcp47, {\n weekday: 'short',\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n ...(ianaZone ? { timeZone: ianaZone, timeZoneName: 'short' } : { timeZoneName: 'short' }),\n })\n } catch {\n // invalid IANA zone for this engine — keep timeZoneName, drop zone.\n return date.toLocaleString(bcp47, {\n weekday: 'short',\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n timeZoneName: 'short',\n })\n }\n}\n","import { useCallback, useEffect, useMemo, useReducer, useRef } from 'preact/hooks'\nimport {\n useRateBundles,\n useContractPreview,\n type ContractFlatFee,\n type ContractPeriod,\n type ContractPreviewModule,\n type ContractPreviewResult,\n type ContractVolume,\n type ContractVoucher,\n type RateBundleTermCard,\n} from '../../hooks/useMagicline'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Offers lifecycle. `empty` (healthy, zero eligible terms) is split from\n * `error` (unavailable / network rejection) so the Offer step shows a friendly\n * no-offers message on `empty` and a Retry affordance on `error`.\n */\nexport type OffersState =\n | { phase: 'loading' }\n | { phase: 'ready'; terms: RateBundleTermCard[]; allowVoucherCodes: boolean }\n | { phase: 'empty' }\n | { phase: 'error' }\n\n/**\n * Server-resolved pricing for the Review step. Fetched on entering Review and\n * re-fetched after a `price_changed` outcome. The `fingerprint` is replayed to\n * the submit action so the backend can confirm the price the visitor saw.\n */\nexport interface ContractPricing {\n basePrice: number\n preUseCharge: number\n currencyCode: string\n flatFees: ContractFlatFee[]\n modules: ContractPreviewModule[]\n contractVolume: ContractVolume | null\n startDate: string\n /** Payment frequency of the revalidated term; renders the base-price period. */\n paymentFrequency: ContractPeriod\n fingerprint: string\n}\n\n/**\n * Preview lifecycle. `idle` is the pre-Review state (no fetch yet). A non-ok\n * preview status is surfaced as the `error` phase carrying the status code so\n * the view can route an `offer_unavailable` back to the Offer step.\n */\nexport type PreviewState =\n | { phase: 'idle' }\n | { phase: 'loading' }\n // A re-price in flight while we already have a ready quote (voucher apply /\n // clear / retry). Carries the last-known pricing so the Review layout stays\n // rendered (dimmed) instead of collapsing to a bare loading hint and jumping.\n | { phase: 'reloading'; pricing: ContractPricing }\n | { phase: 'ready'; pricing: ContractPricing }\n | {\n phase: 'error'\n code: 'consent_required' | 'invalid_fields' | 'offer_unavailable' | 'unavailable'\n }\n\n/** Personal detail fields — all required by the backend. */\nexport interface ContractPersonalFields {\n firstName: string\n lastName: string\n email: string\n dateOfBirth: string\n gender: string\n phone: string\n}\n\n/** Address fields — country is a static \"Deutschland\"/\"Germany\", not collected. */\nexport interface ContractAddressFields {\n street: string\n houseNumber: string\n zipCode: string\n city: string\n}\n\n/**\n * Payment fields. `accountHolderTouched` tracks whether the visitor has edited\n * the account holder so the firstname+lastname prefill only auto-fills once and\n * never clobbers a manual edit. The IBAN lives ONLY here, in memory — it is\n * never persisted to sessionStorage and never logged.\n */\nexport interface ContractPaymentFields {\n accountHolder: string\n accountHolderTouched: boolean\n iban: string\n}\n\n/** Consent flags — both must be accepted before submit. */\nexport interface ContractConsentFields {\n privacy: boolean\n sepa: boolean\n}\n\nexport interface ContractFormFields {\n termId: number | null\n /** Chosen paid optional-module ids for the current term. */\n selectedModuleIds: number[]\n /**\n * Acceptance of required confirmations, keyed by ackKey. Carries both contract\n * text-block acknowledgements and selected-module consents — a single source\n * of truth for every gating tick across the wizard.\n */\n acknowledgedBlocks: Record<string, boolean>\n personal: ContractPersonalFields\n address: ContractAddressFields\n payment: ContractPaymentFields\n consents: ContractConsentFields\n}\n\nconst INITIAL_FIELDS: ContractFormFields = {\n termId: null,\n selectedModuleIds: [],\n acknowledgedBlocks: {},\n personal: {\n firstName: '',\n lastName: '',\n email: '',\n dateOfBirth: '',\n gender: '',\n phone: '',\n },\n address: {\n street: '',\n houseNumber: '',\n zipCode: '',\n city: '',\n },\n payment: {\n accountHolder: '',\n accountHolderTouched: false,\n iban: '',\n },\n consents: {\n privacy: false,\n sepa: false,\n },\n}\n\ntype FieldAction =\n | { type: 'setTermId'; termId: number }\n | { type: 'setPersonal'; key: keyof ContractPersonalFields; value: string }\n | { type: 'setAddress'; key: keyof ContractAddressFields; value: string }\n /** Add/remove a paid optional module; deselecting clears its consent ack too. */\n | { type: 'toggleModule'; moduleId: number; selected: boolean; consentAckKey?: string }\n | { type: 'setBlockAck'; ackKey: string; value: boolean }\n /** A manual account-holder edit also flips the `touched` guard. */\n | { type: 'setAccountHolder'; value: string }\n | { type: 'setIban'; value: string }\n | { type: 'setConsent'; key: keyof ContractConsentFields; value: boolean }\n /** Clears the IBAN after a retryable submit failure (never reused). */\n | { type: 'clearIban' }\n /** Clears the selected term so a stale selection does not survive an offer refetch. */\n | { type: 'clearTermId' }\n /** Auto-prefill the account holder once both names are filled + untouched. */\n | { type: 'prefillAccountHolder'; value: string }\n\nfunction fieldsReducer(state: ContractFormFields, action: FieldAction): ContractFormFields {\n switch (action.type) {\n case 'setTermId': {\n // A different term carries different modules/blocks — reset selections and\n // all acknowledgements (module consents + contract-block confirmations).\n if (state.termId === action.termId) {\n return state\n }\n return {\n ...state,\n termId: action.termId,\n selectedModuleIds: [],\n acknowledgedBlocks: {},\n }\n }\n case 'toggleModule': {\n if (action.selected) {\n if (state.selectedModuleIds.includes(action.moduleId)) {\n return state\n }\n return {\n ...state,\n selectedModuleIds: [...state.selectedModuleIds, action.moduleId],\n }\n }\n // Deselect: drop the id AND clear its consent ack so a stale tick cannot\n // survive a re-add (the visitor must re-accept the terms).\n const nextAcks = { ...state.acknowledgedBlocks }\n if (action.consentAckKey !== undefined) {\n delete nextAcks[action.consentAckKey]\n }\n return {\n ...state,\n selectedModuleIds: state.selectedModuleIds.filter((id) => id !== action.moduleId),\n acknowledgedBlocks: nextAcks,\n }\n }\n case 'setBlockAck': {\n return {\n ...state,\n acknowledgedBlocks: { ...state.acknowledgedBlocks, [action.ackKey]: action.value },\n }\n }\n case 'setPersonal': {\n return { ...state, personal: { ...state.personal, [action.key]: action.value } }\n }\n case 'setAddress': {\n return { ...state, address: { ...state.address, [action.key]: action.value } }\n }\n case 'setAccountHolder': {\n return {\n ...state,\n payment: { ...state.payment, accountHolder: action.value, accountHolderTouched: true },\n }\n }\n case 'setIban': {\n return { ...state, payment: { ...state.payment, iban: action.value } }\n }\n case 'setConsent': {\n return { ...state, consents: { ...state.consents, [action.key]: action.value } }\n }\n case 'clearIban': {\n return { ...state, payment: { ...state.payment, iban: '' } }\n }\n case 'clearTermId': {\n return {\n ...state,\n termId: null,\n selectedModuleIds: [],\n acknowledgedBlocks: {},\n }\n }\n case 'prefillAccountHolder': {\n // Only prefill an untouched, empty field — never clobber a manual entry.\n if (state.payment.accountHolderTouched || state.payment.accountHolder !== '') {\n return state\n }\n return { ...state, payment: { ...state.payment, accountHolder: action.value } }\n }\n default: {\n return state\n }\n }\n}\n\n// ── Voucher state ────────────────────────────────────────────────────────────\n\n/**\n * Lifecycle status for an in-progress or resolved voucher application.\n * - `idle` — no voucher attempt yet (or after CLEAR_VOUCHER).\n * - `applying` — backend call in-flight.\n * - `applied` — a valid voucher is active and its discount shows in the quote.\n * - `invalid` — the code was rejected by the backend (`voucher_invalid`).\n * - `disabled` — vouchers are turned off for this studio (`voucher_disabled`).\n */\nexport type VoucherStatus = 'idle' | 'applying' | 'applied' | 'invalid' | 'disabled'\n\n/**\n * All mutable voucher fields held alongside the contract form. Kept in a\n * dedicated reducer so voucher concerns are isolated and easy to delete.\n *\n * `voucherUnavailable` is session-sticky: once the backend returns\n * `voucher_disabled`, no further voucher UI is shown for this session.\n *\n * `voucherRequestId` is a monotonic counter bumped on every VOUCHER_APPLYING\n * dispatch. VOUCHER_APPLIED checks payload.requestId === state.voucherRequestId\n * before committing — any response carrying a stale id is silently discarded.\n */\nexport interface VoucherState {\n /** The string the visitor is currently typing into the voucher input. */\n draftVoucherCode: string\n /**\n * The code that was sent with the last successful preview fetch. Only set\n * when `voucherStatus === 'applied'`; cleared on any invalidation.\n */\n appliedVoucherCode: string | null\n /**\n * The parsed voucher block from the last successful apply response. Mirrors\n * `ContractVoucher` from `useMagicline` (excludes null — null means cleared).\n */\n appliedVoucher: Exclude<ContractVoucher, null> | null\n /** Current lifecycle status of the voucher attempt. */\n voucherStatus: VoucherStatus\n /**\n * Monotonic counter. Bumped by VOUCHER_APPLYING; VOUCHER_APPLIED only commits\n * when the payload requestId matches this value (stale-response discard).\n */\n voucherRequestId: number\n /**\n * Session-sticky flag. Set to `true` on VOUCHER_DISABLED and never cleared.\n * The UI uses this to permanently hide the voucher entry once the studio has\n * disabled vouchers.\n */\n voucherUnavailable: boolean\n}\n\nconst INITIAL_VOUCHER_STATE: VoucherState = {\n draftVoucherCode: '',\n appliedVoucherCode: null,\n appliedVoucher: null,\n voucherStatus: 'idle',\n voucherRequestId: 0,\n voucherUnavailable: false,\n}\n\n/**\n * The ackKey namespace prefix for voucher-owned text-block acknowledgements.\n * Any key in `acknowledgedBlocks` matching this prefix belongs to the current\n * voucher and MUST be removed when the voucher is cleared/invalidated/disabled.\n */\nconst VOUCHER_ACK_PREFIX = 'voucher:'\n\n/** Returns a copy of `acknowledgedBlocks` with all `voucher:*` keys removed. */\nfunction dropVoucherAcks(acknowledgedBlocks: Record<string, boolean>): Record<string, boolean> {\n const next: Record<string, boolean> = {}\n for (const key of Object.keys(acknowledgedBlocks)) {\n if (!key.startsWith(VOUCHER_ACK_PREFIX)) {\n next[key] = acknowledgedBlocks[key] as boolean\n }\n }\n return next\n}\n\ntype VoucherAction =\n /** Visitor edits the voucher input field. If a voucher is currently applied,\n * clears it (and its acks) so a stale discount cannot survive an edit. */\n | { type: 'SET_VOUCHER_DRAFT'; value: string }\n /**\n * Fired just before the backend call is dispatched. Bumps `voucherRequestId`\n * so any in-flight response from the previous attempt is discarded when it\n * resolves.\n */\n | { type: 'VOUCHER_APPLYING' }\n /**\n * Fired when the backend responds with a valid voucher. Only committed if\n * `payload.requestId === state.voucherRequestId` — otherwise silently dropped\n * as a stale response.\n *\n * `voucherAckKeys` carries the ackKeys from the voucher's `textBlocks` that\n * require confirmation. These are seeded into `acknowledgedBlocks` as `false`\n * (unticked) so the allAcknowledged gate correctly blocks submit until the\n * visitor ticks them.\n */\n | {\n type: 'VOUCHER_APPLIED'\n requestId: number\n voucher: Exclude<ContractVoucher, null>\n appliedCode: string\n voucherAckKeys: string[]\n }\n /**\n * Fired when the backend returns `voucher_invalid`. Clears the applied voucher\n * and its acks; visitor can edit and retry.\n */\n | { type: 'VOUCHER_INVALID' }\n /**\n * Fired when the backend returns `voucher_disabled`. Clears applied voucher +\n * its acks, sets `voucherUnavailable=true` so the UI hides the section.\n */\n | { type: 'VOUCHER_DISABLED' }\n /**\n * Reverts to the no-voucher state (visitor clicks \"Remove\"). Clears applied\n * voucher + its acks, resets status to `idle`.\n */\n | { type: 'CLEAR_VOUCHER' }\n\n/**\n * Voucher-specific reducer. Manages all voucher lifecycle state independently\n * of the form-fields reducer. Cross-concerns (dropping voucher acks from\n * `acknowledgedBlocks`) are handled here by also updating the fields state via\n * a separate `dropVoucherAcksFromFields` action dispatched to `fieldsReducer`.\n */\nfunction voucherReducer(state: VoucherState, action: VoucherAction): VoucherState {\n switch (action.type) {\n case 'SET_VOUCHER_DRAFT': {\n // If a voucher is currently applied and the visitor edits the draft, clear\n // the applied state immediately so a stale discount cannot survive.\n const clearApplied =\n state.appliedVoucher !== null || state.voucherStatus === 'applied'\n return {\n ...state,\n draftVoucherCode: action.value,\n ...(clearApplied\n ? {\n appliedVoucher: null,\n appliedVoucherCode: null,\n voucherStatus: 'idle',\n }\n : {}),\n }\n }\n case 'VOUCHER_APPLYING': {\n return {\n ...state,\n voucherStatus: 'applying',\n voucherRequestId: state.voucherRequestId + 1,\n }\n }\n case 'VOUCHER_APPLIED': {\n // Stale-response discard: only commit if the response matches the latest\n // request id. Any older response arriving out of order is ignored.\n if (action.requestId !== state.voucherRequestId) {\n return state\n }\n return {\n ...state,\n appliedVoucher: action.voucher,\n appliedVoucherCode: action.appliedCode,\n voucherStatus: 'applied',\n }\n }\n case 'VOUCHER_INVALID': {\n return {\n ...state,\n appliedVoucher: null,\n appliedVoucherCode: null,\n voucherStatus: 'invalid',\n }\n }\n case 'VOUCHER_DISABLED': {\n return {\n ...state,\n appliedVoucher: null,\n appliedVoucherCode: null,\n voucherStatus: 'disabled',\n voucherUnavailable: true,\n }\n }\n case 'CLEAR_VOUCHER': {\n return {\n ...state,\n appliedVoucher: null,\n appliedVoucherCode: null,\n voucherStatus: 'idle',\n }\n }\n default: {\n return state\n }\n }\n}\n\n// ── Extended fieldsReducer: voucher ack invalidation on preview-input changes ─\n//\n// When the visitor changes a preview-relevant input (term, module selection,\n// or triggers a CLEAR_VOUCHER-adjacent path), the applied voucher's ackKeys\n// must be removed from `acknowledgedBlocks` so a stale discount cannot block\n// or accidentally pass the `allAcknowledged` gate.\n//\n// We handle this by adding a new `dropVoucherAcks` action type to the FIELDS\n// reducer. The voucher reducer's SET_VOUCHER_DRAFT, VOUCHER_INVALID,\n// VOUCHER_DISABLED, and CLEAR_VOUCHER cases also need the acks removed — the\n// callback wrappers dispatch this action to the fields reducer alongside the\n// voucher action.\n//\n// Additionally, `setTermId` and `clearTermId` already wipe all `acknowledgedBlocks`,\n// which implicitly drops voucher acks too (no special handling needed for those).\n\ntype FieldActionExtended =\n | FieldAction\n /** Removes all `voucher:*` keys from `acknowledgedBlocks`. Dispatched whenever\n * the applied voucher is cleared/invalidated so stale acks cannot persist. */\n | { type: 'dropVoucherAcks' }\n /**\n * Seeds voucher text-block ackKeys into `acknowledgedBlocks` as `false` (unticked).\n * Dispatched alongside VOUCHER_APPLIED so the allAcknowledged gate correctly\n * requires the visitor to confirm any voucher-specific text blocks.\n */\n | { type: 'seedVoucherAcks'; ackKeys: string[] }\n\nfunction fieldsReducerExtended(\n state: ContractFormFields,\n action: FieldActionExtended,\n): ContractFormFields {\n switch (action.type) {\n case 'dropVoucherAcks': {\n const next = dropVoucherAcks(state.acknowledgedBlocks)\n // If nothing changed, return the same reference to avoid re-renders.\n if (Object.keys(next).length === Object.keys(state.acknowledgedBlocks).length) {\n return state\n }\n return { ...state, acknowledgedBlocks: next }\n }\n case 'seedVoucherAcks': {\n if (action.ackKeys.length === 0) {\n return state\n }\n const next = { ...state.acknowledgedBlocks }\n for (const key of action.ackKeys) {\n // Only seed if not already present — preserve an existing true tick.\n if (!(key in next)) {\n next[key] = false\n }\n }\n return { ...state, acknowledgedBlocks: next }\n }\n default: {\n return fieldsReducer(state, action)\n }\n }\n}\n\nexport interface UseContractCreationStateOptions {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\nexport interface ContractCreationState {\n fields: ContractFormFields\n offersState: OffersState\n previewState: PreviewState\n /** The currently selected term card (or null when none is chosen). */\n selectedTerm: RateBundleTermCard | null\n /**\n * ackKeys that MUST be acknowledged before submit for the current term:\n * required text blocks ∪ the consents of SELECTED modules that carry one\n * ∪ any voucher text-block acks (when a voucher is applied).\n */\n requiredAckKeys: string[]\n /** True when every `requiredAckKeys` entry is currently acknowledged. */\n allAcknowledged: boolean\n // ── Voucher state (read) ──────────────────────────────────────────────────\n /** Current voucher lifecycle status. */\n voucherStatus: VoucherStatus\n /** The string currently typed into the voucher input. */\n draftVoucherCode: string\n /** The code tied to the currently displayed quote (set when `voucherStatus === 'applied'`). */\n appliedVoucherCode: string | null\n /**\n * Parsed voucher block from the last successful apply. Non-null only when\n * `voucherStatus === 'applied'`.\n */\n appliedVoucher: Exclude<ContractVoucher, null> | null\n /**\n * Session-sticky: true once the backend has returned `voucher_disabled`.\n * The UI hides the voucher section permanently when this is true.\n */\n voucherUnavailable: boolean\n // ── Field actions ─────────────────────────────────────────────────────────\n setTermId: (termId: number) => void\n setPersonal: (key: keyof ContractPersonalFields, value: string) => void\n setAddress: (key: keyof ContractAddressFields, value: string) => void\n /**\n * Add/remove a paid optional module from the current term. Pass the module's\n * consent ackKey so deselecting clears its acknowledgement in one dispatch.\n */\n toggleModule: (moduleId: number, selected: boolean, consentAckKey?: string) => void\n /** Set the acknowledgement for a contract block or module consent by ackKey. */\n setBlockAck: (ackKey: string, value: boolean) => void\n setAccountHolder: (value: string) => void\n setIban: (value: string) => void\n setConsent: (key: keyof ContractConsentFields, value: boolean) => void\n clearIban: () => void\n /** Clears the selected term so a stale selection does not survive an offer refetch. */\n clearTermId: () => void\n /** Re-run the offers fetch (Retry button + `offer_unavailable` recovery). */\n refetchOffers: () => void\n /** Fetch the server pricing for the selected term (called entering Review). */\n fetchPreview: () => void\n /** Reset the preview back to idle (e.g. when leaving Review). */\n resetPreview: () => void\n // ── Voucher actions ───────────────────────────────────────────────────────\n /** Update the voucher input field. Clears any currently applied voucher. */\n setVoucherDraft: (value: string) => void\n /**\n * Signal that the voucher backend call is starting. Bumps `voucherRequestId`\n * to enable stale-response discard for any concurrent in-flight request.\n * Returns the new requestId so the caller can include it in the VOUCHER_APPLIED\n * dispatch.\n */\n beginVoucherApply: () => number\n /**\n * Commit a successful voucher response. Only takes effect if `requestId`\n * matches the latest (stale responses are silently discarded). Updates\n * `previewState.pricing` to the voucher-inclusive pricing from the apply\n * response (fingerprint + discounted amounts) and seeds voucher ackKeys into\n * `acknowledgedBlocks` as unticked.\n */\n commitVoucherApplied: (options: {\n requestId: number\n voucher: Exclude<ContractVoucher, null>\n appliedCode: string\n voucherAckKeys: string[]\n /** Voucher-inclusive pricing from the same getContractPreview response. */\n pricing: ContractPricing\n }) => void\n /** Mark the current code as invalid and clear the applied state. */\n markVoucherInvalid: () => void\n /** Mark vouchers as disabled for this session (session-sticky). */\n markVoucherDisabled: () => void\n /** Remove the applied voucher and revert to a no-voucher quote. */\n clearVoucher: () => void\n}\n\n/**\n * Single fetch-once container for the membership-signup wizard.\n *\n * - Offers are fetched ONCE on mount and again on `refetchOffers` (Retry /\n * `offer_unavailable` recovery). A `offersKey` counter drives the effect.\n * - The preview is NOT fetched until `fetchPreview` runs (entering Review). A\n * `previewKey` counter re-runs it for `price_changed` recovery.\n * - The account holder auto-prefills from firstname+lastname the first time both\n * are present and the field is still untouched.\n *\n * The IBAN is held only in this hook's in-memory reducer state — it is never\n * written to sessionStorage and never logged.\n */\nexport function useContractCreationState({\n sessionId,\n visitorId,\n}: UseContractCreationStateOptions): ContractCreationState {\n const getRateBundles = useRateBundles()\n const getContractPreview = useContractPreview()\n\n const [fields, dispatch] = useReducer(fieldsReducerExtended, INITIAL_FIELDS)\n const [voucherState, dispatchVoucher] = useReducer(voucherReducer, INITIAL_VOUCHER_STATE)\n const [offersState, setOffersState] = useReducer(\n (_prev: OffersState, next: OffersState) => next,\n { phase: 'loading' } satisfies OffersState,\n )\n // The last-known ready pricing, tracked in a ref so the preview effect can\n // show a `reloading` state (dimmed existing layout) on a re-price instead of\n // collapsing to a bare loading hint. Kept current by `applyPreviewState`.\n const lastReadyPricingRef = useRef<ContractPricing | null>(null)\n const [previewState, dispatchPreviewState] = useReducer(\n (_prev: PreviewState, next: PreviewState) => next,\n { phase: 'idle' } satisfies PreviewState,\n )\n const setPreviewState = useCallback((next: PreviewState) => {\n if (next.phase === 'ready') {\n lastReadyPricingRef.current = next.pricing\n } else if (next.phase === 'idle' || next.phase === 'error') {\n lastReadyPricingRef.current = null\n }\n dispatchPreviewState(next)\n }, [])\n const [offersKey, bumpOffers] = useReducer((n: number) => n + 1, 0)\n const [previewKey, bumpPreview] = useReducer((n: number) => n + 1, 0)\n\n const setTermId = useCallback((termId: number) => {\n dispatch({ type: 'setTermId', termId })\n // A term change resets ALL acks (including voucher: ones) and invalidates\n // the current quote — clear the applied voucher so a stale discount cannot\n // survive into the new term's preview.\n dispatchVoucher({ type: 'CLEAR_VOUCHER' })\n }, [])\n\n const setPersonal = useCallback((key: keyof ContractPersonalFields, value: string) => {\n dispatch({ type: 'setPersonal', key, value })\n }, [])\n\n const setAddress = useCallback((key: keyof ContractAddressFields, value: string) => {\n dispatch({ type: 'setAddress', key, value })\n }, [])\n\n const toggleModule = useCallback((moduleId: number, selected: boolean, consentAckKey?: string) => {\n dispatch({ type: 'toggleModule', moduleId, selected, consentAckKey })\n // Module selection changes affect pricing — invalidate any applied voucher\n // so the stale discount cannot persist into a repriced quote.\n dispatch({ type: 'dropVoucherAcks' })\n dispatchVoucher({ type: 'CLEAR_VOUCHER' })\n }, [])\n\n const setBlockAck = useCallback((ackKey: string, value: boolean) => {\n dispatch({ type: 'setBlockAck', ackKey, value })\n }, [])\n\n const setAccountHolder = useCallback((value: string) => {\n dispatch({ type: 'setAccountHolder', value })\n }, [])\n\n const setIban = useCallback((value: string) => {\n dispatch({ type: 'setIban', value })\n }, [])\n\n const setConsent = useCallback((key: keyof ContractConsentFields, value: boolean) => {\n dispatch({ type: 'setConsent', key, value })\n }, [])\n\n const clearIban = useCallback(() => {\n dispatch({ type: 'clearIban' })\n }, [])\n\n const clearTermId = useCallback(() => {\n dispatch({ type: 'clearTermId' })\n // clearTermId wipes all acks (including voucher: ones) — also clear the\n // applied voucher so the stale discount is removed from the voucher reducer.\n dispatchVoucher({ type: 'CLEAR_VOUCHER' })\n }, [])\n\n const setVoucherDraft = useCallback((value: string) => {\n dispatchVoucher({ type: 'SET_VOUCHER_DRAFT', value })\n // If a voucher was applied, SET_VOUCHER_DRAFT clears it in the voucher\n // reducer. Drop its acks from the fields reducer too so the gate stays consistent.\n dispatch({ type: 'dropVoucherAcks' })\n }, [])\n\n // The latest issued voucher-apply request id, tracked in a ref so the\n // begin/commit callbacks never read a stale closure value. `beginVoucherApply`\n // bumps it synchronously and `commitVoucherApplied` compares against the live\n // ref — without this, an apply whose response resolves before React re-renders\n // (e.g. a fast/cached preview) would fail the stale-closure guard and silently\n // commit nothing (empty display + Submit stuck disabled).\n const voucherRequestIdRef = useRef(INITIAL_VOUCHER_STATE.voucherRequestId)\n\n const beginVoucherApply = useCallback((): number => {\n const nextId = voucherRequestIdRef.current + 1\n voucherRequestIdRef.current = nextId\n dispatchVoucher({ type: 'VOUCHER_APPLYING' })\n return nextId\n }, [])\n\n const commitVoucherApplied = useCallback(\n (options: {\n requestId: number\n voucher: Exclude<ContractVoucher, null>\n appliedCode: string\n voucherAckKeys: string[]\n /** Voucher-inclusive pricing from the same getContractPreview response. */\n pricing: ContractPricing\n }) => {\n // Stale-response discard against the LIVE request id (ref, not a stale\n // closure). An older response arriving out of order is ignored, and we\n // must not update previewState either — the two updates stay atomic.\n if (options.requestId !== voucherRequestIdRef.current) {\n return\n }\n dispatchVoucher({\n type: 'VOUCHER_APPLIED',\n requestId: options.requestId,\n voucher: options.voucher,\n appliedCode: options.appliedCode,\n voucherAckKeys: options.voucherAckKeys,\n })\n // Update previewState with the voucher-inclusive pricing (fingerprint +\n // discounted amounts) from the SAME apply response. Without this the\n // submitted fingerprint is the no-voucher base fingerprint which the\n // backend always rejects as price_changed.\n setPreviewState({ phase: 'ready', pricing: options.pricing })\n // Seed voucher ackKeys into acknowledgedBlocks as unticked (false) so\n // allAcknowledged correctly gates submit until the visitor confirms them.\n dispatch({ type: 'seedVoucherAcks', ackKeys: options.voucherAckKeys })\n },\n [],\n )\n\n const markVoucherInvalid = useCallback(() => {\n dispatchVoucher({ type: 'VOUCHER_INVALID' })\n dispatch({ type: 'dropVoucherAcks' })\n // The voucher-inclusive pricing is now stale — restore the no-voucher\n // pricing by re-running the base preview (no voucherCode).\n bumpPreview()\n }, [])\n\n const markVoucherDisabled = useCallback(() => {\n dispatchVoucher({ type: 'VOUCHER_DISABLED' })\n dispatch({ type: 'dropVoucherAcks' })\n // Same restore: re-run the base preview to get the no-voucher fingerprint.\n bumpPreview()\n }, [])\n\n const clearVoucher = useCallback(() => {\n dispatchVoucher({ type: 'CLEAR_VOUCHER' })\n dispatch({ type: 'dropVoucherAcks' })\n // Visitor removed the voucher — restore no-voucher pricing by re-running\n // the base preview so the submitted fingerprint is no longer voucher-inclusive.\n bumpPreview()\n }, [])\n\n const refetchOffers = useCallback(() => {\n bumpOffers()\n }, [])\n\n const resetPreview = useCallback(() => {\n setPreviewState({ phase: 'idle' })\n }, [])\n\n const fetchPreview = useCallback(() => {\n bumpPreview()\n }, [])\n\n // ── Resolve the selected term from the loaded offer list. ───────────────────\n const selectedTerm =\n offersState.phase === 'ready' && fields.termId !== null\n ? (offersState.terms.find((term) => term.termId === fields.termId) ?? null)\n : null\n\n // ── Required acknowledgements for the current term. ─────────────────────────\n // Required text blocks plus the consent ackKey of each SELECTED module that\n // carries one, plus the ackKeys from any currently applied voucher's textBlocks.\n // `allAcknowledged` gates the Review submit button.\n const { selectedModuleIds, acknowledgedBlocks } = fields\n const { appliedVoucher } = voucherState\n const requiredAckKeys = useMemo(() => {\n if (selectedTerm === null) {\n return []\n }\n const keys = new Set<string>()\n for (const block of selectedTerm.textBlocks) {\n if (block.isConfirmationRequired) {\n keys.add(block.ackKey)\n }\n }\n for (const moduleId of selectedModuleIds) {\n const module = selectedTerm.optionalModules.find((m) => m.id === moduleId)\n if (module?.consent) {\n keys.add(module.consent.ackKey)\n }\n }\n // Include ackKeys from the active voucher's textBlocks (all are required).\n if (appliedVoucher !== null) {\n for (const block of appliedVoucher.textBlocks) {\n keys.add(block.ackKey)\n }\n }\n return [...keys]\n }, [selectedTerm, selectedModuleIds, appliedVoucher])\n\n const allAcknowledged = useMemo(\n () => requiredAckKeys.every((key) => acknowledgedBlocks[key] === true),\n [requiredAckKeys, acknowledgedBlocks],\n )\n\n // ── Account holder prefill: once both names are present + untouched. ────────\n const { firstName, lastName } = fields.personal\n const { accountHolder, accountHolderTouched } = fields.payment\n useEffect(() => {\n if (accountHolderTouched || accountHolder !== '') {\n return\n }\n if (firstName.trim() !== '' && lastName.trim() !== '') {\n dispatch({\n type: 'prefillAccountHolder',\n value: `${firstName.trim()} ${lastName.trim()}`,\n })\n }\n }, [firstName, lastName, accountHolder, accountHolderTouched])\n\n // ── Offers: fetch ONCE on mount + on every `offersKey` bump. ────────────────\n useEffect(() => {\n let cancelled = false\n setOffersState({ phase: 'loading' })\n void (async () => {\n try {\n const result = await getRateBundles({ sessionId, visitorId })\n if (cancelled) {\n return\n }\n if (result.status === 'ok') {\n if (result.terms.length > 0) {\n setOffersState({ phase: 'ready', terms: result.terms, allowVoucherCodes: result.allowVoucherCodes })\n } else {\n setOffersState({ phase: 'empty' })\n }\n } else {\n setOffersState({ phase: 'error' })\n }\n } catch {\n if (!cancelled) {\n setOffersState({ phase: 'error' })\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [getRateBundles, sessionId, visitorId, offersKey])\n\n // ── Preview: only when `previewKey` advances (entering Review / re-price). ──\n // `previewKey === 0` is the idle baseline; the first fetch is `fetchPreview`.\n useEffect(() => {\n if (previewKey === 0) {\n return\n }\n const term = selectedTerm\n if (!term) {\n setPreviewState({ phase: 'error', code: 'offer_unavailable' })\n return\n }\n let cancelled = false\n // If we already have a ready quote, keep showing it (dimmed) during the\n // re-price rather than tearing the layout down to a loading hint.\n const prior = lastReadyPricingRef.current\n setPreviewState(prior !== null ? { phase: 'reloading', pricing: prior } : { phase: 'loading' })\n const startDate = term.defaultContractStartDate ?? ''\n const previewArgs = {\n sessionId,\n visitorId,\n termId: term.termId,\n startDate,\n fields: {\n firstname: fields.personal.firstName.trim(),\n lastname: fields.personal.lastName.trim(),\n email: fields.personal.email.trim(),\n dateOfBirth: fields.personal.dateOfBirth.trim(),\n gender: fields.personal.gender,\n phone: fields.personal.phone.trim(),\n street: fields.address.street.trim(),\n houseNumber: fields.address.houseNumber.trim(),\n zipCode: fields.address.zipCode.trim(),\n city: fields.address.city.trim(),\n },\n // Only modules still offered by the (re-fetched) term are sent; a vanished\n // module is dropped by the term-change reset before this runs.\n selectedModuleIds: term.optionalModules\n .filter((module) => fields.selectedModuleIds.includes(module.id))\n .map((module) => module.id),\n privacyConsent: fields.consents.privacy,\n sepaConsent: fields.consents.sepa,\n }\n void (async () => {\n try {\n const result: ContractPreviewResult = await getContractPreview(previewArgs)\n if (cancelled) {\n return\n }\n if (result.status === 'ok') {\n setPreviewState({\n phase: 'ready',\n pricing: {\n basePrice: result.basePrice,\n preUseCharge: result.preUseCharge,\n currencyCode: result.currencyCode,\n flatFees: result.flatFees,\n modules: result.modules,\n contractVolume: result.contractVolume,\n startDate: result.startDate,\n paymentFrequency: result.paymentFrequency,\n fingerprint: result.pricingFingerprint,\n },\n })\n } else {\n setPreviewState({ phase: 'error', code: result.status })\n }\n } catch {\n if (!cancelled) {\n setPreviewState({ phase: 'error', code: 'unavailable' })\n }\n }\n })()\n return () => {\n cancelled = true\n }\n // The selected term + field values are read at fetch time; the fetch is\n // deliberately gated on an explicit `previewKey` bump (entering Review /\n // re-pricing) so editing a field never auto-refetches the preview.\n }, [previewKey, getContractPreview, sessionId, visitorId])\n\n return {\n fields,\n offersState,\n previewState,\n selectedTerm,\n requiredAckKeys,\n allAcknowledged,\n /**\n * Server-authoritative flag: true only when the server confirmed\n * `allowVoucherCodes` in the getRateBundles ok-result. Defaults to false\n * (fail-closed) while loading or on error.\n */\n serverAllowVoucherCodes: offersState.phase === 'ready' ? offersState.allowVoucherCodes : false,\n // Voucher state (read)\n voucherStatus: voucherState.voucherStatus,\n draftVoucherCode: voucherState.draftVoucherCode,\n appliedVoucherCode: voucherState.appliedVoucherCode,\n appliedVoucher: voucherState.appliedVoucher,\n voucherUnavailable: voucherState.voucherUnavailable,\n // Field actions\n setTermId,\n setPersonal,\n setAddress,\n toggleModule,\n setBlockAck,\n setAccountHolder,\n setIban,\n setConsent,\n clearIban,\n clearTermId,\n refetchOffers,\n fetchPreview,\n resetPreview,\n // Voucher actions\n setVoucherDraft,\n beginVoucherApply,\n commitVoucherApplied,\n markVoucherInvalid,\n markVoucherDisabled,\n clearVoucher,\n }\n}\n","import { useMemo, useState } from 'preact/hooks'\nimport { locale, useLocale } from '../../../../i18n/index'\nimport {\n useSubmitContractCreation,\n useContractPreview,\n type ContractFlatFee,\n type ContractOptionalModule,\n type ContractSubmitResult,\n type ContractVoucher,\n type RateBundleTermCard,\n} from '../../hooks/useMagicline'\nimport {\n formatContractDate,\n formatContractMoney,\n formatContractPeriod,\n formatModulePrice,\n formatModuleRenewal,\n formatPaymentFrequency,\n formatVoucherDiscount,\n isValidEmail,\n isValidIban,\n localizeFeeName,\n maskIban,\n resolvePrivacyUrl,\n todayIsoDate,\n} from './formUtils'\nimport { GENDER_VALUES } from './magiclineConstants'\nimport {\n useContractCreationState,\n type ContractAddressFields,\n type ContractFormFields,\n type ContractPersonalFields,\n type ContractPricing,\n type OffersState,\n type PreviewState,\n type VoucherStatus,\n} from './useContractCreationState'\nimport type { WidgetStrings } from '../../../../i18n/locales/en'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Wizard steps for the membership-signup flow. `upgrades` is conditional —\n * `buildWizardSteps` inserts it after `offer` only when the chosen term has at\n * least one paid optional module.\n */\ntype ContractStep = 'offer' | 'upgrades' | 'personal' | 'address' | 'payment' | 'review'\n\n/**\n * Build the active step list for the chosen term: the `upgrades` step is\n * present only when that term offers ≥1 optional module.\n */\nfunction buildWizardSteps(term: RateBundleTermCard | null): ContractStep[] {\n const hasUpgrades = term !== null && term.optionalModules.length > 0\n return hasUpgrades\n ? ['offer', 'upgrades', 'personal', 'address', 'payment', 'review']\n : ['offer', 'personal', 'address', 'payment', 'review']\n}\n\n/** Per-field error keys spanning every step. */\ntype ContractFieldErrors = Partial<Record<string, string>>\n\ninterface ContractCreationFormProps {\n formMessageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n projectId: Id<'projects'>\n /**\n * The reactive form-row status. The submit flips this to `submitted` at claim\n * time, so the LIVE result envelope (held in component state) always wins; this\n * is only consulted when there is no live result — i.e. a resumed/cold session\n * landing on an already-terminal row.\n */\n formStatus: 'open' | 'submitted' | 'failed'\n}\n\n/**\n * Inline Magicline membership-signup STEP WIZARD. Renders the contract-creation\n * flow as internal steps inside ONE chat card:\n *\n * Offer → Personal → Address → Payment → Review\n *\n * All form state (offers, selected term, personal/address/payment fields,\n * consents, server preview) lives in `useContractCreationState`, mounted ONCE\n * here above the step switch so navigating steps never refetches offers.\n *\n * The submit action is synchronous and authoritative: it claims the submission\n * (which flips the form row to `submitted` reactively), then dispatches and\n * returns a result envelope. Because the reactive flip would otherwise unmount\n * this form mid-await, the component owns its OWN `submitResult` and renders the\n * success / terminal UI from the returned envelope — `MagiclineFormMessage`\n * keeps this form mounted while it owns a live result.\n */\nexport function ContractCreationForm({\n formMessageId,\n sessionId,\n visitorId,\n projectId,\n formStatus,\n}: ContractCreationFormProps) {\n const t = useLocale()\n const widgetLocale = locale.value\n const submitContract = useSubmitContractCreation()\n const getContractPreview = useContractPreview()\n const state = useContractCreationState({ sessionId, visitorId })\n const {\n fields,\n offersState,\n previewState,\n selectedTerm,\n requiredAckKeys,\n allAcknowledged,\n serverAllowVoucherCodes,\n voucherStatus,\n draftVoucherCode,\n appliedVoucher,\n appliedVoucherCode,\n voucherUnavailable,\n setTermId,\n setPersonal,\n setAddress,\n toggleModule,\n setBlockAck,\n setAccountHolder,\n setIban,\n setConsent,\n clearIban,\n clearTermId,\n refetchOffers,\n fetchPreview,\n resetPreview,\n setVoucherDraft,\n beginVoucherApply,\n commitVoucherApplied,\n markVoucherInvalid,\n markVoucherDisabled,\n } = state\n\n const [index, setIndex] = useState(0)\n const [fieldErrors, setFieldErrors] = useState<ContractFieldErrors>({})\n const [submitting, setSubmitting] = useState(false)\n const [submitResult, setSubmitResult] = useState<ContractSubmitResult | null>(null)\n /** A transient notice shown above the nav (price_changed / offer_unavailable). */\n const [notice, setNotice] = useState<string | null>(null)\n /** Voucher-specific banner: voucher_invalid / voucher_disabled messages. */\n const [voucherBanner, setVoucherBanner] = useState<string | null>(null)\n\n const privacyUrl = useMemo(() => resolvePrivacyUrl(), [])\n\n // ── Terminal / success result owns the whole card. ──────────────────────────\n if (submitResult !== null && submitResult.status === 'succeeded') {\n return <ContractSuccessCard customerNumber={submitResult.customerNumber} />\n }\n // A non-retryable failure ends the form as a terminal read-only message.\n if (\n submitResult !== null &&\n submitResult.status === 'failed' &&\n !submitResult.retryable\n ) {\n const message =\n submitResult.errorCode === 'duplicate_submission'\n ? t.magiclineDuplicateNotice\n : submitResult.errorCode === 'unknown_outcome'\n ? t.magiclineUnknownOutcome\n : submitResult.errorCode === 'live_submission_disabled'\n ? t.magiclineLiveSubmissionDisabled\n : t.magiclineFailedDetail\n return <ContractTerminalCard message={message} />\n }\n\n // Resumed / cold session: no live result, the row is already terminal, and we\n // are NOT mid-submit. (During a live submit the claim flips the row to\n // `submitted` while `submitResult` is still resolving — the `submitting` guard\n // keeps the form mounted so the awaited envelope can populate the result UI.)\n if (submitResult === null && !submitting && formStatus === 'submitted') {\n return <ContractSuccessCard customerNumber={null} />\n }\n if (submitResult === null && !submitting && formStatus === 'failed') {\n return <ContractTerminalCard message={t.magiclineFailedDetail} />\n }\n\n // The step list is derived from the chosen term so `upgrades` only appears\n // when that term offers optional modules. Selecting a different term reshapes\n // the list; `safeIndex` clamps a now-out-of-range index.\n const steps = useMemo(() => buildWizardSteps(selectedTerm), [selectedTerm])\n const safeIndex = Math.min(index, steps.length - 1)\n const step = steps[safeIndex]\n const isLast = safeIndex === steps.length - 1\n const isFirst = safeIndex === 0\n\n function validateStep(current: ContractStep): ContractFieldErrors {\n const errors: ContractFieldErrors = {}\n if (current === 'offer') {\n if (fields.termId === null) {\n errors.termId = t.magiclineOfferRequiredError\n }\n return errors\n }\n if (current === 'upgrades') {\n // Every SELECTED module that carries a consent must have its ackKey ticked\n // in `acknowledgedBlocks` (the single source of truth for every gating tick).\n if (selectedTerm !== null) {\n for (const moduleId of fields.selectedModuleIds) {\n const module = selectedTerm.optionalModules.find((m) => m.id === moduleId)\n if (module?.consent && fields.acknowledgedBlocks[module.consent.ackKey] !== true) {\n errors.upgrades = t.magiclineUpgradeConsentError\n break\n }\n }\n }\n return errors\n }\n if (current === 'personal') {\n const p = fields.personal\n if (p.firstName.trim() === '') {\n errors.firstName = t.magiclineRequiredError\n }\n if (p.lastName.trim() === '') {\n errors.lastName = t.magiclineRequiredError\n }\n if (p.email.trim() === '') {\n errors.email = t.magiclineRequiredError\n } else if (!isValidEmail(p.email)) {\n errors.email = t.magiclineEmailError\n }\n if (p.dateOfBirth.trim() === '') {\n errors.dateOfBirth = t.magiclineRequiredError\n }\n if (p.gender === '') {\n errors.gender = t.magiclineRequiredError\n }\n if (p.phone.trim() === '') {\n errors.phone = t.magiclineRequiredError\n }\n return errors\n }\n if (current === 'address') {\n const a = fields.address\n if (a.street.trim() === '') {\n errors.street = t.magiclineRequiredError\n }\n if (a.houseNumber.trim() === '') {\n errors.houseNumber = t.magiclineRequiredError\n }\n if (a.zipCode.trim() === '') {\n errors.zipCode = t.magiclineRequiredError\n }\n if (a.city.trim() === '') {\n errors.city = t.magiclineRequiredError\n }\n return errors\n }\n if (current === 'payment') {\n if (fields.payment.accountHolder.trim() === '') {\n errors.accountHolder = t.magiclineRequiredError\n }\n if (!isValidIban(fields.payment.iban)) {\n errors.iban = t.magiclineIbanInvalidError\n }\n if (!fields.consents.privacy) {\n errors.privacy = t.magiclineConsentError\n }\n if (!fields.consents.sepa) {\n errors.sepa = t.magiclineConsentError\n }\n return errors\n }\n return errors\n }\n\n function handleNext() {\n const errors = validateStep(step)\n if (Object.keys(errors).length > 0) {\n setFieldErrors(errors)\n return\n }\n setFieldErrors({})\n setNotice(null)\n const nextIndex = Math.min(safeIndex + 1, steps.length - 1)\n // Entering Review triggers the server price fetch.\n if (steps[nextIndex] === 'review') {\n fetchPreview()\n }\n setIndex(nextIndex)\n }\n\n function handleBack() {\n setFieldErrors({})\n setNotice(null)\n if (step === 'review') {\n resetPreview()\n }\n setIndex((prev) => Math.max(prev - 1, 0))\n }\n\n /** Re-run the preview after a price change (stays on Review). */\n function handleReviewRetry() {\n setNotice(null)\n fetchPreview()\n }\n\n async function handleSubmit() {\n if (submitting) {\n return\n }\n if (previewState.phase !== 'ready' || selectedTerm === null) {\n return\n }\n // Defence-in-depth: the submit button is already gated on `allAcknowledged`,\n // but re-prompt rather than dispatch if any required confirmation is unticked.\n if (!allAcknowledged) {\n setNotice(t.magiclineConfirmRequiredError)\n return\n }\n setSubmitting(true)\n setNotice(null)\n try {\n const result = await submitContract({\n sessionId,\n visitorId,\n projectId,\n formMessageId,\n fields: {\n firstname: fields.personal.firstName.trim(),\n lastname: fields.personal.lastName.trim(),\n email: fields.personal.email.trim(),\n phone: fields.personal.phone.trim(),\n dateOfBirth: fields.personal.dateOfBirth.trim(),\n gender: fields.personal.gender,\n street: fields.address.street.trim(),\n houseNumber: fields.address.houseNumber.trim(),\n zipCode: fields.address.zipCode.trim(),\n city: fields.address.city.trim(),\n rateBundleTermId: selectedTerm.termId,\n privacyConsent: fields.consents.privacy,\n sepaConsent: fields.consents.sepa,\n },\n bankAccount: {\n accountHolder: fields.payment.accountHolder.trim(),\n iban: fields.payment.iban,\n },\n // Only modules still offered by the selected term are sent.\n selectedModuleIds: selectedTerm.optionalModules\n .filter((module) => fields.selectedModuleIds.includes(module.id))\n .map((module) => module.id),\n // Required text-block + selected-module consent ackKeys (the submit\n // button is gated on all of these being ticked).\n acknowledgedAckKeys: requiredAckKeys,\n pricingFingerprint: previewState.pricing.fingerprint,\n voucherCode: appliedVoucherCode ?? undefined,\n })\n\n if (result.status === 'succeeded') {\n setSubmitResult(result)\n return\n }\n\n // ── Failure routing. ────────────────────────────────────────────────\n if (result.errorCode === 'price_changed') {\n // Re-fetch the preview, stay on Review, show a notice.\n setNotice(t.magiclinePriceChangedNotice)\n fetchPreview()\n setSubmitting(false)\n return\n }\n if (result.errorCode === 'offer_unavailable') {\n // Re-fetch offers and jump back to the Offer step with a notice. The\n // stale term selection is cleared so it cannot survive the refetch —\n // which also drops any module selection + acknowledgements.\n clearTermId()\n refetchOffers()\n resetPreview()\n setNotice(t.magiclineOfferUnavailableNotice)\n setIndex(0)\n setSubmitting(false)\n return\n }\n if (result.errorCode === 'confirmation_required') {\n // The UI normally prevents this; treat it as a validation re-prompt on\n // the Review step (where the confirmation checkboxes live).\n setNotice(t.magiclineConfirmationRequiredNotice)\n setSubmitting(false)\n return\n }\n if (result.errorCode === 'live_submission_disabled') {\n // Terminal — live submission is off for this project; no retry.\n setSubmitResult(result)\n return\n }\n if (!result.retryable) {\n // Terminal (unknown_outcome / duplicate / post-dispatch) — read-only.\n setSubmitResult(result)\n return\n }\n // Other retryable failure: keep the form editable, surface a banner, and\n // CLEAR the IBAN so a stale value is never reused.\n clearIban()\n setNotice(result.message !== '' ? result.message : t.magiclineFailedDetail)\n setSubmitting(false)\n } catch (err) {\n // A network throw on the submit action itself is treated as retryable. The\n // raw error is logged WITHOUT any field/IBAN values (none are in scope).\n console.error('[ContractCreationForm] Submit failed:', err)\n clearIban()\n setNotice(t.magiclineFailedDetail)\n setSubmitting(false)\n }\n }\n\n /** Apply a voucher code on the Review step by calling getContractPreview with the draft code. */\n async function handleApplyVoucher() {\n if (previewState.phase !== 'ready' || selectedTerm === null) {\n return\n }\n if (draftVoucherCode.trim() === '') {\n return\n }\n const attemptedCode = draftVoucherCode.trim()\n const requestId = beginVoucherApply()\n setVoucherBanner(null)\n // Any failed apply clears the input and surfaces the error directly under\n // the voucher field (never the bottom notice), so the visitor immediately\n // knows the code did not apply. Clearing the draft also un-sticks Submit\n // (an un-applied draft otherwise blocks the settled-quote gate).\n const failVoucher = (message: string) => {\n markVoucherInvalid()\n setVoucherDraft('')\n setVoucherBanner(message)\n }\n const invalidMessage = t.magiclineVoucherInvalid.replace('{code}', attemptedCode)\n try {\n const result = await getContractPreview({\n sessionId,\n visitorId,\n termId: selectedTerm.termId,\n startDate: selectedTerm.defaultContractStartDate ?? '',\n fields: {\n firstname: fields.personal.firstName.trim(),\n lastname: fields.personal.lastName.trim(),\n email: fields.personal.email.trim(),\n dateOfBirth: fields.personal.dateOfBirth.trim(),\n gender: fields.personal.gender,\n phone: fields.personal.phone.trim(),\n street: fields.address.street.trim(),\n houseNumber: fields.address.houseNumber.trim(),\n zipCode: fields.address.zipCode.trim(),\n city: fields.address.city.trim(),\n },\n selectedModuleIds: selectedTerm.optionalModules\n .filter((m) => fields.selectedModuleIds.includes(m.id))\n .map((m) => m.id),\n privacyConsent: fields.consents.privacy,\n sepaConsent: fields.consents.sepa,\n voucherCode: draftVoucherCode.trim(),\n })\n if (result.status === 'ok') {\n const voucher = result.voucher\n if (voucher !== null) {\n const voucherAckKeys = voucher.textBlocks.map((b) => b.ackKey)\n commitVoucherApplied({\n requestId,\n voucher,\n appliedCode: draftVoucherCode.trim(),\n voucherAckKeys,\n // Thread the voucher-inclusive pricing from this same response so\n // previewState.pricing.fingerprint is updated atomically. Without\n // this the submitted fingerprint is the base (no-voucher) one and\n // the backend always returns price_changed.\n pricing: {\n basePrice: result.basePrice,\n preUseCharge: result.preUseCharge,\n currencyCode: result.currencyCode,\n flatFees: result.flatFees,\n modules: result.modules,\n contractVolume: result.contractVolume,\n startDate: result.startDate,\n paymentFrequency: result.paymentFrequency,\n fingerprint: result.pricingFingerprint,\n },\n })\n } else {\n // Preview OK but backend returned no voucher block — treat as invalid.\n failVoucher(invalidMessage)\n }\n } else if (result.status === 'voucher_invalid') {\n failVoucher(invalidMessage)\n } else if (result.status === 'voucher_disabled') {\n markVoucherDisabled()\n setVoucherDraft('')\n setVoucherBanner(t.magiclineVoucherDisabled)\n } else {\n // Any other non-ok status (a generic 400 the demo tenant returns for an\n // unknown code, offer_unavailable, etc.) — for a voucher apply, treat as\n // an invalid voucher and show it under the field, not the bottom notice.\n failVoucher(invalidMessage)\n }\n } catch {\n failVoucher(invalidMessage)\n }\n }\n\n function onPrimary() {\n if (isLast) {\n void handleSubmit()\n } else {\n handleNext()\n }\n }\n\n const stepTitle = stepTitleFor(step, t)\n // On Review the primary button waits for a ready preview AND every required\n // contract / module confirmation being ticked before enabling.\n // Additionally, submit is blocked while a voucher Apply is in flight OR while\n // the visitor has typed a new draft that differs from the applied code (un-applied\n // draft = the priced quote is stale). An empty draft with no applied code is the\n // normal no-voucher path and must never block submit.\n const voucherUnsettled =\n voucherStatus === 'applying' ||\n (draftVoucherCode.trim() !== '' &&\n draftVoucherCode.trim() !== (appliedVoucherCode ?? ''))\n const reviewBlocked =\n step === 'review' && (previewState.phase !== 'ready' || !allAcknowledged || voucherUnsettled)\n const primaryDisabled = submitting || reviewBlocked\n\n return (\n <div class=\"jex-inline-form jex-magicline-form\">\n <div class=\"jex-magicline-wizard-header\">\n <div class=\"jex-inline-form-title\">{t.magiclineContractTitle}</div>\n <div class=\"jex-magicline-wizard-progress\">\n <span class=\"jex-magicline-wizard-step-label\">{stepTitle}</span>\n <span class=\"jex-magicline-wizard-counter\">\n {t.magiclineStepCounter\n .replace('{n}', String(safeIndex + 1))\n .replace('{total}', String(steps.length))}\n </span>\n </div>\n <div class=\"jex-magicline-wizard-dots\" aria-hidden=\"true\">\n {steps.map((s, i) => (\n <span\n key={s}\n class={\n i === safeIndex\n ? 'jex-magicline-wizard-dot jex-magicline-wizard-dot-active'\n : 'jex-magicline-wizard-dot'\n }\n />\n ))}\n </div>\n </div>\n\n <div class=\"jex-form\" role=\"group\" aria-label={stepTitle}>\n {step === 'offer' ? (\n <OfferStep\n offersState={offersState}\n selectedTermId={fields.termId}\n widgetLocale={widgetLocale}\n disabled={submitting}\n error={fieldErrors.termId}\n onSelect={setTermId}\n onRetry={refetchOffers}\n />\n ) : null}\n\n {step === 'upgrades' && selectedTerm !== null ? (\n <UpgradesStep\n modules={selectedTerm.optionalModules}\n selectedModuleIds={fields.selectedModuleIds}\n acknowledgedBlocks={fields.acknowledgedBlocks}\n widgetLocale={widgetLocale}\n disabled={submitting}\n error={fieldErrors.upgrades}\n onToggle={toggleModule}\n onAck={setBlockAck}\n />\n ) : null}\n\n {step === 'personal' ? (\n <PersonalStep\n personal={fields.personal}\n errors={fieldErrors}\n disabled={submitting}\n setPersonal={setPersonal}\n />\n ) : null}\n\n {step === 'address' ? (\n <AddressStep\n address={fields.address}\n errors={fieldErrors}\n disabled={submitting}\n setAddress={setAddress}\n />\n ) : null}\n\n {step === 'payment' ? (\n <PaymentStep\n formMessageId={formMessageId}\n fields={fields}\n errors={fieldErrors}\n privacyUrl={privacyUrl}\n disabled={submitting}\n setAccountHolder={setAccountHolder}\n setIban={setIban}\n setConsent={setConsent}\n />\n ) : null}\n\n {step === 'review' ? (\n <ReviewStep\n fields={fields}\n term={selectedTerm}\n previewState={previewState}\n widgetLocale={widgetLocale}\n disabled={submitting}\n acknowledgedBlocks={fields.acknowledgedBlocks}\n onToggleAck={setBlockAck}\n onRetry={handleReviewRetry}\n allowVoucherCodes={serverAllowVoucherCodes}\n voucherUnavailable={voucherUnavailable}\n voucherStatus={voucherStatus}\n draftVoucherCode={draftVoucherCode}\n appliedVoucher={appliedVoucher}\n voucherBanner={voucherBanner}\n onVoucherDraftChange={setVoucherDraft}\n onApplyVoucher={() => { void handleApplyVoucher() }}\n />\n ) : null}\n\n {notice !== null ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{notice}</div>\n ) : null}\n\n <div class=\"jex-magicline-wizard-nav\">\n {!isFirst ? (\n <button\n type=\"button\"\n class=\"jex-magicline-wizard-back\"\n disabled={submitting}\n onClick={handleBack}\n >\n {t.magiclineWizardBack}\n </button>\n ) : null}\n <button\n type=\"button\"\n class=\"jex-form-submit jex-magicline-wizard-next\"\n disabled={primaryDisabled}\n onClick={onPrimary}\n >\n {isLast\n ? submitting\n ? t.magiclineSubmitting\n : t.magiclineSubmit\n : t.magiclineWizardNext}\n </button>\n </div>\n </div>\n </div>\n )\n}\n\n// ── Result cards ─────────────────────────────────────────────────────────────\n\ninterface ContractSuccessCardProps {\n customerNumber: string | null\n}\n\nfunction ContractSuccessCard({ customerNumber }: ContractSuccessCardProps) {\n const t = useLocale()\n return (\n <div class=\"jex-inline-form-submitted\">\n <span class=\"jex-inline-form-check\">✓</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.magiclineSubmitted}</div>\n <div class=\"jex-inline-form-submitted-detail\">{t.magiclineContractSubmitted}</div>\n {customerNumber !== null && customerNumber !== '' ? (\n <div class=\"jex-inline-form-submitted-detail\">\n {t.magiclineCustomerNumber.replace('{number}', customerNumber)}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n\ninterface ContractTerminalCardProps {\n message: string\n}\n\nfunction ContractTerminalCard({ message }: ContractTerminalCardProps) {\n const t = useLocale()\n return (\n <div class=\"jex-inline-form-submitted jex-magicline-failed\">\n <span class=\"jex-inline-form-check jex-magicline-failed-icon\">!</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.magiclineFailed}</div>\n <div class=\"jex-inline-form-submitted-detail\">{message}</div>\n </div>\n </div>\n )\n}\n\n// ── Step components ────────────────────────────────────────────────────────\n\ninterface OfferStepProps {\n offersState: OffersState\n selectedTermId: number | null\n widgetLocale: 'en' | 'de'\n disabled: boolean\n error: string | undefined\n onSelect: (termId: number) => void\n onRetry: () => void\n}\n\nfunction OfferStep({\n offersState,\n selectedTermId,\n widgetLocale,\n disabled,\n error,\n onSelect,\n onRetry,\n}: OfferStepProps) {\n const t = useLocale()\n\n if (offersState.phase === 'loading') {\n return <div class=\"jex-magicline-slots-hint\" aria-live=\"polite\">{t.magiclineOffersLoading}</div>\n }\n if (offersState.phase === 'error') {\n return (\n <div class=\"jex-magicline-slots-error\">\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {t.magiclineOffersError}\n </div>\n <button type=\"button\" class=\"jex-magicline-retry\" disabled={disabled} onClick={onRetry}>\n {t.magiclineRetry}\n </button>\n </div>\n )\n }\n if (offersState.phase === 'empty') {\n return (\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {t.magiclineNoOffers}\n </div>\n )\n }\n\n // ready → render the term cards grouped by their bundle heading.\n const groups = groupTermsByBundle(offersState.terms)\n return (\n <>\n <div class=\"jex-magicline-radio-group\" role=\"radiogroup\" aria-label={t.magiclineStepOffer}>\n {groups.map((group) => (\n <div key={group.bundleId} class=\"jex-magicline-offer-group\">\n <div class=\"jex-magicline-offer-bundle-name\">{group.bundleName}</div>\n {group.bundleDescription !== null ? (\n <div class=\"jex-magicline-offer-bundle-desc\">{group.bundleDescription}</div>\n ) : null}\n {group.terms.map((term) => (\n <OfferTermCard\n key={term.termId}\n term={term}\n checked={selectedTermId === term.termId}\n widgetLocale={widgetLocale}\n disabled={disabled}\n onSelect={onSelect}\n />\n ))}\n <BundleDetails\n subDescription={group.bundleSubDescription}\n footnote={group.footnote}\n />\n </div>\n ))}\n </div>\n {error !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{error}</div>\n ) : null}\n </>\n )\n}\n\ninterface OfferTermCardProps {\n term: RateBundleTermCard\n checked: boolean\n widgetLocale: 'en' | 'de'\n disabled: boolean\n onSelect: (termId: number) => void\n}\n\nfunction OfferTermCard({ term, checked, widgetLocale, disabled, onSelect }: OfferTermCardProps) {\n const t = useLocale()\n const lengthLabel = formatContractPeriod(term.termValue, term.termUnit, widgetLocale)\n const priceLabel = formatContractMoney(term.price, term.currencyCode, widgetLocale)\n const starterFee = term.flatFees.find((fee) => fee.isStarterPackage)\n const otherFlatFees = term.flatFees.filter((fee) => !fee.isStarterPackage)\n return (\n <label\n class={\n checked\n ? 'jex-magicline-radio-card jex-magicline-radio-card-active'\n : 'jex-magicline-radio-card'\n }\n >\n <input\n type=\"radio\"\n name=\"jex-ml-offer\"\n checked={checked}\n disabled={disabled}\n onChange={() => { onSelect(term.termId) }}\n />\n <span class=\"jex-magicline-offer-term\">\n <span class=\"jex-magicline-offer-term-head\">\n <span class=\"jex-magicline-offer-term-length\">{lengthLabel}</span>\n <span class=\"jex-magicline-offer-term-price\">\n {priceLabel}{' '}\n {formatPaymentFrequency(\n term.paymentFrequency.value,\n term.paymentFrequency.unit,\n widgetLocale,\n )}\n </span>\n </span>\n {term.cancellationPeriod !== null ? (\n <span class=\"jex-magicline-offer-term-note\">\n {t.magiclineCancellationPeriod}:{' '}\n {formatContractPeriod(\n term.cancellationPeriod.value,\n term.cancellationPeriod.unit,\n widgetLocale,\n )}\n </span>\n ) : null}\n {starterFee !== undefined ? (\n <span class=\"jex-magicline-offer-term-note\">\n {t.magiclineStarterPackage}:{' '}\n {formatContractMoney(starterFee.price, term.currencyCode, widgetLocale)}\n </span>\n ) : null}\n {otherFlatFees.map((fee) => (\n <span key={fee.name} class=\"jex-magicline-offer-term-note\">\n {localizeFeeName(fee.name, t)}: {formatContractMoney(fee.price, term.currencyCode, widgetLocale)}\n </span>\n ))}\n {term.includedModuleNames.length > 0 ? (\n <span class=\"jex-magicline-offer-term-note\">\n {t.magiclineIncludedModules}: {term.includedModuleNames.join(', ')}\n </span>\n ) : null}\n </span>\n </label>\n )\n}\n\ninterface BundleDetailsProps {\n subDescription: string | null\n footnote: string | null\n}\n\n/**\n * Collapsed-by-default disclosure for a bundle's long sub-description and\n * footnote. The sub-description is parsed into list bullets; the footnote stays\n * as a single muted paragraph. Renders nothing when both are absent so a bundle\n * with no extra copy shows no empty \"Details\" toggle.\n */\nfunction BundleDetails({ subDescription, footnote }: BundleDetailsProps) {\n const t = useLocale()\n const bullets = parseBundleBullets(subDescription)\n const hasFootnote = footnote !== null && footnote.trim() !== ''\n if (bullets.length === 0 && !hasFootnote) {\n return null\n }\n return (\n <details class=\"jex-magicline-bundle-details\">\n <summary class=\"jex-magicline-bundle-details-summary\">{t.magiclineDetails}</summary>\n <div class=\"jex-magicline-bundle-details-body\">\n {bullets.length > 0 ? (\n <ul class=\"jex-magicline-bundle-details-list\">\n {bullets.map((bullet, i) => (\n <li key={`${i}-${bullet}`}>{bullet}</li>\n ))}\n </ul>\n ) : null}\n {hasFootnote ? (\n <p class=\"jex-magicline-bundle-details-footnote\">{footnote}</p>\n ) : null}\n </div>\n </details>\n )\n}\n\ninterface UpgradesStepProps {\n modules: ContractOptionalModule[]\n selectedModuleIds: number[]\n acknowledgedBlocks: Record<string, boolean>\n widgetLocale: 'en' | 'de'\n disabled: boolean\n error: string | undefined\n onToggle: (moduleId: number, selected: boolean, consentAckKey?: string) => void\n onAck: (ackKey: string, value: boolean) => void\n}\n\n/**\n * Optional paid add-on modules for the chosen term. Each card toggles its id in\n * `selectedModuleIds`; a selected module that carries a consent reveals a nested\n * consent checkbox whose ackKey MUST be ticked in `acknowledgedBlocks` to keep\n * the module selected.\n */\nfunction UpgradesStep({\n modules,\n selectedModuleIds,\n acknowledgedBlocks,\n widgetLocale,\n disabled,\n error,\n onToggle,\n onAck,\n}: UpgradesStepProps) {\n const t = useLocale()\n if (modules.length === 0) {\n return <div class=\"jex-magicline-slots-hint\">{t.magiclineUpgradesNone}</div>\n }\n return (\n <>\n <div class=\"jex-magicline-slots-hint\">{t.magiclineUpgradesIntro}</div>\n <div class=\"jex-magicline-upgrade-group\">\n {modules.map((module) => (\n <UpgradeModuleCard\n key={module.id}\n module={module}\n selected={selectedModuleIds.includes(module.id)}\n consentChecked={\n module.consent !== null && acknowledgedBlocks[module.consent.ackKey] === true\n }\n widgetLocale={widgetLocale}\n disabled={disabled}\n onToggle={onToggle}\n onAck={onAck}\n />\n ))}\n </div>\n {error !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{error}</div>\n ) : null}\n </>\n )\n}\n\ninterface UpgradeModuleCardProps {\n module: ContractOptionalModule\n selected: boolean\n consentChecked: boolean\n widgetLocale: 'en' | 'de'\n disabled: boolean\n onToggle: (moduleId: number, selected: boolean, consentAckKey?: string) => void\n onAck: (ackKey: string, value: boolean) => void\n}\n\nfunction UpgradeModuleCard({\n module,\n selected,\n consentChecked,\n widgetLocale,\n disabled,\n onToggle,\n onAck,\n}: UpgradeModuleCardProps) {\n const t = useLocale()\n const priceLabel = formatModulePrice(\n module.price,\n module.currencyCode,\n module.paymentFrequencyType,\n module.recurringUnit,\n widgetLocale,\n )\n const renewalLabel = formatModuleRenewal(module.extensionType, module.termExtension, widgetLocale)\n const termLabel = module.termLabel !== null && module.termLabel !== '' ? module.termLabel : t.magiclineUpgradeOneTime\n const consent = module.consent\n return (\n <div class={selected ? 'jex-magicline-upgrade-card jex-magicline-upgrade-card-active' : 'jex-magicline-upgrade-card'}>\n <label class=\"jex-magicline-upgrade-head\">\n <input\n type=\"checkbox\"\n checked={selected}\n disabled={disabled}\n onChange={(e) => { onToggle(module.id, e.currentTarget.checked, consent?.ackKey) }}\n />\n <span class=\"jex-magicline-upgrade-info\">\n <span class=\"jex-magicline-upgrade-name\">{module.name}</span>\n {module.description !== null && module.description !== '' ? (\n <span class=\"jex-magicline-upgrade-desc\">{module.description}</span>\n ) : null}\n <span class=\"jex-magicline-upgrade-price\">{priceLabel}</span>\n <span class=\"jex-magicline-upgrade-desc\">{termLabel}</span>\n {renewalLabel !== '' ? (\n <span class=\"jex-magicline-upgrade-desc\">{renewalLabel}</span>\n ) : null}\n </span>\n <span class=\"jex-magicline-upgrade-status\">\n {selected ? t.magiclineUpgradeAdded : t.magiclineUpgradeAdd}\n </span>\n </label>\n {selected && consent !== null ? (\n <ConsentRegion\n ackKey={consent.ackKey}\n title={consent.title}\n text={consent.text}\n attachmentLabel={consent.attachmentLabel}\n attachmentUrl={consent.attachmentUrl}\n checked={consentChecked}\n disabled={disabled}\n onToggle={onAck}\n showRequiredPill={true}\n />\n ) : null}\n </div>\n )\n}\n\ninterface PersonalStepProps {\n personal: ContractPersonalFields\n errors: ContractFieldErrors\n disabled: boolean\n setPersonal: (key: keyof ContractPersonalFields, value: string) => void\n}\n\nfunction PersonalStep({ personal, errors, disabled, setPersonal }: PersonalStepProps) {\n const t = useLocale()\n const maxDob = useMemo(() => todayIsoDate(), [])\n return (\n <>\n <div class=\"jex-magicline-row\">\n <TextField\n label={t.magiclineFirstName}\n value={personal.firstName}\n required\n disabled={disabled}\n error={errors.firstName}\n fieldKey=\"firstName\"\n onInput={(v) => { setPersonal('firstName', v) }}\n />\n <TextField\n label={t.magiclineLastName}\n value={personal.lastName}\n required\n disabled={disabled}\n error={errors.lastName}\n fieldKey=\"lastName\"\n onInput={(v) => { setPersonal('lastName', v) }}\n />\n </div>\n <TextField\n label={t.magiclineEmail}\n type=\"email\"\n value={personal.email}\n required\n disabled={disabled}\n error={errors.email}\n fieldKey=\"email\"\n onInput={(v) => { setPersonal('email', v) }}\n />\n <label class=\"jex-magicline-field\">\n <span class=\"jex-magicline-field-label\">{t.magiclineBirthDate}</span>\n <input\n class=\"jex-form-input\"\n type=\"date\"\n aria-label={t.magiclineBirthDate}\n value={personal.dateOfBirth}\n max={maxDob}\n required\n disabled={disabled}\n aria-invalid={errors.dateOfBirth !== undefined}\n onInput={(e) => { setPersonal('dateOfBirth', e.currentTarget.value) }}\n />\n {errors.dateOfBirth !== undefined ? (\n <span class=\"jex-magicline-error\" role=\"alert\">{errors.dateOfBirth}</span>\n ) : null}\n </label>\n <SelectField\n label={t.magiclineGender}\n value={personal.gender}\n required\n disabled={disabled}\n placeholder={t.magiclineGenderPlaceholder}\n error={errors.gender}\n onChange={(v) => { setPersonal('gender', v) }}\n options={GENDER_VALUES.map((value) => ({ value, label: genderLabel(value, t) }))}\n />\n <TextField\n label={t.magiclinePhone}\n type=\"tel\"\n value={personal.phone}\n required\n disabled={disabled}\n error={errors.phone}\n fieldKey=\"phone\"\n onInput={(v) => { setPersonal('phone', v) }}\n />\n </>\n )\n}\n\ninterface AddressStepProps {\n address: ContractAddressFields\n errors: ContractFieldErrors\n disabled: boolean\n setAddress: (key: keyof ContractAddressFields, value: string) => void\n}\n\nfunction AddressStep({ address, errors, disabled, setAddress }: AddressStepProps) {\n const t = useLocale()\n return (\n <>\n <div class=\"jex-magicline-row\">\n <TextField\n label={t.magiclineStreet}\n value={address.street}\n required\n disabled={disabled}\n error={errors.street}\n fieldKey=\"street\"\n onInput={(v) => { setAddress('street', v) }}\n />\n <TextField\n label={t.magiclineHouseNumber}\n value={address.houseNumber}\n required\n disabled={disabled}\n error={errors.houseNumber}\n fieldKey=\"houseNumber\"\n onInput={(v) => { setAddress('houseNumber', v) }}\n />\n </div>\n <div class=\"jex-magicline-row\">\n <TextField\n label={t.magiclineZip}\n value={address.zipCode}\n required\n disabled={disabled}\n error={errors.zipCode}\n fieldKey=\"zipCode\"\n onInput={(v) => { setAddress('zipCode', v) }}\n />\n <TextField\n label={t.magiclineCity}\n value={address.city}\n required\n disabled={disabled}\n error={errors.city}\n fieldKey=\"city\"\n onInput={(v) => { setAddress('city', v) }}\n />\n </div>\n {/* Country is fixed to Germany — shown as static text, never collected. */}\n <div class=\"jex-magicline-field\">\n <span class=\"jex-magicline-field-label\">{t.magiclineCountry}</span>\n <div class=\"jex-magicline-static-value\">{t.magiclineCountryStatic}</div>\n </div>\n </>\n )\n}\n\ninterface PaymentStepProps {\n formMessageId: Id<'conversations'>\n fields: ContractFormFields\n errors: ContractFieldErrors\n privacyUrl: string\n disabled: boolean\n setAccountHolder: (value: string) => void\n setIban: (value: string) => void\n setConsent: (key: 'privacy' | 'sepa', value: boolean) => void\n}\n\nfunction PaymentStep({\n formMessageId,\n fields,\n errors,\n privacyUrl,\n disabled,\n setAccountHolder,\n setIban,\n setConsent,\n}: PaymentStepProps) {\n const t = useLocale()\n const privacyId = `jex-ml-privacy-${formMessageId}`\n const sepaId = `jex-ml-sepa-${formMessageId}`\n return (\n <>\n <TextField\n label={t.magiclineAccountHolder}\n value={fields.payment.accountHolder}\n required\n disabled={disabled}\n error={errors.accountHolder}\n fieldKey=\"accountHolder\"\n onInput={setAccountHolder}\n />\n <TextField\n label={t.magiclineIban}\n value={fields.payment.iban}\n required\n disabled={disabled}\n error={errors.iban}\n fieldKey=\"iban\"\n onInput={setIban}\n />\n\n <label class=\"jex-magicline-consent\" for={privacyId}>\n <input\n id={privacyId}\n type=\"checkbox\"\n checked={fields.consents.privacy}\n disabled={disabled}\n aria-invalid={errors.privacy !== undefined}\n onChange={(e) => { setConsent('privacy', e.currentTarget.checked) }}\n />\n <span>\n {t.magiclineConsent}{' '}\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {t.magiclinePrivacyLinkText}\n </a>.\n </span>\n </label>\n\n <label class=\"jex-magicline-consent\" for={sepaId}>\n <input\n id={sepaId}\n type=\"checkbox\"\n checked={fields.consents.sepa}\n disabled={disabled}\n aria-invalid={errors.sepa !== undefined}\n onChange={(e) => { setConsent('sepa', e.currentTarget.checked) }}\n />\n <span>{t.magiclineSepaConsent}</span>\n </label>\n\n {errors.privacy !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{errors.privacy}</div>\n ) : null}\n {errors.sepa !== undefined ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{errors.sepa}</div>\n ) : null}\n </>\n )\n}\n\ninterface ReviewStepProps {\n fields: ContractFormFields\n term: RateBundleTermCard | null\n previewState: PreviewState\n widgetLocale: 'en' | 'de'\n disabled: boolean\n acknowledgedBlocks: Record<string, boolean>\n onToggleAck: (ackKey: string, value: boolean) => void\n onRetry: () => void\n // Voucher props (Review step only)\n allowVoucherCodes: boolean\n voucherUnavailable: boolean\n voucherStatus: VoucherStatus\n draftVoucherCode: string\n appliedVoucher: ContractVoucher\n voucherBanner: string | null\n onVoucherDraftChange: (value: string) => void\n onApplyVoucher: () => void\n}\n\nfunction ReviewStep({\n fields,\n term,\n previewState,\n widgetLocale,\n disabled,\n acknowledgedBlocks,\n onToggleAck,\n onRetry,\n allowVoucherCodes,\n voucherUnavailable,\n voucherStatus,\n draftVoucherCode,\n appliedVoucher,\n voucherBanner,\n onVoucherDraftChange,\n onApplyVoucher,\n}: ReviewStepProps) {\n const t = useLocale()\n\n // First load (no prior quote) shows the bare hint. A re-price that already has\n // a quote uses `reloading`, handled below — it keeps the layout and dims it.\n if (previewState.phase === 'loading' || previewState.phase === 'idle') {\n return <div class=\"jex-magicline-slots-hint\" aria-live=\"polite\">{t.magiclineReviewLoading}</div>\n }\n if (previewState.phase === 'error') {\n return (\n <div class=\"jex-magicline-slots-error\">\n <div class=\"jex-magicline-slots-hint\" role=\"alert\" aria-live=\"polite\">\n {previewState.code === 'offer_unavailable'\n ? t.magiclineOfferUnavailableNotice\n : t.magiclineReviewError}\n </div>\n <button type=\"button\" class=\"jex-magicline-retry\" disabled={disabled} onClick={onRetry}>\n {t.magiclineRetry}\n </button>\n </div>\n )\n }\n\n // All pricing is rendered from the SERVER preview response (never the cached\n // term card) so the visitor confirms exactly what the backend re-verifies.\n const pricing: ContractPricing = previewState.pricing\n // `reloading` = a re-price (voucher apply/clear/retry) over an existing quote:\n // keep the layout, dim it, and overlay a spinner so nothing shifts.\n const isReloading = previewState.phase === 'reloading'\n const volume = pricing.contractVolume\n const fullName = `${fields.personal.firstName} ${fields.personal.lastName}`.trim()\n const addr = fields.address\n const addressLine = [\n `${addr.street} ${addr.houseNumber}`.trim(),\n `${addr.zipCode} ${addr.city}`.trim(),\n t.magiclineCountryStatic,\n ]\n .filter((line) => line !== '')\n .join(', ')\n const offerLabel =\n term !== null\n ? `${term.bundleName} · ${formatContractPeriod(term.termValue, term.termUnit, widgetLocale)}`\n : '—'\n\n // Required contract text blocks — the only GATING confirmations on this step\n // (the module-consent tick is captured on the Upgrades step). Selected-module\n // consents below are a READ-ONLY recap of what was already accepted there.\n const requiredBlocks = term !== null ? term.textBlocks.filter((b) => b.isConfirmationRequired) : []\n // Non-confirmation text blocks are informational (e.g. billing-interval note);\n // shown as plain read-only text alongside the required checkboxes.\n const infoBlocks = term !== null ? term.textBlocks.filter((b) => !b.isConfirmationRequired) : []\n const selectedModuleConsents =\n term !== null\n ? term.optionalModules\n .filter((m) => fields.selectedModuleIds.includes(m.id) && m.consent !== null)\n .map((m) => ({ module: m, consent: m.consent as NonNullable<typeof m.consent> }))\n : []\n\n // Voucher text blocks that require explicit confirmation (ackKey prefixed `voucher:`).\n const voucherRequiredBlocks =\n appliedVoucher !== null\n ? appliedVoucher.textBlocks.filter((b) => b.ackKey.startsWith('voucher:'))\n : []\n\n // Whether the voucher section should be rendered at all.\n const showVoucherSection = allowVoucherCodes && !voucherUnavailable\n\n return (\n <div class=\"jex-magicline-review-wrap\">\n <div\n class={\n isReloading\n ? 'jex-magicline-review-body jex-magicline-review-body--reloading'\n : 'jex-magicline-review-body'\n }\n aria-busy={isReloading}\n >\n <dl class=\"jex-magicline-summary\">\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewOffer}</dt>\n <dd>{offerLabel}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewBasePrice}</dt>\n <dd>\n {appliedVoucher !== null && appliedVoucher.voucherType === 'DISCOUNT'\n ? formatContractMoney(appliedVoucher.discountedBasePrice, pricing.currencyCode, widgetLocale)\n : formatContractMoney(pricing.basePrice, pricing.currencyCode, widgetLocale)}{' '}\n {formatPaymentFrequency(\n pricing.paymentFrequency.value,\n pricing.paymentFrequency.unit,\n widgetLocale,\n )}\n </dd>\n </div>\n {appliedVoucher !== null && appliedVoucher.voucherType === 'DISCOUNT' ? (\n <div class=\"jex-magicline-summary-row jex-magicline-voucher-discount-row\">\n <dt>\n {t.magiclineVoucherAppliedDiscount.replace(\n '{discount}',\n formatVoucherDiscount(\n appliedVoucher.discountValue,\n appliedVoucher.discountType,\n pricing.currencyCode,\n widgetLocale,\n ),\n )}\n </dt>\n <dd />\n </div>\n ) : null}\n {appliedVoucher !== null && appliedVoucher.remarks !== null && appliedVoucher.remarks !== '' ? (\n <div class=\"jex-magicline-summary-row jex-magicline-voucher-remarks-row\">\n <dt>{t.magiclineVoucherRemarks}</dt>\n <dd>{appliedVoucher.remarks}</dd>\n </div>\n ) : null}\n {pricing.flatFees.map((fee: ContractFlatFee, i) => (\n <div key={`${fee.name}-${i}`} class=\"jex-magicline-summary-row\">\n <dt>{localizeFeeName(fee.name, t)}</dt>\n <dd>{formatContractMoney(fee.price, pricing.currencyCode, widgetLocale)}</dd>\n </div>\n ))}\n {pricing.preUseCharge > 0 ? (\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewPreUseCharge}</dt>\n <dd>{formatContractMoney(pricing.preUseCharge, pricing.currencyCode, widgetLocale)}</dd>\n </div>\n ) : null}\n </dl>\n\n {pricing.modules.length > 0 ? (\n <dl class=\"jex-magicline-summary jex-magicline-summary-section\">\n <div class=\"jex-magicline-summary-heading\">{t.magiclineReviewSelectedUpgrades}</div>\n {pricing.modules.map((module, i) => (\n <div key={`${module.moduleId}-${i}`} class=\"jex-magicline-summary-row\">\n <dt>{module.name}</dt>\n <dd>{formatContractMoney(module.amount, module.currencyCode, widgetLocale)}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n\n {volume !== null && volume.total !== null ? (\n <dl class=\"jex-magicline-summary jex-magicline-summary-section jex-magicline-summary-totals\">\n <div class=\"jex-magicline-summary-row jex-magicline-summary-total-row\">\n <dt>\n {appliedVoucher !== null && appliedVoucher.voucherType === 'DISCOUNT'\n ? t.magiclineGesamtpreisBeforeDiscount\n : t.magiclineReviewContractVolume}\n </dt>\n <dd>{formatContractMoney(volume.total, pricing.currencyCode, widgetLocale)}</dd>\n </div>\n </dl>\n ) : null}\n\n {appliedVoucher !== null && appliedVoucher.voucherType === 'CREDIT' ? (\n <div class=\"jex-magicline-voucher-credit-notice\" role=\"note\">\n {t.magiclineVoucherCreditNotice}\n </div>\n ) : null}\n\n <dl class=\"jex-magicline-summary jex-magicline-summary-section\">\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewStartsOn}</dt>\n <dd>{formatContractDate(pricing.startDate, widgetLocale)}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummaryName}</dt>\n <dd>{fullName !== '' ? fullName : '—'}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineSummaryAddress}</dt>\n <dd>{addressLine}</dd>\n </div>\n <div class=\"jex-magicline-summary-row\">\n <dt>{t.magiclineReviewPayment}</dt>\n <dd>{maskIban(fields.payment.iban)}</dd>\n </div>\n </dl>\n\n {showVoucherSection ? (\n <div class=\"jex-magicline-voucher-section\">\n <div class=\"jex-magicline-field jex-magicline-voucher-field\">\n <input\n class=\"jex-form-input\"\n type=\"text\"\n aria-label={t.magiclineVoucherLabel}\n placeholder={t.magiclineVoucherPlaceholder}\n value={draftVoucherCode}\n disabled={disabled || voucherStatus === 'applying'}\n onInput={(e) => { onVoucherDraftChange(e.currentTarget.value) }}\n />\n <button\n type=\"button\"\n class=\"jex-magicline-voucher-apply\"\n disabled={\n disabled ||\n voucherStatus === 'applying' ||\n draftVoucherCode.trim() === ''\n }\n onClick={onApplyVoucher}\n >\n {t.magiclineVoucherApply}\n </button>\n </div>\n {voucherBanner !== null ? (\n <div class=\"jex-magicline-error\" role=\"alert\">{voucherBanner}</div>\n ) : null}\n </div>\n ) : null}\n\n {selectedModuleConsents.length > 0 ? (\n <div class=\"jex-magicline-terms\" role=\"group\" aria-label={t.magiclineReviewSelectedUpgrades}>\n <div class=\"jex-magicline-upgrades-recap-title\">\n {t.magiclineReviewSelectedUpgrades}\n </div>\n {selectedModuleConsents.map(({ module, consent }) => (\n <ConsentRecap\n key={consent.ackKey}\n title={consent.title !== '' ? consent.title : module.name}\n text={consent.text}\n attachmentLabel={consent.attachmentLabel}\n attachmentUrl={consent.attachmentUrl}\n />\n ))}\n </div>\n ) : null}\n\n {requiredBlocks.length > 0 || infoBlocks.length > 0 || voucherRequiredBlocks.length > 0 ? (\n <div class=\"jex-magicline-terms\" role=\"group\" aria-label={t.magiclineReviewTerms}>\n {requiredBlocks.length > 0 || voucherRequiredBlocks.length > 0 ? (\n <div class=\"jex-magicline-terms-prompt\">\n {t.magiclineConfirmPrompt}\n <span class=\"jex-magicline-required-pill\">{t.magiclineRequired}</span>\n </div>\n ) : null}\n {requiredBlocks.map((block) => (\n <ConsentRegion\n key={block.ackKey}\n ackKey={block.ackKey}\n title={block.title}\n text={block.text}\n attachmentLabel={block.attachmentLabel}\n attachmentUrl={block.attachmentUrl}\n checked={acknowledgedBlocks[block.ackKey] === true}\n disabled={disabled}\n onToggle={onToggleAck}\n />\n ))}\n {voucherRequiredBlocks.map((block) => (\n <ConsentRegion\n key={block.ackKey}\n ackKey={block.ackKey}\n title={block.title}\n text={block.text}\n attachmentLabel={block.attachmentLabel}\n attachmentUrl={block.attachmentUrl}\n checked={acknowledgedBlocks[block.ackKey] === true}\n disabled={disabled}\n onToggle={onToggleAck}\n />\n ))}\n {infoBlocks.map((block, i) => (\n <ConsentRecap\n key={`${block.title}-${i}`}\n title={block.title}\n text={block.text}\n attachmentLabel={block.attachmentLabel}\n attachmentUrl={block.attachmentUrl}\n />\n ))}\n </div>\n ) : null}\n </div>\n {isReloading ? (\n <div class=\"jex-magicline-review-overlay\" aria-hidden=\"true\">\n <span class=\"jex-magicline-review-spinner\" />\n </div>\n ) : null}\n </div>\n )\n}\n\ninterface ConsentRegionProps {\n ackKey: string\n title: string\n text: string\n attachmentLabel: string | null\n attachmentUrl: string | null\n checked: boolean\n disabled: boolean\n onToggle: (ackKey: string, value: boolean) => void\n /** Show the inline \"Required\" pill — used on Upgrades where no group prompt carries it. */\n showRequiredPill?: boolean\n}\n\n/**\n * A gating consent region: a \"Required\" caption above a sibling consent\n * checkbox whose text is the checkbox's own clickable label. Used for module\n * consents on Upgrades and for contract text-block confirmations on Review.\n */\nfunction ConsentRegion({\n ackKey,\n title,\n text,\n attachmentLabel,\n attachmentUrl,\n checked,\n disabled,\n onToggle,\n showRequiredPill = false,\n}: ConsentRegionProps) {\n const t = useLocale()\n const id = `jex-ml-ack-${ackKey}`\n return (\n <div class=\"jex-magicline-consent-region\">\n {showRequiredPill ? (\n <span class=\"jex-magicline-required-pill\">{t.magiclineRequired}</span>\n ) : null}\n <label class=\"jex-magicline-consent\" for={id}>\n <input\n id={id}\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={(e) => { onToggle(ackKey, e.currentTarget.checked) }}\n />\n <span class=\"jex-magicline-consent-body\">\n {title !== '' ? <span class=\"jex-magicline-terms-title\">{title}</span> : null}\n <span class=\"jex-magicline-terms-content\">\n {text}\n {attachmentUrl !== null ? (\n <>\n {' '}\n <a href={attachmentUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {attachmentLabel !== null && attachmentLabel !== '' ? attachmentLabel : attachmentUrl}\n </a>\n </>\n ) : null}\n </span>\n </span>\n </label>\n </div>\n )\n}\n\ninterface ConsentRecapProps {\n title: string\n text: string\n attachmentLabel: string | null\n attachmentUrl: string | null\n}\n\n/**\n * Read-only recap of a module consent already accepted on the Upgrades step.\n * No checkbox — the gating tick lives upstream; this only restates the accepted\n * terms (with the attachment link) in the Review summary.\n */\nfunction ConsentRecap({ title, text, attachmentLabel, attachmentUrl }: ConsentRecapProps) {\n return (\n <div class=\"jex-magicline-consent-recap\">\n {title !== '' ? <span class=\"jex-magicline-terms-title\">{title}</span> : null}\n <span class=\"jex-magicline-terms-content\">\n {text}\n {attachmentUrl !== null ? (\n <>\n {' '}\n <a href={attachmentUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {attachmentLabel !== null && attachmentLabel !== '' ? attachmentLabel : attachmentUrl}\n </a>\n </>\n ) : null}\n </span>\n </div>\n )\n}\n\n// ── Reusable field primitives (local — mirror the trial wizard's shape) ──────\n\ninterface TextFieldProps {\n label: string\n value: string\n fieldKey: string\n type?: string\n required?: boolean\n disabled: boolean\n error: string | undefined\n onInput: (value: string) => void\n}\n\nfunction TextField({\n label,\n value,\n fieldKey,\n type = 'text',\n required = false,\n disabled,\n error,\n onInput,\n}: TextFieldProps) {\n const describedBy = error !== undefined ? `jex-ml-err-${fieldKey}` : undefined\n return (\n <div class=\"jex-magicline-field\">\n <input\n class=\"jex-form-input\"\n type={type}\n aria-label={label}\n placeholder={label}\n value={value}\n required={required}\n disabled={disabled}\n aria-invalid={error !== undefined}\n aria-describedby={describedBy}\n onInput={(e) => { onInput(e.currentTarget.value) }}\n />\n {error !== undefined ? (\n <span id={describedBy} class=\"jex-magicline-error\" role=\"alert\">{error}</span>\n ) : null}\n </div>\n )\n}\n\ninterface SelectOption {\n value: string\n label: string\n}\n\ninterface SelectFieldProps {\n label: string\n value: string\n required: boolean\n disabled: boolean\n placeholder: string\n error: string | undefined\n options: SelectOption[]\n onChange: (value: string) => void\n}\n\nfunction SelectField({\n label,\n value,\n required,\n disabled,\n placeholder,\n error,\n options,\n onChange,\n}: SelectFieldProps) {\n return (\n <div class=\"jex-magicline-field\">\n <select\n class=\"jex-form-input jex-magicline-select\"\n aria-label={label}\n value={value}\n required={required}\n disabled={disabled}\n aria-invalid={error !== undefined}\n onChange={(e) => { onChange(e.currentTarget.value) }}\n >\n <option value=\"\" disabled={required}>{placeholder}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>{option.label}</option>\n ))}\n </select>\n {error !== undefined ? (\n <span class=\"jex-magicline-error\" role=\"alert\">{error}</span>\n ) : null}\n </div>\n )\n}\n\n// ── Pure helpers ─────────────────────────────────────────────────────────────\n\ninterface BundleGroup {\n bundleId: number\n bundleName: string\n bundleDescription: string | null\n bundleSubDescription: string | null\n footnote: string | null\n terms: RateBundleTermCard[]\n}\n\n/**\n * Split a bundle sub-description into display bullets. Lines are separated by\n * newlines; a leading \"- \" / \"• \" marker is stripped. Blank lines are dropped so\n * the resulting list never shows empty items.\n */\nfunction parseBundleBullets(subDescription: string | null): string[] {\n if (subDescription === null) {\n return []\n }\n return subDescription\n .split('\\n')\n .map((line) => line.replace(/^\\s*[-•]\\s*/, '').trim())\n .filter((line) => line !== '')\n}\n\n/**\n * Group term cards under their bundle heading, preserving first-seen order for\n * both bundles and the terms within each bundle.\n */\nfunction groupTermsByBundle(terms: RateBundleTermCard[]): BundleGroup[] {\n const groups: BundleGroup[] = []\n const byId = new Map<number, BundleGroup>()\n for (const term of terms) {\n let group = byId.get(term.bundleId)\n if (!group) {\n group = {\n bundleId: term.bundleId,\n bundleName: term.bundleName,\n bundleDescription: term.bundleDescription,\n bundleSubDescription: term.bundleSubDescription,\n footnote: term.footnote,\n terms: [],\n }\n byId.set(term.bundleId, group)\n groups.push(group)\n }\n group.terms.push(term)\n }\n return groups\n}\n\n/** Localised step title for the wizard header. */\nfunction stepTitleFor(step: ContractStep, t: WidgetStrings): string {\n switch (step) {\n case 'offer': {\n return t.magiclineStepOffer\n }\n case 'upgrades': {\n return t.magiclineStepUpgrades\n }\n case 'personal': {\n return t.magiclineStepPersonal\n }\n case 'address': {\n return t.magiclineStepAddress\n }\n case 'payment': {\n return t.magiclineStepPayment\n }\n case 'review': {\n return t.magiclineStepReview\n }\n default: {\n return ''\n }\n }\n}\n\n/** Localised label for a gender enum value. */\nfunction genderLabel(value: 'MALE' | 'FEMALE' | 'UNISEX', t: WidgetStrings): string {\n if (value === 'MALE') {\n return t.magiclineGenderMale\n }\n if (value === 'FEMALE') {\n return t.magiclineGenderFemale\n }\n return t.magiclineGenderUnisex\n}\n","import { useQuery } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport { useLocale } from '../../../i18n/index'\nimport { TrialSessionBookingForm } from './magicline/TrialSessionBookingForm'\nimport { ContractCreationForm } from './magicline/ContractCreationForm'\nimport type { Doc, Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface MagiclineFormMessageProps {\n message: Doc<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\n/**\n * Inline Magicline integration form rendered inside the chat thread.\n *\n * Three states driven by `message.magiclineForm.status`:\n * - `submitted` → read-only success card (NOT re-submittable).\n * - `failed` → read-only failure card.\n * - `open` → renders the interactive form: `trialSessionBooking` →\n * TrialSessionBookingForm, `contractCreation` → ContractCreationForm. The\n * dormant `leadApplication` action is intentionally NOT routed (the file stays\n * on disk but is no longer imported).\n *\n * `contractCreation` is routed for EVERY status (not just `open`): its submit\n * action flips the row to `submitted` at claim time, so the form must stay\n * mounted to render its own result envelope (customer number / terminal notice).\n *\n * 409 retry: when a `slot_unavailable` 409 reopens the form (status flips\n * back to `open` while the linked submission carries `errorCode === \"slot_unavailable\"`),\n * the form shows a \"pick another time\" notice and reloads slots. This is detected\n * by reading `getSubmissionStatus` only when the form is `open` AND a\n * `submissionId` is present (otherwise the query is skipped).\n *\n * Mirrors FormMessage (escalation): reads the row, renders read-only when the\n * backend has flipped the status, otherwise renders the interactive form. The\n * form's own submit handler additionally guards against double-submit.\n */\nexport function MagiclineFormMessage({ message, sessionId, visitorId }: MagiclineFormMessageProps) {\n const t = useLocale()\n const form = message.magiclineForm\n\n // Read the submission status ONLY when the form is open with a linked\n // submission — that is the only state where a 409 retry can have reopened it.\n // Skipped otherwise (Convex 'skip' sentinel) so submitted/failed cards never\n // issue an extra query.\n const shouldCheckRetry = !!form && form.status === 'open' && !!form.submissionId\n const submissionStatus = useQuery(\n api.functions.magicline.public.getSubmissionStatus,\n shouldCheckRetry && form?.submissionId\n ? { sessionId, visitorId, submissionId: form.submissionId }\n : 'skip',\n )\n\n // Defensive: a magicline-form row without its payload can't render anything.\n if (!form) {\n return null\n }\n\n // Contract creation owns its full lifecycle inside ContractCreationForm: the\n // submit action flips the row to `submitted` at CLAIM time (mid-dispatch), so\n // a generic read-only card here would unmount the live form before its result\n // envelope (customer number / terminal notice) can render. We therefore route\n // EVERY contractCreation status to the form, which renders the interactive\n // wizard while `open`, its own live result UI once it owns a submit envelope,\n // and a read-only card from `formStatus` on a resumed/cold session.\n if (form.action === 'contractCreation') {\n if (!message.projectId) {\n // Without a project id the submit action can't run — fail closed.\n return null\n }\n return (\n <ContractCreationForm\n formMessageId={message._id}\n sessionId={sessionId}\n visitorId={visitorId}\n projectId={message.projectId}\n formStatus={form.status}\n />\n )\n }\n\n if (form.status === 'submitted') {\n return (\n <div class=\"jex-inline-form-submitted\">\n <span class=\"jex-inline-form-check\">✓</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.magiclineSubmitted}</div>\n <div class=\"jex-inline-form-submitted-detail\">{t.magiclineSubmittedDetail}</div>\n </div>\n </div>\n )\n }\n\n if (form.status === 'failed') {\n return (\n <div class=\"jex-inline-form-submitted jex-magicline-failed\">\n <span class=\"jex-inline-form-check jex-magicline-failed-icon\">!</span>\n <div>\n <div class=\"jex-inline-form-submitted-title\">{t.magiclineFailed}</div>\n <div class=\"jex-inline-form-submitted-detail\">{t.magiclineFailedDetail}</div>\n </div>\n </div>\n )\n }\n\n // status === 'open' → interactive trial form. contractCreation is handled\n // above; leadApplication remains unwired (its form is intentionally not routed).\n if (form.action !== 'trialSessionBooking') {\n return null\n }\n\n // A reopened form whose linked submission failed with `slot_unavailable` is a\n // 409 retry — surface the notice so the visitor re-picks a time.\n const slotUnavailable =\n submissionStatus !== undefined &&\n submissionStatus !== null &&\n submissionStatus.errorCode === 'slot_unavailable'\n\n // while a 409-reopen's retry-status query is still resolving\n // (`undefined`), the wizard's Slot step must NOT decide its UI yet — otherwise\n // it can flash \"no slots\" before the slot-unavailable notice resolves. We only\n // gate when we are actually checking a reopened submission.\n const retryPending = shouldCheckRetry && submissionStatus === undefined\n\n return (\n <TrialSessionBookingForm\n formMessageId={message._id}\n sessionId={sessionId}\n visitorId={visitorId}\n slotUnavailable={slotUnavailable}\n retryPending={retryPending}\n />\n )\n}\n","import { useState } from 'preact/hooks'\nimport type { Doc } from '@repo/backend/convex/_generated/dataModel'\nimport { useLocale } from '../../../i18n/index'\n\ntype Source = NonNullable<Doc<'conversations'>['sources']>[number]\n\ninterface SourcesRowProps {\n sources: Source[]\n}\n\nconst ICONS: Record<Source['sourceType'], string> = {\n crawl: '🌐',\n file: '📄',\n snippet: '💡',\n qa: '❓',\n}\n\n/**\n * Visitor-facing pill row rendered below assistant messages. Server-side\n * filtering by `widgetConfigs.sourcesVisibility` (\"off\" | \"website\" | \"all\")\n * already trimmed the sources array before it reached the widget — this\n * component just renders whatever survived. If the array is empty, no row.\n *\n * Crawl pills are direct anchor links to the URL (visitor sees what we cited).\n * Non-crawl pills (file / snippet / qa) currently show as static badges since\n * we don't expose deep-links to the org Knowledge admin from the visitor side.\n */\nexport function SourcesRow({ sources }: SourcesRowProps) {\n const s = useLocale()\n const [expanded, setExpanded] = useState(false)\n\n if (sources.length === 0) {\n return null\n }\n\n return (\n <div class=\"jex-sources-row\">\n <button\n type=\"button\"\n class=\"jex-sources-toggle\"\n onClick={() => { setExpanded((e) => !e) }}\n aria-expanded={expanded}\n >\n <span class=\"jex-sources-icon\">📖</span>\n <span>\n {(sources.length === 1 ? s.sourcesCountOne : s.sourcesCountOther).replace(\n '{count}',\n String(sources.length),\n )}\n </span>\n <span class={`jex-sources-chevron${expanded ? ' jex-sources-chevron--open' : ''}`}>▾</span>\n </button>\n\n {expanded ? (\n <div class=\"jex-sources-pills\">\n {sources.map((s, i) => {\n const isCrawl = s.sourceType === 'crawl'\n const label = getPillLabel(s)\n const tooltip =\n isCrawl && s.url ? `${s.title}\\n${s.url}` : s.title\n\n const pillBody = (\n <>\n {typeof s.id === 'number' ? (\n <span class=\"jex-source-id\">{s.id}</span>\n ) : null}\n <span class=\"jex-source-type\">{ICONS[s.sourceType]}</span>\n <span class=\"jex-source-label\">{label}</span>\n <span class=\"jex-source-score\">· {s.score.toFixed(2)}</span>\n </>\n )\n\n if (isCrawl && s.url) {\n return (\n <a\n key={i}\n class=\"jex-source-pill\"\n href={s.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={tooltip}\n >\n {pillBody}\n </a>\n )\n }\n return (\n <span key={i} class=\"jex-source-pill\" title={tooltip}>\n {pillBody}\n </span>\n )\n })}\n </div>\n ) : null}\n </div>\n )\n}\n\n/**\n * Pill display label. Crawl pages on commerce sites typically share an\n * identical SEO `<title>` template (e.g. \"FIT-INN Trier | Premium\n * Supplements\"), so URL path/hostname disambiguates better than the title.\n * Full title remains in the tooltip.\n */\nfunction getPillLabel(source: Source): string {\n if (source.sourceType === 'crawl' && source.url) {\n try {\n const u = new URL(source.url)\n if (!u.pathname || u.pathname === '/') {\n return u.hostname\n }\n return u.pathname\n } catch {\n // Invalid URL — fall through to title.\n }\n }\n return source.title\n}\n","export function TypingIndicator() {\n return (\n <div class=\"jex-typing\">\n <span />\n <span />\n <span />\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'preact/hooks'\nimport { markActivity } from '../../../module/visitor/visitor.state'\nimport { BotMessage } from './BotMessage'\nimport { UserMessage } from './UserMessage'\nimport { FormMessage } from './FormMessage'\nimport { MagiclineFormMessage } from './MagiclineFormMessage'\nimport { SourcesRow } from './SourcesRow'\nimport { TypingIndicator } from './TypingIndicator'\nimport { useLocale } from '../../../i18n/index'\nimport { escalationFormStyle, navigate } from '../../../module/screens/screens.state'\nimport type { Doc, Id } from '@repo/backend/convex/_generated/dataModel'\n\n/**\n * Strips legacy `[N]` citation markers from displayed body text. Phase 1\n * doesn't emit them server-side, but pre-existing rows persisted before\n * the citation system was removed may still contain them — this is a\n * safety net so visitors never see stray brackets in old messages.\n *\n * The leading optional whitespace prevents \" [3].\" from leaving an\n * orphaned space before a period.\n */\nconst STRIP_MARKER_RE = /\\s?\\[\\d+\\]/g\nfunction stripCitationMarkers(text: string): string {\n return text.replace(STRIP_MARKER_RE, '')\n}\n\ninterface MessageListProps {\n conversations: Doc<'conversations'>[] | undefined\n greeting: string\n /** True when a resume attempt didn't find the old session. */\n sessionNotFound?: boolean\n /** True when resume failed and visitor hasn't started fresh yet. */\n resumeFailed?: boolean\n /** Callback to start a fresh session after resume failure. */\n onStartFresh?: () => void\n /** Session ID for escalation form submission. */\n sessionId: Id<'contactSessions'> | null\n /** Visitor ID for escalation form submission. */\n visitorId: string | null\n}\n\n/** Scrollable message area — renders messages with streaming status support. */\nexport function MessageList({ conversations, greeting, sessionNotFound, resumeFailed, onStartFresh, sessionId, visitorId }: MessageListProps) {\n const s = useLocale()\n const bottomRef = useRef<HTMLDivElement>(null)\n const [dismissedFormId, setDismissedFormId] = useState<string | null>(null)\n\n // Bump activity when a NEW final (non-streaming) assistant reply lands.\n // Streaming chunks would re-fire on every token — guard via _id dedupe.\n const lastFinalIdRef = useRef<string | null>(null)\n useEffect(() => {\n if (!visitorId || !conversations || conversations.length === 0) { return }\n const last = conversations[conversations.length - 1]\n if (last.role === 'assistant' && last.status !== 'streaming' && last._id !== lastFinalIdRef.current) {\n lastFinalIdRef.current = last._id\n markActivity(visitorId)\n }\n }, [conversations, visitorId])\n\n useEffect(() => {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [conversations?.length, conversations?.at(-1)?.content])\n\n return (\n <div class=\"jex-chat-messages\">\n <BotMessage text={greeting} />\n\n {sessionNotFound && resumeFailed && onStartFresh ? (\n <div class=\"jex-session-prompt\">\n <div class=\"jex-session-prompt-text\">{s.sessionNotFoundPrompt}</div>\n <button\n class=\"jex-session-prompt-btn\"\n type=\"button\"\n onClick={() => { void onStartFresh() }}\n >\n {s.startNewConversation}\n </button>\n </div>\n ) : sessionNotFound ? (\n <div class=\"jex-session-notice\">\n {s.sessionNotFound}\n </div>\n ) : null}\n\n {conversations?.map((msg) => {\n // ── System notices (human-notice, escalation) ─────────────\n if (msg.contentType === 'human-notice') {\n // Translate in the visitor's locale via `noticeKind`. Legacy rows\n // with no kind fall back to the English `content` baked server-side.\n const noticeText =\n msg.noticeKind === 'agent-joined'\n ? s.noticeAgentJoined.replace('{name}', msg.noticeData?.agentName ?? '')\n : msg.noticeKind === 'human-requested'\n ? s.noticeHumanRequested\n : msg.noticeKind === 'human-requested-form'\n ? s.noticeHumanRequestedForm\n : msg.noticeKind === 'message-received'\n ? s.noticeMessageReceived\n : msg.noticeKind === 'agent-handling'\n ? s.noticeAgentHandling\n : msg.content\n return <BotMessage key={msg._id} text={noticeText} />\n }\n if (msg.contentType === 'escalation-form' && sessionId && visitorId) {\n // 'screen' mode: show a \"go to form\" button that navigates to full-screen form\n if (escalationFormStyle.value === 'screen' && !msg.formData) {\n // Visitor dismissed this card\n if (dismissedFormId === msg._id) { return null }\n\n return (\n <div key={msg._id} class=\"jex-inline-form jex-inline-form-card\">\n <div class=\"jex-inline-form-title\">{s.escalationPromptTitle}</div>\n <div class=\"jex-inline-form-subtitle\">{s.escalationPromptSubtitle}</div>\n <button\n class=\"jex-form-submit\"\n type=\"button\"\n onClick={() => { navigate({ id: 'escalation-form', formMessageId: msg._id, sessionId, visitorId }) }}\n >\n {s.escalationPromptSubmit}\n </button>\n <button\n class=\"jex-escalation-skip\"\n type=\"button\"\n onClick={() => { setDismissedFormId(msg._id) }}\n >\n {s.escalationSkip}\n </button>\n </div>\n )\n }\n // 'inline' mode (default): render the form card directly in chat\n return <FormMessage key={msg._id} message={msg} sessionId={sessionId} visitorId={visitorId} />\n }\n if (msg.contentType === 'magicline-form' && sessionId && visitorId) {\n return <MagiclineFormMessage key={msg._id} message={msg} sessionId={sessionId} visitorId={visitorId} />\n }\n if (msg.contentType === 'escalation-confirm') {\n // Rebuild the reference card in the visitor's locale. BotMessage\n // renders markdown (newlines + **bold**). Legacy rows without a\n // `noticeKind` fall back to the English `content` baked server-side.\n const confirmText =\n msg.noticeKind === 'escalation-confirmed'\n ? s.noticeEscalationConfirmed\n .replace('{name}', msg.noticeData?.visitorName ?? '')\n .replace('{email}', msg.noticeData?.visitorEmail ?? '')\n .replace('{ref}', msg.noticeData?.visitorId ?? '')\n : msg.content\n return <BotMessage key={msg._id} text={confirmText} />\n }\n\n // ── Standard messages ───────────────────────────────────\n if (msg.role === 'user') {\n return <UserMessage key={msg._id} text={msg.content} />\n }\n\n // Shared author props for all assistant message states\n const authorProps = {\n authorId: msg.authorId,\n authorName: msg.authorName,\n authorImage: msg.authorImage,\n }\n\n // Assistant message — render based on streaming status\n if (msg.status === 'streaming' && msg.content === '') {\n return <TypingIndicator key={msg._id} />\n }\n\n if (msg.status === 'streaming') {\n return <BotMessage key={msg._id} text={stripCitationMarkers(msg.content)} streaming {...authorProps} />\n }\n\n if (msg.status === 'error') {\n return (\n <BotMessage\n key={msg._id}\n text={msg.errorMessage ?? `${s.somethingWentWrong}. ${s.tryAgain}.`}\n error\n {...authorProps}\n />\n )\n }\n\n // Final assistant message — render bubble plus the source pills row.\n // Server-side filtering by widgetConfigs.sourcesVisibility (\"off\" |\n // \"website\" | \"all\") already trimmed the array, so SourcesRow just\n // renders whatever survived. Empty array → component returns null.\n return (\n <div key={msg._id}>\n <BotMessage text={stripCitationMarkers(msg.content)} {...authorProps} />\n {msg.sources && msg.sources.length > 0 ? (\n <SourcesRow sources={msg.sources} />\n ) : null}\n </div>\n )\n })}\n\n <div ref={bottomRef} />\n </div>\n )\n}\n","import { useEffect, useState } from 'preact/hooks'\n\ninterface LoadingScreenProps {\n message?: string\n}\n\n/**\n * Full-coverage overlay shown during async operations.\n * Defers first paint by 80ms to suppress single-frame flicker on fast resolves.\n */\nexport function LoadingScreen({ message }: LoadingScreenProps) {\n const [shown, setShown] = useState(false)\n\n useEffect(() => {\n const t = setTimeout(() => { setShown(true) }, 80)\n return () => { clearTimeout(t) }\n }, [])\n\n if (!shown) { return null }\n\n return (\n <div class=\"jex-overlay jex-loading\">\n <div class=\"jex-loading-spinner\" aria-hidden=\"true\" />\n {message && <p class=\"jex-loading-message\">{message}</p>}\n </div>\n )\n}\n","import { useQuery } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport type { Doc, Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface UseConversationArgs {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n}\n\nexport type SessionLiveStatus = 'active' | 'escalated' | 'assigned' | 'resolved'\n\ninterface UseConversationResult {\n /** Conversation rows; `undefined` until first server response (loading). */\n conversations: Doc<'conversations'>[] | undefined\n /** Live status of the contact session, or null while loading / no session. */\n sessionStatus: SessionLiveStatus | null\n /** True while the conversations query is in flight for a known session. */\n isLoading: boolean\n /** True while any bot/agent message is mid-stream. */\n isStreaming: boolean\n}\n\n/**\n * Conversation data hook — wraps the two Convex queries ChatScreen\n * needs (message list + live session status) so the component is\n * free of `api.functions.chat.public.*` paths.\n *\n * Both queries use the `'skip'` idle pattern until a session exists,\n * keeping subscription cost at zero before the first send.\n */\nexport function useConversation({ sessionId, visitorId }: UseConversationArgs): UseConversationResult {\n // Subscribe to the visitor's conversation rows for this session.\n const conversations = useQuery(\n api.functions.chat.public.conversations.listBySession,\n sessionId && visitorId ? { sessionId, visitorId } : 'skip',\n )\n\n // Subscribe to the session's live status (reacts to agent accept / resolve).\n const liveStatus = useQuery(\n api.functions.chat.public.sessions.getSessionStatus,\n sessionId && visitorId ? { sessionId, visitorId } : 'skip',\n )\n\n // Loading only matters once a session id exists — otherwise the\n // query is intentionally skipped and `undefined` is the correct\n // resting state, not a loading state.\n const isLoading = sessionId !== null && conversations === undefined\n // Any in-flight stream → freeze input + show typing affordance upstream.\n const isStreaming = conversations?.some((m) => m.status === 'streaming') ?? false\n\n return {\n conversations,\n sessionStatus: liveStatus ?? null,\n isLoading,\n isStreaming,\n }\n}\n","import { useEffect, useRef } from 'preact/hooks'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\nimport { MessageList } from './MessageList'\nimport { ChatInput } from '../composer'\nimport { LoadingScreen } from '../../../shared/ui/LoadingScreen'\nimport { hasAnyHistory, chatMountIntent, markActivity } from '../../../module/visitor/visitor.state'\nimport { useLocale } from '../../../i18n/index'\nimport { useConversation } from '../hooks/useConversation'\nimport type { SessionResult } from '../hooks/useConvexSession'\n\ninterface ChatScreenProps {\n greeting: string\n // Session state hoisted from WidgetShell — avoids duplicate useConvexSession subscriptions\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n isLoading: boolean\n sessionNotFound: boolean\n resumeFailed: boolean\n isOrgDeleted: boolean\n ensureSession: () => Promise<SessionResult | null>\n startFresh: () => Promise<SessionResult | null>\n}\n\n/**\n * Chat screen — renders immediately with greeting + input.\n * Session is created lazily on first send (no loading spinner on open).\n *\n * Owns the conversations query so both MessageList and ChatInput\n * can react to streaming status from a single subscription.\n *\n * Note: session state is hoisted into WidgetShell so the Header can show\n * HumanHandoffAction with the same sessionId/visitorId — no duplicate subscriptions.\n */\nexport function ChatScreen({ greeting, sessionId, visitorId, isLoading, sessionNotFound, resumeFailed, isOrgDeleted, ensureSession, startFresh }: ChatScreenProps) {\n const s = useLocale()\n\n // Single seam over the two queries ChatScreen needs (message list +\n // live session status). Hook handles the `'skip'` idle pattern.\n const { conversations, sessionStatus, isLoading: isQueryLoading, isStreaming } = useConversation({ sessionId, visitorId })\n\n // Snapshot mount intent once at first render.\n // peek() avoids subscribing to the signal; chatMountIntent clear is a side-effect — moved to useEffect.\n const mountIntent = useRef<'fresh' | 'resume'>(\n (() => {\n const v = chatMountIntent.peek()\n if (v !== null) { return v }\n // Treat null as 'fresh' for first-time visitors; 'resume' when arriving\n // with history (e.g. direct link into chat without HomeScreen action).\n return hasAnyHistory.peek() ? 'resume' : 'fresh'\n })(),\n ).current\n\n // Clear the signal after mount so subsequent mounts are unambiguous (side-effect — proper slot).\n useEffect(() => {\n chatMountIntent.value = null\n }, [])\n\n // Auto-resolve existing session so messages appear on resume (not just on send).\n // AFTER — eager unconditional create. Backend createOrResume is idempotent.\n useEffect(() => {\n void ensureSession()\n }, [ensureSession])\n\n // Bump TTL anchor every time ChatScreen mounts so reopening the widget\n // counts as activity. Prevents silent pruning of active sessions.\n useEffect(() => {\n if (visitorId) {\n markActivity(visitorId)\n }\n }, [visitorId])\n\n if (isOrgDeleted) {\n return (\n <div class=\"jex-chat-messages\">\n <div class=\"jex-session-notice\">{s.chatNoLongerAvailable}</div>\n </div>\n )\n }\n\n // LoadingScreen rules:\n // - resume intent → show until conversations query resolves\n // - fresh intent → show until sessionId is set (null until ensureSession resolves)\n const isFreshSessionLoading = mountIntent === 'fresh' && !sessionId\n // Resume covers TWO windows: (a) sessionId not yet resolved (mutation in flight),\n // (b) sessionId resolved but conversations query still loading.\n const isResumeLoading = mountIntent === 'resume' && (!sessionId || isQueryLoading)\n\n if (isFreshSessionLoading) {\n return <LoadingScreen message={s.startingConversation} />\n }\n if (isResumeLoading) {\n return <LoadingScreen message={s.resumeConversation} />\n }\n\n return (\n <>\n <MessageList\n conversations={conversations}\n greeting={greeting}\n sessionNotFound={sessionNotFound}\n resumeFailed={resumeFailed}\n onStartFresh={startFresh}\n sessionId={sessionId}\n visitorId={visitorId}\n />\n <ChatInput\n sessionId={sessionId}\n visitorId={visitorId}\n isLoading={isLoading}\n isStreaming={isStreaming}\n sessionStatus={sessionStatus}\n ensureSession={ensureSession}\n onStartFresh={startFresh}\n />\n </>\n )\n}\n","import { useState } from 'preact/hooks'\nimport { back } from '../../../module/screens/screens.state'\nimport { PLATFORM_PRIVACY_POLICY_URL, resolvedPrivacyPolicyUrl } from '../../../module/shell/shell.state'\nimport { locale as widgetLocale, useLocale } from '../../../i18n/index'\nimport { useEscalation } from '../hooks/useEscalation'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface EscalationFormScreenProps {\n formMessageId: Id<'conversations'>\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\n/**\n * Full-screen escalation form — alternative to the inline FormMessage.\n * Uses the same .jex-form-* styling as FormScreen but calls the real\n * submitEscalation mutation instead of a mock.\n *\n * Navigated to from MessageList when escalationFormStyle === 'screen'.\n * On submit: patches the form message, shows confirmation, then goes back to chat.\n */\nexport function EscalationFormScreen({ formMessageId, sessionId, visitorId }: EscalationFormScreenProps) {\n const t = useLocale()\n const rawPrivacyUrl = resolvedPrivacyPolicyUrl.value\n const privacyUrl = /^https?:\\/\\//i.test(rawPrivacyUrl) ? rawPrivacyUrl : PLATFORM_PRIVACY_POLICY_URL\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n\n // Bound to the escalation seam — single touch point shared with FormMessage.\n const submitEscalation = useEscalation()\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n\n async function handleSubmit(e: Event) {\n e.preventDefault()\n setSubmitting(true)\n setSubmitError(null)\n try {\n // Submit escalation — backend inserts escalation-confirm BotMessage inline.\n await submitEscalation({\n sessionId,\n visitorId,\n formMessageId,\n visitorName: name.trim(),\n visitorEmail: email.trim(),\n locale: widgetLocale.value,\n })\n // Pop back to chat; the freshly-inserted escalation-confirm row renders there.\n back()\n } catch (error) {\n console.error('[EscalationFormScreen] Submit failed:', error)\n // Keep form mounted; show inline error so visitor can retry.\n setSubmitError(t.escalationSubmitFailed)\n } finally {\n setSubmitting(false)\n }\n }\n\n return (\n <div class=\"jex-form-screen\">\n <h2 class=\"jex-form-title\">{t.escalationFormTitle}</h2>\n <p class=\"jex-escalation-subtitle\">{t.escalationSubtitle}</p>\n {submitError && (\n <div class=\"jex-form-error\" role=\"alert\">{submitError}</div>\n )}\n <form class=\"jex-form\" onSubmit={(e) => { void handleSubmit(e) }}>\n <input\n class=\"jex-form-input\"\n type=\"text\"\n placeholder={t.escalationNameLabel}\n value={name}\n required\n onInput={(e) => { setName(e.currentTarget.value) }}\n />\n <input\n class=\"jex-form-input\"\n type=\"email\"\n placeholder={t.escalationEmailLabel}\n value={email}\n required\n onInput={(e) => { setEmail(e.currentTarget.value) }}\n />\n <button class=\"jex-form-submit\" type=\"submit\" disabled={submitting}>{t.escalationSubmit}</button>\n </form>\n <div class=\"jex-inline-form-consent\" style={{ textAlign: 'center', margin: '16px 0 8px 0' }}>\n {t.escalationConsent}{' '}\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\" class=\"jex-privacy-notice-link\">\n {t.escalationPrivacyLinkText}\n </a>.\n </div>\n <button class=\"jex-escalation-skip\" type=\"button\" onClick={() => { back() }}>\n {t.escalationSkip}\n </button>\n </div>\n )\n}\n","import { useMutation } from 'convex/react'\nimport { api } from '@repo/backend/convex/_generated/api'\n\n/**\n * Handoff hook — single touch point for the headless\n * `createEscalationRequest` mutation.\n *\n * Returned function fires the request and the backend decides the\n * branch (skipForm vs. requires-form) via its return discriminator.\n * Caller is responsible for navigating + reading the bootstrap\n * token; the hook just abstracts the api path.\n */\nexport function useHandoff() {\n return useMutation(api.functions.chat.public.helpdesk.createEscalationRequest)\n}\n","import { useState } from 'preact/hooks'\nimport { navigate } from '../../../module/screens/screens.state'\nimport { bootstrapToken } from '../../../module/shell/shell.state'\nimport { locale as widgetLocale, useLocale } from '../../../i18n/index'\nimport { useHandoff } from '../hooks/useHandoff'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\n\ninterface HumanHandoffActionProps {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n}\n\n/**\n * Header button — \"Talk to human\".\n *\n * Calls createEscalationRequest. Backend decides:\n * - If session has visitor info → returns { skipForm:true, ticketRef } →\n * navigate to ConfirmationScreen (no form needed).\n * - Else → returns { skipForm:false, formMessageId } →\n * navigate to EscalationFormScreen (existing flow).\n *\n * Zero LLM tokens consumed on this path.\n */\nexport function HumanHandoffAction({ sessionId, visitorId }: HumanHandoffActionProps) {\n const t = useLocale()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Bound to the handoff seam — headless escalation mutation.\n const createRequest = useHandoff()\n\n async function handleClick() {\n if (!sessionId || !visitorId) { return }\n const token = bootstrapToken.value\n if (!token) { return }\n\n setBusy(true)\n setError(null)\n try {\n // Fire the headless escalation — backend chooses the branch.\n const result = await createRequest({\n sessionId,\n visitorId,\n bootstrapToken: token,\n locale: widgetLocale.value,\n })\n\n if (result.skipForm) {\n // Visitor info already on session — backend inserted escalation-confirm BotMessage.\n // Stay on chat; subscription picks up the row and renders it inline.\n return\n }\n // Need to collect name + email — route to existing form screen.\n navigate({ id: 'escalation-form', formMessageId: result.formMessageId, sessionId, visitorId })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // Distinguish rate-limit from generic failure to drive copy.\n setError(/RATE_LIMITED|Too many/.test(msg) ? t.handoffRateLimited : t.handoffFailed)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <>\n <button\n class=\"jex-header-handoff\"\n type=\"button\"\n onClick={() => { void handleClick() }}\n disabled={busy || !sessionId || !visitorId}\n aria-label={t.talkToHumanAria}\n title={t.talkToHuman}\n >\n {/* Headset glyph — icon-only saves header real-estate on mobile;\n label survives as title= tooltip + aria-label for a11y. */}\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 14v-3a9 9 0 0 1 18 0v3\" />\n <path d=\"M21 14a2 2 0 0 1-2 2h-1a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1h3z\" />\n <path d=\"M3 14a2 2 0 0 0 2 2h1a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1H3z\" />\n <path d=\"M21 14v3a4 4 0 0 1-4 4h-3\" />\n </svg>\n </button>\n {error && <div class=\"jex-handoff-error\" role=\"alert\">{error}</div>}\n </>\n )\n}\n","/**\n * Re-POST /widget/bootstrap to obtain a fresh bootstrap token after the\n * 1-hour TTL elapses mid-session. Reads cached inputs stashed by\n * useBootstrap, writes the new token into the shared signal, and returns\n * a discriminated result so callers can render a visitor-facing notice\n * (not just a console line).\n *\n * Call when a mutation rejects with UNAUTHORIZED_ORIGIN to obtain a fresh\n * token and retry.\n */\nimport { bootstrapWidget } from './widgetBootstrap'\nimport { bootstrapInputs, bootstrapToken } from '../module/shell/shell.state'\n\nexport type RefreshResult =\n | { ok: true; token: NonNullable<typeof bootstrapToken.value> }\n | { ok: false; reason: 'no-inputs' | 'unauthorized' | 'not_found' | 'rate_limited' | 'network' }\n\nexport async function refreshBootstrapToken(): Promise<RefreshResult> {\n const inputs = bootstrapInputs.value\n if (!inputs) {\n console.warn('[JexityChat] Bootstrap refresh skipped — inputs missing')\n return { ok: false, reason: 'no-inputs' }\n }\n\n const result = await bootstrapWidget(inputs.orgSlug, inputs.siteUrl, inputs.projSlug)\n if (!result.ok) {\n console.warn('[JexityChat] Bootstrap refresh failed:', result.error)\n return { ok: false, reason: result.error }\n }\n\n const fresh = result.token as NonNullable<typeof bootstrapToken.value>\n bootstrapToken.value = fresh\n return { ok: true, token: fresh }\n}\n","import { useRef, useCallback, useEffect } from 'preact/hooks'\nimport { useSignal } from '@preact/signals'\nimport { useMutation } from 'convex/react'\nimport { ConvexError } from 'convex/values'\nimport { api } from '@repo/backend/convex/_generated/api'\nimport type { Id } from '@repo/backend/convex/_generated/dataModel'\nimport { currentSessionRef, startNewSession } from '../../../module/visitor/visitor.state'\nimport { isSessionBusy, registerLockResetCallback } from '../../../module/visitor/idle-lock'\nimport { widgetSource, bootstrapToken } from '../../../module/shell/shell.state'\nimport { refreshBootstrapToken } from '../../../lib/refreshBootstrap'\nimport { sessionError, type SessionErrorReason } from '../state'\nimport { locale as widgetLocale } from '../../../i18n/index'\n\n/** Map a thrown error to a visitor-facing reason for the sessionError signal. */\nfunction reasonForError(err: unknown): SessionErrorReason {\n if (isBootstrapExpiredError(err)) { return 'unauthorized' }\n if (err instanceof Error && /network|fetch|failed to fetch/i.test(err.message)) {\n return 'network'\n }\n return 'unknown'\n}\n\n/**\n * True when the createOrResume mutation rejects with the server-side\n * UNAUTHORIZED_ORIGIN code — emitted when the 1-hour bootstrap token has\n * expired or the origin allow-list changed. Caller uses this to trigger\n * a one-shot bootstrap refresh and retry.\n */\nfunction isBootstrapExpiredError(err: unknown): boolean {\n if (!(err instanceof ConvexError)) { return false }\n const data = err.data as { code?: string } | undefined\n return data?.code === 'UNAUTHORIZED_ORIGIN'\n}\n\n// Resolves once bootstrapToken signal becomes defined, or null after timeout.\n// React entry bootstraps the token asynchronously via useBootstrap, so the\n// first ensureSession() can race ahead of the POST /widget/bootstrap response.\nfunction waitForBootstrapToken(timeoutMs = 10_000): Promise<typeof bootstrapToken.value | null> {\n if (bootstrapToken.value) {\n return Promise.resolve(bootstrapToken.value)\n }\n return new Promise((resolve) => {\n let settled = false\n const finish = (val: typeof bootstrapToken.value | null) => {\n if (settled) { return }\n settled = true\n clearTimeout(timer)\n dispose()\n resolve(val)\n }\n const timer = setTimeout(() => { finish(null) }, timeoutMs)\n const dispose = bootstrapToken.subscribe((val) => {\n if (val) { finish(val) }\n })\n })\n}\n\ntype SessionStatus = 'active' | 'escalated' | 'assigned' | 'resolved' | 'org_deleted' | null\n\nexport interface SessionResult {\n sessionId: Id<'contactSessions'>\n visitorId: string\n}\n\ninterface ConvexSession {\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n isLoading: boolean\n /** True when a resume attempt didn't find the old session (old one not found). */\n sessionNotFound: boolean\n /** True when resume failed and visitor hasn't chosen to start new yet. */\n resumeFailed: boolean\n /** Session escalation status from backend. */\n sessionStatus: SessionStatus\n /** True when the session's org has been deleted — show dead-end message, hide input. */\n isOrgDeleted: boolean\n /** Call before the first send — creates/resumes a Convex session lazily. */\n ensureSession: () => Promise<SessionResult | null>\n /** Clears the failed resume state and starts a fresh session. */\n startFresh: () => Promise<SessionResult | null>\n /** Clears cached resolved session so next ensureSession() re-resolves from currentSessionRef.\n * Called by HomeScreen when visitor resumes a different history entry. */\n resetSession: () => void\n}\n\n/**\n * Lazy session hook — does NOT create a session on mount.\n * Call `ensureSession()` when the visitor sends their first message.\n *\n * Uses a ref to track the resolved session, avoiding stale closures\n * and preventing duplicate mutations on rapid double-sends.\n */\nexport function useConvexSession(orgSlug: string, projSlug?: string): ConvexSession {\n const resolvedRef = useRef<SessionResult | null>(null)\n const isLoading = useSignal(false)\n const sessionNotFound = useSignal(false)\n const resumeFailed = useSignal(false)\n const sessionStatus = useSignal<SessionStatus>(null)\n\n const createOrResumeMut = useMutation(api.functions.chat.public.sessions.createOrResume)\n\n // Auto-recovers from UNAUTHORIZED_ORIGIN (expired bootstrap token) by\n // re-POSTing /widget/bootstrap once and retrying.\n const callCreateOrResume = async (vid: string) => {\n const initialToken = await waitForBootstrapToken()\n if (!initialToken) {\n // 10s timeout — surface to UI so the visitor sees something instead\n // of a send button that does nothing.\n console.warn('[JexityChat] No bootstrap token after 10s — session creation blocked.')\n sessionError.value = 'no-token'\n return null\n }\n\n const buildArgs = (tok: NonNullable<typeof bootstrapToken.value>) => ({\n orgSlug,\n ...(projSlug ? { projSlug } : {}),\n visitorId: vid,\n bootstrapToken: tok,\n locale: widgetLocale.value,\n ...(widgetSource.value ? { source: widgetSource.value } : {}),\n })\n\n // Flag the privacy-lock watcher so its 60s poll skips this tick — the\n // wipe must not race an awaited createOrResume (would orphan resolvedRef).\n isSessionBusy.value = true\n let result\n try {\n try {\n result = await createOrResumeMut(buildArgs(initialToken))\n } catch (err) {\n if (!isBootstrapExpiredError(err)) { throw err }\n // Token expired mid-session — refresh once, then retry. If the\n // refresh itself errors (rate-limit, origin de-auth) we surface a\n // discriminated reason instead of letting the visitor see nothing.\n const refresh = await refreshBootstrapToken()\n if (!refresh.ok) {\n sessionError.value = refresh.reason === 'rate_limited' ? 'network' : 'unauthorized'\n return null\n }\n result = await createOrResumeMut(buildArgs(refresh.token))\n }\n } finally {\n isSessionBusy.value = false\n }\n\n // Success — clear any stale notice from a prior failure.\n sessionError.value = null\n sessionStatus.value = result.status\n const session: SessionResult = { sessionId: result.sessionId, visitorId: vid }\n resolvedRef.current = session\n return { session, result }\n }\n\n const ensureSession = useCallback(async (): Promise<SessionResult | null> => {\n // Already resolved — return immediately (ref avoids stale closure)\n if (resolvedRef.current) {\n return resolvedRef.current\n }\n\n // If resume already failed, don't auto-create — wait for startFresh()\n if (resumeFailed.value) {\n return null\n }\n\n isLoading.value = true\n const hadExistingRef = currentSessionRef.value !== null\n const vid = currentSessionRef.value ?? startNewSession()\n\n try {\n const outcome = await callCreateOrResume(vid)\n if (!outcome) { return null }\n\n // Detect resume failure: had a stored ref but server created a new session.\n if (hadExistingRef && outcome.result.isNew) {\n sessionNotFound.value = true\n resumeFailed.value = true\n }\n\n return outcome.session\n } catch (err) {\n console.error('[JexityChat] Failed to create session:', err)\n sessionError.value = reasonForError(err)\n return null\n } finally {\n isLoading.value = false\n }\n }, [orgSlug, projSlug, createOrResumeMut, isLoading, sessionNotFound, resumeFailed])\n\n // Clear cached resolved session so next ensureSession() re-resolves from currentSessionRef.\n // Called when HomeScreen routes to a different history entry — and also\n // by the privacy lock so the wipe clears this hook's resolvedRef.\n const resetSession = useCallback(() => {\n resolvedRef.current = null\n sessionNotFound.value = false\n resumeFailed.value = false\n }, [sessionNotFound, resumeFailed])\n\n // Mirror lock wipes into resolvedRef so a post-lock send can't reuse a\n // stale sessionId for a visitor whose ref was just cleared.\n useEffect(() => registerLockResetCallback(resetSession), [resetSession])\n\n // Start a fresh session after resume failure — visitor explicitly chose this\n const startFresh = useCallback(async (): Promise<SessionResult | null> => {\n resolvedRef.current = null\n resumeFailed.value = false\n sessionNotFound.value = false\n\n const vid = startNewSession()\n isLoading.value = true\n\n try {\n const outcome = await callCreateOrResume(vid)\n return outcome?.session ?? null\n } catch (err) {\n console.error('[JexityChat] Failed to create fresh session:', err)\n sessionError.value = reasonForError(err)\n return null\n } finally {\n isLoading.value = false\n }\n }, [orgSlug, projSlug, createOrResumeMut, isLoading, sessionNotFound, resumeFailed, sessionStatus])\n\n const resolved = resolvedRef.current\n return {\n sessionId: resolved?.sessionId ?? null,\n visitorId: resolved?.visitorId ?? null,\n isLoading: isLoading.value,\n sessionNotFound: sessionNotFound.value,\n resumeFailed: resumeFailed.value,\n sessionStatus: sessionStatus.value,\n isOrgDeleted: sessionStatus.value === 'org_deleted',\n ensureSession,\n startFresh,\n resetSession,\n }\n}\n","import { useState } from 'preact/hooks'\nimport { replace } from '../../../module/screens/screens.state'\nimport { useLocale } from '../../../i18n/index'\n\n/** Contact / ticket submission form. On submit: replace with loading, then confirmation/error. */\nexport function FormScreen() {\n const t = useLocale()\n const [name, setName] = useState('')\n const [email, setEmail] = useState('')\n const [message, setMessage] = useState('')\n\n async function handleSubmit(e: Event) {\n e.preventDefault()\n replace({ id: 'loading', message: t.submittingTicket })\n\n // TODO: Phase 2 — replace with Convex mutation\n await new Promise<void>(resolve => { setTimeout(resolve, 1200) })\n const ref = 'JEX-' + Math.random().toString(36).slice(2, 8).toUpperCase()\n replace({ id: 'confirmation', ref })\n }\n\n return (\n <div class=\"jex-form-screen\">\n <h2 class=\"jex-form-title\">{t.submitTicket}</h2>\n <form class=\"jex-form\" onSubmit={(e) => { void handleSubmit(e) }}>\n <input\n class=\"jex-form-input\"\n type=\"text\"\n placeholder={t.yourName}\n value={name}\n required\n onInput={(e) => { setName(e.currentTarget.value) }}\n />\n <input\n class=\"jex-form-input\"\n type=\"email\"\n placeholder={t.yourEmail}\n value={email}\n required\n onInput={(e) => { setEmail(e.currentTarget.value) }}\n />\n <textarea\n class=\"jex-form-textarea\"\n placeholder={t.howCanWeHelp}\n value={message}\n required\n onInput={(e) => { setMessage(e.currentTarget.value) }}\n />\n <button class=\"jex-form-submit\" type=\"submit\">{t.submit}</button>\n </form>\n </div>\n )\n}\n","import { isOpen } from '../../../module/shell/shell.state'\nimport { useLocale } from '../../../i18n/index'\n\ninterface ConfirmationScreenProps {\n ticketRef: string\n}\n\n/** Shown after async ticket submission. Displays ref# and closes widget on Done. */\nexport function ConfirmationScreen({ ticketRef }: ConfirmationScreenProps) {\n const t = useLocale()\n return (\n <div class=\"jex-confirmation\">\n <div class=\"jex-confirmation-icon\" aria-hidden=\"true\">✓</div>\n <h2 class=\"jex-confirmation-title\">{t.ticketSubmitted}</h2>\n <p class=\"jex-confirmation-body\">{t.yourReferenceNumber}</p>\n <div class=\"jex-confirmation-ref\">{ticketRef}</div>\n <p class=\"jex-confirmation-hint\">{t.sentToEmailHint}</p>\n <button\n class=\"jex-confirmation-done\"\n onClick={() => { isOpen.value = false }}\n >\n {t.done}\n </button>\n </div>\n )\n}\n","import { useLocale } from '../../i18n/index'\n\ninterface ErrorScreenProps {\n message: string\n onRetry?: () => void\n onBack?: () => void\n}\n\n/** Full-coverage overlay shown when an async operation fails. */\nexport function ErrorScreen({ message, onRetry, onBack }: ErrorScreenProps) {\n const t = useLocale()\n return (\n <div class=\"jex-overlay jex-error\">\n <p class=\"jex-error-message\">{message}</p>\n <div class=\"jex-error-actions\">\n {onRetry && (\n <button class=\"jex-error-retry\" onClick={onRetry}>\n {t.tryAgain}\n </button>\n )}\n {onBack && (\n <button class=\"jex-error-back\" onClick={onBack}>\n {t.goBack}\n </button>\n )}\n </div>\n </div>\n )\n}\n","import { screenStack } from './screens.state'\nimport type { ScreenState } from './screens.state'\nimport { back, replace } from './screens.state'\nimport { HomeScreen } from '../../features/home/components/HomeScreen'\nimport { SelectionScreen } from '../../features/selection/components/SelectionScreen'\nimport { ChatScreen, EscalationFormScreen, type SessionResult } from '../../features/chat'\nimport { FormScreen } from '../../features/ticket/components/FormScreen'\nimport { ConfirmationScreen } from '../../features/ticket/components/ConfirmationScreen'\nimport { LoadingScreen } from '../../shared/ui/LoadingScreen'\nimport { ErrorScreen } from '../../shared/ui/ErrorScreen'\n\ninterface ScreenRouterProps {\n greeting: string\n title: string\n orgSlug: string\n projSlug?: string\n // Hoisted session state from WidgetShell — passed down to ChatScreen\n sessionId: Id<'contactSessions'> | null\n visitorId: string | null\n isLoading: boolean\n sessionNotFound: boolean\n resumeFailed: boolean\n isOrgDeleted: boolean\n ensureSession: () => Promise<SessionResult | null>\n startFresh: () => Promise<SessionResult | null>\n resetSession: () => void\n}\n\n/** Renders only the active screen. No animation — add transitions later once routing is stable. */\nexport function ScreenRouter({ greeting, title, sessionId, visitorId, isLoading, sessionNotFound, resumeFailed, isOrgDeleted, ensureSession, startFresh, resetSession }: ScreenRouterProps) {\n const stack = screenStack.value\n const currentScreen = stack[stack.length - 1] as ScreenState\n\n const confirmationState = [...stack].reverse().find(\n (s): s is Extract<ScreenState, { id: 'confirmation' }> => s.id === 'confirmation'\n )\n\n return (\n <div class=\"jex-screen-container\">\n {currentScreen.id === 'home' && (\n <HomeScreen greeting={greeting} title={title} onStartFresh={startFresh} onResetSession={resetSession} />\n )}\n {currentScreen.id === 'selection' && (\n <SelectionScreen title={title} />\n )}\n {currentScreen.id === 'form' && (\n <FormScreen />\n )}\n {currentScreen.id === 'escalation-form' && (\n <EscalationFormScreen\n formMessageId={currentScreen.formMessageId}\n sessionId={currentScreen.sessionId}\n visitorId={currentScreen.visitorId}\n />\n )}\n {currentScreen.id === 'confirmation' && confirmationState && (\n <ConfirmationScreen ticketRef={confirmationState.ref} />\n )}\n {currentScreen.id === 'chat' && (\n <ChatScreen\n greeting={greeting}\n sessionId={sessionId}\n visitorId={visitorId}\n isLoading={isLoading}\n sessionNotFound={sessionNotFound}\n resumeFailed={resumeFailed}\n isOrgDeleted={isOrgDeleted}\n ensureSession={ensureSession}\n startFresh={startFresh}\n />\n )}\n {currentScreen.id === 'loading' && (\n <LoadingScreen message={currentScreen.message} />\n )}\n {currentScreen.id === 'error' && (\n <ErrorScreen\n message={currentScreen.message}\n onRetry={() => replace({ id: 'loading' })}\n onBack={back}\n />\n )}\n </div>\n )\n}\n","import { useEffect } from 'preact/hooks'\nimport {\n isOpen,\n PLATFORM_PRIVACY_POLICY_URL,\n privacyNoticeStyle,\n resolvedPrivacyPolicyUrl,\n} from './shell.state'\nimport { useRemoteConfig } from './hooks/useRemoteConfig'\nimport { useBootstrap } from './hooks/useBootstrap'\nimport { usePathGuard } from './hooks/usePathGuard'\nimport { usePreviewBridge } from './hooks/usePreviewBridge'\nimport { initVisitor } from '../visitor/visitor.state'\nimport { startIdleLockWatcher } from '../visitor/idle-lock'\nimport { screenStack, resetInitialStack } from '../screens/screens.state'\nimport { locale } from '../../i18n/index'\nimport { resolveWidgetLocale } from '../../i18n/resolve-widget-locale'\nimport { buildThemeStyle } from '../../shared/theme/build-theme'\nimport { Header } from '../../shared/ui/Header'\nimport { Footer } from '../../shared/ui/Footer'\nimport { FAB } from '../../shared/ui/FAB'\nimport { ScreenRouter } from '../screens/ScreenRouter'\nimport { mergeWidgetConfig } from '../../lib/widget-config'\nimport { useConvexSession, HumanHandoffAction } from '../../features/chat'\nimport type { JexityChatOptions } from '../../types'\n\ninterface WidgetShellProps {\n options: JexityChatOptions\n}\n\n/**\n * Outer shell: always runs bootstrap + path guard.\n * Only mounts WidgetContent (and its Convex subscriptions) when the path is allowed,\n * keeping hook counts stable in each component regardless of navigation.\n */\nexport function WidgetShell({ options }: WidgetShellProps) {\n useBootstrap({\n orgSlug: options.orgSlug,\n projSlug: options.projSlug,\n preToken: options.bootstrapToken,\n convexUrl: options.convexUrl,\n preAllowedUrls: options.allowedUrls ?? [],\n preExcludedPaths: options.excludePaths,\n })\n\n const isPathAllowed = usePathGuard()\n if (!isPathAllowed) { return null }\n return <WidgetContent options={options} />\n}\n\n/** Inner component — only mounted when path guard passes. All hooks here run unconditionally. */\nfunction WidgetContent({ options }: WidgetShellProps) {\n // Fetch widget config from Convex; aborts/resets on orgSlug/projSlug change or unmount\n const remoteConfig = useRemoteConfig(options.orgSlug, options.projSlug, options.convexUrl)\n\n // Dashboard preview iframe bridge — handles live locale updates from the Studio\n usePreviewBridge(options.parentOrigin)\n\n // One-time bootstrap: load visitor session ref from sessionStorage,\n // then re-seed the screen stack so returning visitors land on home.\n useEffect(() => {\n initVisitor()\n resetInitialStack()\n }, [])\n\n // Hoist session state so the Header can receive sessionId/visitorId for the\n // handoff button without a second subscription in ChatScreen.\n const { sessionId, visitorId, isLoading, sessionNotFound, resumeFailed, isOrgDeleted, ensureSession, startFresh, resetSession } = useConvexSession(options.orgSlug, options.projSlug)\n\n // Merge embed-script options with Convex remote config (embed takes precedence)\n const resolved = mergeWidgetConfig(options, remoteConfig)\n\n // Sync the resolved locale to the global signal (drives all i18n in the widget)\n useEffect(() => {\n locale.value = resolveWidgetLocale(resolved.locale)\n }, [resolved.locale])\n\n useEffect(() => {\n resolvedPrivacyPolicyUrl.value = resolved.privacyPolicyUrl ?? PLATFORM_PRIVACY_POLICY_URL\n privacyNoticeStyle.value = resolved.privacyNoticeStyle\n }, [resolved.privacyNoticeStyle, resolved.privacyPolicyUrl])\n\n // Mobile takeover scroll-lock — keeps the host page from scrolling under\n // the fullscreen sheet. Matches the CSS breakpoint in widget.css.\n // Embedded mode is skipped (host owns its scroll container).\n useEffect(() => {\n if (!isOpen.value) { return }\n if (resolved.mode === 'embedded') { return }\n const mql = window.matchMedia('(max-width: 480px), (pointer: coarse) and (max-width: 768px)')\n if (!mql.matches) { return }\n const prev = document.documentElement.style.overflow\n document.documentElement.style.overflow = 'hidden'\n return () => {\n document.documentElement.style.overflow = prev\n }\n }, [isOpen.value, resolved.mode])\n\n // GDPR privacy lock — wipes the conversation and shows a privacy notice\n // after 15 min of idle/hidden time, so the next person on a shared device\n // can't read prior messages. Embedded mode is owned by the host page and\n // is skipped — the host controls visibility and access.\n // try/catch: a sandboxed iframe or strict CSP could throw on setInterval\n // or addEventListener; failing the watcher must not unmount the widget.\n useEffect(() => {\n if (resolved.mode === 'embedded') { return }\n try {\n return startIdleLockWatcher()\n } catch (err) {\n console.warn('[JexityChat] Idle-lock watcher failed to start:', err)\n return undefined\n }\n }, [resolved.mode])\n\n // Layout helpers derived from resolved config\n const posLeft = resolved.position === 'bottom-left'\n const colorSchemeClass = resolved.colorScheme === 'dark' || resolved.colorScheme === 'light'\n ? resolved.colorScheme\n : ''\n\n // Build CSS custom-property map for the widget root element.\n // options is spread first for granular theme.bg/text/border overrides,\n // then resolved fields override the top-level shorthand values.\n const themeStyle = buildThemeStyle({\n ...options,\n primaryColor: resolved.primaryColor,\n accentColor: resolved.accentColor,\n fontFamily: resolved.fontFamily,\n fontSize: resolved.fontSize,\n borderRadius: resolved.borderRadius,\n windowWidth: resolved.windowWidth,\n windowHeight: resolved.windowHeight,\n })\n\n const embedded = resolved.mode === 'embedded'\n\n // Derive current screen for conditional header actions\n const stack = screenStack.value\n const currentScreen = stack[stack.length - 1]\n const isChatScreen = currentScreen?.id === 'chat'\n\n // Defer visibility until remote config loads to prevent FOUC\n // (default teal/bottom-right flashing before real config arrives).\n // Embedded + preview modes render immediately (config comes from host/bridge).\n const configReady = remoteConfig !== null || embedded || !!options.parentOrigin\n const shellStyle = configReady\n ? themeStyle\n : { ...themeStyle, visibility: 'hidden' as const }\n\n return (\n <div\n class={`jex-widget ${colorSchemeClass}`.trim()}\n style={shellStyle}\n >\n {embedded ? (\n <div class=\"jex-embedded\">\n <Header\n title={resolved.title}\n rightAction={isChatScreen ? <HumanHandoffAction sessionId={sessionId} visitorId={visitorId} /> : null}\n showClose={!embedded}\n />\n <ScreenRouter\n greeting={resolved.greeting}\n title={resolved.title}\n orgSlug={options.orgSlug}\n projSlug={options.projSlug}\n sessionId={sessionId}\n visitorId={visitorId}\n isLoading={isLoading}\n sessionNotFound={sessionNotFound}\n resumeFailed={resumeFailed}\n isOrgDeleted={isOrgDeleted}\n ensureSession={ensureSession}\n startFresh={startFresh}\n resetSession={resetSession}\n />\n {!resolved.hideBranding && <Footer />}\n </div>\n ) : (\n <div class={`jex-container${posLeft ? ' jex-pos-left' : ''}`}>\n {isOpen.value && (\n <div class=\"jex-chat-window\">\n <Header\n title={resolved.title}\n rightAction={isChatScreen ? <HumanHandoffAction sessionId={sessionId} visitorId={visitorId} /> : null}\n />\n <ScreenRouter\n greeting={resolved.greeting}\n title={resolved.title}\n orgSlug={options.orgSlug}\n projSlug={options.projSlug}\n sessionId={sessionId}\n visitorId={visitorId}\n isLoading={isLoading}\n sessionNotFound={sessionNotFound}\n resumeFailed={resumeFailed}\n isOrgDeleted={isOrgDeleted}\n ensureSession={ensureSession}\n startFresh={startFresh}\n resetSession={resetSession}\n />\n {!resolved.hideBranding && <Footer />}\n </div>\n )}\n <FAB\n iconOption={resolved.triggerIcon}\n radius={resolved.triggerRadius}\n label={resolved.triggerLabel}\n />\n </div>\n )}\n </div>\n )\n}\n","import widgetCss from './widget.css?inline'\n\n/**\n * Injects the widget's CSS into the given shadow root.\n *\n * We use a <style> element rather than Constructable StyleSheets because:\n * - Works in all browsers (Safari < 16.4 lacks adoptedStyleSheets support)\n * - Vite's ?inline import gives us the processed CSS as a string\n * - No external requests — fully bundled in the JS output\n */\nexport function injectStyles(shadowRoot: ShadowRoot): void {\n const style = document.createElement('style')\n style.textContent = widgetCss\n shadowRoot.appendChild(style)\n}\n","import { render } from 'preact'\nimport { ConvexProvider, ConvexReactClient } from 'convex/react'\nimport { WidgetShell } from './WidgetShell'\nimport { isOpen, widgetSource, bootstrapToken } from './shell.state'\nimport { screenStack } from '../screens/screens.state'\nimport { injectStyles } from '../../shared/theme/inject-styles'\nimport { toConvexCloudUrl } from '../../lib/convex-url'\nimport type { JexityChatOptions } from '../../types'\n\n// Singleton — one WebSocket connection shared across all mounts.\n// Runtime `options.convexUrl` (from `data-convex-url` on the script tag) takes\n// precedence over the build-time VITE_CONVEX_URL baked in by Vite.\nconst buildTimeUrl = import.meta.env.VITE_CONVEX_URL as string | undefined\nlet convexClient: ConvexReactClient | null = null\n\nfunction getOrCreateClient(runtimeUrl?: string): ConvexReactClient {\n const url = runtimeUrl ?? buildTimeUrl\n if (!url) {\n throw new Error('[jexity] No Convex URL — set VITE_CONVEX_URL at build time or data-convex-url on the script tag')\n }\n if (!convexClient) {\n convexClient = new ConvexReactClient(toConvexCloudUrl(url))\n }\n return convexClient\n}\n\n/**\n * LOW-LEVEL: Renders the widget into a Shadow DOM on the given host element.\n *\n * Why Shadow DOM?\n * The widget is injected into customer websites that have their own CSS.\n * Shadow DOM creates an isolated DOM subtree — styles on the host page\n * cannot leak in, and widget styles cannot leak out.\n *\n * Why injectStyles?\n * Stylesheets do not cross Shadow DOM boundaries automatically.\n * We must explicitly stamp the widget's CSS into the shadow root.\n *\n * Why reuse the existing shadow root?\n * Calling attachShadow() on an element that already has a shadow root\n * throws \"already has a shadow root\". The Studio playground re-mounts\n * on every config change, so we reuse the root instead of re-creating it.\n *\n * Returns a shutdown function that unmounts the Preact tree and resets state.\n * Called by createInstance() — entry points (esm.ts, iife.ts) should not\n * call this directly; use createInstance() instead.\n */\nexport function mountWidget(\n hostEl: HTMLElement,\n options: JexityChatOptions,\n): () => void {\n const shadow = hostEl.shadowRoot ?? hostEl.attachShadow({ mode: 'open' })\n\n // Clear previous render (safe on first mount — loop simply doesn't run)\n while (shadow.firstChild) {\n shadow.removeChild(shadow.firstChild)\n }\n\n // Stamp widget CSS into the shadow root (not visible outside this boundary)\n injectStyles(shadow)\n\n // Persist the source tag so useConvexSession can read it without prop drilling.\n widgetSource.value = options.source\n bootstrapToken.value = options.bootstrapToken as typeof bootstrapToken.value\n\n // Always start at HomeScreen so visitors can resume with a ref ID or start new.\n screenStack.value = [{ id: 'home' }]\n\n // In embedded mode, add class to shadow host for :host styling\n // and set isOpen so the chat window renders immediately (no FAB to toggle it).\n if (options.mode === 'embedded') {\n hostEl.classList.add('jex-mode-embedded')\n isOpen.value = true\n }\n\n const container = document.createElement('div')\n\n // Embedded mode: container must fill the shadow host for the height chain to work.\n if (options.mode === 'embedded') {\n container.style.cssText = 'width:100%;height:100%'\n }\n shadow.appendChild(container)\n\n // Hand off to Preact — everything below this line is React-style component code\n render(\n <ConvexProvider client={getOrCreateClient(options.convexUrl)}>\n <WidgetShell options={options} />\n </ConvexProvider>,\n container,\n )\n\n return function shutdown() {\n render(null, container) // unmounts the Preact tree and runs all cleanup effects\n isOpen.value = false\n widgetSource.value = undefined\n bootstrapToken.value = undefined\n screenStack.value = [{ id: 'home' }]\n }\n}\n","import { mountWidget } from './mount'\nimport { isOpen } from './shell.state'\nimport type { JexityChatOptions, JexityChatInstance } from '../../types'\n\n/**\n * HIGH-LEVEL: Creates a JexityChatInstance for the given host element.\n *\n * This is the function entry points (esm.ts, iife.ts) call to get a widget.\n * It wraps mountWidget() with the full public API:\n *\n * instance.open() — opens the chat window\n * instance.close() — closes the chat window\n * instance.toggle() — flips open/closed\n * instance.isOpen — current open state (getter)\n * instance.subscribe(cb) — notified whenever open state changes\n * instance.shutdown() — destroys the widget and cleans up everything\n *\n * How open/close state works:\n * `isOpen` is a Preact signal — a reactive value that any component can\n * subscribe to. When its value changes, only the components that read it\n * re-render (no prop drilling needed). `subscribe()` below taps into the\n * same signal so external callers (e.g. the React wrapper) can react to\n * open/close events without polling.\n *\n * The onRemove callback:\n * Passed by esm.ts to clean up the host <div> from document.body after\n * shutdown. Undefined when the caller manages the container themselves.\n */\nexport function createInstance(\n mountEl: HTMLElement,\n options: JexityChatOptions,\n onRemove?: () => void,\n): JexityChatInstance {\n const shutdownWidget = mountWidget(mountEl, options)\n\n // Collect external open/close listeners so we can notify them via subscribe()\n const listeners = new Set<(open: boolean) => void>()\n\n // Bridge the internal signal → external subscribe() callbacks.\n // disposeSignal() stops the bridge when the instance is shut down.\n const disposeSignal = isOpen.subscribe((value) => {\n for (const cb of listeners) { cb(value) }\n })\n\n const instance: JexityChatInstance = {\n shutdown() {\n disposeSignal() // stop listening to the signal\n listeners.clear() // drop all external subscribers\n shutdownWidget() // unmount Preact tree + reset state\n if (onRemove) { onRemove() } // clean up host element if needed\n },\n open() { isOpen.value = true },\n close() { isOpen.value = false },\n toggle() { isOpen.value = !isOpen.value },\n get isOpen() { return isOpen.value },\n subscribe(cb: (open: boolean) => void) {\n listeners.add(cb)\n return () => { listeners.delete(cb) }\n },\n }\n\n return instance\n}\n","import { createInstance } from '../module/shell/widget-instance'\nimport type { JexityChatOptions, JexityChatInstance } from '../types'\n\nexport type { JexityChatOptions, JexityChatInstance }\n\nlet activeInstance: JexityChatInstance | null = null\n\nexport function JexityChat(options: JexityChatOptions): JexityChatInstance {\n // Singleton: shut down previous instance if one exists\n if (activeInstance) {\n activeInstance.shutdown()\n }\n\n let mountEl: HTMLElement\n\n if (options.container) {\n mountEl =\n typeof options.container === 'string'\n ? document.querySelector<HTMLElement>(options.container)!\n : options.container\n } else {\n mountEl = document.createElement('div')\n mountEl.id = 'jexity-chat-widget'\n document.body.appendChild(mountEl)\n }\n\n const instance = createInstance(mountEl, options, () => {\n if (!options.container) { mountEl.remove() }\n if (activeInstance === instance) { activeInstance = null }\n })\n\n activeInstance = instance\n return instance\n}\n","import { JexityChat } from './esm'\nimport { bootstrapWidget, isUrlMatched } from '../lib/widgetBootstrap'\nimport { toConvexSiteUrl } from '../lib/convex-url'\nimport type { JexityChatOptions } from '../types'\n\nfunction getAttr(el: Element, name: string): string | undefined {\n return el.getAttribute(name) ?? undefined\n}\n\nasync function autoInit() {\n const script =\n document.currentScript ??\n document.querySelector<HTMLScriptElement>('script[data-org-slug]') ??\n document.querySelector<HTMLScriptElement>('script[data-org-id]')\n\n if (!script) { return }\n\n const orgSlug =\n script.getAttribute('data-org-slug') ??\n script.getAttribute('data-org-id') ??\n 'default-org'\n\n const projSlug = script.getAttribute('data-proj-slug') ?? undefined\n\n // ── Origin allowlist bootstrap ──────────────────────────────────────────\n const convexUrl =\n getAttr(script, 'data-convex-url') ??\n (import.meta.env.VITE_CONVEX_URL as string | undefined) ??\n ''\n\n const siteUrl = toConvexSiteUrl(convexUrl)\n const bootstrap = await bootstrapWidget(orgSlug, siteUrl, projSlug)\n\n if (!bootstrap.ok) {\n const origin = window.location.origin\n const scopeLabel = projSlug ? `project '${orgSlug}/${projSlug}'` : `org '${orgSlug}'`\n if (bootstrap.error === 'unauthorized') {\n console.warn(\n `[JexityChat] This domain is not authorized for ${scopeLabel}. ` +\n `Add '${origin}' under Allowed Domains in your Jexity dashboard.`,\n )\n } else if (bootstrap.error === 'not_found') {\n console.warn(\n `[JexityChat] No active widget config found for ${scopeLabel}. ` +\n `Check that the org slug is correct and the widget is enabled.`,\n )\n } else if (bootstrap.error === 'rate_limited') {\n console.warn(\n `[JexityChat] Bootstrap rate-limited for ${scopeLabel}. ` +\n `Retry after ${bootstrap.retryAfterSec ?? 60}s.`,\n )\n } else {\n console.warn(\n `[JexityChat] Bootstrap failed (network error). ` +\n `Check that the Convex deployment is reachable at ${siteUrl}.`,\n )\n }\n return // Do NOT mount the widget\n }\n\n // ── Path restriction check (page-load path — no SPA navigation) ────────\n if (\n bootstrap.allowedUrls.length > 0 &&\n !bootstrap.allowedUrls.some((url) => isUrlMatched(window.location.href, url))\n ) {\n const scopeLabel = projSlug ? `project '${orgSlug}/${projSlug}'` : `org '${orgSlug}'`\n console.warn(\n `[JexityChat] Widget hidden for ${scopeLabel} — current page does not match path rule. Allowed: ${bootstrap.allowedUrls.join(', ')}`,\n )\n return\n }\n\n // ── Mount widget with bootstrap token ───────────────────────────────────\n const options: JexityChatOptions = {\n orgSlug,\n projSlug,\n bootstrapToken: bootstrap.token,\n allowedUrls: bootstrap.allowedUrls,\n excludePaths: bootstrap.excludePaths,\n position: (getAttr(script, 'data-position') as JexityChatOptions['position']) ?? undefined,\n theme: (getAttr(script, 'data-theme') as JexityChatOptions['theme']) ?? undefined,\n greeting: getAttr(script, 'data-greeting'),\n title: getAttr(script, 'data-title'),\n primaryColor: getAttr(script, 'data-primary-color'),\n locale: getAttr(script, 'data-locale'),\n convexUrl: getAttr(script, 'data-convex-url'),\n }\n\n ;(window as unknown as Record<string, unknown>).JexityChat = JexityChat(options)\n}\n\nif (document.readyState === 'complete') {\n autoInit()\n} else {\n window.addEventListener('load', autoInit)\n}\n"],"names":["n","l","u","t","i","r","o","e","f","c","s","a","h","p","v","y","w","d","g","_","m","b","k","x","S","C","M","$","O","N","I","P","B","A","L","D","H","T","j","F","E","V","z","q","G","J","K","Q","R","U","W","Z","Y","X","nn","tn","en","rn","un","on","ln","cn","fn","an","sn","hn","dn","mn","pn","yn","_n","bn","Sn","gn","En","Cn","xn","Rn","lookup","revLookup","Arr","code","len","getLens","b64","validLen","placeHoldersLen","_byteLength","_b64","toByteArray","tmp","lens","arr","curByte","tripletToBase64","num","encodeChunk","uint8","start","end","output","fromByteArray","extraBytes","parts","maxChunkLength","len2","parseArgs","args","isSimpleObject","validateDeploymentUrl","deploymentUrl","value","isObject","prototype","isSimple","LITTLE_ENDIAN","MIN_INT64","MAX_INT64","ZERO","EIGHT","TWOFIFTYSIX","isSpecial","slowBigIntToBase64","hex","bytes","hexByte","Base64.fromByteArray","slowBase64ToBigInt","encoded","integerBytes","Base64.toByteArray","power","byte","modernBigIntToBase64","buffer","modernBase64ToBigInt","bigIntToBase64","base64ToBigInt","MAX_IDENTIFIER_LEN","validateObjectField","charCode","jsonToConvex","value2","entries","key","floatBytes","float","out","MAX_VALUE_FOR_ERROR_LEN","stringifyValueForError","str","_key","rest","truncateAt","codePoint","convexToJsonInternal","originalValue","context","includeTopLevelUndefined","contextText","errorMessageForUnsupportedType","theType","typeName","k1","_v1","k2","_v2","convexToJson","__defProp","__defNormalProp","obj","__publicField","_a","_b","IDENTIFYING_FIELD","ConvexError","data","version","INFO_COLOR","prefix_for_source","source","DefaultLogger","options","func","id","instantiateDefaultLogger","logger","level","instantiateNoopLogger","logForFunction","type","udfPath","message","prefix","match","logFatalError","errorMessage","createHybridErrorStacktrace","result","forwardData","error","canonicalizeUdfPath","pieces","moduleName","functionName","serializePathAndArgs","serializePaginatedPathAndArgs","initialNumItems","LocalSyncState","journal","componentPath","canonicalizedUdfPath","queryToken","existingEntry","queryId","query","baseVersion","newVersion","add","transition","modification","actingAs","auth","pathAndArgs","modifications","localQuery","querySet","authenticate","remove","RequestManager","markConnectionStateDirty","sent","resolve","status","response","requestInfo","udfType","line","onResolve","errorData","ts","completeRequests","requestId","allMessages","oldestInflightRequest","request","toReferencePath","extractReferencePath","reference","isFunctionHandle","getFunctionAddress","functionReference","functionAddress","referencePath","getFunctionName","address","name","makeFunctionReference","createApi","pathParts","handler","prop","newParts","found","path","exportName","anyApi","OptimisticLocalStoreImpl","queryResults","queryArgs","queryResult","queriesWithName","queryReference","OptimisticQueryResults","serverQueryResults","optimisticUpdatesToDrop","updateAndId","oldQueryResults","localStore","changedQueries","oldQuery","update","mutationId","Long","low","high","hi","lo","UZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_32_DBL","other","val","TWO_PWR_16_DBL","RemoteQuerySet","queryPath","u64ToLong","longToU64","raw","parseServerMessage","encodeClientMessage","CLOSE_NORMAL","CLOSE_GOING_AWAY","CLOSE_NO_STATUS","CLOSE_NOT_FOUND","firstTime","monotonicMillis","prettyNow","serverDisconnectErrors","classifyDisconnectError","WebSocketManager","uri","callbacks","webSocketConstructor","debug","state","chunk","expectedLength","fullJson","ws","timeSavedMs","messageLength","serverMessage","event","msg","reason","messageForLog","encodedMessage","backoff","scheduledAt","timeoutId","closeReason","_message","elapsed","baseBackoff","actualBackoff","jitter","transitionTransitTime","prettyTransitionTime","prettyMessageMB","bytesPerSecond","prettyBytesPerSecond","newSessionId","uuidv4","InvalidTokenError","b64DecodeUnicode","_m","base64UrlDecode","jwtDecode","token","pos","part","decoded","MAXIMUM_REFRESH_DELAY","MAX_TOKEN_CONFIRMATION_ATTEMPTS","AuthenticationManager","syncState","config","isRefreshing","fetchToken","onChange","onRefreshChange","decodedToken","iat","exp","tokenValiditySeconds","delay","refetchTokenTimeoutId","fetchArgs","originalConfigVersion","onAuthChange","newAuth","authStateForLog","markNames","mark","sessionId","detail","performanceMarkToJson","mark2","getMarksReport","allMarks","marks","entry","BaseConvexClient","onTransition","curConnectionState","cb","authRefreshTokenLeewaySeconds","origin","protocol","wsProtocol","wsUri","pauseSocket","unsavedChangesWarning","confirmationMessage","reconnectMetadata","querySetModification","authModification","completedRequests","completedMutationInfo","observedTs","remoteQueryResults","queryTokenToValue","changedQueryTokens","optimisticResult","authToken","fakeUserIdentity","argsObject","unsubscribe","modification2","wsConnectionState","mutationPromise","mutationArgs","optimisticUpdate","wrappedUpdate","localQueryStore","localResult","mightBeSent","actionArgs","report","timeOfOldestRequest","endpoint","asPaginationResult","PaginatedQueryClient","client","paginatedQuery","activePages","numItems","allResults","hasUndefined","isDone","pageToken","paginationResult","changedBaseTokens","changed","paginatedQueries","extendedTransition","lastPageToken","lastPageResult","loadMoreTransition","queryTokens","queryTokenSet","paginatedToken","getResult","paginatedQueryToken","ongoingSplits","pageKeyToQuery","pageKeys","pageKey","splitKey1","splitKey2","pageResult","splitCursor","continueCursor","paginationOpts","firstSubscription","secondSubscription","pageArgs","subscription","originalQuery","pageIndex","sub","lastPageKey","useSubscription","getCurrentValue","subscribe","setState","useState","valueToReturn","useEffect","didUnsubscribe","checkForUpdates","prevState","DEFAULT_EXTEND_SUBSCRIPTION_FOR","React","createMutation","mutationReference","mutation","assertNotAccidentalArgument","createAction","actionReference","ConvexReactClient","identity","argsAndOptions","callback","currentListeners","currentListeners2","queryOptions","extendSubscriptionFor","action","watch","existingResult","reject","sync","simple","paginated","updatedQueries","ConvexContext","useConvex","useContext","ConvexProvider","children","useQuery","skip","queryName","queries","useMemo","useQueries","useMutation","convex","useAction","QueriesObserver","createWatch","newQueries","identifier","paginationOptions","existingInfo","listener","info","useQueriesHelper","observer","useSignal","isOpen","signal","widgetSource","PLATFORM_PRIVACY_POLICY_URL","resolvedPrivacyPolicyUrl","privacyNoticeStyle","bootstrapToken","allowedUrls","excludedPaths","bootstrapInputs","toConvexCloudUrl","url","toConvexSiteUrl","normalizeHttpUrl","trimmed","parsed","mergeWidgetConfig","remote","title","privacyPolicyMode","normalizePrivacyNoticeStyle","style","fetchRemoteConfig","siteUrl","orgSlug","projSlug","urlObj","useRemoteConfig","runtimeConvexUrl","remoteConfig","setRemoteConfig","convexUrl","controller","load","cfg","err","bootstrapWidget","convexSiteUrl","resp","isPathExcluded","pathname","excludePaths","excluded","isUrlMatched","currentUrl","allowedUrl","current","allowed","allowedPath","currentPath","useBootstrap","preToken","preAllowedUrls","preExcludedPaths","resolvedConvexUrl","cancelled","scope","listeners","patched","ensureHistoryPatch","origPush","origReplace","addHistoryListener","usePathGuard","href","urls","isExcluded","de","SUPPORTED_LOCALES","WIDGET_DEFAULT_LOCALE","LOCALE_STORAGE_KEY","locale","STRINGS","useLocale","parseLocale","base","resolveWidgetLocale","configLocale","saved","browser","usePreviewBridge","parentOrigin","handleMessage","allowedOrigin","newLocale","SESSION_HISTORY_STORAGE_KEY","STORAGE_KEY","SESSION_HISTORY_TTL_MS","sessionHistory","currentSessionRef","hasAnyHistory","computed","chatMountIntent","generateRef","loadEnvelope","now","persist","envelope","initVisitor","pruned","startNewSession","ref","next","resumeSession","markActivity","screenStack","computeInitialStack","resetInitialStack","escalationFormStyle","navigate","screen","back","replace","POLL_MS","isLocked","isSessionBusy","resetCallbacks","registerLockResetCallback","lastActivityAtForCurrent","isIdle","threshold","last","lockSession","unlockSession","startIdleLockWatcher","hiddenSince","onVisibility","timer","buildThemeStyle","vars","primaryColor","theme","bg","text","border","BotIcon","size","jsx","HeaderLeft","HeaderTitle","jsxs","CloseIcon","HeaderCloseButton","HeaderActions","showClose","Header","rightAction","ZapIcon","Footer","MessageIcon","SparklesIcon","props","ICON_MAP","RADIUS_MAP","FAB","radius","iconOption","label","resolvedLabel","hasLabel","HomeScreen","onStartFresh","onResetSession","lookupRef","setLookupRef","handleStartChat","handleResumeEntry","handleLookupSubmit","SelectionScreen","mergeClasses","classes","className","index","array","toKebabCase","string","toCamelCase","p1","p2","toPascalCase","camelCase","defaultAttributes","hasA11yProp","Icon","color","strokeWidth","absoluteStrokeWidth","iconNode","tag","attrs","toChildArray","createLucideIcon","iconName","Component","CornerUpLeft","be","Re","Te","Oe","we","se","ie","ye","Pe","Se","$e","_e","oe","Le","ne","Me","ze","Ee","Ie","ae","Ae","Ce","le","Be","De","qe","ue","ve","He","pe","Ze","Ge","Ne","Qe","je","Fe","Ue","Ke","We","Xe","Je","ce","he","Ve","re","Ye","et","tt","ke","ge","fe","nt","ee","te","me","xe","marked","MarkdownContent","html","draftMessage","tagAgent","agentName","firstName","mention","rateLimitedUntilMs","nowMs","attachedImages","MAX_IMAGE_ATTACHMENTS","MAX_IMAGE_BYTES","genAttachmentId","addAttachedImages","files","incoming","room","file","removeAttachedImage","target","img","clearAttachedImages","createChildComponents","root","componentsGeneric","api","useSendMessage","visitorId","ensureSession","send","content","session","useRateLimitCountdown","until","tick","clear","isActive","remainingSeconds","RateLimitNotice","sessionError","SessionErrorNotice","SendIcon","MAX_TEXTAREA_PX","useComposerInput","onSend","textareaRef","useRef","fileInputRef","el","onKeyDown","onAttachClick","onFilesPicked","onCardClick","ComposerRow","isStreaming","disabled","inputDisabled","onFocus","input","images","hasInput","hasImages","sendActive","PrivacyNotice","variant","onAcknowledge","privacyUrl","ChatInput","isLoading","sessionStatus","noticeStyle","privacyGate","setPrivacyGate","sendMessage","isRateLimited","sendDisabled","requiresPrivacyAck","blocksComposer","openPrivacyExplicit","acknowledgePrivacyExplicit","handleSend","getInitials","BotMessage","streaming","authorId","authorName","authorImage","botAvatarUrl","isHuman","imgBroken","setImgBroken","onImgError","useCallback","replyLabel","bubbleClass","UserMessage","useEscalation","FormMessage","FormMessageInput","messageId","setName","email","setEmail","submitting","setSubmitting","rawPrivacyUrl","submitEscalation","handleSubmit","widgetLocale","useMagiclineSubmit","useTrialConfig","useTrialSlots","useRateBundles","useContractPreview","useSubmitContractCreation","LOCALE_STRINGS","EMAIL_RE","isValidEmail","ageFromIsoDate","isoDate","year","month","day","age","monthDelta","todayIsoDate","resolvePrivacyUrl","IBAN_LENGTHS","IBAN_GENERIC_MIN","IBAN_GENERIC_MAX","normalizeIban","isValidIban","normalized","country","rearranged","digits","ch","remainder","maskIban","head","tail","formatContractMoney","amount","currencyCode","bcp47","formatContractPeriod","unit","plural","singular","pluralWord","formatContractDate","date","formatPaymentFrequency","upper","template","formatModulePrice","paymentFrequencyType","recurringUnit","money","formatVoucherDiscount","discountValue","discountType","FEE_NAME_KEY_MAP","localizeFeeName","rawName","formatModuleRenewal","extensionType","termExtension","periodLabel","GENDER_VALUES","COUNTRY_OPTIONS","buildWizardSteps","plan","bookingWithoutTrainerAllowed","steps","INITIAL_FIELDS","fieldsReducer","useTrialBookingState","getTrialConfig","listTrialSlots","fields","dispatch","useReducer","configState","setConfigState","_prev","slotsState","setSlotsState","refreshKey","bumpRefresh","setField","setTrainerRequired","trainerRequired","refetchSlots","configReady","slot","TrialSessionBookingForm","formMessageId","slotUnavailable","retryPending","submitForm","resolveConfigMessage","TrialWizard","minimumAge","studioZoneId","initialIndex","setIndex","fieldErrors","setFieldErrors","submitError","setSubmitError","safeIndex","step","isLast","isFirst","validateStep","errors","handleNext","prev","handleBack","bag","buildFieldBag","onPrimary","stepTitle","stepTitleFor","consentId","TrainerStep","SlotStep","PersonalStep","AddressStep","ConfirmStep","slotId","onSelect","onRetry","Fragment","formatSlot","maxDob","TextField","optionalLabel","SelectField","genderLabel","option","consentError","slotLabel","fieldKey","required","onInput","describedBy","placeholder","backendMessage","startDateTime","zoneMatch","ianaZone","parseable","nextAcks","INITIAL_VOUCHER_STATE","VOUCHER_ACK_PREFIX","dropVoucherAcks","acknowledgedBlocks","voucherReducer","clearApplied","fieldsReducerExtended","useContractCreationState","getRateBundles","getContractPreview","voucherState","dispatchVoucher","offersState","setOffersState","lastReadyPricingRef","previewState","dispatchPreviewState","setPreviewState","offersKey","bumpOffers","previewKey","bumpPreview","setTermId","termId","setPersonal","setAddress","toggleModule","moduleId","selected","consentAckKey","setBlockAck","ackKey","setAccountHolder","setIban","setConsent","clearIban","clearTermId","setVoucherDraft","voucherRequestIdRef","beginVoucherApply","nextId","commitVoucherApplied","markVoucherInvalid","markVoucherDisabled","clearVoucher","refetchOffers","resetPreview","fetchPreview","selectedTerm","term","selectedModuleIds","appliedVoucher","requiredAckKeys","keys","block","module","allAcknowledged","lastName","accountHolder","accountHolderTouched","prior","startDate","previewArgs","ContractCreationForm","projectId","formStatus","submitContract","serverAllowVoucherCodes","voucherStatus","draftVoucherCode","appliedVoucherCode","voucherUnavailable","submitResult","setSubmitResult","notice","setNotice","voucherBanner","setVoucherBanner","ContractSuccessCard","ContractTerminalCard","nextIndex","handleReviewRetry","handleApplyVoucher","attemptedCode","failVoucher","invalidMessage","voucher","voucherAckKeys","voucherUnsettled","reviewBlocked","primaryDisabled","OfferStep","UpgradesStep","PaymentStep","ReviewStep","customerNumber","selectedTermId","groups","groupTermsByBundle","group","OfferTermCard","BundleDetails","checked","lengthLabel","priceLabel","starterFee","fee","otherFlatFees","subDescription","footnote","bullets","parseBundleBullets","hasFootnote","bullet","modules","onToggle","onAck","UpgradeModuleCard","consentChecked","renewalLabel","termLabel","consent","ConsentRegion","personal","privacyId","sepaId","onToggleAck","allowVoucherCodes","onVoucherDraftChange","onApplyVoucher","pricing","isReloading","volume","fullName","addr","addressLine","offerLabel","requiredBlocks","infoBlocks","selectedModuleConsents","voucherRequiredBlocks","showVoucherSection","ConsentRecap","attachmentLabel","attachmentUrl","showRequiredPill","terms","byId","MagiclineFormMessage","form","shouldCheckRetry","submissionStatus","ICONS","SourcesRow","sources","expanded","setExpanded","isCrawl","getPillLabel","tooltip","pillBody","TypingIndicator","STRIP_MARKER_RE","stripCitationMarkers","MessageList","conversations","greeting","sessionNotFound","resumeFailed","bottomRef","dismissedFormId","setDismissedFormId","lastFinalIdRef","noticeText","confirmText","authorProps","LoadingScreen","shown","setShown","useConversation","liveStatus","ChatScreen","isOrgDeleted","startFresh","isQueryLoading","mountIntent","isFreshSessionLoading","isResumeLoading","EscalationFormScreen","useHandoff","HumanHandoffAction","busy","setBusy","setError","createRequest","handleClick","refreshBootstrapToken","inputs","fresh","reasonForError","isBootstrapExpiredError","waitForBootstrapToken","timeoutMs","settled","finish","dispose","useConvexSession","resolvedRef","createOrResumeMut","callCreateOrResume","vid","initialToken","buildArgs","tok","refresh","hadExistingRef","outcome","resetSession","resolved","FormScreen","setMessage","ConfirmationScreen","ticketRef","ErrorScreen","onBack","ScreenRouter","stack","currentScreen","confirmationState","WidgetShell","WidgetContent","posLeft","colorSchemeClass","themeStyle","embedded","isChatScreen","shellStyle","injectStyles","shadowRoot","widgetCss","buildTimeUrl","convexClient","getOrCreateClient","runtimeUrl","mountWidget","hostEl","shadow","container","render","createInstance","mountEl","onRemove","shutdownWidget","disposeSignal","activeInstance","JexityChat","instance","getAttr","autoInit","script","bootstrap","scopeLabel"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,67,68,69,70,71,72,73,74,75,76,81]}
|