@holaboss/client 0.2.0-beta.27 → 0.2.0-beta.28

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.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use client'
2
- var ee=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var at=Object.prototype.hasOwnProperty;var lt=(e,t)=>{for(var n in t)ee(e,n,{get:t[n],enumerable:!0})},ut=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of it(t))!at.call(e,s)&&s!==n&&ee(e,s,{get:()=>t[s],enumerable:!(r=st(t,s))||r.enumerable});return e};var dt=e=>ut(ee({},"__esModule",{value:!0}),e);var Ut={};lt(Ut,{Chat:()=>We,CreditRefused:()=>M,GRID_COLS:()=>oe,GRID_MAX_COLS:()=>se,GRID_MAX_ROWS:()=>ie,HolaProvider:()=>Me,PortalConflict:()=>$,bandOfKind:()=>W,bandOfType:()=>ae,buyRequestText:()=>Ze,cellValue:()=>ve,createApiTransport:()=>He,createHolaClient:()=>Ee,createPortalCredits:()=>Ve,createPortalData:()=>je,createPortalShop:()=>Be,createWidgetTransport:()=>J,deliverableCellText:()=>he,deliverableStatus:()=>fe,deriveFields:()=>ne,emptyTableResponses:()=>_,facetValues:()=>Ye,footprintOf:()=>le,footprintWith:()=>K,formatDeliverableDate:()=>ke,groupDeliverableVersions:()=>Y,includesFor:()=>Qe,inferSpec:()=>re,isDeliverableChecked:()=>xe,mergeMessage:()=>Ce,modeOf:()=>Ge,money:()=>F,normalizeDeliverableColType:()=>Z,normalizeDeliverableItem:()=>Q,orderBilling:()=>Ne,parseDashboardSpec:()=>me,parseDeliverableItems:()=>ge,parseDeliverableTable:()=>be,parseTableResponses:()=>we,placeWidgets:()=>X,priceFor:()=>Je,priceLabel:()=>Te,publishedVersionOf:()=>ye,quantityRange:()=>Xe,renderModel:()=>ce,setResponse:()=>Se,setTableReview:()=>Pe,shelfPriceLabel:()=>ze,shelfProblem:()=>et,splitLayout:()=>ue,textDeltaOf:()=>L,thinkingDeltaOf:()=>U,toolEventOf:()=>N,totalFor:()=>Ke,useArtifactUrl:()=>j,useChat:()=>q,useCredits:()=>tt,useHolaClient:()=>G,useShop:()=>nt,useThread:()=>ot});module.exports=dt(Ut);var Re=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},L=e=>{let t=Re(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},U=e=>{let t=Re(e);return t?.type==="thinking_delta"&&typeof t.delta=="string"?t.delta:null},N=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="tool_execution_start"&&t.toolCallId?{phase:"start",id:t.toolCallId,name:t.toolName}:t.type==="tool_execution_end"&&t.toolCallId?{phase:"end",id:t.toolCallId,isError:t.isError}:null};var pt=/^ /,x=e=>{if(e&&typeof e=="object"){let t=e,n=typeof t.error=="string"?t.error:"request_failed";return typeof t.retryable=="boolean"?{error:n,retryable:t.retryable}:{error:n}}return{error:"request_failed"}},ct=e=>{let t="message",n=[];for(let r of e.split(`
3
- `))r.startsWith(":")||(r.startsWith("event:")?t=r.slice(6).trim():r.startsWith("data:")&&n.push(r.slice(5).replace(pt,"")));return n.length>0?{event:t,data:n.join(`
4
- `)}:null},mt=(e,t,n)=>{let r;try{r=JSON.parse(e.data)}catch{return}if(e.event==="session"){let s=r.sessionId;s&&(n(s),t.onSession?.(s));return}if(e.event==="turn_event"){t.onEvent?.(r);let s=L(r);s&&t.onText?.(s);let i=U(r);i&&t.onThinking?.(i);let o=N(r);o&&t.onTool?.(o);return}if(e.event==="chat_completed"){let s=r;n(s.sessionId),t.onComplete?.(s);return}e.event==="chat_error"&&t.onError?.(x(r))},P=async(e,t)=>{let n=await fetch(e,{headers:t});if(!n.ok)throw new Error(`hola: request failed (${n.status})`);return await n.json()},De=async e=>{let t=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body});if(!t.ok)throw new Error(`hola: message failed (${t.status})`);return await t.json()},Ie=async(e,t,n,r)=>{let s=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:r});if(!(s.ok&&s.body)){t.onError?.({error:`stream_failed_${s.status}`});return}let i=s.body.getReader(),o=new TextDecoder,a="",l=()=>{let d=a.indexOf(`
2
+ var ee=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var at=Object.prototype.hasOwnProperty;var lt=(e,t)=>{for(var r in t)ee(e,r,{get:t[r],enumerable:!0})},ut=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of it(t))!at.call(e,s)&&s!==r&&ee(e,s,{get:()=>t[s],enumerable:!(n=st(t,s))||n.enumerable});return e};var dt=e=>ut(ee({},"__esModule",{value:!0}),e);var Ut={};lt(Ut,{Chat:()=>We,CreditRefused:()=>M,GRID_COLS:()=>oe,GRID_MAX_COLS:()=>se,GRID_MAX_ROWS:()=>ie,HolaProvider:()=>Me,PortalConflict:()=>$,bandOfKind:()=>W,bandOfType:()=>ae,buyRequestText:()=>Ze,cellValue:()=>ve,createApiTransport:()=>Ae,createHolaClient:()=>Ee,createPortalCredits:()=>qe,createPortalData:()=>Ve,createPortalShop:()=>je,createWidgetTransport:()=>J,deliverableCellText:()=>he,deliverableStatus:()=>fe,deriveFields:()=>re,emptyTableResponses:()=>O,facetValues:()=>Ye,footprintOf:()=>le,footprintWith:()=>K,formatDeliverableDate:()=>ke,groupDeliverableVersions:()=>Y,includesFor:()=>Qe,inferSpec:()=>ne,isDeliverableChecked:()=>xe,mergeMessage:()=>Ce,modeOf:()=>Be,money:()=>_,normalizeDeliverableColType:()=>Z,normalizeDeliverableItem:()=>Q,orderBilling:()=>Ne,parseDashboardSpec:()=>me,parseDeliverableItems:()=>ge,parseDeliverableTable:()=>be,parseTableResponses:()=>we,placeWidgets:()=>X,priceFor:()=>Je,priceLabel:()=>Te,publishedVersionOf:()=>ye,quantityRange:()=>Xe,renderModel:()=>ce,setResponse:()=>Se,setTableReview:()=>Pe,shelfPriceLabel:()=>ze,shelfProblem:()=>et,splitLayout:()=>ue,textDeltaOf:()=>L,thinkingDeltaOf:()=>U,toolEventOf:()=>N,totalFor:()=>Ke,useArtifactUrl:()=>V,useChat:()=>G,useCredits:()=>tt,useHolaClient:()=>B,useShop:()=>rt,useThread:()=>ot});module.exports=dt(Ut);var Re=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},L=e=>{let t=Re(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},U=e=>{let t=Re(e);return t?.type==="thinking_delta"&&typeof t.delta=="string"?t.delta:null},N=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="tool_execution_start"&&t.toolCallId?{phase:"start",id:t.toolCallId,name:t.toolName}:t.type==="tool_execution_end"&&t.toolCallId?{phase:"end",id:t.toolCallId,isError:t.isError}:null};var pt=/^ /,w=e=>{if(e&&typeof e=="object"){let t=e,r=typeof t.error=="string"?t.error:"request_failed";return typeof t.retryable=="boolean"?{error:r,retryable:t.retryable}:{error:r}}return{error:"request_failed"}},ct=e=>{let t="message",r=[];for(let n of e.split(`
3
+ `))n.startsWith(":")||(n.startsWith("event:")?t=n.slice(6).trim():n.startsWith("data:")&&r.push(n.slice(5).replace(pt,"")));return r.length>0?{event:t,data:r.join(`
4
+ `)}:null},mt=(e,t,r)=>{let n;try{n=JSON.parse(e.data)}catch{return}if(e.event==="session"){let s=n.sessionId;s&&(r(s),t.onSession?.(s));return}if(e.event==="turn_event"){t.onEvent?.(n);let s=L(n);s&&t.onText?.(s);let i=U(n);i&&t.onThinking?.(i);let o=N(n);o&&t.onTool?.(o);return}if(e.event==="chat_completed"){let s=n;r(s.sessionId),t.onComplete?.(s);return}e.event==="chat_error"&&t.onError?.(w(n))},P=async(e,t)=>{let r=await fetch(e,{headers:t});if(!r.ok)throw new Error(`hola: request failed (${r.status})`);return await r.json()},De=async e=>{let t=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body});if(!t.ok)throw new Error(`hola: message failed (${t.status})`);return await t.json()},Ie=async(e,t,r,n)=>{let s=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:n});if(!(s.ok&&s.body)){t.onError?.({error:`stream_failed_${s.status}`});return}let i=s.body.getReader(),o=new TextDecoder,a="",l=()=>{let d=a.indexOf(`
5
5
 
6
- `);for(;d!==-1;){let c=a.slice(0,d);a=a.slice(d+2);let m=ct(c);m&&mt(m,t,n),d=a.indexOf(`
6
+ `);for(;d!==-1;){let p=a.slice(0,d);a=a.slice(d+2);let f=ct(p);f&&mt(f,t,r),d=a.indexOf(`
7
7
 
8
- `)}},u=async()=>{let d=await i.read();if(!d.done)return a+=o.decode(d.value,{stream:!0}),l(),u()};await u()};var gt=/\/+$/,te="/api/v1/end-user",He=e=>{let t=e.baseUrl.replace(gt,""),n=()=>typeof e.token=="function"?e.token():e.token,r=o=>e.project?`${o}project=${encodeURIComponent(e.project)}`:"",s=async()=>({"content-type":"application/json",authorization:`Bearer ${await n()}`}),i=async o=>{let a=await fetch(`${t}${te}/chat${r("?")}`,{method:"POST",headers:await s(),body:JSON.stringify({message:o})});if(!a.ok)throw new Error(`hola: message failed (${a.status})`);return{reply:(await a.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>P(`${t}${te}/chat/info${r("?")}`,await s()),sendMessage:i,streamMessage:async(o,a)=>{try{let l=await i(o);a.onText?.(l.reply),a.onComplete?.(l)}catch(l){a.onError?.(x(l))}},subscribe:(o,a)=>{let l=a?.since??"0",u=!1,d,c=a?.intervalMs??3e3,m=typeof document<"u",p=()=>m&&document.visibilityState==="hidden",y=!1,w=()=>{if(!u){if(p()){y=!0;return}d=setTimeout(f,c)}},f=async()=>{try{let h=await P(`${t}${te}/chat/thread?since=${encodeURIComponent(l)}${r("&")}`,await s());for(let I of h.messages)o.onMessage(I);l=h.cursor,o.onHealthy?.()}catch(h){o.onError?.(x(h))}w()},C=()=>{u||!y||p()||(y=!1,d&&clearTimeout(d),d=setTimeout(f,0))};m&&document.addEventListener("visibilitychange",C);let g=()=>{u=!0,d&&clearTimeout(d),m&&document.removeEventListener("visibilitychange",C)};return a?.signal?.addEventListener("abort",g),d=setTimeout(f,0),g}}};var V=require("react"),j=(e,t)=>{let[n,r]=(0,V.useState)("");return(0,V.useEffect)(()=>{if(!e){r("");return}let s=Uint8Array.from(atob(e),o=>o.charCodeAt(0)),i=URL.createObjectURL(new Blob([s],{type:t}));return r(i),()=>URL.revokeObjectURL(i)},[e,t]),n};var z=require("react");var B=require("react"),$e=require("react/jsx-runtime"),Ae=(0,B.createContext)(null),Me=({client:e,children:t})=>(0,$e.jsx)(Ae.Provider,{value:e,children:t}),G=()=>{let e=(0,B.useContext)(Ae);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};var v=require("react"),q=e=>{let[t,n]=(0,v.useState)([]),[r,s]=(0,v.useState)(""),[i,o]=(0,v.useState)(!1),[a,l]=(0,v.useState)(null),u=(0,v.useRef)(0),d=(0,v.useRef)(null);(0,v.useEffect)(()=>()=>d.current?.abort(),[]);let c=(0,v.useCallback)(()=>{let p=u.current;return u.current+=1,p},[]);(0,v.useEffect)(()=>{let p=!0;return e.getInfo().then(y=>{p&&y.greeting&&n([{id:c(),role:"assistant",text:y.greeting}])}).catch(()=>{}),()=>{p=!1}},[e,c]);let m=(0,v.useCallback)(()=>{let p=r.trim();if(!p||i)return;s(""),l(null),o(!0);let y=c(),w=c();n(g=>[...g,{id:y,role:"user",text:p},{id:w,role:"assistant",text:"",streaming:!0}]);let f=g=>{n(h=>h.map(I=>I.id===w?g(I):I))},C=new AbortController;d.current=C,e.streamMessage(p,{onText:g=>f(h=>({...h,text:h.text+g})),onComplete:g=>{f(h=>({...h,text:g.reply||h.text,artifacts:g.artifacts,streaming:!1})),o(!1)},onError:g=>{f(h=>({...h,streaming:!1})),l(g.error),o(!1)}},C.signal).catch(g=>{f(h=>({...h,streaming:!1})),l(g instanceof Error?g.message:"stream_failed"),o(!1)}).finally(()=>{o(!1),f(g=>g.streaming?{...g,streaming:!1}:g)})},[r,i,e,c]);return{messages:t,input:r,setInput:s,send:m,sending:i,error:a}};var S=require("react/jsx-runtime"),T={root:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif",fontSize:14,color:"#111827"},log:{flex:1,overflowY:"auto",padding:12,display:"flex",flexDirection:"column",gap:8},user:{alignSelf:"flex-end",background:"#111827",color:"#ffffff",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},assistant:{alignSelf:"flex-start",background:"#f1f1f4",color:"#111827",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},artifacts:{display:"flex",flexDirection:"column",gap:6,marginTop:6},image:{maxHeight:220,borderRadius:8,border:"1px solid #e5e7eb"},link:{color:"#2563eb",textDecoration:"underline",wordBreak:"break-all"},error:{color:"#b91c1c",padding:"4px 12px",fontSize:13},form:{display:"flex",gap:8,borderTop:"1px solid #e5e7eb",padding:8},input:{flex:1,border:"1px solid #d1d5db",borderRadius:8,padding:"8px 10px",fontSize:14,outline:"none"},button:{border:"none",background:"#111827",color:"#ffffff",borderRadius:8,padding:"8px 14px",fontSize:14,cursor:"pointer"}},ft=({artifact:e})=>{let t=j(e.dataBase64??"",e.mimeType),n=e.url??t;return n?e.mimeType.startsWith("image/")?(0,S.jsx)("a",{href:n,rel:"noopener noreferrer",target:"_blank",children:(0,S.jsx)("img",{alt:e.filename,src:n,style:T.image})}):(0,S.jsx)("a",{download:e.filename,href:n,style:T.link,children:e.filename}):null},We=()=>{let e=G(),{messages:t,input:n,setInput:r,send:s,sending:i,error:o}=q(e),a=(0,z.useRef)(null);(0,z.useEffect)(()=>{let u=a.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let l=u=>{u.preventDefault(),s()};return(0,S.jsxs)("div",{style:T.root,children:[(0,S.jsx)("div",{ref:a,style:T.log,children:t.map(u=>(0,S.jsxs)("div",{style:u.role==="user"?T.user:T.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?(0,S.jsx)("div",{style:T.artifacts,children:u.artifacts.map(d=>(0,S.jsx)(ft,{artifact:d},d.filename))}):null]},u.id))}),o?(0,S.jsx)("div",{style:T.error,children:o}):null,(0,S.jsxs)("form",{onSubmit:l,style:T.form,children:[(0,S.jsx)("input",{"aria-label":"Message",onChange:u=>r(u.target.value),placeholder:"Type a message\u2026",style:T.input,value:n}),(0,S.jsx)("button",{disabled:i||n.trim().length===0,style:T.button,type:"submit",children:"Send"})]})]})};var yt=/\/+$/,J=e=>{let t=e.sessionId,n=e.baseUrl.replace(yt,""),r=o=>`${n}/endpoint/${encodeURIComponent(e.token)}${o}`,s={"content-type":"application/json"},i=(o,a)=>({url:r(o),headers:s,body:JSON.stringify({message:a,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>P(r("/config"),{}),sendMessage:async o=>{let a=await De(i("/message",o));return t=a.sessionId,a},streamMessage:(o,a,l)=>Ie(i("/message/stream",o),a,u=>{t=u},l),subscribe:(o,a)=>{let l=a?.since??"0",u=!1,d,c=a?.intervalMs??3e3,m=async()=>{let y=t;if(y)try{let w=await P(r(`/messages?session=${encodeURIComponent(y)}&since=${encodeURIComponent(l)}`),{});for(let f of w.messages)o.onMessage(f);l=w.cursor,o.onHealthy?.()}catch(w){o.onError?.(x(w))}u||(d=setTimeout(m,c))},p=()=>{u=!0,d&&clearTimeout(d)};return a?.signal?.addEventListener("abort",p),d=setTimeout(m,0),p}}};var Ee=e=>"transport"in e?e.transport:J(e);var bt=/^https?:\/\//i,ht=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,xt=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function wt(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(bt.test(e))return"url";if(ht.test(e))return"date"}return"text"}function ne(e){let t=[],n=new Map;for(let r of e)for(let[s,i]of Object.entries(r.data??{})){if(i==null)continue;let o=n.get(s);o||(o=new Map,n.set(s,o),t.push(s));let a=wt(i);o.set(a,(o.get(a)??0)+1)}return t.map(r=>{let s=n.get(r)??new Map,i="text",o=-1;for(let[a,l]of s)l>o&&(o=l,i=a);return{key:r,label:xt(r),type:i}})}var vt=e=>typeof e=="number"?e:Number(e)||0,Oe=e=>/rate|position|rank|score|percent|avg/i.test(e),St=/posted|published|sent|completed|shipped|launched|_at/i,Pt=new Set(["service","order","end_user_id"]);function re(e,t){let n=e.filter(l=>!Pt.has(l.key)),r=n.filter(l=>l.type==="number").slice(0,3),s=n.find(l=>l.key==="status")??n.find(l=>l.type==="select"),i=n.find(l=>l.type==="date"&&St.test(l.key))??n.find(l=>l.type==="date"),o=n.filter(l=>l.type==="number"&&!Oe(l.key)).map(l=>({field:l,total:t.reduce((u,d)=>u+vt(d.data[l.key]),0)})).sort((l,u)=>u.total-l.total).find(l=>l.total>0)?.field??null,a=[{type:"stat",label:"Items",agg:"count"}];for(let l of r){let u=Oe(l.key);a.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return i&&a.push({type:"line",x:i.key,y:o?.key,agg:"sum",title:o?`${o.label} by day`:"Items by day"}),s&&a.push({type:"donut",groupBy:s.key,title:s.label}),a.push({type:"table",columns:n.map(l=>l.key)}),{version:1,widgets:a}}var oe=6,se=6,ie=4,_e={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},kt=e=>Math.max(1,Math.min(6,Math.round(e))),Tt=e=>Math.max(1,Math.min(4,Math.round(e)));function W(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function ae(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function le(e){return _e[e]}function K(e,t,n){let r=_e[e];return{w:t===void 0?r.w:kt(t),h:n===void 0?r.h:Tt(n)}}function X(e){let t=[],n=[],r=(o,a,l,u)=>{if(o<0||o+l>6)return!1;for(let d=0;d<u;d+=1){let c=n[a+d];if(c){for(let m=0;m<l;m+=1)if(c[o+m])return!1}}return!0},s=(o,a,l,u)=>{for(let d=0;d<u;d+=1){let c=n[a+d]??[];for(let m=0;m<l;m+=1)c[o+m]=!0;n[a+d]=c}},i=(o,a)=>{for(let l=0;;l+=1)for(let u=0;u+o<=6;u+=1)if(r(u,l,o,a))return{gx:u,gy:l}};for(let o of e){let a=K(W(o.kind),o.w,o.h),u=o.gx!==void 0&&o.gy!==void 0&&r(o.gx,o.gy,a.w,a.h)&&o.gx!==void 0&&o.gy!==void 0?{gx:o.gx,gy:o.gy}:i(a.w,a.h);s(u.gx,u.gy,a.w,a.h),t.push({widget:o,gx:u.gx,gy:u.gy,w:a.w,h:a.h})}return t}function ue(e){let t=[],n=[];for(let r of e)W(r.kind)==="block"?n.push(r):t.push(r);return{tiles:X(t),blocks:n}}var Fe=new Set(["service","order","end_user_id"]),de=e=>typeof e=="number"?e:Number(e)||0,Le=e=>e==null?"":String(e);function pe(e,t){if(e==="count")return t.length;if(t.length===0)return 0;if(e==="last")return t[t.length-1]??0;if(e==="min")return Math.min(...t);if(e==="max")return Math.max(...t);let n=t.reduce((r,s)=>r+s,0);return e==="avg"?Math.round(n/t.length*100)/100:n}function Ct(e,t,n,r){let s=new Map;for(let i of e){let o=new Date(Le(i.data[t]));if(Number.isNaN(o.getTime()))continue;let a=o.toISOString().slice(0,10),l=s.get(a)??[];l.push(n?de(i.data[n]):1),s.set(a,l)}return[...s.entries()].sort((i,o)=>i[0]<o[0]?-1:1).map(([i,o])=>({label:new Date(`${i}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:n?pe(r,o):o.length}))}function Rt(e,t,n,r="sum"){let s=new Map;for(let i of e){let o=Le(i.data[t]).trim();if(!o)continue;let a=s.get(o)??[];a.push(n?de(i.data[n]):1),s.set(o,a)}return[...s.entries()].map(([i,o])=>({label:i,value:n?pe(r,o):o.length})).sort((i,o)=>o.value-i.value)}function Dt(e,t,n,r){switch(e.type){case"stat":{let s=e.metric?t.get(e.metric):void 0;if(e.metric&&!s)return null;if(!s)return{kind:"stat",label:e.label??"Items",value:r.length};let i=r.map(o=>de(o.data[s.key]));return{kind:"stat",label:e.label??s.label,value:pe(e.agg??"sum",i)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let s=Ct(r,e.x,e.y,e.agg??"sum");return s.length<2?null:{kind:"series",draw:e.type,title:e.title??"By day",points:s}}case"donut":{if(!t.has(e.groupBy))return null;let s=Rt(r,e.groupBy,e.metric,e.agg??"sum");return s.length===0?null:{kind:"donut",title:e.title??t.get(e.groupBy)?.label??"Breakdown",points:s}}case"table":{let s=e.columns?e.columns.map(i=>t.get(i)).filter(i=>i!==void 0&&!Fe.has(i.key)):n;return s.length===0?null:{kind:"table",title:e.title,columns:s,rows:r}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function ce(e,t,n,r={}){let s=new Map,i=l=>({byKey:new Map(l.fields.map(u=>[u.key,u])),cols:l.fields.filter(u=>!Fe.has(u.key)),rows:l.rows}),o=i({fields:t,rows:n});for(let[l,u]of Object.entries(r))s.set(l,i(u));let a=[];for(let l of e.widgets){let u=l.type==="text"?void 0:l.source,d=u?s.get(u):o;if(!d)continue;let c=Dt(l,d.byKey,d.cols,d.rows);c&&a.push({...c,w:l.w,h:l.h,gx:l.gx,gy:l.gy})}return a}var It=new Set(["sum","avg","count","min","max","last"]),Ue=e=>typeof e=="string"&&It.has(e)?e:void 0,b=e=>typeof e=="string"&&e!==""?e:void 0,E=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,O=e=>typeof e=="number"&&e>=1?Math.min(4,Math.round(e)):void 0,R=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function Ht(e){if(typeof e!="object"||e===null)return null;let t=e;switch(t.type){case"stat":return{type:"stat",source:b(t.source),label:b(t.label),metric:b(t.metric)??b(t.column),agg:Ue(t.agg),w:E(t.w),h:O(t.h),gx:R(t.gx),gy:R(t.gy)};case"line":case"bar":{let n=b(t.x);return n?{type:t.type,source:b(t.source),title:b(t.title),x:n,y:b(t.y)??b(t.column),agg:Ue(t.agg),w:E(t.w),h:O(t.h),gx:R(t.gx),gy:R(t.gy)}:null}case"donut":{let n=b(t.groupBy)??b(t.column);return n?{type:"donut",source:b(t.source),title:b(t.title),groupBy:n,w:E(t.w),h:O(t.h),gx:R(t.gx),gy:R(t.gy)}:null}case"table":{let n=Array.isArray(t.columns)?t.columns.filter(r=>typeof r=="string"):void 0;return{type:"table",source:b(t.source),title:b(t.title),columns:n,w:E(t.w),h:O(t.h),gx:R(t.gx),gy:R(t.gy)}}case"text":{let n=b(t.body);return n?{type:"text",title:b(t.title),body:n,w:E(t.w),h:O(t.h),gx:R(t.gx),gy:R(t.gy)}:null}default:return null}}function me(e){let t=e;if(typeof e=="string"){if(e.trim()==="")return null;try{t=JSON.parse(e)}catch{return null}}if(typeof t!="object"||t===null)return null;let n=t.widgets;if(!Array.isArray(n))return null;let r=n.map(Ht).filter(i=>i!==null);if(r.length===0)return null;let s=t.version;return{version:typeof s=="number"?s:1,title:b(t.title),widgets:r}}function Q(e){if(typeof e=="string")return e?{kind:"file",value:e}:null;if(e&&typeof e=="object"){let t=e,n=typeof t.value=="string"?t.value:"",r=t.kind==="link"||t.kind==="text"||t.kind==="table"?t.kind:"file",s=typeof t.v=="number"&&t.v>=1?Math.floor(t.v):void 0;return n?{kind:r,value:n,...s?{v:s}:{}}:null}return null}function Y(e){let t=new Map;for(let n of e){let r=n.v??1,s=t.get(r)??[];s.push(n),t.set(r,s)}return[...t.entries()].sort(([n],[r])=>n-r).map(([n,r])=>({v:n,items:r}))}function ge(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let r=JSON.parse(t);if(Array.isArray(r))return r.map(Q).filter(s=>s!==null)}catch{}let n=String(e.file??"");return n?[{kind:"file",value:n}]:[]}function fe(e,t,n,r=""){let i=Y(e).find(a=>a.v===t)?.items??[],o=i.filter(a=>a.kind==="file").map(a=>n.get(a.value)??"");return i.some(a=>a.kind==="table")&&o.push(r),o.length===0||o.some(a=>a==="")?"awaiting":o.some(a=>a==="revise")?"revise":"accepted"}function ye(e){return Number(e.published_version)||0}function Z(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function be(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let n=t.columns.map((i,o)=>({key:typeof i.key=="string"&&i.key?i.key:typeof i.id=="string"&&i.id?i.id:`column_${o+1}`,label:typeof i.label=="string"?i.label:"",type:Z(i.type),...i.clientEditable===!0?{clientEditable:!0}:{}})),r=t.rows.map((i,o)=>({id:typeof i.id=="string"&&i.id?i.id:`row_${o}`,cells:i.cells&&typeof i.cells=="object"?i.cells:{}})),s=typeof t.name=="string"?t.name:void 0;return{columns:n,rows:r,...s?{name:s}:{}}}}catch{}return null}function he(e){return e==null?"":String(e)}function xe(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function _(){return{cells:{},verdict:"",comment:""}}function we(e){if(typeof e!="string"||e.trim()==="")return _();try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let n=t;return{cells:n.cells&&typeof n.cells=="object"?n.cells:n,verdict:n.verdict==="accepted"||n.verdict==="revise"?n.verdict:"",comment:typeof n.comment=="string"?n.comment:""}}}catch{}return _()}function ve(e,t,n){if(e.clientEditable){let r=n.cells[t.id];if(r&&e.key in r)return r[e.key]}return t.cells[e.key]}function Se(e,t,n,r){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[n]:r}}}}function Pe(e,t,n){return{...e,verdict:t,comment:n}}function ke(e){let t=new Date(`${e}T00:00:00`);return Number.isNaN(t.getTime())?e:t.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}var M=class extends Error{code;status;constructor(t,n,r){super(n),this.name="CreditRefused",this.code=t,this.status=r}},At=/\/+$/,Mt="/api/v1/end-user",Ne=(e,t,n)=>{let r=t.filter(l=>l.order===n),s=r.reduce((l,u)=>l+u.amount,0),i=r.filter(l=>l.status==="paid").reduce((l,u)=>l+u.amount,0),o=e.value>0,a=s>0?s-i:e.value-i;return{value:e.value,priced:o,billed:s,paid:i,due:Math.max(0,a),lines:[...r].sort((l,u)=>l.status!==u.status?l.status==="due"?-1:1:(l.dueDate||l.paidAt).localeCompare(u.dueDate||u.paidAt)),awaitingPayment:o&&i<=0}},Ve=e=>{let t=e.baseUrl.replace(At,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async(s,i={method:"GET"})=>{try{let o=await fetch(`${t}${Mt}${s}`,{method:i.method,headers:{"content-type":"application/json",authorization:`Bearer ${await n()}`},...i.body===void 0?{}:{body:JSON.stringify(i.body)}});if(!o.ok){let a=await o.json().catch(()=>({}));throw new M(a.error??"request_failed",a.message??`${i.method} ${s} \u2192 ${String(o.status)}`,o.status)}return await o.json()}catch(o){throw o instanceof M?o:x(o)}};return{wallet:()=>r("/credits"),history:()=>r("/credits/history"),topup:s=>r("/credits/checkout",{method:"POST",body:{packId:s}}),checkout:s=>r("/shop/checkout",{method:"POST",body:s}),payments:()=>r("/payments"),paymentMethods:()=>r("/payment-methods"),markPaymentSent:(s,i)=>r(`/payments/${encodeURIComponent(s)}/sent`,{method:"POST",body:{reference:i??""}}),acceptInquiry:s=>r(`/inquiries/${encodeURIComponent(s)}/accept`,{method:"POST"}),enquire:(s,i,o)=>r("/shop/enquire",{method:"POST",body:{productId:s,answers:i,name:o??""}})}};var $t=/\/+$/,A="/api/v1/end-user",$=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function Wt(e){let t="";for(let r=0;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return btoa(t)}var je=e=>{let t=e.baseUrl.replace($t,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async()=>({"content-type":"application/json",authorization:`Bearer ${await n()}`}),s=async(o,a)=>{try{let l=await fetch(`${t}${A}${o}`,{method:a.method,headers:await r(),...a.body===void 0?{}:{body:JSON.stringify(a.body)}});if(l.status===409){let u=await l.json().catch(()=>({}));throw new $(u.message??"Someone else saved this first.")}if(!l.ok){let u=await l.text().catch(()=>""),d=`${a.method} ${o} \u2192 ${String(l.status)}`;try{let c=JSON.parse(u);c.message&&(d=c.message)}catch{d=u?`${d}: ${u}`:d}throw x({error:d})}return await l.json()}catch(l){throw l instanceof $?l:x(l)}},i=o=>`/tables/${encodeURIComponent(o)}`;return{listTables:async()=>(await P(`${t}${A}/tables`,await r())).tables,listRows:async(o,a)=>await P(`${t}${A}${i(o)}/rows?limit=${String(a??100)}`,await r()),insertRow:async(o,a)=>{let{rowIds:l}=await s(`${i(o)}/rows`,{method:"POST",body:{rows:[a]}}),u=l[0];if(!u)throw x(new Error("The row was not created."));return u},patchRow:async(o,a,l)=>(await s(`${i(o)}/rows/${encodeURIComponent(a)}`,{method:"PATCH",body:l})).updated,deleteRow:async(o,a)=>(await s(`/${encodeURIComponent(o)}/${encodeURIComponent(a)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await P(`${t}${A}/tables/files/rows?limit=200`,await r())).rows.map(a=>({id:a.rowId,filename:String(a.data.filename??""),source:String(a.data.source??"client"),campaign:String(a.data.campaign??""),size:typeof a.data.size=="number"?a.data.size:0,createdAt:a.createdAt})),uploadFile:async(o,a)=>{let l=new Uint8Array(await o.arrayBuffer());return await s("/files",{method:"POST",body:{filename:o.name,mime:o.type||"application/octet-stream",data:Wt(l),...a===void 0?{}:{message:a}}})},fileLink:async o=>await P(`${t}${A}/files/${encodeURIComponent(o)}/url`,await r()),deleteFile:async o=>(await s(`/files/${encodeURIComponent(o)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await P(`${t}${A}/documents`,await r())).documents,readDocument:async o=>(await P(`${t}${A}/documents/${encodeURIComponent(o)}`,await r())).document,saveDocument:async(o,a)=>await s(`/documents/${encodeURIComponent(o)}`,{method:"PATCH",body:a})}};var Et=/\/+$/,Ot="/api/v1/end-user",Be=e=>{let t=e.baseUrl.replace(Et,""),n=async(r,s)=>{let i;try{i=await fetch(`${t}${Ot}${r}`,s===void 0?{}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})}catch(o){throw x(o)}if(i.status===429)throw x({error:"rate_limited",retryable:!0});if(!i.ok)throw x({error:`shop_request_failed_${String(i.status)}`});try{return await i.json()}catch(o){throw x(o)}};return{listProducts:async()=>{let r=await n(`/shop/products?publishable_key=${encodeURIComponent(e.publishableKey)}`);return{products:r.products.map(s=>({...s,currency:typeof s.currency=="string"?s.currency:""})),truncated:r.truncated===!0}},apply:async r=>await n("/shop/apply",{publishable_key:e.publishableKey,name:r.name,email:r.email,...r.phone?{phone:r.phone}:{},...r.message?{message:r.message}:{},...r.productId?{productId:r.productId}:{}})}};var _t=new Set(["buy","ask"]);function Ge(e){return _t.has(e.mode)?e.mode:"ask"}var Ft={kind:"quoted"};function F(e,t){if(!t)return e.toLocaleString();if(t.toLowerCase()==="credits")return`${e.toLocaleString()} ${e===1?"credit":"credits"}`;let n=Number.isInteger(e)?0:2;try{return new Intl.NumberFormat(void 0,{style:"currency",currency:t,minimumFractionDigits:n,maximumFractionDigits:n}).format(e)}catch{return`${t} ${e.toLocaleString()}`}}function qe(e,t){let n=/^[a-z]+$/i.test(t)&&!t.endsWith("s")?"s":"";return`${e.toLocaleString()} ${t}${n}`}function Te(e,t){return e.kind==="quoted"?"Priced on enquiry":e.kind==="flat"?F(e.price,t):`${F(e.unitPrice,t)} per ${e.unitStep===1?e.unit:qe(e.unitStep,e.unit)}`}function ze(e){let t=e.currency,n=e.pricing;if(n.kind!=="variants")return Te(n,t);let r=n.variants.map(s=>s.price).filter(s=>typeof s=="number");return r.length>0?`From ${F(Math.min(...r),t)}`:"Priced on enquiry"}function Je(e,t){if(e.kind!=="variants")return e;let n=e.variants.find(r=>r.name===t);return typeof n?.price=="number"?{kind:"flat",price:n.price}:Ft}function Ke(e,t){return e.kind==="flat"?e.price:e.kind==="per_unit"?e.unitPrice*Math.ceil(t/Math.max(e.unitStep,1)):null}function Xe(e,t){let n=t.kind==="per_unit"?Math.max(t.unitStep,1):1;return{min:Math.max(e.minQty??n,n),max:e.maxQty??null,step:n}}function Qe(e,t){let n=e.variants?.find(r=>r.name===t);return n&&n.includes.length>0?n.includes:e.includes}function Ye(e,t){let n=[];for(let r of e){let s=t(r).trim();s&&!n.includes(s)&&n.push(s)}return n}function Ze(e,t,n,r){let s=t?`${e.name} \u2014 ${t}`:e.name,i=n.kind==="per_unit"?`, ${qe(r,n.unit)}`:"";return`I'd like to buy ${s}${i}. How do I go ahead?`}function et(e){return e?(e&&typeof e=="object"&&"error"in e?String(e.error):"")==="rate_limited"?"That's a lot of looking at once \u2014 give it a moment, then reload.":"The shop isn't loading right now. Please try again shortly.":null}var H=require("react"),tt=e=>{let[t,n]=(0,H.useState)(null),[r,s]=(0,H.useState)(!0),[i,o]=(0,H.useState)(null),a=(0,H.useCallback)(async()=>{try{n(await e.wallet()),o(null)}catch{o("Couldn't read your balance just now.")}finally{s(!1)}},[e]),l=(0,H.useCallback)(()=>{a().catch(()=>{})},[a]);return(0,H.useEffect)(()=>(l(),window.addEventListener("focus",l),()=>{window.removeEventListener("focus",l)}),[l]),{wallet:t,loading:r,failure:i,refresh:l}};var D=require("react"),Lt=e=>e&&typeof e=="object"&&typeof e.error=="string"?e.error:e instanceof Error?e.message:"shop_unavailable",nt=e=>{let[t,n]=(0,D.useState)([]),[r,s]=(0,D.useState)(!1),[i,o]=(0,D.useState)(!0),[a,l]=(0,D.useState)(null),[u,d]=(0,D.useState)(0);(0,D.useEffect)(()=>{let m=!0;return o(!0),e.listProducts().then(p=>{m&&(n(p.products),s(p.truncated),l(null))}).catch(p=>{m&&l(Lt(p))}).finally(()=>{m&&o(!1)}),()=>{m=!1}},[e,u]);let c=(0,D.useCallback)(()=>d(m=>m+1),[]);return{products:t,truncated:r,loading:i,error:a,reload:c}};var k=require("react"),rt="greeting";function Ce(e,t){if(e.some(i=>i.id===t.id))return e;let n=e.filter(i=>i.id!==rt),r=i=>i.author==="client"==(t.author==="client");return[...n.filter(i=>!(i.pending&&r(i)&&i.text===t.text)),t]}var ot=(e,t)=>{let[n,r]=(0,k.useState)([]),[s,i]=(0,k.useState)(""),[o,a]=(0,k.useState)(!1),[l,u]=(0,k.useState)(null),d=(0,k.useRef)(0),c=t?.pollMs??2e3;(0,k.useEffect)(()=>{let p=!0;return e.getInfo().then(y=>{p&&y.greeting&&r(w=>w.length===0?[{id:rt,cursor:"",author:"agent",text:y.greeting}]:w)}).catch(()=>{}),()=>{p=!1}},[e]),(0,k.useEffect)(()=>e.subscribe?.({onMessage:p=>r(y=>Ce(y,p)),onError:p=>u(p.error),onHealthy:()=>u(null)},{intervalMs:c}),[e,c]);let m=(0,k.useCallback)(()=>{let p=s.trim();if(!p||o)return;i(""),u(null),a(!0),d.current+=1;let y=`pending-${d.current}`,w={id:y,cursor:"",author:"client",text:p,pending:!0};r(f=>[...f,w]),e.sendMessage(p).then(f=>{a(!1),f.reply.trim()&&r(g=>g.some(I=>!I.pending&&I.author!=="client"&&I.text===f.reply)?g:(d.current+=1,[...g,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:f.reply,pending:!0}]))}).catch(f=>{u(f instanceof Error?f.message:"send_failed"),a(!1),r(C=>C.filter(g=>g.id!==y)),i(C=>C||p)})},[s,o,e]);return{messages:n,input:s,setInput:i,send:m,sending:o,error:l}};0&&(module.exports={Chat,CreditRefused,GRID_COLS,GRID_MAX_COLS,GRID_MAX_ROWS,HolaProvider,PortalConflict,bandOfKind,bandOfType,buyRequestText,cellValue,createApiTransport,createHolaClient,createPortalCredits,createPortalData,createPortalShop,createWidgetTransport,deliverableCellText,deliverableStatus,deriveFields,emptyTableResponses,facetValues,footprintOf,footprintWith,formatDeliverableDate,groupDeliverableVersions,includesFor,inferSpec,isDeliverableChecked,mergeMessage,modeOf,money,normalizeDeliverableColType,normalizeDeliverableItem,orderBilling,parseDashboardSpec,parseDeliverableItems,parseDeliverableTable,parseTableResponses,placeWidgets,priceFor,priceLabel,publishedVersionOf,quantityRange,renderModel,setResponse,setTableReview,shelfPriceLabel,shelfProblem,splitLayout,textDeltaOf,thinkingDeltaOf,toolEventOf,totalFor,useArtifactUrl,useChat,useCredits,useHolaClient,useShop,useThread});
8
+ `)}},u=async()=>{let d=await i.read();if(!d.done)return a+=o.decode(d.value,{stream:!0}),l(),u()};await u()};var gt=/\/+$/,te="/api/v1/end-user",Ae=e=>{let t=e.baseUrl.replace(gt,""),r=()=>typeof e.token=="function"?e.token():e.token,n=o=>e.project?`${o}project=${encodeURIComponent(e.project)}`:"",s=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),i=async o=>{let a=await fetch(`${t}${te}/chat${n("?")}`,{method:"POST",headers:await s(),body:JSON.stringify({message:o})});if(!a.ok)throw new Error(`hola: message failed (${a.status})`);return{reply:(await a.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>P(`${t}${te}/chat/info${n("?")}`,await s()),sendMessage:i,streamMessage:async(o,a)=>{try{let l=await i(o);a.onText?.(l.reply),a.onComplete?.(l)}catch(l){a.onError?.(w(l))}},subscribe:(o,a)=>{let l=a?.since??"0",u=!1,d,p=a?.intervalMs??3e3,f=typeof document<"u",c=()=>f&&document.visibilityState==="hidden",m=!1,y=()=>{if(!u){if(c()){m=!0;return}d=setTimeout(b,p)}},b=async()=>{try{let x=await P(`${t}${te}/chat/thread?since=${encodeURIComponent(l)}${n("&")}`,await s());for(let I of x.messages)o.onMessage(I);l=x.cursor,o.onHealthy?.()}catch(x){o.onError?.(w(x))}y()},R=()=>{u||!m||c()||(m=!1,d&&clearTimeout(d),d=setTimeout(b,0))};f&&document.addEventListener("visibilitychange",R);let g=()=>{u=!0,d&&clearTimeout(d),f&&document.removeEventListener("visibilitychange",R)};return a?.signal?.addEventListener("abort",g),d=setTimeout(b,0),g}}};var q=require("react"),V=(e,t)=>{let[r,n]=(0,q.useState)("");return(0,q.useEffect)(()=>{if(!e){n("");return}let s=Uint8Array.from(atob(e),o=>o.charCodeAt(0)),i=URL.createObjectURL(new Blob([s],{type:t}));return n(i),()=>URL.revokeObjectURL(i)},[e,t]),r};var z=require("react");var j=require("react"),$e=require("react/jsx-runtime"),He=(0,j.createContext)(null),Me=({client:e,children:t})=>(0,$e.jsx)(He.Provider,{value:e,children:t}),B=()=>{let e=(0,j.useContext)(He);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};var v=require("react"),G=e=>{let[t,r]=(0,v.useState)([]),[n,s]=(0,v.useState)(""),[i,o]=(0,v.useState)(!1),[a,l]=(0,v.useState)(null),u=(0,v.useRef)(0),d=(0,v.useRef)(null);(0,v.useEffect)(()=>()=>d.current?.abort(),[]);let p=(0,v.useCallback)(()=>{let c=u.current;return u.current+=1,c},[]);(0,v.useEffect)(()=>{let c=!0;return e.getInfo().then(m=>{c&&m.greeting&&r([{id:p(),role:"assistant",text:m.greeting}])}).catch(()=>{}),()=>{c=!1}},[e,p]);let f=(0,v.useCallback)(()=>{let c=n.trim();if(!c||i)return;s(""),l(null),o(!0);let m=p(),y=p();r(g=>[...g,{id:m,role:"user",text:c},{id:y,role:"assistant",text:"",streaming:!0}]);let b=g=>{r(x=>x.map(I=>I.id===y?g(I):I))},R=new AbortController;d.current=R,e.streamMessage(c,{onText:g=>b(x=>({...x,text:x.text+g})),onComplete:g=>{b(x=>({...x,text:g.reply||x.text,artifacts:g.artifacts,streaming:!1})),o(!1)},onError:g=>{b(x=>({...x,streaming:!1})),l(g.error),o(!1)}},R.signal).catch(g=>{b(x=>({...x,streaming:!1})),l(g instanceof Error?g.message:"stream_failed"),o(!1)}).finally(()=>{o(!1),b(g=>g.streaming?{...g,streaming:!1}:g)})},[n,i,e,p]);return{messages:t,input:n,setInput:s,send:f,sending:i,error:a}};var S=require("react/jsx-runtime"),T={root:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif",fontSize:14,color:"#111827"},log:{flex:1,overflowY:"auto",padding:12,display:"flex",flexDirection:"column",gap:8},user:{alignSelf:"flex-end",background:"#111827",color:"#ffffff",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},assistant:{alignSelf:"flex-start",background:"#f1f1f4",color:"#111827",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},artifacts:{display:"flex",flexDirection:"column",gap:6,marginTop:6},image:{maxHeight:220,borderRadius:8,border:"1px solid #e5e7eb"},link:{color:"#2563eb",textDecoration:"underline",wordBreak:"break-all"},error:{color:"#b91c1c",padding:"4px 12px",fontSize:13},form:{display:"flex",gap:8,borderTop:"1px solid #e5e7eb",padding:8},input:{flex:1,border:"1px solid #d1d5db",borderRadius:8,padding:"8px 10px",fontSize:14,outline:"none"},button:{border:"none",background:"#111827",color:"#ffffff",borderRadius:8,padding:"8px 14px",fontSize:14,cursor:"pointer"}},ft=({artifact:e})=>{let t=V(e.dataBase64??"",e.mimeType),r=e.url??t;return r?e.mimeType.startsWith("image/")?(0,S.jsx)("a",{href:r,rel:"noopener noreferrer",target:"_blank",children:(0,S.jsx)("img",{alt:e.filename,src:r,style:T.image})}):(0,S.jsx)("a",{download:e.filename,href:r,style:T.link,children:e.filename}):null},We=()=>{let e=B(),{messages:t,input:r,setInput:n,send:s,sending:i,error:o}=G(e),a=(0,z.useRef)(null);(0,z.useEffect)(()=>{let u=a.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let l=u=>{u.preventDefault(),s()};return(0,S.jsxs)("div",{style:T.root,children:[(0,S.jsx)("div",{ref:a,style:T.log,children:t.map(u=>(0,S.jsxs)("div",{style:u.role==="user"?T.user:T.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?(0,S.jsx)("div",{style:T.artifacts,children:u.artifacts.map(d=>(0,S.jsx)(ft,{artifact:d},d.filename))}):null]},u.id))}),o?(0,S.jsx)("div",{style:T.error,children:o}):null,(0,S.jsxs)("form",{onSubmit:l,style:T.form,children:[(0,S.jsx)("input",{"aria-label":"Message",onChange:u=>n(u.target.value),placeholder:"Type a message\u2026",style:T.input,value:r}),(0,S.jsx)("button",{disabled:i||r.trim().length===0,style:T.button,type:"submit",children:"Send"})]})]})};var yt=/\/+$/,J=e=>{let t=e.sessionId,r=e.baseUrl.replace(yt,""),n=o=>`${r}/endpoint/${encodeURIComponent(e.token)}${o}`,s={"content-type":"application/json"},i=(o,a)=>({url:n(o),headers:s,body:JSON.stringify({message:a,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>P(n("/config"),{}),sendMessage:async o=>{let a=await De(i("/message",o));return t=a.sessionId,a},streamMessage:(o,a,l)=>Ie(i("/message/stream",o),a,u=>{t=u},l),subscribe:(o,a)=>{let l=a?.since??"0",u=!1,d,p=a?.intervalMs??3e3,f=async()=>{let m=t;if(m)try{let y=await P(n(`/messages?session=${encodeURIComponent(m)}&since=${encodeURIComponent(l)}`),{});for(let b of y.messages)o.onMessage(b);l=y.cursor,o.onHealthy?.()}catch(y){o.onError?.(w(y))}u||(d=setTimeout(f,p))},c=()=>{u=!0,d&&clearTimeout(d)};return a?.signal?.addEventListener("abort",c),d=setTimeout(f,0),c}}};var Ee=e=>"transport"in e?e.transport:J(e);var bt=/^https?:\/\//i,ht=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,xt=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function wt(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(bt.test(e))return"url";if(ht.test(e))return"date"}return"text"}function re(e){let t=[],r=new Map;for(let n of e)for(let[s,i]of Object.entries(n.data??{})){if(i==null)continue;let o=r.get(s);o||(o=new Map,r.set(s,o),t.push(s));let a=wt(i);o.set(a,(o.get(a)??0)+1)}return t.map(n=>{let s=r.get(n)??new Map,i="text",o=-1;for(let[a,l]of s)l>o&&(o=l,i=a);return{key:n,label:xt(n),type:i}})}var vt=e=>typeof e=="number"?e:Number(e)||0,Fe=e=>/rate|position|rank|score|percent|avg/i.test(e),St=/posted|published|sent|completed|shipped|launched|_at/i,Pt=new Set(["service","order","end_user_id"]);function ne(e,t){let r=e.filter(l=>!Pt.has(l.key)),n=r.filter(l=>l.type==="number").slice(0,3),s=r.find(l=>l.key==="status")??r.find(l=>l.type==="select"),i=r.find(l=>l.type==="date"&&St.test(l.key))??r.find(l=>l.type==="date"),o=r.filter(l=>l.type==="number"&&!Fe(l.key)).map(l=>({field:l,total:t.reduce((u,d)=>u+vt(d.data[l.key]),0)})).sort((l,u)=>u.total-l.total).find(l=>l.total>0)?.field??null,a=[{type:"stat",label:"Items",agg:"count"}];for(let l of n){let u=Fe(l.key);a.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return i&&a.push({type:"line",x:i.key,y:o?.key,agg:"sum",title:o?`${o.label} by day`:"Items by day"}),s&&a.push({type:"donut",groupBy:s.key,title:s.label}),a.push({type:"table",columns:r.map(l=>l.key)}),{version:1,widgets:a}}var oe=6,se=6,ie=4,Oe={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},kt=e=>Math.max(1,Math.min(6,Math.round(e))),Tt=e=>Math.max(1,Math.min(4,Math.round(e)));function W(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function ae(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function le(e){return Oe[e]}function K(e,t,r){let n=Oe[e];return{w:t===void 0?n.w:kt(t),h:r===void 0?n.h:Tt(r)}}function X(e){let t=[],r=[],n=(o,a,l,u)=>{if(o<0||o+l>6)return!1;for(let d=0;d<u;d+=1){let p=r[a+d];if(p){for(let f=0;f<l;f+=1)if(p[o+f])return!1}}return!0},s=(o,a,l,u)=>{for(let d=0;d<u;d+=1){let p=r[a+d]??[];for(let f=0;f<l;f+=1)p[o+f]=!0;r[a+d]=p}},i=(o,a)=>{for(let l=0;;l+=1)for(let u=0;u+o<=6;u+=1)if(n(u,l,o,a))return{gx:u,gy:l}};for(let o of e){let a=K(W(o.kind),o.w,o.h),u=o.gx!==void 0&&o.gy!==void 0&&n(o.gx,o.gy,a.w,a.h)&&o.gx!==void 0&&o.gy!==void 0?{gx:o.gx,gy:o.gy}:i(a.w,a.h);s(u.gx,u.gy,a.w,a.h),t.push({widget:o,gx:u.gx,gy:u.gy,w:a.w,h:a.h})}return t}function ue(e){let t=[],r=[];for(let n of e)W(n.kind)==="block"?r.push(n):t.push(n);return{tiles:X(t),blocks:r}}var _e=new Set(["service","order","end_user_id"]),de=e=>typeof e=="number"?e:Number(e)||0,Le=e=>e==null?"":String(e);function pe(e,t){if(e==="count")return t.length;if(t.length===0)return 0;if(e==="last")return t[t.length-1]??0;if(e==="min")return Math.min(...t);if(e==="max")return Math.max(...t);let r=t.reduce((n,s)=>n+s,0);return e==="avg"?Math.round(r/t.length*100)/100:r}function Ct(e,t,r,n){let s=new Map;for(let i of e){let o=new Date(Le(i.data[t]));if(Number.isNaN(o.getTime()))continue;let a=o.toISOString().slice(0,10),l=s.get(a)??[];l.push(r?de(i.data[r]):1),s.set(a,l)}return[...s.entries()].sort((i,o)=>i[0]<o[0]?-1:1).map(([i,o])=>({label:new Date(`${i}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:r?pe(n,o):o.length}))}function Rt(e,t,r,n="sum"){let s=new Map;for(let i of e){let o=Le(i.data[t]).trim();if(!o)continue;let a=s.get(o)??[];a.push(r?de(i.data[r]):1),s.set(o,a)}return[...s.entries()].map(([i,o])=>({label:i,value:r?pe(n,o):o.length})).sort((i,o)=>o.value-i.value)}function Dt(e,t,r,n){switch(e.type){case"stat":{let s=e.metric?t.get(e.metric):void 0;if(e.metric&&!s)return null;if(!s)return{kind:"stat",label:e.label??"Items",value:n.length};let i=n.map(o=>de(o.data[s.key]));return{kind:"stat",label:e.label??s.label,value:pe(e.agg??"sum",i)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let s=Ct(n,e.x,e.y,e.agg??"sum");return s.length<2?null:{kind:"series",draw:e.type,title:e.title??"By day",points:s}}case"donut":{if(!t.has(e.groupBy))return null;let s=Rt(n,e.groupBy,e.metric,e.agg??"sum");return s.length===0?null:{kind:"donut",title:e.title??t.get(e.groupBy)?.label??"Breakdown",points:s}}case"table":{let s=e.columns?e.columns.map(i=>t.get(i)).filter(i=>i!==void 0&&!_e.has(i.key)):r;return s.length===0?null:{kind:"table",title:e.title,columns:s,rows:n}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function ce(e,t,r,n={}){let s=new Map,i=l=>({byKey:new Map(l.fields.map(u=>[u.key,u])),cols:l.fields.filter(u=>!_e.has(u.key)),rows:l.rows}),o=i({fields:t,rows:r});for(let[l,u]of Object.entries(n))s.set(l,i(u));let a=[];for(let l of e.widgets){let u=l.type==="text"?void 0:l.source,d=u?s.get(u):o;if(!d)continue;let p=Dt(l,d.byKey,d.cols,d.rows);p&&a.push({...p,w:l.w,h:l.h,gx:l.gx,gy:l.gy})}return a}var It=new Set(["sum","avg","count","min","max","last"]),Ue=e=>typeof e=="string"&&It.has(e)?e:void 0,h=e=>typeof e=="string"&&e!==""?e:void 0,E=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,F=e=>typeof e=="number"&&e>=1?Math.min(4,Math.round(e)):void 0,D=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function At(e){if(typeof e!="object"||e===null)return null;let t=e;switch(t.type){case"stat":return{type:"stat",source:h(t.source),label:h(t.label),metric:h(t.metric)??h(t.column),agg:Ue(t.agg),w:E(t.w),h:F(t.h),gx:D(t.gx),gy:D(t.gy)};case"line":case"bar":{let r=h(t.x);return r?{type:t.type,source:h(t.source),title:h(t.title),x:r,y:h(t.y)??h(t.column),agg:Ue(t.agg),w:E(t.w),h:F(t.h),gx:D(t.gx),gy:D(t.gy)}:null}case"donut":{let r=h(t.groupBy)??h(t.column);return r?{type:"donut",source:h(t.source),title:h(t.title),groupBy:r,w:E(t.w),h:F(t.h),gx:D(t.gx),gy:D(t.gy)}:null}case"table":{let r=Array.isArray(t.columns)?t.columns.filter(n=>typeof n=="string"):void 0;return{type:"table",source:h(t.source),title:h(t.title),columns:r,w:E(t.w),h:F(t.h),gx:D(t.gx),gy:D(t.gy)}}case"text":{let r=h(t.body);return r?{type:"text",title:h(t.title),body:r,w:E(t.w),h:F(t.h),gx:D(t.gx),gy:D(t.gy)}:null}default:return null}}function me(e){let t=e;if(typeof e=="string"){if(e.trim()==="")return null;try{t=JSON.parse(e)}catch{return null}}if(typeof t!="object"||t===null)return null;let r=t.widgets;if(!Array.isArray(r))return null;let n=r.map(At).filter(i=>i!==null);if(n.length===0)return null;let s=t.version;return{version:typeof s=="number"?s:1,title:h(t.title),widgets:n}}function Q(e){if(typeof e=="string")return e?{kind:"file",value:e}:null;if(e&&typeof e=="object"){let t=e,r=typeof t.value=="string"?t.value:"",n=t.kind==="link"||t.kind==="text"||t.kind==="table"?t.kind:"file",s=typeof t.v=="number"&&t.v>=1?Math.floor(t.v):void 0;return r?{kind:n,value:r,...s?{v:s}:{}}:null}return null}function Y(e){let t=new Map;for(let r of e){let n=r.v??1,s=t.get(n)??[];s.push(r),t.set(n,s)}return[...t.entries()].sort(([r],[n])=>r-n).map(([r,n])=>({v:r,items:n}))}function ge(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let n=JSON.parse(t);if(Array.isArray(n))return n.map(Q).filter(s=>s!==null)}catch{}let r=String(e.file??"");return r?[{kind:"file",value:r}]:[]}function fe(e,t,r,n=""){let i=Y(e).find(a=>a.v===t)?.items??[],o=i.filter(a=>a.kind==="file").map(a=>r.get(a.value)??"");return i.some(a=>a.kind==="table")&&o.push(n),o.length===0||o.some(a=>a==="")?"awaiting":o.some(a=>a==="revise")?"revise":"accepted"}function ye(e){return Number(e.published_version)||0}function Z(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function be(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let r=t.columns.map((i,o)=>({key:typeof i.key=="string"&&i.key?i.key:typeof i.id=="string"&&i.id?i.id:`column_${o+1}`,label:typeof i.label=="string"?i.label:"",type:Z(i.type),...i.clientEditable===!0?{clientEditable:!0}:{}})),n=t.rows.map((i,o)=>({id:typeof i.id=="string"&&i.id?i.id:`row_${o}`,cells:i.cells&&typeof i.cells=="object"?i.cells:{}})),s=typeof t.name=="string"?t.name:void 0;return{columns:r,rows:n,...s?{name:s}:{}}}}catch{}return null}function he(e){return e==null?"":String(e)}function xe(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function O(){return{cells:{},verdict:"",comment:""}}function we(e){if(typeof e!="string"||e.trim()==="")return O();try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let r=t;return{cells:r.cells&&typeof r.cells=="object"?r.cells:r,verdict:r.verdict==="accepted"||r.verdict==="revise"?r.verdict:"",comment:typeof r.comment=="string"?r.comment:""}}}catch{}return O()}function ve(e,t,r){if(e.clientEditable){let n=r.cells[t.id];if(n&&e.key in n)return n[e.key]}return t.cells[e.key]}function Se(e,t,r,n){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[r]:n}}}}function Pe(e,t,r){return{...e,verdict:t,comment:r}}function ke(e){let t=new Date(`${e}T00:00:00`);return Number.isNaN(t.getTime())?e:t.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}var M=class extends Error{code;status;constructor(t,r,n){super(r),this.name="CreditRefused",this.code=t,this.status=n}},Ht=/\/+$/,Mt="/api/v1/end-user",Ne=(e,t,r)=>{let n=t.filter(l=>l.order===r),s=n.reduce((l,u)=>l+u.amount,0),i=n.filter(l=>l.status==="paid").reduce((l,u)=>l+u.amount,0),o=e.value>0,a=s>0?s-i:e.value-i;return{value:e.value,priced:o,billed:s,paid:i,due:Math.max(0,a),lines:[...n].sort((l,u)=>l.status!==u.status?l.status==="due"?-1:1:(l.dueDate||l.paidAt).localeCompare(u.dueDate||u.paidAt)),awaitingPayment:o&&i<=0}},qe=e=>{let t=e.baseUrl.replace(Ht,""),r=()=>typeof e.token=="function"?e.token():e.token,n=async(s,i={method:"GET"})=>{try{let o=await fetch(`${t}${Mt}${s}`,{method:i.method,headers:{"content-type":"application/json",authorization:`Bearer ${await r()}`},...i.body===void 0?{}:{body:JSON.stringify(i.body)}});if(!o.ok){let a=await o.json().catch(()=>({}));throw new M(a.error??"request_failed",a.message??`${i.method} ${s} \u2192 ${String(o.status)}`,o.status)}return await o.json()}catch(o){throw o instanceof M?o:w(o)}};return{wallet:()=>n("/credits"),history:()=>n("/credits/history"),topup:s=>n("/credits/checkout",{method:"POST",body:{packId:s}}),checkout:s=>n("/shop/checkout",{method:"POST",body:s}),payments:()=>n("/payments"),paymentMethods:()=>n("/payment-methods"),markPaymentSent:(s,i)=>n(`/payments/${encodeURIComponent(s)}/sent`,{method:"POST",body:{reference:i??""}}),acceptInquiry:s=>n(`/inquiries/${encodeURIComponent(s)}/accept`,{method:"POST"}),enquire:(s,i,o)=>n("/shop/enquire",{method:"POST",body:{productId:s,answers:i,name:o??""}})}};var $t=/\/+$/,H="/api/v1/end-user",$=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function Wt(e){let t="";for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}var Ve=e=>{let t=e.baseUrl.replace($t,""),r=()=>typeof e.token=="function"?e.token():e.token,n=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),s=async(o,a)=>{try{let l=await fetch(`${t}${H}${o}`,{method:a.method,headers:await n(),...a.body===void 0?{}:{body:JSON.stringify(a.body)}});if(l.status===409){let u=await l.json().catch(()=>({}));throw new $(u.message??"Someone else saved this first.")}if(!l.ok){let u=await l.text().catch(()=>""),d=`${a.method} ${o} \u2192 ${String(l.status)}`;try{let p=JSON.parse(u);p.message&&(d=p.message)}catch{d=u?`${d}: ${u}`:d}throw w({error:d})}return await l.json()}catch(l){throw l instanceof $?l:w(l)}},i=o=>`/tables/${encodeURIComponent(o)}`;return{listTables:async()=>(await P(`${t}${H}/tables`,await n())).tables,listRows:async(o,a)=>await P(`${t}${H}${i(o)}/rows?limit=${String(a??100)}`,await n()),insertRow:async(o,a)=>{let{rowIds:l}=await s(`${i(o)}/rows`,{method:"POST",body:{rows:[a]}}),u=l[0];if(!u)throw w(new Error("The row was not created."));return u},patchRow:async(o,a,l)=>(await s(`${i(o)}/rows/${encodeURIComponent(a)}`,{method:"PATCH",body:l})).updated,deleteRow:async(o,a)=>(await s(`/${encodeURIComponent(o)}/${encodeURIComponent(a)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await P(`${t}${H}/tables/files/rows?limit=200`,await n())).rows.map(a=>({id:a.rowId,filename:String(a.data.filename??""),source:String(a.data.source??"client"),campaign:String(a.data.campaign??""),size:typeof a.data.size=="number"?a.data.size:0,createdAt:a.createdAt})),uploadFile:async(o,a)=>{let l=new Uint8Array(await o.arrayBuffer());return await s("/files",{method:"POST",body:{filename:o.name,mime:o.type||"application/octet-stream",data:Wt(l),...a===void 0?{}:{message:a}}})},fileLink:async o=>await P(`${t}${H}/files/${encodeURIComponent(o)}/url`,await n()),deleteFile:async o=>(await s(`/files/${encodeURIComponent(o)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await P(`${t}${H}/documents`,await n())).documents,readDocument:async o=>(await P(`${t}${H}/documents/${encodeURIComponent(o)}`,await n())).document,saveDocument:async(o,a)=>await s(`/documents/${encodeURIComponent(o)}`,{method:"PATCH",body:a})}};var Et=/\/+$/,Ft="/api/v1/end-user",je=e=>{let t=e.baseUrl.replace(Et,""),r=async(n,s)=>{let i;try{i=await fetch(`${t}${Ft}${n}`,s===void 0?{}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})}catch(o){throw w(o)}if(i.status===429)throw w({error:"rate_limited",retryable:!0});if(!i.ok)throw w({error:`shop_request_failed_${String(i.status)}`});try{return await i.json()}catch(o){throw w(o)}};return{listProducts:async()=>{let n=await r(`/shop/products?publishable_key=${encodeURIComponent(e.publishableKey)}`);return{products:n.products.map(s=>({...s,currency:typeof s.currency=="string"?s.currency:""})),truncated:n.truncated===!0,enquiryForm:Array.isArray(n.enquiryForm)?n.enquiryForm:[]}},apply:async n=>await r("/shop/apply",{publishable_key:e.publishableKey,name:n.name,email:n.email,...n.phone?{phone:n.phone}:{},...n.message?{message:n.message}:{},...n.productId?{productId:n.productId}:{}})}};var Ot=new Set(["buy","ask"]);function Be(e){return Ot.has(e.mode)?e.mode:"ask"}var _t={kind:"quoted"};function _(e,t){if(!t)return e.toLocaleString();if(t.toLowerCase()==="credits")return`${e.toLocaleString()} ${e===1?"credit":"credits"}`;let r=Number.isInteger(e)?0:2;try{return new Intl.NumberFormat(void 0,{style:"currency",currency:t,minimumFractionDigits:r,maximumFractionDigits:r}).format(e)}catch{return`${t} ${e.toLocaleString()}`}}function Ge(e,t){let r=/^[a-z]+$/i.test(t)&&!t.endsWith("s")?"s":"";return`${e.toLocaleString()} ${t}${r}`}function Te(e,t){return e.kind==="quoted"?"Priced on enquiry":e.kind==="flat"?_(e.price,t):`${_(e.unitPrice,t)} per ${e.unitStep===1?e.unit:Ge(e.unitStep,e.unit)}`}function ze(e){let t=e.currency,r=e.pricing;if(r.kind!=="variants")return Te(r,t);let n=r.variants.map(s=>s.price).filter(s=>typeof s=="number");return n.length>0?`From ${_(Math.min(...n),t)}`:"Priced on enquiry"}function Je(e,t){if(e.kind!=="variants")return e;let r=e.variants.find(n=>n.name===t);return typeof r?.price=="number"?{kind:"flat",price:r.price}:_t}function Ke(e,t){return e.kind==="flat"?e.price:e.kind==="per_unit"?e.unitPrice*Math.ceil(t/Math.max(e.unitStep,1)):null}function Xe(e,t){let r=t.kind==="per_unit"?Math.max(t.unitStep,1):1;return{min:Math.max(e.minQty??r,r),max:e.maxQty??null,step:r}}function Qe(e,t){let r=e.variants?.find(n=>n.name===t);return r&&r.includes.length>0?r.includes:e.includes}function Ye(e,t){let r=[];for(let n of e){let s=t(n).trim();s&&!r.includes(s)&&r.push(s)}return r}function Ze(e,t,r,n){let s=t?`${e.name} \u2014 ${t}`:e.name,i=r.kind==="per_unit"?`, ${Ge(n,r.unit)}`:"";return`I'd like to buy ${s}${i}. How do I go ahead?`}function et(e){return e?(e&&typeof e=="object"&&"error"in e?String(e.error):"")==="rate_limited"?"That's a lot of looking at once \u2014 give it a moment, then reload.":"The shop isn't loading right now. Please try again shortly.":null}var A=require("react"),tt=e=>{let[t,r]=(0,A.useState)(null),[n,s]=(0,A.useState)(!0),[i,o]=(0,A.useState)(null),a=(0,A.useCallback)(async()=>{try{r(await e.wallet()),o(null)}catch{o("Couldn't read your balance just now.")}finally{s(!1)}},[e]),l=(0,A.useCallback)(()=>{a().catch(()=>{})},[a]);return(0,A.useEffect)(()=>(l(),window.addEventListener("focus",l),()=>{window.removeEventListener("focus",l)}),[l]),{wallet:t,loading:n,failure:i,refresh:l}};var C=require("react"),Lt=e=>e&&typeof e=="object"&&typeof e.error=="string"?e.error:e instanceof Error?e.message:"shop_unavailable",rt=e=>{let[t,r]=(0,C.useState)([]),[n,s]=(0,C.useState)([]),[i,o]=(0,C.useState)(!1),[a,l]=(0,C.useState)(!0),[u,d]=(0,C.useState)(null),[p,f]=(0,C.useState)(0);(0,C.useEffect)(()=>{let m=!0;return l(!0),e.listProducts().then(y=>{m&&(r(y.products),s(y.enquiryForm),o(y.truncated),d(null))}).catch(y=>{m&&d(Lt(y))}).finally(()=>{m&&l(!1)}),()=>{m=!1}},[e,p]);let c=(0,C.useCallback)(()=>f(m=>m+1),[]);return{products:t,enquiryForm:n,truncated:i,loading:a,error:u,reload:c}};var k=require("react"),nt="greeting";function Ce(e,t){if(e.some(i=>i.id===t.id))return e;let r=e.filter(i=>i.id!==nt),n=i=>i.author==="client"==(t.author==="client");return[...r.filter(i=>!(i.pending&&n(i)&&i.text===t.text)),t]}var ot=(e,t)=>{let[r,n]=(0,k.useState)([]),[s,i]=(0,k.useState)(""),[o,a]=(0,k.useState)(!1),[l,u]=(0,k.useState)(null),d=(0,k.useRef)(0),p=t?.pollMs??2e3;(0,k.useEffect)(()=>{let c=!0;return e.getInfo().then(m=>{c&&m.greeting&&n(y=>y.length===0?[{id:nt,cursor:"",author:"agent",text:m.greeting}]:y)}).catch(()=>{}),()=>{c=!1}},[e]),(0,k.useEffect)(()=>e.subscribe?.({onMessage:c=>n(m=>Ce(m,c)),onError:c=>u(c.error),onHealthy:()=>u(null)},{intervalMs:p}),[e,p]);let f=(0,k.useCallback)(()=>{let c=s.trim();if(!c||o)return;i(""),u(null),a(!0),d.current+=1;let m=`pending-${d.current}`,y={id:m,cursor:"",author:"client",text:c,pending:!0};n(b=>[...b,y]),e.sendMessage(c).then(b=>{a(!1),b.reply.trim()&&n(g=>g.some(I=>!I.pending&&I.author!=="client"&&I.text===b.reply)?g:(d.current+=1,[...g,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:b.reply,pending:!0}]))}).catch(b=>{u(b instanceof Error?b.message:"send_failed"),a(!1),n(R=>R.filter(g=>g.id!==m)),i(R=>R||c)})},[s,o,e]);return{messages:r,input:s,setInput:i,send:f,sending:o,error:l}};0&&(module.exports={Chat,CreditRefused,GRID_COLS,GRID_MAX_COLS,GRID_MAX_ROWS,HolaProvider,PortalConflict,bandOfKind,bandOfType,buyRequestText,cellValue,createApiTransport,createHolaClient,createPortalCredits,createPortalData,createPortalShop,createWidgetTransport,deliverableCellText,deliverableStatus,deriveFields,emptyTableResponses,facetValues,footprintOf,footprintWith,formatDeliverableDate,groupDeliverableVersions,includesFor,inferSpec,isDeliverableChecked,mergeMessage,modeOf,money,normalizeDeliverableColType,normalizeDeliverableItem,orderBilling,parseDashboardSpec,parseDeliverableItems,parseDeliverableTable,parseTableResponses,placeWidgets,priceFor,priceLabel,publishedVersionOf,quantityRange,renderModel,setResponse,setTableReview,shelfPriceLabel,shelfProblem,splitLayout,textDeltaOf,thinkingDeltaOf,toolEventOf,totalFor,useArtifactUrl,useChat,useCredits,useHolaClient,useShop,useThread});
package/dist/index.d.cts CHANGED
@@ -1031,6 +1031,11 @@ type ShopShelf = {
1031
1031
  * can tell. The same argument the server makes when it bothers to send the flag.
1032
1032
  */
1033
1033
  truncated: boolean;
1034
+ /** What an enquiry with NO product asks — "can you also do X", which has no product row to carry
1035
+ * questions. The operator's own defaults; empty when they have set none, which a storefront
1036
+ * reads as one box ("What do you need?"). A product's `form` is already resolved against these
1037
+ * server-side, so a card never has to merge the two itself. */
1038
+ enquiryForm: ShopFormField[];
1034
1039
  };
1035
1040
  /** An application against a product, or against nothing in particular — a general enquiry that
1036
1041
  * names no product is a real thing to receive, so `productId` is optional. */
@@ -1200,6 +1205,10 @@ declare const useCredits: (credits: PortalCredits) => UseCredits;
1200
1205
 
1201
1206
  type UseShop = {
1202
1207
  products: ShopProduct[];
1208
+ /** What an enquiry asks when the product has authored nothing of its own — and the WHOLE form
1209
+ * for somebody asking about something not on the shelf, which has no product to carry questions
1210
+ * at all. The org's, set in the console. Empty is a real answer: it means one box. */
1211
+ enquiryForm: ShopFormField[];
1203
1212
  /** In flight — the first read, and every `reload`. The products from the previous read stay put
1204
1213
  * underneath it, so a refresh does not blank a shop that is already on screen. */
1205
1214
  loading: boolean;
package/dist/index.d.ts CHANGED
@@ -1031,6 +1031,11 @@ type ShopShelf = {
1031
1031
  * can tell. The same argument the server makes when it bothers to send the flag.
1032
1032
  */
1033
1033
  truncated: boolean;
1034
+ /** What an enquiry with NO product asks — "can you also do X", which has no product row to carry
1035
+ * questions. The operator's own defaults; empty when they have set none, which a storefront
1036
+ * reads as one box ("What do you need?"). A product's `form` is already resolved against these
1037
+ * server-side, so a card never has to merge the two itself. */
1038
+ enquiryForm: ShopFormField[];
1034
1039
  };
1035
1040
  /** An application against a product, or against nothing in particular — a general enquiry that
1036
1041
  * names no product is a real thing to receive, so `productId` is optional. */
@@ -1200,6 +1205,10 @@ declare const useCredits: (credits: PortalCredits) => UseCredits;
1200
1205
 
1201
1206
  type UseShop = {
1202
1207
  products: ShopProduct[];
1208
+ /** What an enquiry asks when the product has authored nothing of its own — and the WHOLE form
1209
+ * for somebody asking about something not on the shelf, which has no product to carry questions
1210
+ * at all. The org's, set in the console. Empty is a real answer: it means one box. */
1211
+ enquiryForm: ShopFormField[];
1203
1212
  /** In flight — the first read, and every `reload`. The products from the previous read stay put
1204
1213
  * underneath it, so a refresh does not blank a shop that is already on screen. */
1205
1214
  loading: boolean;
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  'use client'
2
- var te=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},F=e=>{let t=te(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},L=e=>{let t=te(e);return t?.type==="thinking_delta"&&typeof t.delta=="string"?t.delta:null},U=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="tool_execution_start"&&t.toolCallId?{phase:"start",id:t.toolCallId,name:t.toolName}:t.type==="tool_execution_end"&&t.toolCallId?{phase:"end",id:t.toolCallId,isError:t.isError}:null};var Ue=/^ /,x=e=>{if(e&&typeof e=="object"){let t=e,n=typeof t.error=="string"?t.error:"request_failed";return typeof t.retryable=="boolean"?{error:n,retryable:t.retryable}:{error:n}}return{error:"request_failed"}},Ne=e=>{let t="message",n=[];for(let r of e.split(`
3
- `))r.startsWith(":")||(r.startsWith("event:")?t=r.slice(6).trim():r.startsWith("data:")&&n.push(r.slice(5).replace(Ue,"")));return n.length>0?{event:t,data:n.join(`
4
- `)}:null},Ve=(e,t,n)=>{let r;try{r=JSON.parse(e.data)}catch{return}if(e.event==="session"){let s=r.sessionId;s&&(n(s),t.onSession?.(s));return}if(e.event==="turn_event"){t.onEvent?.(r);let s=F(r);s&&t.onText?.(s);let i=L(r);i&&t.onThinking?.(i);let o=U(r);o&&t.onTool?.(o);return}if(e.event==="chat_completed"){let s=r;n(s.sessionId),t.onComplete?.(s);return}e.event==="chat_error"&&t.onError?.(x(r))},v=async(e,t)=>{let n=await fetch(e,{headers:t});if(!n.ok)throw new Error(`hola: request failed (${n.status})`);return await n.json()},ne=async e=>{let t=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body});if(!t.ok)throw new Error(`hola: message failed (${t.status})`);return await t.json()},re=async(e,t,n,r)=>{let s=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:r});if(!(s.ok&&s.body)){t.onError?.({error:`stream_failed_${s.status}`});return}let i=s.body.getReader(),o=new TextDecoder,a="",l=()=>{let d=a.indexOf(`
2
+ var te=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},_=e=>{let t=te(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},L=e=>{let t=te(e);return t?.type==="thinking_delta"&&typeof t.delta=="string"?t.delta:null},U=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="tool_execution_start"&&t.toolCallId?{phase:"start",id:t.toolCallId,name:t.toolName}:t.type==="tool_execution_end"&&t.toolCallId?{phase:"end",id:t.toolCallId,isError:t.isError}:null};var Ue=/^ /,w=e=>{if(e&&typeof e=="object"){let t=e,r=typeof t.error=="string"?t.error:"request_failed";return typeof t.retryable=="boolean"?{error:r,retryable:t.retryable}:{error:r}}return{error:"request_failed"}},Ne=e=>{let t="message",r=[];for(let n of e.split(`
3
+ `))n.startsWith(":")||(n.startsWith("event:")?t=n.slice(6).trim():n.startsWith("data:")&&r.push(n.slice(5).replace(Ue,"")));return r.length>0?{event:t,data:r.join(`
4
+ `)}:null},qe=(e,t,r)=>{let n;try{n=JSON.parse(e.data)}catch{return}if(e.event==="session"){let s=n.sessionId;s&&(r(s),t.onSession?.(s));return}if(e.event==="turn_event"){t.onEvent?.(n);let s=_(n);s&&t.onText?.(s);let i=L(n);i&&t.onThinking?.(i);let o=U(n);o&&t.onTool?.(o);return}if(e.event==="chat_completed"){let s=n;r(s.sessionId),t.onComplete?.(s);return}e.event==="chat_error"&&t.onError?.(w(n))},v=async(e,t)=>{let r=await fetch(e,{headers:t});if(!r.ok)throw new Error(`hola: request failed (${r.status})`);return await r.json()},re=async e=>{let t=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body});if(!t.ok)throw new Error(`hola: message failed (${t.status})`);return await t.json()},ne=async(e,t,r,n)=>{let s=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:n});if(!(s.ok&&s.body)){t.onError?.({error:`stream_failed_${s.status}`});return}let i=s.body.getReader(),o=new TextDecoder,a="",l=()=>{let d=a.indexOf(`
5
5
 
6
- `);for(;d!==-1;){let c=a.slice(0,d);a=a.slice(d+2);let m=Ne(c);m&&Ve(m,t,n),d=a.indexOf(`
6
+ `);for(;d!==-1;){let p=a.slice(0,d);a=a.slice(d+2);let f=Ne(p);f&&qe(f,t,r),d=a.indexOf(`
7
7
 
8
- `)}},u=async()=>{let d=await i.read();if(!d.done)return a+=o.decode(d.value,{stream:!0}),l(),u()};await u()};var je=/\/+$/,N="/api/v1/end-user",Be=e=>{let t=e.baseUrl.replace(je,""),n=()=>typeof e.token=="function"?e.token():e.token,r=o=>e.project?`${o}project=${encodeURIComponent(e.project)}`:"",s=async()=>({"content-type":"application/json",authorization:`Bearer ${await n()}`}),i=async o=>{let a=await fetch(`${t}${N}/chat${r("?")}`,{method:"POST",headers:await s(),body:JSON.stringify({message:o})});if(!a.ok)throw new Error(`hola: message failed (${a.status})`);return{reply:(await a.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>v(`${t}${N}/chat/info${r("?")}`,await s()),sendMessage:i,streamMessage:async(o,a)=>{try{let l=await i(o);a.onText?.(l.reply),a.onComplete?.(l)}catch(l){a.onError?.(x(l))}},subscribe:(o,a)=>{let l=a?.since??"0",u=!1,d,c=a?.intervalMs??3e3,m=typeof document<"u",p=()=>m&&document.visibilityState==="hidden",y=!1,w=()=>{if(!u){if(p()){y=!0;return}d=setTimeout(f,c)}},f=async()=>{try{let h=await v(`${t}${N}/chat/thread?since=${encodeURIComponent(l)}${r("&")}`,await s());for(let T of h.messages)o.onMessage(T);l=h.cursor,o.onHealthy?.()}catch(h){o.onError?.(x(h))}w()},P=()=>{u||!y||p()||(y=!1,d&&clearTimeout(d),d=setTimeout(f,0))};m&&document.addEventListener("visibilitychange",P);let g=()=>{u=!0,d&&clearTimeout(d),m&&document.removeEventListener("visibilitychange",P)};return a?.signal?.addEventListener("abort",g),d=setTimeout(f,0),g}}};import{useEffect as Ge,useState as qe}from"react";var V=(e,t)=>{let[n,r]=qe("");return Ge(()=>{if(!e){r("");return}let s=Uint8Array.from(atob(e),o=>o.charCodeAt(0)),i=URL.createObjectURL(new Blob([s],{type:t}));return r(i),()=>URL.revokeObjectURL(i)},[e,t]),n};import{useEffect as Qe,useRef as Ye}from"react";import{createContext as ze,useContext as Je}from"react";import{jsx as Xe}from"react/jsx-runtime";var oe=ze(null),Ke=({client:e,children:t})=>Xe(oe.Provider,{value:e,children:t}),j=()=>{let e=Je(oe);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};import{useCallback as se,useEffect as ie,useRef as ae,useState as $}from"react";var B=e=>{let[t,n]=$([]),[r,s]=$(""),[i,o]=$(!1),[a,l]=$(null),u=ae(0),d=ae(null);ie(()=>()=>d.current?.abort(),[]);let c=se(()=>{let p=u.current;return u.current+=1,p},[]);ie(()=>{let p=!0;return e.getInfo().then(y=>{p&&y.greeting&&n([{id:c(),role:"assistant",text:y.greeting}])}).catch(()=>{}),()=>{p=!1}},[e,c]);let m=se(()=>{let p=r.trim();if(!p||i)return;s(""),l(null),o(!0);let y=c(),w=c();n(g=>[...g,{id:y,role:"user",text:p},{id:w,role:"assistant",text:"",streaming:!0}]);let f=g=>{n(h=>h.map(T=>T.id===w?g(T):T))},P=new AbortController;d.current=P,e.streamMessage(p,{onText:g=>f(h=>({...h,text:h.text+g})),onComplete:g=>{f(h=>({...h,text:g.reply||h.text,artifacts:g.artifacts,streaming:!1})),o(!1)},onError:g=>{f(h=>({...h,streaming:!1})),l(g.error),o(!1)}},P.signal).catch(g=>{f(h=>({...h,streaming:!1})),l(g instanceof Error?g.message:"stream_failed"),o(!1)}).finally(()=>{o(!1),f(g=>g.streaming?{...g,streaming:!1}:g)})},[r,i,e,c]);return{messages:t,input:r,setInput:s,send:m,sending:i,error:a}};import{jsx as C,jsxs as G}from"react/jsx-runtime";var S={root:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif",fontSize:14,color:"#111827"},log:{flex:1,overflowY:"auto",padding:12,display:"flex",flexDirection:"column",gap:8},user:{alignSelf:"flex-end",background:"#111827",color:"#ffffff",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},assistant:{alignSelf:"flex-start",background:"#f1f1f4",color:"#111827",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},artifacts:{display:"flex",flexDirection:"column",gap:6,marginTop:6},image:{maxHeight:220,borderRadius:8,border:"1px solid #e5e7eb"},link:{color:"#2563eb",textDecoration:"underline",wordBreak:"break-all"},error:{color:"#b91c1c",padding:"4px 12px",fontSize:13},form:{display:"flex",gap:8,borderTop:"1px solid #e5e7eb",padding:8},input:{flex:1,border:"1px solid #d1d5db",borderRadius:8,padding:"8px 10px",fontSize:14,outline:"none"},button:{border:"none",background:"#111827",color:"#ffffff",borderRadius:8,padding:"8px 14px",fontSize:14,cursor:"pointer"}},Ze=({artifact:e})=>{let t=V(e.dataBase64??"",e.mimeType),n=e.url??t;return n?e.mimeType.startsWith("image/")?C("a",{href:n,rel:"noopener noreferrer",target:"_blank",children:C("img",{alt:e.filename,src:n,style:S.image})}):C("a",{download:e.filename,href:n,style:S.link,children:e.filename}):null},et=()=>{let e=j(),{messages:t,input:n,setInput:r,send:s,sending:i,error:o}=B(e),a=Ye(null);Qe(()=>{let u=a.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let l=u=>{u.preventDefault(),s()};return G("div",{style:S.root,children:[C("div",{ref:a,style:S.log,children:t.map(u=>G("div",{style:u.role==="user"?S.user:S.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?C("div",{style:S.artifacts,children:u.artifacts.map(d=>C(Ze,{artifact:d},d.filename))}):null]},u.id))}),o?C("div",{style:S.error,children:o}):null,G("form",{onSubmit:l,style:S.form,children:[C("input",{"aria-label":"Message",onChange:u=>r(u.target.value),placeholder:"Type a message\u2026",style:S.input,value:n}),C("button",{disabled:i||n.trim().length===0,style:S.button,type:"submit",children:"Send"})]})]})};var tt=/\/+$/,q=e=>{let t=e.sessionId,n=e.baseUrl.replace(tt,""),r=o=>`${n}/endpoint/${encodeURIComponent(e.token)}${o}`,s={"content-type":"application/json"},i=(o,a)=>({url:r(o),headers:s,body:JSON.stringify({message:a,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>v(r("/config"),{}),sendMessage:async o=>{let a=await ne(i("/message",o));return t=a.sessionId,a},streamMessage:(o,a,l)=>re(i("/message/stream",o),a,u=>{t=u},l),subscribe:(o,a)=>{let l=a?.since??"0",u=!1,d,c=a?.intervalMs??3e3,m=async()=>{let y=t;if(y)try{let w=await v(r(`/messages?session=${encodeURIComponent(y)}&since=${encodeURIComponent(l)}`),{});for(let f of w.messages)o.onMessage(f);l=w.cursor,o.onHealthy?.()}catch(w){o.onError?.(x(w))}u||(d=setTimeout(m,c))},p=()=>{u=!0,d&&clearTimeout(d)};return a?.signal?.addEventListener("abort",p),d=setTimeout(m,0),p}}};var nt=e=>"transport"in e?e.transport:q(e);var rt=/^https?:\/\//i,ot=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,st=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function it(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(rt.test(e))return"url";if(ot.test(e))return"date"}return"text"}function le(e){let t=[],n=new Map;for(let r of e)for(let[s,i]of Object.entries(r.data??{})){if(i==null)continue;let o=n.get(s);o||(o=new Map,n.set(s,o),t.push(s));let a=it(i);o.set(a,(o.get(a)??0)+1)}return t.map(r=>{let s=n.get(r)??new Map,i="text",o=-1;for(let[a,l]of s)l>o&&(o=l,i=a);return{key:r,label:st(r),type:i}})}var at=e=>typeof e=="number"?e:Number(e)||0,ue=e=>/rate|position|rank|score|percent|avg/i.test(e),lt=/posted|published|sent|completed|shipped|launched|_at/i,ut=new Set(["service","order","end_user_id"]);function de(e,t){let n=e.filter(l=>!ut.has(l.key)),r=n.filter(l=>l.type==="number").slice(0,3),s=n.find(l=>l.key==="status")??n.find(l=>l.type==="select"),i=n.find(l=>l.type==="date"&&lt.test(l.key))??n.find(l=>l.type==="date"),o=n.filter(l=>l.type==="number"&&!ue(l.key)).map(l=>({field:l,total:t.reduce((u,d)=>u+at(d.data[l.key]),0)})).sort((l,u)=>u.total-l.total).find(l=>l.total>0)?.field??null,a=[{type:"stat",label:"Items",agg:"count"}];for(let l of r){let u=ue(l.key);a.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return i&&a.push({type:"line",x:i.key,y:o?.key,agg:"sum",title:o?`${o.label} by day`:"Items by day"}),s&&a.push({type:"donut",groupBy:s.key,title:s.label}),a.push({type:"table",columns:n.map(l=>l.key)}),{version:1,widgets:a}}var pe=6,ce=6,me=4,ge={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},dt=e=>Math.max(1,Math.min(6,Math.round(e))),pt=e=>Math.max(1,Math.min(4,Math.round(e)));function W(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function fe(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function ye(e){return ge[e]}function z(e,t,n){let r=ge[e];return{w:t===void 0?r.w:dt(t),h:n===void 0?r.h:pt(n)}}function J(e){let t=[],n=[],r=(o,a,l,u)=>{if(o<0||o+l>6)return!1;for(let d=0;d<u;d+=1){let c=n[a+d];if(c){for(let m=0;m<l;m+=1)if(c[o+m])return!1}}return!0},s=(o,a,l,u)=>{for(let d=0;d<u;d+=1){let c=n[a+d]??[];for(let m=0;m<l;m+=1)c[o+m]=!0;n[a+d]=c}},i=(o,a)=>{for(let l=0;;l+=1)for(let u=0;u+o<=6;u+=1)if(r(u,l,o,a))return{gx:u,gy:l}};for(let o of e){let a=z(W(o.kind),o.w,o.h),u=o.gx!==void 0&&o.gy!==void 0&&r(o.gx,o.gy,a.w,a.h)&&o.gx!==void 0&&o.gy!==void 0?{gx:o.gx,gy:o.gy}:i(a.w,a.h);s(u.gx,u.gy,a.w,a.h),t.push({widget:o,gx:u.gx,gy:u.gy,w:a.w,h:a.h})}return t}function be(e){let t=[],n=[];for(let r of e)W(r.kind)==="block"?n.push(r):t.push(r);return{tiles:J(t),blocks:n}}var he=new Set(["service","order","end_user_id"]),K=e=>typeof e=="number"?e:Number(e)||0,xe=e=>e==null?"":String(e);function X(e,t){if(e==="count")return t.length;if(t.length===0)return 0;if(e==="last")return t[t.length-1]??0;if(e==="min")return Math.min(...t);if(e==="max")return Math.max(...t);let n=t.reduce((r,s)=>r+s,0);return e==="avg"?Math.round(n/t.length*100)/100:n}function ct(e,t,n,r){let s=new Map;for(let i of e){let o=new Date(xe(i.data[t]));if(Number.isNaN(o.getTime()))continue;let a=o.toISOString().slice(0,10),l=s.get(a)??[];l.push(n?K(i.data[n]):1),s.set(a,l)}return[...s.entries()].sort((i,o)=>i[0]<o[0]?-1:1).map(([i,o])=>({label:new Date(`${i}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:n?X(r,o):o.length}))}function mt(e,t,n,r="sum"){let s=new Map;for(let i of e){let o=xe(i.data[t]).trim();if(!o)continue;let a=s.get(o)??[];a.push(n?K(i.data[n]):1),s.set(o,a)}return[...s.entries()].map(([i,o])=>({label:i,value:n?X(r,o):o.length})).sort((i,o)=>o.value-i.value)}function gt(e,t,n,r){switch(e.type){case"stat":{let s=e.metric?t.get(e.metric):void 0;if(e.metric&&!s)return null;if(!s)return{kind:"stat",label:e.label??"Items",value:r.length};let i=r.map(o=>K(o.data[s.key]));return{kind:"stat",label:e.label??s.label,value:X(e.agg??"sum",i)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let s=ct(r,e.x,e.y,e.agg??"sum");return s.length<2?null:{kind:"series",draw:e.type,title:e.title??"By day",points:s}}case"donut":{if(!t.has(e.groupBy))return null;let s=mt(r,e.groupBy,e.metric,e.agg??"sum");return s.length===0?null:{kind:"donut",title:e.title??t.get(e.groupBy)?.label??"Breakdown",points:s}}case"table":{let s=e.columns?e.columns.map(i=>t.get(i)).filter(i=>i!==void 0&&!he.has(i.key)):n;return s.length===0?null:{kind:"table",title:e.title,columns:s,rows:r}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function we(e,t,n,r={}){let s=new Map,i=l=>({byKey:new Map(l.fields.map(u=>[u.key,u])),cols:l.fields.filter(u=>!he.has(u.key)),rows:l.rows}),o=i({fields:t,rows:n});for(let[l,u]of Object.entries(r))s.set(l,i(u));let a=[];for(let l of e.widgets){let u=l.type==="text"?void 0:l.source,d=u?s.get(u):o;if(!d)continue;let c=gt(l,d.byKey,d.cols,d.rows);c&&a.push({...c,w:l.w,h:l.h,gx:l.gx,gy:l.gy})}return a}var ft=new Set(["sum","avg","count","min","max","last"]),ve=e=>typeof e=="string"&&ft.has(e)?e:void 0,b=e=>typeof e=="string"&&e!==""?e:void 0,D=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,I=e=>typeof e=="number"&&e>=1?Math.min(4,Math.round(e)):void 0,k=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function yt(e){if(typeof e!="object"||e===null)return null;let t=e;switch(t.type){case"stat":return{type:"stat",source:b(t.source),label:b(t.label),metric:b(t.metric)??b(t.column),agg:ve(t.agg),w:D(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)};case"line":case"bar":{let n=b(t.x);return n?{type:t.type,source:b(t.source),title:b(t.title),x:n,y:b(t.y)??b(t.column),agg:ve(t.agg),w:D(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}:null}case"donut":{let n=b(t.groupBy)??b(t.column);return n?{type:"donut",source:b(t.source),title:b(t.title),groupBy:n,w:D(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}:null}case"table":{let n=Array.isArray(t.columns)?t.columns.filter(r=>typeof r=="string"):void 0;return{type:"table",source:b(t.source),title:b(t.title),columns:n,w:D(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}}case"text":{let n=b(t.body);return n?{type:"text",title:b(t.title),body:n,w:D(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}:null}default:return null}}function Se(e){let t=e;if(typeof e=="string"){if(e.trim()==="")return null;try{t=JSON.parse(e)}catch{return null}}if(typeof t!="object"||t===null)return null;let n=t.widgets;if(!Array.isArray(n))return null;let r=n.map(yt).filter(i=>i!==null);if(r.length===0)return null;let s=t.version;return{version:typeof s=="number"?s:1,title:b(t.title),widgets:r}}function Q(e){if(typeof e=="string")return e?{kind:"file",value:e}:null;if(e&&typeof e=="object"){let t=e,n=typeof t.value=="string"?t.value:"",r=t.kind==="link"||t.kind==="text"||t.kind==="table"?t.kind:"file",s=typeof t.v=="number"&&t.v>=1?Math.floor(t.v):void 0;return n?{kind:r,value:n,...s?{v:s}:{}}:null}return null}function Y(e){let t=new Map;for(let n of e){let r=n.v??1,s=t.get(r)??[];s.push(n),t.set(r,s)}return[...t.entries()].sort(([n],[r])=>n-r).map(([n,r])=>({v:n,items:r}))}function Pe(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let r=JSON.parse(t);if(Array.isArray(r))return r.map(Q).filter(s=>s!==null)}catch{}let n=String(e.file??"");return n?[{kind:"file",value:n}]:[]}function ke(e,t,n,r=""){let i=Y(e).find(a=>a.v===t)?.items??[],o=i.filter(a=>a.kind==="file").map(a=>n.get(a.value)??"");return i.some(a=>a.kind==="table")&&o.push(r),o.length===0||o.some(a=>a==="")?"awaiting":o.some(a=>a==="revise")?"revise":"accepted"}function Te(e){return Number(e.published_version)||0}function Z(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function Ce(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let n=t.columns.map((i,o)=>({key:typeof i.key=="string"&&i.key?i.key:typeof i.id=="string"&&i.id?i.id:`column_${o+1}`,label:typeof i.label=="string"?i.label:"",type:Z(i.type),...i.clientEditable===!0?{clientEditable:!0}:{}})),r=t.rows.map((i,o)=>({id:typeof i.id=="string"&&i.id?i.id:`row_${o}`,cells:i.cells&&typeof i.cells=="object"?i.cells:{}})),s=typeof t.name=="string"?t.name:void 0;return{columns:n,rows:r,...s?{name:s}:{}}}}catch{}return null}function Re(e){return e==null?"":String(e)}function De(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function E(){return{cells:{},verdict:"",comment:""}}function Ie(e){if(typeof e!="string"||e.trim()==="")return E();try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let n=t;return{cells:n.cells&&typeof n.cells=="object"?n.cells:n,verdict:n.verdict==="accepted"||n.verdict==="revise"?n.verdict:"",comment:typeof n.comment=="string"?n.comment:""}}}catch{}return E()}function He(e,t,n){if(e.clientEditable){let r=n.cells[t.id];if(r&&e.key in r)return r[e.key]}return t.cells[e.key]}function Ae(e,t,n,r){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[n]:r}}}}function Me(e,t,n){return{...e,verdict:t,comment:n}}function $e(e){let t=new Date(`${e}T00:00:00`);return Number.isNaN(t.getTime())?e:t.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}var H=class extends Error{code;status;constructor(t,n,r){super(n),this.name="CreditRefused",this.code=t,this.status=r}},bt=/\/+$/,ht="/api/v1/end-user",xt=(e,t,n)=>{let r=t.filter(l=>l.order===n),s=r.reduce((l,u)=>l+u.amount,0),i=r.filter(l=>l.status==="paid").reduce((l,u)=>l+u.amount,0),o=e.value>0,a=s>0?s-i:e.value-i;return{value:e.value,priced:o,billed:s,paid:i,due:Math.max(0,a),lines:[...r].sort((l,u)=>l.status!==u.status?l.status==="due"?-1:1:(l.dueDate||l.paidAt).localeCompare(u.dueDate||u.paidAt)),awaitingPayment:o&&i<=0}},wt=e=>{let t=e.baseUrl.replace(bt,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async(s,i={method:"GET"})=>{try{let o=await fetch(`${t}${ht}${s}`,{method:i.method,headers:{"content-type":"application/json",authorization:`Bearer ${await n()}`},...i.body===void 0?{}:{body:JSON.stringify(i.body)}});if(!o.ok){let a=await o.json().catch(()=>({}));throw new H(a.error??"request_failed",a.message??`${i.method} ${s} \u2192 ${String(o.status)}`,o.status)}return await o.json()}catch(o){throw o instanceof H?o:x(o)}};return{wallet:()=>r("/credits"),history:()=>r("/credits/history"),topup:s=>r("/credits/checkout",{method:"POST",body:{packId:s}}),checkout:s=>r("/shop/checkout",{method:"POST",body:s}),payments:()=>r("/payments"),paymentMethods:()=>r("/payment-methods"),markPaymentSent:(s,i)=>r(`/payments/${encodeURIComponent(s)}/sent`,{method:"POST",body:{reference:i??""}}),acceptInquiry:s=>r(`/inquiries/${encodeURIComponent(s)}/accept`,{method:"POST"}),enquire:(s,i,o)=>r("/shop/enquire",{method:"POST",body:{productId:s,answers:i,name:o??""}})}};var vt=/\/+$/,R="/api/v1/end-user",A=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function St(e){let t="";for(let r=0;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return btoa(t)}var Pt=e=>{let t=e.baseUrl.replace(vt,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async()=>({"content-type":"application/json",authorization:`Bearer ${await n()}`}),s=async(o,a)=>{try{let l=await fetch(`${t}${R}${o}`,{method:a.method,headers:await r(),...a.body===void 0?{}:{body:JSON.stringify(a.body)}});if(l.status===409){let u=await l.json().catch(()=>({}));throw new A(u.message??"Someone else saved this first.")}if(!l.ok){let u=await l.text().catch(()=>""),d=`${a.method} ${o} \u2192 ${String(l.status)}`;try{let c=JSON.parse(u);c.message&&(d=c.message)}catch{d=u?`${d}: ${u}`:d}throw x({error:d})}return await l.json()}catch(l){throw l instanceof A?l:x(l)}},i=o=>`/tables/${encodeURIComponent(o)}`;return{listTables:async()=>(await v(`${t}${R}/tables`,await r())).tables,listRows:async(o,a)=>await v(`${t}${R}${i(o)}/rows?limit=${String(a??100)}`,await r()),insertRow:async(o,a)=>{let{rowIds:l}=await s(`${i(o)}/rows`,{method:"POST",body:{rows:[a]}}),u=l[0];if(!u)throw x(new Error("The row was not created."));return u},patchRow:async(o,a,l)=>(await s(`${i(o)}/rows/${encodeURIComponent(a)}`,{method:"PATCH",body:l})).updated,deleteRow:async(o,a)=>(await s(`/${encodeURIComponent(o)}/${encodeURIComponent(a)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await v(`${t}${R}/tables/files/rows?limit=200`,await r())).rows.map(a=>({id:a.rowId,filename:String(a.data.filename??""),source:String(a.data.source??"client"),campaign:String(a.data.campaign??""),size:typeof a.data.size=="number"?a.data.size:0,createdAt:a.createdAt})),uploadFile:async(o,a)=>{let l=new Uint8Array(await o.arrayBuffer());return await s("/files",{method:"POST",body:{filename:o.name,mime:o.type||"application/octet-stream",data:St(l),...a===void 0?{}:{message:a}}})},fileLink:async o=>await v(`${t}${R}/files/${encodeURIComponent(o)}/url`,await r()),deleteFile:async o=>(await s(`/files/${encodeURIComponent(o)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await v(`${t}${R}/documents`,await r())).documents,readDocument:async o=>(await v(`${t}${R}/documents/${encodeURIComponent(o)}`,await r())).document,saveDocument:async(o,a)=>await s(`/documents/${encodeURIComponent(o)}`,{method:"PATCH",body:a})}};var kt=/\/+$/,Tt="/api/v1/end-user",Ct=e=>{let t=e.baseUrl.replace(kt,""),n=async(r,s)=>{let i;try{i=await fetch(`${t}${Tt}${r}`,s===void 0?{}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})}catch(o){throw x(o)}if(i.status===429)throw x({error:"rate_limited",retryable:!0});if(!i.ok)throw x({error:`shop_request_failed_${String(i.status)}`});try{return await i.json()}catch(o){throw x(o)}};return{listProducts:async()=>{let r=await n(`/shop/products?publishable_key=${encodeURIComponent(e.publishableKey)}`);return{products:r.products.map(s=>({...s,currency:typeof s.currency=="string"?s.currency:""})),truncated:r.truncated===!0}},apply:async r=>await n("/shop/apply",{publishable_key:e.publishableKey,name:r.name,email:r.email,...r.phone?{phone:r.phone}:{},...r.message?{message:r.message}:{},...r.productId?{productId:r.productId}:{}})}};var Rt=new Set(["buy","ask"]);function Dt(e){return Rt.has(e.mode)?e.mode:"ask"}var It={kind:"quoted"};function O(e,t){if(!t)return e.toLocaleString();if(t.toLowerCase()==="credits")return`${e.toLocaleString()} ${e===1?"credit":"credits"}`;let n=Number.isInteger(e)?0:2;try{return new Intl.NumberFormat(void 0,{style:"currency",currency:t,minimumFractionDigits:n,maximumFractionDigits:n}).format(e)}catch{return`${t} ${e.toLocaleString()}`}}function We(e,t){let n=/^[a-z]+$/i.test(t)&&!t.endsWith("s")?"s":"";return`${e.toLocaleString()} ${t}${n}`}function Ee(e,t){return e.kind==="quoted"?"Priced on enquiry":e.kind==="flat"?O(e.price,t):`${O(e.unitPrice,t)} per ${e.unitStep===1?e.unit:We(e.unitStep,e.unit)}`}function Ht(e){let t=e.currency,n=e.pricing;if(n.kind!=="variants")return Ee(n,t);let r=n.variants.map(s=>s.price).filter(s=>typeof s=="number");return r.length>0?`From ${O(Math.min(...r),t)}`:"Priced on enquiry"}function At(e,t){if(e.kind!=="variants")return e;let n=e.variants.find(r=>r.name===t);return typeof n?.price=="number"?{kind:"flat",price:n.price}:It}function Mt(e,t){return e.kind==="flat"?e.price:e.kind==="per_unit"?e.unitPrice*Math.ceil(t/Math.max(e.unitStep,1)):null}function $t(e,t){let n=t.kind==="per_unit"?Math.max(t.unitStep,1):1;return{min:Math.max(e.minQty??n,n),max:e.maxQty??null,step:n}}function Wt(e,t){let n=e.variants?.find(r=>r.name===t);return n&&n.includes.length>0?n.includes:e.includes}function Et(e,t){let n=[];for(let r of e){let s=t(r).trim();s&&!n.includes(s)&&n.push(s)}return n}function Ot(e,t,n,r){let s=t?`${e.name} \u2014 ${t}`:e.name,i=n.kind==="per_unit"?`, ${We(r,n.unit)}`:"";return`I'd like to buy ${s}${i}. How do I go ahead?`}function _t(e){return e?(e&&typeof e=="object"&&"error"in e?String(e.error):"")==="rate_limited"?"That's a lot of looking at once \u2014 give it a moment, then reload.":"The shop isn't loading right now. Please try again shortly.":null}import{useCallback as Oe,useEffect as Ft,useState as ee}from"react";var Lt=e=>{let[t,n]=ee(null),[r,s]=ee(!0),[i,o]=ee(null),a=Oe(async()=>{try{n(await e.wallet()),o(null)}catch{o("Couldn't read your balance just now.")}finally{s(!1)}},[e]),l=Oe(()=>{a().catch(()=>{})},[a]);return Ft(()=>(l(),window.addEventListener("focus",l),()=>{window.removeEventListener("focus",l)}),[l]),{wallet:t,loading:r,failure:i,refresh:l}};import{useCallback as Ut,useEffect as Nt,useState as M}from"react";var Vt=e=>e&&typeof e=="object"&&typeof e.error=="string"?e.error:e instanceof Error?e.message:"shop_unavailable",jt=e=>{let[t,n]=M([]),[r,s]=M(!1),[i,o]=M(!0),[a,l]=M(null),[u,d]=M(0);Nt(()=>{let m=!0;return o(!0),e.listProducts().then(p=>{m&&(n(p.products),s(p.truncated),l(null))}).catch(p=>{m&&l(Vt(p))}).finally(()=>{m&&o(!1)}),()=>{m=!1}},[e,u]);let c=Ut(()=>d(m=>m+1),[]);return{products:t,truncated:r,loading:i,error:a,reload:c}};import{useCallback as Bt,useEffect as _e,useRef as Gt,useState as _}from"react";var Fe="greeting";function Le(e,t){if(e.some(i=>i.id===t.id))return e;let n=e.filter(i=>i.id!==Fe),r=i=>i.author==="client"==(t.author==="client");return[...n.filter(i=>!(i.pending&&r(i)&&i.text===t.text)),t]}var qt=(e,t)=>{let[n,r]=_([]),[s,i]=_(""),[o,a]=_(!1),[l,u]=_(null),d=Gt(0),c=t?.pollMs??2e3;_e(()=>{let p=!0;return e.getInfo().then(y=>{p&&y.greeting&&r(w=>w.length===0?[{id:Fe,cursor:"",author:"agent",text:y.greeting}]:w)}).catch(()=>{}),()=>{p=!1}},[e]),_e(()=>e.subscribe?.({onMessage:p=>r(y=>Le(y,p)),onError:p=>u(p.error),onHealthy:()=>u(null)},{intervalMs:c}),[e,c]);let m=Bt(()=>{let p=s.trim();if(!p||o)return;i(""),u(null),a(!0),d.current+=1;let y=`pending-${d.current}`,w={id:y,cursor:"",author:"client",text:p,pending:!0};r(f=>[...f,w]),e.sendMessage(p).then(f=>{a(!1),f.reply.trim()&&r(g=>g.some(T=>!T.pending&&T.author!=="client"&&T.text===f.reply)?g:(d.current+=1,[...g,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:f.reply,pending:!0}]))}).catch(f=>{u(f instanceof Error?f.message:"send_failed"),a(!1),r(P=>P.filter(g=>g.id!==y)),i(P=>P||p)})},[s,o,e]);return{messages:n,input:s,setInput:i,send:m,sending:o,error:l}};export{et as Chat,H as CreditRefused,pe as GRID_COLS,ce as GRID_MAX_COLS,me as GRID_MAX_ROWS,Ke as HolaProvider,A as PortalConflict,W as bandOfKind,fe as bandOfType,Ot as buyRequestText,He as cellValue,Be as createApiTransport,nt as createHolaClient,wt as createPortalCredits,Pt as createPortalData,Ct as createPortalShop,q as createWidgetTransport,Re as deliverableCellText,ke as deliverableStatus,le as deriveFields,E as emptyTableResponses,Et as facetValues,ye as footprintOf,z as footprintWith,$e as formatDeliverableDate,Y as groupDeliverableVersions,Wt as includesFor,de as inferSpec,De as isDeliverableChecked,Le as mergeMessage,Dt as modeOf,O as money,Z as normalizeDeliverableColType,Q as normalizeDeliverableItem,xt as orderBilling,Se as parseDashboardSpec,Pe as parseDeliverableItems,Ce as parseDeliverableTable,Ie as parseTableResponses,J as placeWidgets,At as priceFor,Ee as priceLabel,Te as publishedVersionOf,$t as quantityRange,we as renderModel,Ae as setResponse,Me as setTableReview,Ht as shelfPriceLabel,_t as shelfProblem,be as splitLayout,F as textDeltaOf,L as thinkingDeltaOf,U as toolEventOf,Mt as totalFor,V as useArtifactUrl,B as useChat,Lt as useCredits,j as useHolaClient,jt as useShop,qt as useThread};
8
+ `)}},u=async()=>{let d=await i.read();if(!d.done)return a+=o.decode(d.value,{stream:!0}),l(),u()};await u()};var Ve=/\/+$/,N="/api/v1/end-user",je=e=>{let t=e.baseUrl.replace(Ve,""),r=()=>typeof e.token=="function"?e.token():e.token,n=o=>e.project?`${o}project=${encodeURIComponent(e.project)}`:"",s=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),i=async o=>{let a=await fetch(`${t}${N}/chat${n("?")}`,{method:"POST",headers:await s(),body:JSON.stringify({message:o})});if(!a.ok)throw new Error(`hola: message failed (${a.status})`);return{reply:(await a.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>v(`${t}${N}/chat/info${n("?")}`,await s()),sendMessage:i,streamMessage:async(o,a)=>{try{let l=await i(o);a.onText?.(l.reply),a.onComplete?.(l)}catch(l){a.onError?.(w(l))}},subscribe:(o,a)=>{let l=a?.since??"0",u=!1,d,p=a?.intervalMs??3e3,f=typeof document<"u",c=()=>f&&document.visibilityState==="hidden",m=!1,y=()=>{if(!u){if(c()){m=!0;return}d=setTimeout(b,p)}},b=async()=>{try{let x=await v(`${t}${N}/chat/thread?since=${encodeURIComponent(l)}${n("&")}`,await s());for(let T of x.messages)o.onMessage(T);l=x.cursor,o.onHealthy?.()}catch(x){o.onError?.(w(x))}y()},P=()=>{u||!m||c()||(m=!1,d&&clearTimeout(d),d=setTimeout(b,0))};f&&document.addEventListener("visibilitychange",P);let g=()=>{u=!0,d&&clearTimeout(d),f&&document.removeEventListener("visibilitychange",P)};return a?.signal?.addEventListener("abort",g),d=setTimeout(b,0),g}}};import{useEffect as Be,useState as Ge}from"react";var q=(e,t)=>{let[r,n]=Ge("");return Be(()=>{if(!e){n("");return}let s=Uint8Array.from(atob(e),o=>o.charCodeAt(0)),i=URL.createObjectURL(new Blob([s],{type:t}));return n(i),()=>URL.revokeObjectURL(i)},[e,t]),r};import{useEffect as Qe,useRef as Ye}from"react";import{createContext as ze,useContext as Je}from"react";import{jsx as Xe}from"react/jsx-runtime";var oe=ze(null),Ke=({client:e,children:t})=>Xe(oe.Provider,{value:e,children:t}),V=()=>{let e=Je(oe);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};import{useCallback as se,useEffect as ie,useRef as ae,useState as $}from"react";var j=e=>{let[t,r]=$([]),[n,s]=$(""),[i,o]=$(!1),[a,l]=$(null),u=ae(0),d=ae(null);ie(()=>()=>d.current?.abort(),[]);let p=se(()=>{let c=u.current;return u.current+=1,c},[]);ie(()=>{let c=!0;return e.getInfo().then(m=>{c&&m.greeting&&r([{id:p(),role:"assistant",text:m.greeting}])}).catch(()=>{}),()=>{c=!1}},[e,p]);let f=se(()=>{let c=n.trim();if(!c||i)return;s(""),l(null),o(!0);let m=p(),y=p();r(g=>[...g,{id:m,role:"user",text:c},{id:y,role:"assistant",text:"",streaming:!0}]);let b=g=>{r(x=>x.map(T=>T.id===y?g(T):T))},P=new AbortController;d.current=P,e.streamMessage(c,{onText:g=>b(x=>({...x,text:x.text+g})),onComplete:g=>{b(x=>({...x,text:g.reply||x.text,artifacts:g.artifacts,streaming:!1})),o(!1)},onError:g=>{b(x=>({...x,streaming:!1})),l(g.error),o(!1)}},P.signal).catch(g=>{b(x=>({...x,streaming:!1})),l(g instanceof Error?g.message:"stream_failed"),o(!1)}).finally(()=>{o(!1),b(g=>g.streaming?{...g,streaming:!1}:g)})},[n,i,e,p]);return{messages:t,input:n,setInput:s,send:f,sending:i,error:a}};import{jsx as C,jsxs as B}from"react/jsx-runtime";var S={root:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif",fontSize:14,color:"#111827"},log:{flex:1,overflowY:"auto",padding:12,display:"flex",flexDirection:"column",gap:8},user:{alignSelf:"flex-end",background:"#111827",color:"#ffffff",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},assistant:{alignSelf:"flex-start",background:"#f1f1f4",color:"#111827",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},artifacts:{display:"flex",flexDirection:"column",gap:6,marginTop:6},image:{maxHeight:220,borderRadius:8,border:"1px solid #e5e7eb"},link:{color:"#2563eb",textDecoration:"underline",wordBreak:"break-all"},error:{color:"#b91c1c",padding:"4px 12px",fontSize:13},form:{display:"flex",gap:8,borderTop:"1px solid #e5e7eb",padding:8},input:{flex:1,border:"1px solid #d1d5db",borderRadius:8,padding:"8px 10px",fontSize:14,outline:"none"},button:{border:"none",background:"#111827",color:"#ffffff",borderRadius:8,padding:"8px 14px",fontSize:14,cursor:"pointer"}},Ze=({artifact:e})=>{let t=q(e.dataBase64??"",e.mimeType),r=e.url??t;return r?e.mimeType.startsWith("image/")?C("a",{href:r,rel:"noopener noreferrer",target:"_blank",children:C("img",{alt:e.filename,src:r,style:S.image})}):C("a",{download:e.filename,href:r,style:S.link,children:e.filename}):null},et=()=>{let e=V(),{messages:t,input:r,setInput:n,send:s,sending:i,error:o}=j(e),a=Ye(null);Qe(()=>{let u=a.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let l=u=>{u.preventDefault(),s()};return B("div",{style:S.root,children:[C("div",{ref:a,style:S.log,children:t.map(u=>B("div",{style:u.role==="user"?S.user:S.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?C("div",{style:S.artifacts,children:u.artifacts.map(d=>C(Ze,{artifact:d},d.filename))}):null]},u.id))}),o?C("div",{style:S.error,children:o}):null,B("form",{onSubmit:l,style:S.form,children:[C("input",{"aria-label":"Message",onChange:u=>n(u.target.value),placeholder:"Type a message\u2026",style:S.input,value:r}),C("button",{disabled:i||r.trim().length===0,style:S.button,type:"submit",children:"Send"})]})]})};var tt=/\/+$/,G=e=>{let t=e.sessionId,r=e.baseUrl.replace(tt,""),n=o=>`${r}/endpoint/${encodeURIComponent(e.token)}${o}`,s={"content-type":"application/json"},i=(o,a)=>({url:n(o),headers:s,body:JSON.stringify({message:a,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>v(n("/config"),{}),sendMessage:async o=>{let a=await re(i("/message",o));return t=a.sessionId,a},streamMessage:(o,a,l)=>ne(i("/message/stream",o),a,u=>{t=u},l),subscribe:(o,a)=>{let l=a?.since??"0",u=!1,d,p=a?.intervalMs??3e3,f=async()=>{let m=t;if(m)try{let y=await v(n(`/messages?session=${encodeURIComponent(m)}&since=${encodeURIComponent(l)}`),{});for(let b of y.messages)o.onMessage(b);l=y.cursor,o.onHealthy?.()}catch(y){o.onError?.(w(y))}u||(d=setTimeout(f,p))},c=()=>{u=!0,d&&clearTimeout(d)};return a?.signal?.addEventListener("abort",c),d=setTimeout(f,0),c}}};var rt=e=>"transport"in e?e.transport:G(e);var nt=/^https?:\/\//i,ot=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,st=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function it(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(nt.test(e))return"url";if(ot.test(e))return"date"}return"text"}function le(e){let t=[],r=new Map;for(let n of e)for(let[s,i]of Object.entries(n.data??{})){if(i==null)continue;let o=r.get(s);o||(o=new Map,r.set(s,o),t.push(s));let a=it(i);o.set(a,(o.get(a)??0)+1)}return t.map(n=>{let s=r.get(n)??new Map,i="text",o=-1;for(let[a,l]of s)l>o&&(o=l,i=a);return{key:n,label:st(n),type:i}})}var at=e=>typeof e=="number"?e:Number(e)||0,ue=e=>/rate|position|rank|score|percent|avg/i.test(e),lt=/posted|published|sent|completed|shipped|launched|_at/i,ut=new Set(["service","order","end_user_id"]);function de(e,t){let r=e.filter(l=>!ut.has(l.key)),n=r.filter(l=>l.type==="number").slice(0,3),s=r.find(l=>l.key==="status")??r.find(l=>l.type==="select"),i=r.find(l=>l.type==="date"&&lt.test(l.key))??r.find(l=>l.type==="date"),o=r.filter(l=>l.type==="number"&&!ue(l.key)).map(l=>({field:l,total:t.reduce((u,d)=>u+at(d.data[l.key]),0)})).sort((l,u)=>u.total-l.total).find(l=>l.total>0)?.field??null,a=[{type:"stat",label:"Items",agg:"count"}];for(let l of n){let u=ue(l.key);a.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return i&&a.push({type:"line",x:i.key,y:o?.key,agg:"sum",title:o?`${o.label} by day`:"Items by day"}),s&&a.push({type:"donut",groupBy:s.key,title:s.label}),a.push({type:"table",columns:r.map(l=>l.key)}),{version:1,widgets:a}}var pe=6,ce=6,me=4,ge={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},dt=e=>Math.max(1,Math.min(6,Math.round(e))),pt=e=>Math.max(1,Math.min(4,Math.round(e)));function W(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function fe(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function ye(e){return ge[e]}function z(e,t,r){let n=ge[e];return{w:t===void 0?n.w:dt(t),h:r===void 0?n.h:pt(r)}}function J(e){let t=[],r=[],n=(o,a,l,u)=>{if(o<0||o+l>6)return!1;for(let d=0;d<u;d+=1){let p=r[a+d];if(p){for(let f=0;f<l;f+=1)if(p[o+f])return!1}}return!0},s=(o,a,l,u)=>{for(let d=0;d<u;d+=1){let p=r[a+d]??[];for(let f=0;f<l;f+=1)p[o+f]=!0;r[a+d]=p}},i=(o,a)=>{for(let l=0;;l+=1)for(let u=0;u+o<=6;u+=1)if(n(u,l,o,a))return{gx:u,gy:l}};for(let o of e){let a=z(W(o.kind),o.w,o.h),u=o.gx!==void 0&&o.gy!==void 0&&n(o.gx,o.gy,a.w,a.h)&&o.gx!==void 0&&o.gy!==void 0?{gx:o.gx,gy:o.gy}:i(a.w,a.h);s(u.gx,u.gy,a.w,a.h),t.push({widget:o,gx:u.gx,gy:u.gy,w:a.w,h:a.h})}return t}function be(e){let t=[],r=[];for(let n of e)W(n.kind)==="block"?r.push(n):t.push(n);return{tiles:J(t),blocks:r}}var he=new Set(["service","order","end_user_id"]),K=e=>typeof e=="number"?e:Number(e)||0,xe=e=>e==null?"":String(e);function X(e,t){if(e==="count")return t.length;if(t.length===0)return 0;if(e==="last")return t[t.length-1]??0;if(e==="min")return Math.min(...t);if(e==="max")return Math.max(...t);let r=t.reduce((n,s)=>n+s,0);return e==="avg"?Math.round(r/t.length*100)/100:r}function ct(e,t,r,n){let s=new Map;for(let i of e){let o=new Date(xe(i.data[t]));if(Number.isNaN(o.getTime()))continue;let a=o.toISOString().slice(0,10),l=s.get(a)??[];l.push(r?K(i.data[r]):1),s.set(a,l)}return[...s.entries()].sort((i,o)=>i[0]<o[0]?-1:1).map(([i,o])=>({label:new Date(`${i}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:r?X(n,o):o.length}))}function mt(e,t,r,n="sum"){let s=new Map;for(let i of e){let o=xe(i.data[t]).trim();if(!o)continue;let a=s.get(o)??[];a.push(r?K(i.data[r]):1),s.set(o,a)}return[...s.entries()].map(([i,o])=>({label:i,value:r?X(n,o):o.length})).sort((i,o)=>o.value-i.value)}function gt(e,t,r,n){switch(e.type){case"stat":{let s=e.metric?t.get(e.metric):void 0;if(e.metric&&!s)return null;if(!s)return{kind:"stat",label:e.label??"Items",value:n.length};let i=n.map(o=>K(o.data[s.key]));return{kind:"stat",label:e.label??s.label,value:X(e.agg??"sum",i)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let s=ct(n,e.x,e.y,e.agg??"sum");return s.length<2?null:{kind:"series",draw:e.type,title:e.title??"By day",points:s}}case"donut":{if(!t.has(e.groupBy))return null;let s=mt(n,e.groupBy,e.metric,e.agg??"sum");return s.length===0?null:{kind:"donut",title:e.title??t.get(e.groupBy)?.label??"Breakdown",points:s}}case"table":{let s=e.columns?e.columns.map(i=>t.get(i)).filter(i=>i!==void 0&&!he.has(i.key)):r;return s.length===0?null:{kind:"table",title:e.title,columns:s,rows:n}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function we(e,t,r,n={}){let s=new Map,i=l=>({byKey:new Map(l.fields.map(u=>[u.key,u])),cols:l.fields.filter(u=>!he.has(u.key)),rows:l.rows}),o=i({fields:t,rows:r});for(let[l,u]of Object.entries(n))s.set(l,i(u));let a=[];for(let l of e.widgets){let u=l.type==="text"?void 0:l.source,d=u?s.get(u):o;if(!d)continue;let p=gt(l,d.byKey,d.cols,d.rows);p&&a.push({...p,w:l.w,h:l.h,gx:l.gx,gy:l.gy})}return a}var ft=new Set(["sum","avg","count","min","max","last"]),ve=e=>typeof e=="string"&&ft.has(e)?e:void 0,h=e=>typeof e=="string"&&e!==""?e:void 0,I=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,A=e=>typeof e=="number"&&e>=1?Math.min(4,Math.round(e)):void 0,k=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function yt(e){if(typeof e!="object"||e===null)return null;let t=e;switch(t.type){case"stat":return{type:"stat",source:h(t.source),label:h(t.label),metric:h(t.metric)??h(t.column),agg:ve(t.agg),w:I(t.w),h:A(t.h),gx:k(t.gx),gy:k(t.gy)};case"line":case"bar":{let r=h(t.x);return r?{type:t.type,source:h(t.source),title:h(t.title),x:r,y:h(t.y)??h(t.column),agg:ve(t.agg),w:I(t.w),h:A(t.h),gx:k(t.gx),gy:k(t.gy)}:null}case"donut":{let r=h(t.groupBy)??h(t.column);return r?{type:"donut",source:h(t.source),title:h(t.title),groupBy:r,w:I(t.w),h:A(t.h),gx:k(t.gx),gy:k(t.gy)}:null}case"table":{let r=Array.isArray(t.columns)?t.columns.filter(n=>typeof n=="string"):void 0;return{type:"table",source:h(t.source),title:h(t.title),columns:r,w:I(t.w),h:A(t.h),gx:k(t.gx),gy:k(t.gy)}}case"text":{let r=h(t.body);return r?{type:"text",title:h(t.title),body:r,w:I(t.w),h:A(t.h),gx:k(t.gx),gy:k(t.gy)}:null}default:return null}}function Se(e){let t=e;if(typeof e=="string"){if(e.trim()==="")return null;try{t=JSON.parse(e)}catch{return null}}if(typeof t!="object"||t===null)return null;let r=t.widgets;if(!Array.isArray(r))return null;let n=r.map(yt).filter(i=>i!==null);if(n.length===0)return null;let s=t.version;return{version:typeof s=="number"?s:1,title:h(t.title),widgets:n}}function Q(e){if(typeof e=="string")return e?{kind:"file",value:e}:null;if(e&&typeof e=="object"){let t=e,r=typeof t.value=="string"?t.value:"",n=t.kind==="link"||t.kind==="text"||t.kind==="table"?t.kind:"file",s=typeof t.v=="number"&&t.v>=1?Math.floor(t.v):void 0;return r?{kind:n,value:r,...s?{v:s}:{}}:null}return null}function Y(e){let t=new Map;for(let r of e){let n=r.v??1,s=t.get(n)??[];s.push(r),t.set(n,s)}return[...t.entries()].sort(([r],[n])=>r-n).map(([r,n])=>({v:r,items:n}))}function Pe(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let n=JSON.parse(t);if(Array.isArray(n))return n.map(Q).filter(s=>s!==null)}catch{}let r=String(e.file??"");return r?[{kind:"file",value:r}]:[]}function ke(e,t,r,n=""){let i=Y(e).find(a=>a.v===t)?.items??[],o=i.filter(a=>a.kind==="file").map(a=>r.get(a.value)??"");return i.some(a=>a.kind==="table")&&o.push(n),o.length===0||o.some(a=>a==="")?"awaiting":o.some(a=>a==="revise")?"revise":"accepted"}function Te(e){return Number(e.published_version)||0}function Z(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function Ce(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let r=t.columns.map((i,o)=>({key:typeof i.key=="string"&&i.key?i.key:typeof i.id=="string"&&i.id?i.id:`column_${o+1}`,label:typeof i.label=="string"?i.label:"",type:Z(i.type),...i.clientEditable===!0?{clientEditable:!0}:{}})),n=t.rows.map((i,o)=>({id:typeof i.id=="string"&&i.id?i.id:`row_${o}`,cells:i.cells&&typeof i.cells=="object"?i.cells:{}})),s=typeof t.name=="string"?t.name:void 0;return{columns:r,rows:n,...s?{name:s}:{}}}}catch{}return null}function Re(e){return e==null?"":String(e)}function De(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function E(){return{cells:{},verdict:"",comment:""}}function Ie(e){if(typeof e!="string"||e.trim()==="")return E();try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let r=t;return{cells:r.cells&&typeof r.cells=="object"?r.cells:r,verdict:r.verdict==="accepted"||r.verdict==="revise"?r.verdict:"",comment:typeof r.comment=="string"?r.comment:""}}}catch{}return E()}function Ae(e,t,r){if(e.clientEditable){let n=r.cells[t.id];if(n&&e.key in n)return n[e.key]}return t.cells[e.key]}function He(e,t,r,n){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[r]:n}}}}function Me(e,t,r){return{...e,verdict:t,comment:r}}function $e(e){let t=new Date(`${e}T00:00:00`);return Number.isNaN(t.getTime())?e:t.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}var H=class extends Error{code;status;constructor(t,r,n){super(r),this.name="CreditRefused",this.code=t,this.status=n}},bt=/\/+$/,ht="/api/v1/end-user",xt=(e,t,r)=>{let n=t.filter(l=>l.order===r),s=n.reduce((l,u)=>l+u.amount,0),i=n.filter(l=>l.status==="paid").reduce((l,u)=>l+u.amount,0),o=e.value>0,a=s>0?s-i:e.value-i;return{value:e.value,priced:o,billed:s,paid:i,due:Math.max(0,a),lines:[...n].sort((l,u)=>l.status!==u.status?l.status==="due"?-1:1:(l.dueDate||l.paidAt).localeCompare(u.dueDate||u.paidAt)),awaitingPayment:o&&i<=0}},wt=e=>{let t=e.baseUrl.replace(bt,""),r=()=>typeof e.token=="function"?e.token():e.token,n=async(s,i={method:"GET"})=>{try{let o=await fetch(`${t}${ht}${s}`,{method:i.method,headers:{"content-type":"application/json",authorization:`Bearer ${await r()}`},...i.body===void 0?{}:{body:JSON.stringify(i.body)}});if(!o.ok){let a=await o.json().catch(()=>({}));throw new H(a.error??"request_failed",a.message??`${i.method} ${s} \u2192 ${String(o.status)}`,o.status)}return await o.json()}catch(o){throw o instanceof H?o:w(o)}};return{wallet:()=>n("/credits"),history:()=>n("/credits/history"),topup:s=>n("/credits/checkout",{method:"POST",body:{packId:s}}),checkout:s=>n("/shop/checkout",{method:"POST",body:s}),payments:()=>n("/payments"),paymentMethods:()=>n("/payment-methods"),markPaymentSent:(s,i)=>n(`/payments/${encodeURIComponent(s)}/sent`,{method:"POST",body:{reference:i??""}}),acceptInquiry:s=>n(`/inquiries/${encodeURIComponent(s)}/accept`,{method:"POST"}),enquire:(s,i,o)=>n("/shop/enquire",{method:"POST",body:{productId:s,answers:i,name:o??""}})}};var vt=/\/+$/,R="/api/v1/end-user",M=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function St(e){let t="";for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}var Pt=e=>{let t=e.baseUrl.replace(vt,""),r=()=>typeof e.token=="function"?e.token():e.token,n=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),s=async(o,a)=>{try{let l=await fetch(`${t}${R}${o}`,{method:a.method,headers:await n(),...a.body===void 0?{}:{body:JSON.stringify(a.body)}});if(l.status===409){let u=await l.json().catch(()=>({}));throw new M(u.message??"Someone else saved this first.")}if(!l.ok){let u=await l.text().catch(()=>""),d=`${a.method} ${o} \u2192 ${String(l.status)}`;try{let p=JSON.parse(u);p.message&&(d=p.message)}catch{d=u?`${d}: ${u}`:d}throw w({error:d})}return await l.json()}catch(l){throw l instanceof M?l:w(l)}},i=o=>`/tables/${encodeURIComponent(o)}`;return{listTables:async()=>(await v(`${t}${R}/tables`,await n())).tables,listRows:async(o,a)=>await v(`${t}${R}${i(o)}/rows?limit=${String(a??100)}`,await n()),insertRow:async(o,a)=>{let{rowIds:l}=await s(`${i(o)}/rows`,{method:"POST",body:{rows:[a]}}),u=l[0];if(!u)throw w(new Error("The row was not created."));return u},patchRow:async(o,a,l)=>(await s(`${i(o)}/rows/${encodeURIComponent(a)}`,{method:"PATCH",body:l})).updated,deleteRow:async(o,a)=>(await s(`/${encodeURIComponent(o)}/${encodeURIComponent(a)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await v(`${t}${R}/tables/files/rows?limit=200`,await n())).rows.map(a=>({id:a.rowId,filename:String(a.data.filename??""),source:String(a.data.source??"client"),campaign:String(a.data.campaign??""),size:typeof a.data.size=="number"?a.data.size:0,createdAt:a.createdAt})),uploadFile:async(o,a)=>{let l=new Uint8Array(await o.arrayBuffer());return await s("/files",{method:"POST",body:{filename:o.name,mime:o.type||"application/octet-stream",data:St(l),...a===void 0?{}:{message:a}}})},fileLink:async o=>await v(`${t}${R}/files/${encodeURIComponent(o)}/url`,await n()),deleteFile:async o=>(await s(`/files/${encodeURIComponent(o)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await v(`${t}${R}/documents`,await n())).documents,readDocument:async o=>(await v(`${t}${R}/documents/${encodeURIComponent(o)}`,await n())).document,saveDocument:async(o,a)=>await s(`/documents/${encodeURIComponent(o)}`,{method:"PATCH",body:a})}};var kt=/\/+$/,Tt="/api/v1/end-user",Ct=e=>{let t=e.baseUrl.replace(kt,""),r=async(n,s)=>{let i;try{i=await fetch(`${t}${Tt}${n}`,s===void 0?{}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})}catch(o){throw w(o)}if(i.status===429)throw w({error:"rate_limited",retryable:!0});if(!i.ok)throw w({error:`shop_request_failed_${String(i.status)}`});try{return await i.json()}catch(o){throw w(o)}};return{listProducts:async()=>{let n=await r(`/shop/products?publishable_key=${encodeURIComponent(e.publishableKey)}`);return{products:n.products.map(s=>({...s,currency:typeof s.currency=="string"?s.currency:""})),truncated:n.truncated===!0,enquiryForm:Array.isArray(n.enquiryForm)?n.enquiryForm:[]}},apply:async n=>await r("/shop/apply",{publishable_key:e.publishableKey,name:n.name,email:n.email,...n.phone?{phone:n.phone}:{},...n.message?{message:n.message}:{},...n.productId?{productId:n.productId}:{}})}};var Rt=new Set(["buy","ask"]);function Dt(e){return Rt.has(e.mode)?e.mode:"ask"}var It={kind:"quoted"};function F(e,t){if(!t)return e.toLocaleString();if(t.toLowerCase()==="credits")return`${e.toLocaleString()} ${e===1?"credit":"credits"}`;let r=Number.isInteger(e)?0:2;try{return new Intl.NumberFormat(void 0,{style:"currency",currency:t,minimumFractionDigits:r,maximumFractionDigits:r}).format(e)}catch{return`${t} ${e.toLocaleString()}`}}function We(e,t){let r=/^[a-z]+$/i.test(t)&&!t.endsWith("s")?"s":"";return`${e.toLocaleString()} ${t}${r}`}function Ee(e,t){return e.kind==="quoted"?"Priced on enquiry":e.kind==="flat"?F(e.price,t):`${F(e.unitPrice,t)} per ${e.unitStep===1?e.unit:We(e.unitStep,e.unit)}`}function At(e){let t=e.currency,r=e.pricing;if(r.kind!=="variants")return Ee(r,t);let n=r.variants.map(s=>s.price).filter(s=>typeof s=="number");return n.length>0?`From ${F(Math.min(...n),t)}`:"Priced on enquiry"}function Ht(e,t){if(e.kind!=="variants")return e;let r=e.variants.find(n=>n.name===t);return typeof r?.price=="number"?{kind:"flat",price:r.price}:It}function Mt(e,t){return e.kind==="flat"?e.price:e.kind==="per_unit"?e.unitPrice*Math.ceil(t/Math.max(e.unitStep,1)):null}function $t(e,t){let r=t.kind==="per_unit"?Math.max(t.unitStep,1):1;return{min:Math.max(e.minQty??r,r),max:e.maxQty??null,step:r}}function Wt(e,t){let r=e.variants?.find(n=>n.name===t);return r&&r.includes.length>0?r.includes:e.includes}function Et(e,t){let r=[];for(let n of e){let s=t(n).trim();s&&!r.includes(s)&&r.push(s)}return r}function Ft(e,t,r,n){let s=t?`${e.name} \u2014 ${t}`:e.name,i=r.kind==="per_unit"?`, ${We(n,r.unit)}`:"";return`I'd like to buy ${s}${i}. How do I go ahead?`}function Ot(e){return e?(e&&typeof e=="object"&&"error"in e?String(e.error):"")==="rate_limited"?"That's a lot of looking at once \u2014 give it a moment, then reload.":"The shop isn't loading right now. Please try again shortly.":null}import{useCallback as Fe,useEffect as _t,useState as ee}from"react";var Lt=e=>{let[t,r]=ee(null),[n,s]=ee(!0),[i,o]=ee(null),a=Fe(async()=>{try{r(await e.wallet()),o(null)}catch{o("Couldn't read your balance just now.")}finally{s(!1)}},[e]),l=Fe(()=>{a().catch(()=>{})},[a]);return _t(()=>(l(),window.addEventListener("focus",l),()=>{window.removeEventListener("focus",l)}),[l]),{wallet:t,loading:n,failure:i,refresh:l}};import{useCallback as Ut,useEffect as Nt,useState as D}from"react";var qt=e=>e&&typeof e=="object"&&typeof e.error=="string"?e.error:e instanceof Error?e.message:"shop_unavailable",Vt=e=>{let[t,r]=D([]),[n,s]=D([]),[i,o]=D(!1),[a,l]=D(!0),[u,d]=D(null),[p,f]=D(0);Nt(()=>{let m=!0;return l(!0),e.listProducts().then(y=>{m&&(r(y.products),s(y.enquiryForm),o(y.truncated),d(null))}).catch(y=>{m&&d(qt(y))}).finally(()=>{m&&l(!1)}),()=>{m=!1}},[e,p]);let c=Ut(()=>f(m=>m+1),[]);return{products:t,enquiryForm:n,truncated:i,loading:a,error:u,reload:c}};import{useCallback as jt,useEffect as Oe,useRef as Bt,useState as O}from"react";var _e="greeting";function Le(e,t){if(e.some(i=>i.id===t.id))return e;let r=e.filter(i=>i.id!==_e),n=i=>i.author==="client"==(t.author==="client");return[...r.filter(i=>!(i.pending&&n(i)&&i.text===t.text)),t]}var Gt=(e,t)=>{let[r,n]=O([]),[s,i]=O(""),[o,a]=O(!1),[l,u]=O(null),d=Bt(0),p=t?.pollMs??2e3;Oe(()=>{let c=!0;return e.getInfo().then(m=>{c&&m.greeting&&n(y=>y.length===0?[{id:_e,cursor:"",author:"agent",text:m.greeting}]:y)}).catch(()=>{}),()=>{c=!1}},[e]),Oe(()=>e.subscribe?.({onMessage:c=>n(m=>Le(m,c)),onError:c=>u(c.error),onHealthy:()=>u(null)},{intervalMs:p}),[e,p]);let f=jt(()=>{let c=s.trim();if(!c||o)return;i(""),u(null),a(!0),d.current+=1;let m=`pending-${d.current}`,y={id:m,cursor:"",author:"client",text:c,pending:!0};n(b=>[...b,y]),e.sendMessage(c).then(b=>{a(!1),b.reply.trim()&&n(g=>g.some(T=>!T.pending&&T.author!=="client"&&T.text===b.reply)?g:(d.current+=1,[...g,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:b.reply,pending:!0}]))}).catch(b=>{u(b instanceof Error?b.message:"send_failed"),a(!1),n(P=>P.filter(g=>g.id!==m)),i(P=>P||c)})},[s,o,e]);return{messages:r,input:s,setInput:i,send:f,sending:o,error:l}};export{et as Chat,H as CreditRefused,pe as GRID_COLS,ce as GRID_MAX_COLS,me as GRID_MAX_ROWS,Ke as HolaProvider,M as PortalConflict,W as bandOfKind,fe as bandOfType,Ft as buyRequestText,Ae as cellValue,je as createApiTransport,rt as createHolaClient,wt as createPortalCredits,Pt as createPortalData,Ct as createPortalShop,G as createWidgetTransport,Re as deliverableCellText,ke as deliverableStatus,le as deriveFields,E as emptyTableResponses,Et as facetValues,ye as footprintOf,z as footprintWith,$e as formatDeliverableDate,Y as groupDeliverableVersions,Wt as includesFor,de as inferSpec,De as isDeliverableChecked,Le as mergeMessage,Dt as modeOf,F as money,Z as normalizeDeliverableColType,Q as normalizeDeliverableItem,xt as orderBilling,Se as parseDashboardSpec,Pe as parseDeliverableItems,Ce as parseDeliverableTable,Ie as parseTableResponses,J as placeWidgets,Ht as priceFor,Ee as priceLabel,Te as publishedVersionOf,$t as quantityRange,we as renderModel,He as setResponse,Me as setTableReview,At as shelfPriceLabel,Ot as shelfProblem,be as splitLayout,_ as textDeltaOf,L as thinkingDeltaOf,U as toolEventOf,Mt as totalFor,q as useArtifactUrl,j as useChat,Lt as useCredits,V as useHolaClient,Vt as useShop,Gt as useThread};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holaboss/client",
3
- "version": "0.2.0-beta.27",
3
+ "version": "0.2.0-beta.28",
4
4
  "description": "Injectable client SDK for embedding a Holaboss AI employee (chat + configurable dashboards today; artifacts next) into your own web app.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",