@holaboss/client 0.2.0-beta.32 → 0.2.0-beta.34
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 +5 -5
- package/dist/index.d.cts +70 -3
- package/dist/index.d.ts +70 -3
- package/dist/index.js +5 -5
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
var
|
|
3
|
-
`))r.startsWith(":")||(r.startsWith("event:")?t=r.slice(6).trim():r.startsWith("data:")&&n.push(r.slice(5).replace(
|
|
4
|
-
`)}:null},
|
|
2
|
+
var pe=Object.defineProperty;var Pt=Object.getOwnPropertyDescriptor;var kt=Object.getOwnPropertyNames;var Ct=Object.prototype.hasOwnProperty;var Rt=(e,t)=>{for(var n in t)pe(e,n,{get:t[n],enumerable:!0})},Dt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of kt(t))!Ct.call(e,s)&&s!==n&&pe(e,s,{get:()=>t[s],enumerable:!(r=Pt(t,s))||r.enumerable});return e};var It=e=>Dt(pe({},"__esModule",{value:!0}),e);var un={};Rt(un,{Chat:()=>Je,CreditRefused:()=>M,DATE_FORMATS:()=>te,GRID_COLS:()=>fe,GRID_MAX_COLS:()=>ye,GRID_MAX_ROWS:()=>be,HolaProvider:()=>Qe,InsufficientCredits:()=>L,OPTION_TINTS:()=>se,PortalConflict:()=>O,QUOTE_BALANCE_LABEL:()=>de,QUOTE_DEPOSIT_LABEL:()=>ue,TIME_FORMATS:()=>ne,arrangedColumns:()=>Ae,bandOfKind:()=>H,bandOfType:()=>he,buyRequestText:()=>ht,cellValue:()=>_e,createApiTransport:()=>Ve,createHolaClient:()=>Ke,createPortalCredits:()=>at,createPortalData:()=>lt,createPortalShop:()=>ut,createWidgetTransport:()=>K,creditsOfMoney:()=>st,deliverableCellText:()=>ie,deliverableCellValues:()=>Ee,deliverableStatus:()=>Ce,deriveFields:()=>me,emptyTableResponses:()=>W,facetValues:()=>bt,footprintOf:()=>we,footprintWith:()=>X,formatDeliverableDate:()=>Le,groupDeliverableVersions:()=>ee,includesFor:()=>yt,inferSpec:()=>ge,isDeliverableChecked:()=>Oe,mergeMessage:()=>Ne,modeOf:()=>dt,money:()=>U,normalizeDeliverableColType:()=>re,normalizeDeliverableItem:()=>Z,optionTintIndex:()=>Me,orderBilling:()=>it,parseArrangement:()=>oe,parseDashboardSpec:()=>Pe,parseDeliverableItems:()=>ke,parseDeliverableTable:()=>Ie,parseTableResponses:()=>He,paymentAsked:()=>le,paymentPayMethods:()=>ot,placeWidgets:()=>Y,priceFor:()=>mt,priceLabel:()=>Ue,publishedVersionOf:()=>Re,quantityRange:()=>ft,quoteSchedule:()=>rt,renderModel:()=>Te,setResponse:()=>$e,setTableReview:()=>We,shelfPriceLabel:()=>ct,shelfProblem:()=>wt,shortenUrl:()=>Fe,splitLayout:()=>xe,textDeltaOf:()=>N,thinkingDeltaOf:()=>q,toolEventOf:()=>j,totalFor:()=>gt,useArtifactUrl:()=>V,useChat:()=>z,useCredits:()=>xt,useHolaClient:()=>Q,useShop:()=>St,useThread:()=>Tt});module.exports=It(un);var qe=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},N=e=>{let t=qe(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},q=e=>{let t=qe(e);return t?.type==="thinking_delta"&&typeof t.delta=="string"?t.delta:null},j=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 At=/^ /,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"}},Mt=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(At,"")));return n.length>0?{event:t,data:n.join(`
|
|
4
|
+
`)}:null},Ft=(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=N(r);s&&t.onText?.(s);let l=q(r);l&&t.onThinking?.(l);let o=j(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))},T=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()},je=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()},Be=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 l=s.body.getReader(),o=new TextDecoder,i="",a=()=>{let d=i.indexOf(`
|
|
5
5
|
|
|
6
|
-
`);for(;d!==-1;){let m=i.slice(0,d);i=i.slice(d+2);let p=
|
|
6
|
+
`);for(;d!==-1;){let m=i.slice(0,d);i=i.slice(d+2);let p=Mt(m);p&&Ft(p,t,n),d=i.indexOf(`
|
|
7
7
|
|
|
8
|
-
`)}},u=async()=>{let d=await a.read();if(!d.done)return i+=o.decode(d.value,{stream:!0}),l(),u()};await u()};var vt=/\/+$/,ae="/api/v1/end-user",Oe=e=>{let t=e.baseUrl.replace(vt,""),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()}`}),a=async o=>{let i=await fetch(`${t}${ae}/chat${r("?")}`,{method:"POST",headers:await s(),body:JSON.stringify({message:o})});if(!i.ok)throw new Error(`hola: message failed (${i.status})`);return{reply:(await i.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>v(`${t}${ae}/chat/info${r("?")}`,await s()),sendMessage:a,streamMessage:async(o,i)=>{try{let l=await a(o);i.onText?.(l.reply),i.onComplete?.(l)}catch(l){i.onError?.(w(l))}},subscribe:(o,i)=>{let l=i?.since??"0",u=!1,d,m=i?.intervalMs??3e3,p=typeof document<"u",c=()=>p&&document.visibilityState==="hidden",g=!1,y=()=>{if(!u){if(c()){g=!0;return}d=setTimeout(b,m)}},b=async()=>{try{let x=await v(`${t}${ae}/chat/thread?since=${encodeURIComponent(l)}${r("&")}`,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||!g||c()||(g=!1,d&&clearTimeout(d),d=setTimeout(b,0))};p&&document.addEventListener("visibilitychange",R);let f=()=>{u=!0,d&&clearTimeout(d),p&&document.removeEventListener("visibilitychange",R)};return i?.signal?.addEventListener("abort",f),d=setTimeout(b,0),f}}};var V=require("react"),B=(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)),a=URL.createObjectURL(new Blob([s],{type:t}));return r(a),()=>URL.revokeObjectURL(a)},[e,t]),n};var z=require("react");var j=require("react"),Le=require("react/jsx-runtime"),Fe=(0,j.createContext)(null),_e=({client:e,children:t})=>(0,Le.jsx)(Fe.Provider,{value:e,children:t}),G=()=>{let e=(0,j.useContext)(Fe);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};var P=require("react"),Q=e=>{let[t,n]=(0,P.useState)([]),[r,s]=(0,P.useState)(""),[a,o]=(0,P.useState)(!1),[i,l]=(0,P.useState)(null),u=(0,P.useRef)(0),d=(0,P.useRef)(null);(0,P.useEffect)(()=>()=>d.current?.abort(),[]);let m=(0,P.useCallback)(()=>{let c=u.current;return u.current+=1,c},[]);(0,P.useEffect)(()=>{let c=!0;return e.getInfo().then(g=>{c&&g.greeting&&n([{id:m(),role:"assistant",text:g.greeting}])}).catch(()=>{}),()=>{c=!1}},[e,m]);let p=(0,P.useCallback)(()=>{let c=r.trim();if(!c||a)return;s(""),l(null),o(!0);let g=m(),y=m();n(f=>[...f,{id:g,role:"user",text:c},{id:y,role:"assistant",text:"",streaming:!0}]);let b=f=>{n(x=>x.map(I=>I.id===y?f(I):I))},R=new AbortController;d.current=R,e.streamMessage(c,{onText:f=>b(x=>({...x,text:x.text+f})),onComplete:f=>{b(x=>({...x,text:f.reply||x.text,artifacts:f.artifacts,streaming:!1})),o(!1)},onError:f=>{b(x=>({...x,streaming:!1})),l(f.error),o(!1)}},R.signal).catch(f=>{b(x=>({...x,streaming:!1})),l(f instanceof Error?f.message:"stream_failed"),o(!1)}).finally(()=>{o(!1),b(f=>f.streaming?{...f,streaming:!1}:f)})},[r,a,e,m]);return{messages:t,input:r,setInput:s,send:p,sending:a,error:i}};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"}},kt=({artifact:e})=>{let t=B(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},Ue=()=>{let e=G(),{messages:t,input:n,setInput:r,send:s,sending:a,error:o}=Q(e),i=(0,z.useRef)(null);(0,z.useEffect)(()=>{let u=i.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:i,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)(kt,{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:a||n.trim().length===0,style:T.button,type:"submit",children:"Send"})]})]})};var Tt=/\/+$/,J=e=>{let t=e.sessionId,n=e.baseUrl.replace(Tt,""),r=o=>`${n}/endpoint/${encodeURIComponent(e.token)}${o}`,s={"content-type":"application/json"},a=(o,i)=>({url:r(o),headers:s,body:JSON.stringify({message:i,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>v(r("/config"),{}),sendMessage:async o=>{let i=await We(a("/message",o));return t=i.sessionId,i},streamMessage:(o,i,l)=>$e(a("/message/stream",o),i,u=>{t=u},l),subscribe:(o,i)=>{let l=i?.since??"0",u=!1,d,m=i?.intervalMs??3e3,p=async()=>{let g=t;if(g)try{let y=await v(r(`/messages?session=${encodeURIComponent(g)}&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(p,m))},c=()=>{u=!0,d&&clearTimeout(d)};return i?.signal?.addEventListener("abort",c),d=setTimeout(p,0),c}}};var Ne=e=>"transport"in e?e.transport:J(e);var Ct=/^https?:\/\//i,Rt=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,Dt=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(Ct.test(e))return"url";if(Rt.test(e))return"date"}return"text"}function le(e){let t=[],n=new Map;for(let r of e)for(let[s,a]of Object.entries(r.data??{})){if(a==null)continue;let o=n.get(s);o||(o=new Map,n.set(s,o),t.push(s));let i=It(a);o.set(i,(o.get(i)??0)+1)}return t.map(r=>{let s=n.get(r)??new Map,a="text",o=-1;for(let[i,l]of s)l>o&&(o=l,a=i);return{key:r,label:Dt(r),type:a}})}var At=e=>typeof e=="number"?e:Number(e)||0,qe=e=>/rate|position|rank|score|percent|avg/i.test(e),Mt=/posted|published|sent|completed|shipped|launched|_at/i,Ht=new Set(["service","order","end_user_id"]);function ue(e,t){let n=e.filter(l=>!Ht.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"),a=n.find(l=>l.type==="date"&&Mt.test(l.key))??n.find(l=>l.type==="date"),o=n.filter(l=>l.type==="number"&&!qe(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,i=[{type:"stat",label:"Items",agg:"count"}];for(let l of r){let u=qe(l.key);i.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return a&&i.push({type:"line",x:a.key,y:o?.key,agg:"sum",title:o?`${o.label} by day`:"Items by day"}),s&&i.push({type:"donut",groupBy:s.key,title:s.label}),i.push({type:"table",columns:n.map(l=>l.key)}),{version:1,widgets:i}}var de=6,pe=6,ce=4,Ve={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},Et=e=>Math.max(1,Math.min(6,Math.round(e))),Wt=e=>Math.max(1,Math.min(4,Math.round(e)));function W(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function me(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function ge(e){return Ve[e]}function K(e,t,n){let r=Ve[e];return{w:t===void 0?r.w:Et(t),h:n===void 0?r.h:Wt(n)}}function X(e){let t=[],n=[],r=(o,i,l,u)=>{if(o<0||o+l>6)return!1;for(let d=0;d<u;d+=1){let m=n[i+d];if(m){for(let p=0;p<l;p+=1)if(m[o+p])return!1}}return!0},s=(o,i,l,u)=>{for(let d=0;d<u;d+=1){let m=n[i+d]??[];for(let p=0;p<l;p+=1)m[o+p]=!0;n[i+d]=m}},a=(o,i)=>{for(let l=0;;l+=1)for(let u=0;u+o<=6;u+=1)if(r(u,l,o,i))return{gx:u,gy:l}};for(let o of e){let i=K(W(o.kind),o.w,o.h),u=o.gx!==void 0&&o.gy!==void 0&&r(o.gx,o.gy,i.w,i.h)&&o.gx!==void 0&&o.gy!==void 0?{gx:o.gx,gy:o.gy}:a(i.w,i.h);s(u.gx,u.gy,i.w,i.h),t.push({widget:o,gx:u.gx,gy:u.gy,w:i.w,h:i.h})}return t}function fe(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 Be=new Set(["service","order","end_user_id"]),ye=e=>typeof e=="number"?e:Number(e)||0,je=e=>e==null?"":String(e);function be(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 $t(e,t,n,r){let s=new Map;for(let a of e){let o=new Date(je(a.data[t]));if(Number.isNaN(o.getTime()))continue;let i=o.toISOString().slice(0,10),l=s.get(i)??[];l.push(n?ye(a.data[n]):1),s.set(i,l)}return[...s.entries()].sort((a,o)=>a[0]<o[0]?-1:1).map(([a,o])=>({label:new Date(`${a}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:n?be(r,o):o.length}))}function Ot(e,t,n,r="sum"){let s=new Map;for(let a of e){let o=je(a.data[t]).trim();if(!o)continue;let i=s.get(o)??[];i.push(n?ye(a.data[n]):1),s.set(o,i)}return[...s.entries()].map(([a,o])=>({label:a,value:n?be(r,o):o.length})).sort((a,o)=>o.value-a.value)}function Ft(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 a=r.map(o=>ye(o.data[s.key]));return{kind:"stat",label:e.label??s.label,value:be(e.agg??"sum",a)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let s=$t(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=Ot(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(a=>t.get(a)).filter(a=>a!==void 0&&!Be.has(a.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 he(e,t,n,r={}){let s=new Map,a=l=>({byKey:new Map(l.fields.map(u=>[u.key,u])),cols:l.fields.filter(u=>!Be.has(u.key)),rows:l.rows}),o=a({fields:t,rows:n});for(let[l,u]of Object.entries(r))s.set(l,a(u));let i=[];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 m=Ft(l,d.byKey,d.cols,d.rows);m&&i.push({...m,w:l.w,h:l.h,gx:l.gx,gy:l.gy})}return i}var _t=new Set(["sum","avg","count","min","max","last"]),Ge=e=>typeof e=="string"&&_t.has(e)?e:void 0,h=e=>typeof e=="string"&&e!==""?e:void 0,$=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,D=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function Lt(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:Ge(t.agg),w:$(t.w),h:O(t.h),gx:D(t.gx),gy:D(t.gy)};case"line":case"bar":{let n=h(t.x);return n?{type:t.type,source:h(t.source),title:h(t.title),x:n,y:h(t.y)??h(t.column),agg:Ge(t.agg),w:$(t.w),h:O(t.h),gx:D(t.gx),gy:D(t.gy)}:null}case"donut":{let n=h(t.groupBy)??h(t.column);return n?{type:"donut",source:h(t.source),title:h(t.title),groupBy:n,w:$(t.w),h:O(t.h),gx:D(t.gx),gy:D(t.gy)}:null}case"table":{let n=Array.isArray(t.columns)?t.columns.filter(r=>typeof r=="string"):void 0;return{type:"table",source:h(t.source),title:h(t.title),columns:n,w:$(t.w),h:O(t.h),gx:D(t.gx),gy:D(t.gy)}}case"text":{let n=h(t.body);return n?{type:"text",title:h(t.title),body:n,w:$(t.w),h:O(t.h),gx:D(t.gx),gy:D(t.gy)}:null}default:return null}}function xe(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(Lt).filter(a=>a!==null);if(r.length===0)return null;let s=t.version;return{version:typeof s=="number"?s:1,title:h(t.title),widgets:r}}function Y(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 Z(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 we(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let r=JSON.parse(t);if(Array.isArray(r))return r.map(Y).filter(s=>s!==null)}catch{}let n=String(e.file??"");return n?[{kind:"file",value:n}]:[]}function Pe(e,t,n,r=""){let a=Z(e).find(i=>i.v===t)?.items??[],o=a.filter(i=>i.kind==="file").map(i=>n.get(i.value)??"");return a.some(i=>i.kind==="table")&&o.push(r),o.length===0||o.some(i=>i==="")?"awaiting":o.some(i=>i==="revise")?"revise":"accepted"}function Se(e){return Number(e.published_version)||0}function ee(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="multi_select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function ve(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let n=t.columns.map((a,o)=>({key:typeof a.key=="string"&&a.key?a.key:typeof a.id=="string"&&a.id?a.id:`column_${o+1}`,label:typeof a.label=="string"?a.label:"",type:ee(a.type),...(()=>{let i=Array.isArray(a.options)?[...new Set(a.options.map(l=>String(l).trim()).filter(l=>l!==""))]:[];return i.length>0?{options:i}:{}})(),...a.clientEditable===!0?{clientEditable:!0}:{}})),r=t.rows.map((a,o)=>({id:typeof a.id=="string"&&a.id?a.id:`row_${o}`,cells:a.cells&&typeof a.cells=="object"?a.cells:{}})),s=typeof t.name=="string"?t.name:void 0;return{columns:n,rows:r,...s?{name:s}:{}}}}catch{}return null}function te(e){return e==null?"":String(e)}function ke(e){let t=te(e).trim();if(t==="")return[];try{let n=JSON.parse(t);if(Array.isArray(n))return n.map(r=>String(r).trim()).filter(r=>r!=="")}catch{}return t.split(",").map(n=>n.trim()).filter(n=>n!=="")}function Te(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function F(){return{cells:{},verdict:"",comment:""}}function Ce(e){if(typeof e!="string"||e.trim()==="")return F();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 F()}function Re(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 De(e,t,n,r){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[n]:r}}}}function Ie(e,t,n){return{...e,verdict:t,comment:n}}function Ae(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}},_=class extends M{credits;balance;short;constructor(t,n){super("insufficient_credits",t,402),this.name="InsufficientCredits",this.credits=n.credits,this.balance=n.balance,this.short=n.short}},Ut=/\/+$/,Nt="/api/v1/end-user",oe="Pre-payment",se="After-payment";function Qe(e,t){if(e<=0)return[];let n=t&&typeof t.upfront=="number"&&Number.isFinite(t.upfront)?Math.max(0,Math.min(t.upfront,e)):e,r=Math.round((e-n)*100)/100,s=[];return n>0&&s.push({label:oe,amount:n}),r>0&&s.push({label:se,amount:r}),s}var re=e=>e.status!=="paid"&&e.asked!==!1,ze=(e,t)=>e.payMethods&&e.payMethods.length>0?[...e.payMethods]:[...t],Je=(e,t)=>{let n=typeof t=="number"&&Number.isFinite(t)&&t>0?t:1;return!Number.isFinite(e)||e<=0?0:Math.ceil(e*n)},ne=e=>{let t=e.label.trim().toLowerCase();return t===oe.toLowerCase()?0:t===se.toLowerCase()?2:1},Ke=(e,t,n)=>{let r=t.filter(p=>p.order===n),s=p=>p.reduce((c,g)=>c+g.amount,0),a=s(r),o=s(r.filter(p=>p.status==="paid")),i=e.value>0,l=[...r].sort((p,c)=>ne(p)!==ne(c)?ne(p)-ne(c):(p.dueDate||p.paidAt).localeCompare(c.dueDate||c.paidAt)),u=l.filter(re),d=l.filter(p=>p.status!=="paid"&&!re(p)),m=a>0?s(u):e.value-o;return{value:e.value,priced:i,billed:a,paid:o,due:Math.max(0,m),scheduled:s(d),lines:l,asked:u,upcoming:d,awaitingPayment:i&&o<=0}},qt=e=>{let{credits:t,balance:n,short:r}=e;return typeof t!="number"||typeof n!="number"||typeof r!="number"||!(Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r))?null:{credits:t,balance:n,short:r}},Xe=e=>{let t=e.baseUrl.replace(Ut,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async(s,a={method:"GET"})=>{try{let o=await fetch(`${t}${Nt}${s}`,{method:a.method,headers:{"content-type":"application/json",authorization:`Bearer ${await n()}`},...a.body===void 0?{}:{body:JSON.stringify(a.body)}});if(!o.ok){let i=await o.json().catch(()=>({})),l=i.message??`${a.method} ${s} \u2192 ${String(o.status)}`,u=qt(i);throw o.status===402&&i.error==="insufficient_credits"&&u?new _(l,u):new M(i.error??"request_failed",l,o.status)}return await o.json()}catch(o){throw o instanceof M?o:w(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,a)=>r(`/payments/${encodeURIComponent(s)}/sent`,{method:"POST",body:{reference:a??""}}),payWithCredits:s=>r(`/payments/${encodeURIComponent(s)}/pay-with-credits`,{method:"POST",body:{}}),inquiryQuote:s=>r(`/inquiries/${encodeURIComponent(s)}/quote`),acceptInquiry:(s,a)=>r(`/inquiries/${encodeURIComponent(s)}/accept`,{method:"POST",body:{version:a}}),enquire:(s,a,o)=>r("/shop/enquire",{method:"POST",body:{productId:s,answers:a,name:o??""}})}};var Vt=/\/+$/,H="/api/v1/end-user",E=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function Bt(e){let t="";for(let r=0;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return btoa(t)}var Ye=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,i)=>{try{let l=await fetch(`${t}${H}${o}`,{method:i.method,headers:await r(),...i.body===void 0?{}:{body:JSON.stringify(i.body)}});if(l.status===409){let u=await l.json().catch(()=>({}));throw new E(u.message??"Someone else saved this first.")}if(!l.ok){let u=await l.text().catch(()=>""),d=`${i.method} ${o} \u2192 ${String(l.status)}`;try{let m=JSON.parse(u);m.message&&(d=m.message)}catch{d=u?`${d}: ${u}`:d}throw w({error:d})}return await l.json()}catch(l){throw l instanceof E?l:w(l)}},a=o=>`/tables/${encodeURIComponent(o)}`;return{listTables:async()=>(await v(`${t}${H}/tables`,await r())).tables,listRows:async(o,i)=>await v(`${t}${H}${a(o)}/rows?limit=${String(i??100)}`,await r()),insertRow:async(o,i)=>{let{rowIds:l}=await s(`${a(o)}/rows`,{method:"POST",body:{rows:[i]}}),u=l[0];if(!u)throw w(new Error("The row was not created."));return u},patchRow:async(o,i,l)=>(await s(`${a(o)}/rows/${encodeURIComponent(i)}`,{method:"PATCH",body:l})).updated,deleteRow:async(o,i)=>(await s(`/${encodeURIComponent(o)}/${encodeURIComponent(i)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await v(`${t}${H}/tables/files/rows?limit=200`,await r())).rows.map(i=>({id:i.rowId,filename:String(i.data.filename??""),source:String(i.data.source??"client"),campaign:String(i.data.campaign??""),size:typeof i.data.size=="number"?i.data.size:0,createdAt:i.createdAt})),uploadFile:async(o,i)=>{let l=new Uint8Array(await o.arrayBuffer());return await s("/files",{method:"POST",body:{filename:o.name,mime:o.type||"application/octet-stream",data:Bt(l),...i===void 0?{}:{message:i}}})},fileLink:async o=>await v(`${t}${H}/files/${encodeURIComponent(o)}/url`,await r()),deleteFile:async o=>(await s(`/files/${encodeURIComponent(o)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await v(`${t}${H}/documents`,await r())).documents,readDocument:async o=>(await v(`${t}${H}/documents/${encodeURIComponent(o)}`,await r())).document,saveDocument:async(o,i)=>await s(`/documents/${encodeURIComponent(o)}`,{method:"PATCH",body:i})}};var jt=/\/+$/,Gt="/api/v1/end-user",Ze=e=>{let t=e.baseUrl.replace(jt,""),n=async(r,s)=>{let a;try{a=await fetch(`${t}${Gt}${r}`,s===void 0?{}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})}catch(o){throw w(o)}if(a.status===429)throw w({error:"rate_limited",retryable:!0});if(!a.ok)throw w({error:`shop_request_failed_${String(a.status)}`});try{return await a.json()}catch(o){throw w(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,enquiryForm:Array.isArray(r.enquiryForm)?r.enquiryForm:[]}},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 Qt=new Set(["buy","ask"]);function et(e){return Qt.has(e.mode)?e.mode:"ask"}var zt={kind:"quoted"};function L(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 tt(e,t){let n=/^[a-z]+$/i.test(t)&&!t.endsWith("s")?"s":"";return`${e.toLocaleString()} ${t}${n}`}function Me(e,t){return e.kind==="quoted"?"Priced on enquiry":e.kind==="flat"?L(e.price,t):`${L(e.unitPrice,t)} per ${e.unitStep===1?e.unit:tt(e.unitStep,e.unit)}`}function nt(e){let t=e.currency,n=e.pricing;if(n.kind!=="variants")return Me(n,t);let r=n.variants.map(s=>s.price).filter(s=>typeof s=="number");return r.length>0?`From ${L(Math.min(...r),t)}`:"Priced on enquiry"}function rt(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}:zt}function ot(e,t){return e.kind==="flat"?e.price:e.kind==="per_unit"?e.unitPrice*Math.ceil(t/Math.max(e.unitStep,1)):null}function st(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 it(e,t){let n=e.variants?.find(r=>r.name===t);return n&&n.includes.length>0?n.includes:e.includes}function at(e,t){let n=[];for(let r of e){let s=t(r).trim();s&&!n.includes(s)&&n.push(s)}return n}function lt(e,t,n,r){let s=t?`${e.name} \u2014 ${t}`:e.name,a=n.kind==="per_unit"?`, ${tt(r,n.unit)}`:"";return`I'd like to buy ${s}${a}. How do I go ahead?`}function ut(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"),dt=e=>{let[t,n]=(0,A.useState)(null),[r,s]=(0,A.useState)(!0),[a,o]=(0,A.useState)(null),i=(0,A.useCallback)(async()=>{try{n(await e.wallet()),o(null)}catch{o("Couldn't read your balance just now.")}finally{s(!1)}},[e]),l=(0,A.useCallback)(()=>{i().catch(()=>{})},[i]);return(0,A.useEffect)(()=>(l(),window.addEventListener("focus",l),()=>{window.removeEventListener("focus",l)}),[l]),{wallet:t,loading:r,failure:a,refresh:l}};var C=require("react"),Jt=e=>e&&typeof e=="object"&&typeof e.error=="string"?e.error:e instanceof Error?e.message:"shop_unavailable",pt=e=>{let[t,n]=(0,C.useState)([]),[r,s]=(0,C.useState)([]),[a,o]=(0,C.useState)(!1),[i,l]=(0,C.useState)(!0),[u,d]=(0,C.useState)(null),[m,p]=(0,C.useState)(0);(0,C.useEffect)(()=>{let g=!0;return l(!0),e.listProducts().then(y=>{g&&(n(y.products),s(y.enquiryForm),o(y.truncated),d(null))}).catch(y=>{g&&d(Jt(y))}).finally(()=>{g&&l(!1)}),()=>{g=!1}},[e,m]);let c=(0,C.useCallback)(()=>p(g=>g+1),[]);return{products:t,enquiryForm:r,truncated:a,loading:i,error:u,reload:c}};var k=require("react"),ct="greeting";function He(e,t){if(e.some(a=>a.id===t.id))return e;let n=e.filter(a=>a.id!==ct),r=a=>a.author==="client"==(t.author==="client");return[...n.filter(a=>!(a.pending&&r(a)&&a.text===t.text)),t]}var mt=(e,t)=>{let[n,r]=(0,k.useState)([]),[s,a]=(0,k.useState)(""),[o,i]=(0,k.useState)(!1),[l,u]=(0,k.useState)(null),d=(0,k.useRef)(0),m=t?.pollMs??2e3;(0,k.useEffect)(()=>{let c=!0;return e.getInfo().then(g=>{c&&g.greeting&&r(y=>y.length===0?[{id:ct,cursor:"",author:"agent",text:g.greeting}]:y)}).catch(()=>{}),()=>{c=!1}},[e]),(0,k.useEffect)(()=>e.subscribe?.({onMessage:c=>r(g=>He(g,c)),onError:c=>u(c.error),onHealthy:()=>u(null)},{intervalMs:m}),[e,m]);let p=(0,k.useCallback)(()=>{let c=s.trim();if(!c||o)return;a(""),u(null),i(!0),d.current+=1;let g=`pending-${d.current}`,y={id:g,cursor:"",author:"client",text:c,pending:!0};r(b=>[...b,y]),e.sendMessage(c).then(b=>{i(!1),b.reply.trim()&&r(f=>f.some(I=>!I.pending&&I.author!=="client"&&I.text===b.reply)?f:(d.current+=1,[...f,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:b.reply,pending:!0}]))}).catch(b=>{u(b instanceof Error?b.message:"send_failed"),i(!1),r(R=>R.filter(f=>f.id!==g)),a(R=>R||c)})},[s,o,e]);return{messages:n,input:s,setInput:a,send:p,sending:o,error:l}};0&&(module.exports={Chat,CreditRefused,GRID_COLS,GRID_MAX_COLS,GRID_MAX_ROWS,HolaProvider,InsufficientCredits,PortalConflict,QUOTE_BALANCE_LABEL,QUOTE_DEPOSIT_LABEL,bandOfKind,bandOfType,buyRequestText,cellValue,createApiTransport,createHolaClient,createPortalCredits,createPortalData,createPortalShop,createWidgetTransport,creditsOfMoney,deliverableCellText,deliverableCellValues,deliverableStatus,deriveFields,emptyTableResponses,facetValues,footprintOf,footprintWith,formatDeliverableDate,groupDeliverableVersions,includesFor,inferSpec,isDeliverableChecked,mergeMessage,modeOf,money,normalizeDeliverableColType,normalizeDeliverableItem,orderBilling,parseDashboardSpec,parseDeliverableItems,parseDeliverableTable,parseTableResponses,paymentAsked,paymentPayMethods,placeWidgets,priceFor,priceLabel,publishedVersionOf,quantityRange,quoteSchedule,renderModel,setResponse,setTableReview,shelfPriceLabel,shelfProblem,splitLayout,textDeltaOf,thinkingDeltaOf,toolEventOf,totalFor,useArtifactUrl,useChat,useCredits,useHolaClient,useShop,useThread});
|
|
8
|
+
`)}},u=async()=>{let d=await l.read();if(!d.done)return i+=o.decode(d.value,{stream:!0}),a(),u()};await u()};var Et=/\/+$/,ce="/api/v1/end-user",Ve=e=>{let t=e.baseUrl.replace(Et,""),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()}`}),l=async o=>{let i=await fetch(`${t}${ce}/chat${r("?")}`,{method:"POST",headers:await s(),body:JSON.stringify({message:o})});if(!i.ok)throw new Error(`hola: message failed (${i.status})`);return{reply:(await i.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>T(`${t}${ce}/chat/info${r("?")}`,await s()),sendMessage:l,streamMessage:async(o,i)=>{try{let a=await l(o);i.onText?.(a.reply),i.onComplete?.(a)}catch(a){i.onError?.(x(a))}},subscribe:(o,i)=>{let a=i?.since??"0",u=!1,d,m=i?.intervalMs??3e3,p=typeof document<"u",c=()=>p&&document.visibilityState==="hidden",g=!1,y=()=>{if(!u){if(c()){g=!0;return}d=setTimeout(b,m)}},b=async()=>{try{let w=await T(`${t}${ce}/chat/thread?since=${encodeURIComponent(a)}${r("&")}`,await s());for(let I of w.messages)o.onMessage(I);a=w.cursor,o.onHealthy?.()}catch(w){o.onError?.(x(w))}y()},R=()=>{u||!g||c()||(g=!1,d&&clearTimeout(d),d=setTimeout(b,0))};p&&document.addEventListener("visibilitychange",R);let f=()=>{u=!0,d&&clearTimeout(d),p&&document.removeEventListener("visibilitychange",R)};return i?.signal?.addEventListener("abort",f),d=setTimeout(b,0),f}}};var B=require("react"),V=(e,t)=>{let[n,r]=(0,B.useState)("");return(0,B.useEffect)(()=>{if(!e){r("");return}let s=Uint8Array.from(atob(e),o=>o.charCodeAt(0)),l=URL.createObjectURL(new Blob([s],{type:t}));return r(l),()=>URL.revokeObjectURL(l)},[e,t]),n};var J=require("react");var G=require("react"),ze=require("react/jsx-runtime"),Ge=(0,G.createContext)(null),Qe=({client:e,children:t})=>(0,ze.jsx)(Ge.Provider,{value:e,children:t}),Q=()=>{let e=(0,G.useContext)(Ge);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};var S=require("react"),z=e=>{let[t,n]=(0,S.useState)([]),[r,s]=(0,S.useState)(""),[l,o]=(0,S.useState)(!1),[i,a]=(0,S.useState)(null),u=(0,S.useRef)(0),d=(0,S.useRef)(null);(0,S.useEffect)(()=>()=>d.current?.abort(),[]);let m=(0,S.useCallback)(()=>{let c=u.current;return u.current+=1,c},[]);(0,S.useEffect)(()=>{let c=!0;return e.getInfo().then(g=>{c&&g.greeting&&n([{id:m(),role:"assistant",text:g.greeting}])}).catch(()=>{}),()=>{c=!1}},[e,m]);let p=(0,S.useCallback)(()=>{let c=r.trim();if(!c||l)return;s(""),a(null),o(!0);let g=m(),y=m();n(f=>[...f,{id:g,role:"user",text:c},{id:y,role:"assistant",text:"",streaming:!0}]);let b=f=>{n(w=>w.map(I=>I.id===y?f(I):I))},R=new AbortController;d.current=R,e.streamMessage(c,{onText:f=>b(w=>({...w,text:w.text+f})),onComplete:f=>{b(w=>({...w,text:f.reply||w.text,artifacts:f.artifacts,streaming:!1})),o(!1)},onError:f=>{b(w=>({...w,streaming:!1})),a(f.error),o(!1)}},R.signal).catch(f=>{b(w=>({...w,streaming:!1})),a(f instanceof Error?f.message:"stream_failed"),o(!1)}).finally(()=>{o(!1),b(f=>f.streaming?{...f,streaming:!1}:f)})},[r,l,e,m]);return{messages:t,input:r,setInput:s,send:p,sending:l,error:i}};var v=require("react/jsx-runtime"),k={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"}},Ot=({artifact:e})=>{let t=V(e.dataBase64??"",e.mimeType),n=e.url??t;return n?e.mimeType.startsWith("image/")?(0,v.jsx)("a",{href:n,rel:"noopener noreferrer",target:"_blank",children:(0,v.jsx)("img",{alt:e.filename,src:n,style:k.image})}):(0,v.jsx)("a",{download:e.filename,href:n,style:k.link,children:e.filename}):null},Je=()=>{let e=Q(),{messages:t,input:n,setInput:r,send:s,sending:l,error:o}=z(e),i=(0,J.useRef)(null);(0,J.useEffect)(()=>{let u=i.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let a=u=>{u.preventDefault(),s()};return(0,v.jsxs)("div",{style:k.root,children:[(0,v.jsx)("div",{ref:i,style:k.log,children:t.map(u=>(0,v.jsxs)("div",{style:u.role==="user"?k.user:k.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?(0,v.jsx)("div",{style:k.artifacts,children:u.artifacts.map(d=>(0,v.jsx)(Ot,{artifact:d},d.filename))}):null]},u.id))}),o?(0,v.jsx)("div",{style:k.error,children:o}):null,(0,v.jsxs)("form",{onSubmit:a,style:k.form,children:[(0,v.jsx)("input",{"aria-label":"Message",onChange:u=>r(u.target.value),placeholder:"Type a message\u2026",style:k.input,value:n}),(0,v.jsx)("button",{disabled:l||n.trim().length===0,style:k.button,type:"submit",children:"Send"})]})]})};var Ht=/\/+$/,K=e=>{let t=e.sessionId,n=e.baseUrl.replace(Ht,""),r=o=>`${n}/endpoint/${encodeURIComponent(e.token)}${o}`,s={"content-type":"application/json"},l=(o,i)=>({url:r(o),headers:s,body:JSON.stringify({message:i,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>T(r("/config"),{}),sendMessage:async o=>{let i=await je(l("/message",o));return t=i.sessionId,i},streamMessage:(o,i,a)=>Be(l("/message/stream",o),i,u=>{t=u},a),subscribe:(o,i)=>{let a=i?.since??"0",u=!1,d,m=i?.intervalMs??3e3,p=async()=>{let g=t;if(g)try{let y=await T(r(`/messages?session=${encodeURIComponent(g)}&since=${encodeURIComponent(a)}`),{});for(let b of y.messages)o.onMessage(b);a=y.cursor,o.onHealthy?.()}catch(y){o.onError?.(x(y))}u||(d=setTimeout(p,m))},c=()=>{u=!0,d&&clearTimeout(d)};return i?.signal?.addEventListener("abort",c),d=setTimeout(p,0),c}}};var Ke=e=>"transport"in e?e.transport:K(e);var _t=/^https?:\/\//i,$t=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,Wt=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function Lt(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(_t.test(e))return"url";if($t.test(e))return"date"}return"text"}function me(e){let t=[],n=new Map;for(let r of e)for(let[s,l]of Object.entries(r.data??{})){if(l==null)continue;let o=n.get(s);o||(o=new Map,n.set(s,o),t.push(s));let i=Lt(l);o.set(i,(o.get(i)??0)+1)}return t.map(r=>{let s=n.get(r)??new Map,l="text",o=-1;for(let[i,a]of s)a>o&&(o=a,l=i);return{key:r,label:Wt(r),type:l}})}var Ut=e=>typeof e=="number"?e:Number(e)||0,Xe=e=>/rate|position|rank|score|percent|avg/i.test(e),Nt=/posted|published|sent|completed|shipped|launched|_at/i,qt=new Set(["service","order","end_user_id"]);function ge(e,t){let n=e.filter(a=>!qt.has(a.key)),r=n.filter(a=>a.type==="number").slice(0,3),s=n.find(a=>a.key==="status")??n.find(a=>a.type==="select"),l=n.find(a=>a.type==="date"&&Nt.test(a.key))??n.find(a=>a.type==="date"),o=n.filter(a=>a.type==="number"&&!Xe(a.key)).map(a=>({field:a,total:t.reduce((u,d)=>u+Ut(d.data[a.key]),0)})).sort((a,u)=>u.total-a.total).find(a=>a.total>0)?.field??null,i=[{type:"stat",label:"Items",agg:"count"}];for(let a of r){let u=Xe(a.key);i.push({type:"stat",metric:a.key,agg:u?"avg":"sum",label:u?`Avg ${a.label.toLowerCase()}`:a.label})}return l&&i.push({type:"line",x:l.key,y:o?.key,agg:"sum",title:o?`${o.label} by day`:"Items by day"}),s&&i.push({type:"donut",groupBy:s.key,title:s.label}),i.push({type:"table",columns:n.map(a=>a.key)}),{version:1,widgets:i}}var fe=6,ye=6,be=4,Ye={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},jt=e=>Math.max(1,Math.min(6,Math.round(e))),Bt=e=>Math.max(1,Math.min(4,Math.round(e)));function H(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function he(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function we(e){return Ye[e]}function X(e,t,n){let r=Ye[e];return{w:t===void 0?r.w:jt(t),h:n===void 0?r.h:Bt(n)}}function Y(e){let t=[],n=[],r=(o,i,a,u)=>{if(o<0||o+a>6)return!1;for(let d=0;d<u;d+=1){let m=n[i+d];if(m){for(let p=0;p<a;p+=1)if(m[o+p])return!1}}return!0},s=(o,i,a,u)=>{for(let d=0;d<u;d+=1){let m=n[i+d]??[];for(let p=0;p<a;p+=1)m[o+p]=!0;n[i+d]=m}},l=(o,i)=>{for(let a=0;;a+=1)for(let u=0;u+o<=6;u+=1)if(r(u,a,o,i))return{gx:u,gy:a}};for(let o of e){let i=X(H(o.kind),o.w,o.h),u=o.gx!==void 0&&o.gy!==void 0&&r(o.gx,o.gy,i.w,i.h)&&o.gx!==void 0&&o.gy!==void 0?{gx:o.gx,gy:o.gy}:l(i.w,i.h);s(u.gx,u.gy,i.w,i.h),t.push({widget:o,gx:u.gx,gy:u.gy,w:i.w,h:i.h})}return t}function xe(e){let t=[],n=[];for(let r of e)H(r.kind)==="block"?n.push(r):t.push(r);return{tiles:Y(t),blocks:n}}var Ze=new Set(["service","order","end_user_id"]),Se=e=>typeof e=="number"?e:Number(e)||0,et=e=>e==null?"":String(e);function ve(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 Vt(e,t,n,r){let s=new Map;for(let l of e){let o=new Date(et(l.data[t]));if(Number.isNaN(o.getTime()))continue;let i=o.toISOString().slice(0,10),a=s.get(i)??[];a.push(n?Se(l.data[n]):1),s.set(i,a)}return[...s.entries()].sort((l,o)=>l[0]<o[0]?-1:1).map(([l,o])=>({label:new Date(`${l}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:n?ve(r,o):o.length}))}function Gt(e,t,n,r="sum"){let s=new Map;for(let l of e){let o=et(l.data[t]).trim();if(!o)continue;let i=s.get(o)??[];i.push(n?Se(l.data[n]):1),s.set(o,i)}return[...s.entries()].map(([l,o])=>({label:l,value:n?ve(r,o):o.length})).sort((l,o)=>o.value-l.value)}function Qt(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 l=r.map(o=>Se(o.data[s.key]));return{kind:"stat",label:e.label??s.label,value:ve(e.agg??"sum",l)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let s=Vt(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=Gt(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(l=>t.get(l)).filter(l=>l!==void 0&&!Ze.has(l.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 Te(e,t,n,r={}){let s=new Map,l=a=>({byKey:new Map(a.fields.map(u=>[u.key,u])),cols:a.fields.filter(u=>!Ze.has(u.key)),rows:a.rows}),o=l({fields:t,rows:n});for(let[a,u]of Object.entries(r))s.set(a,l(u));let i=[];for(let a of e.widgets){let u=a.type==="text"?void 0:a.source,d=u?s.get(u):o;if(!d)continue;let m=Qt(a,d.byKey,d.cols,d.rows);m&&i.push({...m,w:a.w,h:a.h,gx:a.gx,gy:a.gy})}return i}var zt=new Set(["sum","avg","count","min","max","last"]),tt=e=>typeof e=="string"&&zt.has(e)?e:void 0,h=e=>typeof e=="string"&&e!==""?e:void 0,_=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,$=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 Jt(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:tt(t.agg),w:_(t.w),h:$(t.h),gx:D(t.gx),gy:D(t.gy)};case"line":case"bar":{let n=h(t.x);return n?{type:t.type,source:h(t.source),title:h(t.title),x:n,y:h(t.y)??h(t.column),agg:tt(t.agg),w:_(t.w),h:$(t.h),gx:D(t.gx),gy:D(t.gy)}:null}case"donut":{let n=h(t.groupBy)??h(t.column);return n?{type:"donut",source:h(t.source),title:h(t.title),groupBy:n,w:_(t.w),h:$(t.h),gx:D(t.gx),gy:D(t.gy)}:null}case"table":{let n=Array.isArray(t.columns)?t.columns.filter(r=>typeof r=="string"):void 0;return{type:"table",source:h(t.source),title:h(t.title),columns:n,w:_(t.w),h:$(t.h),gx:D(t.gx),gy:D(t.gy)}}case"text":{let n=h(t.body);return n?{type:"text",title:h(t.title),body:n,w:_(t.w),h:$(t.h),gx:D(t.gx),gy:D(t.gy)}:null}default:return null}}function Pe(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(Jt).filter(l=>l!==null);if(r.length===0)return null;let s=t.version;return{version:typeof s=="number"?s:1,title:h(t.title),widgets:r}}function Z(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 ee(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 ke(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let r=JSON.parse(t);if(Array.isArray(r))return r.map(Z).filter(s=>s!==null)}catch{}let n=String(e.file??"");return n?[{kind:"file",value:n}]:[]}function Ce(e,t,n,r=""){let l=ee(e).find(i=>i.v===t)?.items??[],o=l.filter(i=>i.kind==="file").map(i=>n.get(i.value)??"");return l.some(i=>i.kind==="table")&&o.push(r),o.length===0||o.some(i=>i==="")?"awaiting":o.some(i=>i==="revise")?"revise":"accepted"}function Re(e){return Number(e.published_version)||0}var te=["short","medium","long","iso","relative"],ne=["none","12h","24h"];function re(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="multi_select"||e==="file"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function Ie(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let n=t.columns.map((o,i)=>({key:typeof o.key=="string"&&o.key?o.key:typeof o.id=="string"&&o.id?o.id:`column_${i+1}`,label:typeof o.label=="string"?o.label:"",type:re(o.type),...(()=>{let a=Array.isArray(o.options)?[...new Set(o.options.map(u=>String(u).trim()).filter(u=>u!==""))]:[];return a.length>0?{options:a}:{}})(),...te.includes(o.dateFormat)?{dateFormat:o.dateFormat}:{},...ne.includes(o.timeFormat)?{timeFormat:o.timeFormat}:{},...o.clientEditable===!0?{clientEditable:!0}:{}})),r=t.rows.map((o,i)=>({id:typeof o.id=="string"&&o.id?o.id:`row_${i}`,cells:o.cells&&typeof o.cells=="object"?o.cells:{}})),s=typeof t.name=="string"?t.name:void 0,l=oe(t.view);return{columns:n,rows:r,...s?{name:s}:{},...l?{view:l}:{}}}}catch{}return null}var E=e=>{if(!Array.isArray(e))return;let t=e.map(n=>String(n).trim()).filter(n=>n!=="");return t.length>0?t:void 0};function oe(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n={};if(t.widths&&typeof t.widths=="object"&&!Array.isArray(t.widths))for(let[l,o]of Object.entries(t.widths))typeof o=="number"&&Number.isFinite(o)&&o>0&&(n[l]=Math.round(o));let r=typeof t.frozen=="number"&&Number.isFinite(t.frozen)&&t.frozen>0?Math.floor(t.frozen):void 0,s={...E(t.hidden)?{hidden:E(t.hidden)}:{},...E(t.order)?{order:E(t.order)}:{},...E(t.wrap)?{wrap:E(t.wrap)}:{},...Object.keys(n).length>0?{widths:n}:{},...r?{frozen:r}:{}};return Object.keys(s).length>0?s:void 0}function Ae(e){let t=e.view;if(!t)return e.columns;let n=new Set(e.columns.map(i=>i.key)),r=new Set(t.hidden??[]),s=(t.order??[]).filter(i=>n.has(i)),l=e.columns.map(i=>i.key).filter(i=>!s.includes(i)),o=new Map(e.columns.map(i=>[i.key,i]));return[...s,...l].filter(i=>!r.has(i)).map(i=>o.get(i)).filter(i=>!!i)}var se=6;function Me(e){let t=e.trim().toLowerCase();if(t==="")return-1;let n=2166136261;for(let r=0;r<t.length;r++)n^=t.charCodeAt(r),n=Math.imul(n,16777619);return Math.abs(n)%se}function Fe(e){try{let t=new URL(e),n=t.pathname.split("/").filter(Boolean).pop()??"";return n===""?t.host:`${t.host}/\u2026/${n}`}catch{return e}}function ie(e){return e==null?"":String(e)}function Ee(e){let t=ie(e).trim();if(t==="")return[];try{let n=JSON.parse(t);if(Array.isArray(n))return n.map(r=>String(r).trim()).filter(r=>r!=="")}catch{}return t.split(",").map(n=>n.trim()).filter(n=>n!=="")}function Oe(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function W(){return{cells:{},verdict:"",comment:""}}function He(e){if(typeof e!="string"||e.trim()==="")return W();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 W()}function _e(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 $e(e,t,n,r){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[n]:r}}}}function We(e,t,n){return{...e,verdict:t,comment:n}}function Le(e,t="medium",n="none"){let r=new Date(/^\d{4}-\d{2}-\d{2}$/.test(e)?`${e}T00:00:00`:e);if(Number.isNaN(r.getTime()))return e;if(t==="iso"){let o=a=>String(a).padStart(2,"0"),i=`${r.getFullYear()}-${o(r.getMonth()+1)}-${o(r.getDate())}`;return n==="none"?i:`${i} ${o(r.getHours())}:${o(r.getMinutes())}`}if(t==="relative")return Xt(r);let s=t==="short"?{year:"numeric",month:"numeric",day:"numeric"}:t==="long"?{year:"numeric",month:"long",day:"numeric",weekday:"long"}:{year:"numeric",month:"short",day:"numeric"},l=n==="none"?{}:{hour:"numeric",minute:"2-digit",hour12:n==="12h"};return r.toLocaleString(void 0,{...s,...l})}var Kt=6e4,nt=36e5,De=864e5;function Xt(e){let t=e.getTime()-Date.now(),n=Math.abs(t);if(n>30*De)return e.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"});let r=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"});return n<nt?r.format(Math.round(t/Kt),"minute"):n<De?r.format(Math.round(t/nt),"hour"):r.format(Math.round(t/De),"day")}var M=class extends Error{code;status;constructor(t,n,r){super(n),this.name="CreditRefused",this.code=t,this.status=r}},L=class extends M{credits;balance;short;constructor(t,n){super("insufficient_credits",t,402),this.name="InsufficientCredits",this.credits=n.credits,this.balance=n.balance,this.short=n.short}},Yt=/\/+$/,Zt="/api/v1/end-user",ue="Pre-payment",de="After-payment";function rt(e,t){if(e<=0)return[];let n=t&&typeof t.upfront=="number"&&Number.isFinite(t.upfront)?Math.max(0,Math.min(t.upfront,e)):e,r=Math.round((e-n)*100)/100,s=[];return n>0&&s.push({label:ue,amount:n}),r>0&&s.push({label:de,amount:r}),s}var le=e=>e.status!=="paid"&&e.asked!==!1,ot=(e,t)=>e.payMethods&&e.payMethods.length>0?[...e.payMethods]:[...t],st=(e,t)=>{let n=typeof t=="number"&&Number.isFinite(t)&&t>0?t:1;return!Number.isFinite(e)||e<=0?0:Math.ceil(e*n)},ae=e=>{let t=e.label.trim().toLowerCase();return t===ue.toLowerCase()?0:t===de.toLowerCase()?2:1},it=(e,t,n)=>{let r=t.filter(p=>p.order===n),s=p=>p.reduce((c,g)=>c+g.amount,0),l=s(r),o=s(r.filter(p=>p.status==="paid")),i=e.value>0,a=[...r].sort((p,c)=>ae(p)!==ae(c)?ae(p)-ae(c):(p.dueDate||p.paidAt).localeCompare(c.dueDate||c.paidAt)),u=a.filter(le),d=a.filter(p=>p.status!=="paid"&&!le(p)),m=l>0?s(u):e.value-o;return{value:e.value,priced:i,billed:l,paid:o,due:Math.max(0,m),scheduled:s(d),lines:a,asked:u,upcoming:d,awaitingPayment:i&&o<=0}},en=e=>{let{credits:t,balance:n,short:r}=e;return typeof t!="number"||typeof n!="number"||typeof r!="number"||!(Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r))?null:{credits:t,balance:n,short:r}},at=e=>{let t=e.baseUrl.replace(Yt,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async(s,l={method:"GET"})=>{try{let o=await fetch(`${t}${Zt}${s}`,{method:l.method,headers:{"content-type":"application/json",authorization:`Bearer ${await n()}`},...l.body===void 0?{}:{body:JSON.stringify(l.body)}});if(!o.ok){let i=await o.json().catch(()=>({})),a=i.message??`${l.method} ${s} \u2192 ${String(o.status)}`,u=en(i);throw o.status===402&&i.error==="insufficient_credits"&&u?new L(a,u):new M(i.error??"request_failed",a,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,l)=>r(`/payments/${encodeURIComponent(s)}/sent`,{method:"POST",body:{reference:l??""}}),payWithCredits:s=>r(`/payments/${encodeURIComponent(s)}/pay-with-credits`,{method:"POST",body:{}}),inquiryQuote:s=>r(`/inquiries/${encodeURIComponent(s)}/quote`),acceptInquiry:(s,l)=>r(`/inquiries/${encodeURIComponent(s)}/accept`,{method:"POST",body:{version:l}}),enquire:(s,l,o)=>r("/shop/enquire",{method:"POST",body:{productId:s,answers:l,name:o??""}})}};var tn=/\/+$/,F="/api/v1/end-user",O=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function nn(e){let t="";for(let r=0;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return btoa(t)}var lt=e=>{let t=e.baseUrl.replace(tn,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async()=>({"content-type":"application/json",authorization:`Bearer ${await n()}`}),s=async(o,i)=>{try{let a=await fetch(`${t}${F}${o}`,{method:i.method,headers:await r(),...i.body===void 0?{}:{body:JSON.stringify(i.body)}});if(a.status===409){let u=await a.json().catch(()=>({}));throw new O(u.message??"Someone else saved this first.")}if(!a.ok){let u=await a.text().catch(()=>""),d=`${i.method} ${o} \u2192 ${String(a.status)}`;try{let m=JSON.parse(u);m.message&&(d=m.message)}catch{d=u?`${d}: ${u}`:d}throw x({error:d})}return await a.json()}catch(a){throw a instanceof O?a:x(a)}},l=o=>`/tables/${encodeURIComponent(o)}`;return{listTables:async()=>(await T(`${t}${F}/tables`,await r())).tables,listRows:async(o,i)=>await T(`${t}${F}${l(o)}/rows?limit=${String(i??100)}`,await r()),insertRow:async(o,i)=>{let{rowIds:a}=await s(`${l(o)}/rows`,{method:"POST",body:{rows:[i]}}),u=a[0];if(!u)throw x(new Error("The row was not created."));return u},patchRow:async(o,i,a)=>(await s(`${l(o)}/rows/${encodeURIComponent(i)}`,{method:"PATCH",body:a})).updated,deleteRow:async(o,i)=>(await s(`/${encodeURIComponent(o)}/${encodeURIComponent(i)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await T(`${t}${F}/tables/files/rows?limit=200`,await r())).rows.map(i=>({id:i.rowId,filename:String(i.data.filename??""),source:String(i.data.source??"client"),campaign:String(i.data.campaign??""),size:typeof i.data.size=="number"?i.data.size:0,createdAt:i.createdAt})),uploadFile:async(o,i)=>{let a=new Uint8Array(await o.arrayBuffer());return await s("/files",{method:"POST",body:{filename:o.name,mime:o.type||"application/octet-stream",data:nn(a),...i===void 0?{}:{message:i}}})},fileLink:async o=>await T(`${t}${F}/files/${encodeURIComponent(o)}/url`,await r()),deleteFile:async o=>(await s(`/files/${encodeURIComponent(o)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await T(`${t}${F}/documents`,await r())).documents,readDocument:async o=>(await T(`${t}${F}/documents/${encodeURIComponent(o)}`,await r())).document,saveDocument:async(o,i)=>await s(`/documents/${encodeURIComponent(o)}`,{method:"PATCH",body:i})}};var rn=/\/+$/,on="/api/v1/end-user",ut=e=>{let t=e.baseUrl.replace(rn,""),n=async(r,s)=>{let l;try{l=await fetch(`${t}${on}${r}`,s===void 0?{}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})}catch(o){throw x(o)}if(l.status===429)throw x({error:"rate_limited",retryable:!0});if(!l.ok)throw x({error:`shop_request_failed_${String(l.status)}`});try{return await l.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,enquiryForm:Array.isArray(r.enquiryForm)?r.enquiryForm:[]}},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 sn=new Set(["buy","ask"]);function dt(e){return sn.has(e.mode)?e.mode:"ask"}var an={kind:"quoted"};function U(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 pt(e,t){let n=/^[a-z]+$/i.test(t)&&!t.endsWith("s")?"s":"";return`${e.toLocaleString()} ${t}${n}`}function Ue(e,t){return e.kind==="quoted"?"Priced on enquiry":e.kind==="flat"?U(e.price,t):`${U(e.unitPrice,t)} per ${e.unitStep===1?e.unit:pt(e.unitStep,e.unit)}`}function ct(e){let t=e.currency,n=e.pricing;if(n.kind!=="variants")return Ue(n,t);let r=n.variants.map(s=>s.price).filter(s=>typeof s=="number");return r.length>0?`From ${U(Math.min(...r),t)}`:"Priced on enquiry"}function mt(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}:an}function gt(e,t){return e.kind==="flat"?e.price:e.kind==="per_unit"?e.unitPrice*Math.ceil(t/Math.max(e.unitStep,1)):null}function ft(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 yt(e,t){let n=e.variants?.find(r=>r.name===t);return n&&n.includes.length>0?n.includes:e.includes}function bt(e,t){let n=[];for(let r of e){let s=t(r).trim();s&&!n.includes(s)&&n.push(s)}return n}function ht(e,t,n,r){let s=t?`${e.name} \u2014 ${t}`:e.name,l=n.kind==="per_unit"?`, ${pt(r,n.unit)}`:"";return`I'd like to buy ${s}${l}. How do I go ahead?`}function wt(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"),xt=e=>{let[t,n]=(0,A.useState)(null),[r,s]=(0,A.useState)(!0),[l,o]=(0,A.useState)(null),i=(0,A.useCallback)(async()=>{try{n(await e.wallet()),o(null)}catch{o("Couldn't read your balance just now.")}finally{s(!1)}},[e]),a=(0,A.useCallback)(()=>{i().catch(()=>{})},[i]);return(0,A.useEffect)(()=>(a(),window.addEventListener("focus",a),()=>{window.removeEventListener("focus",a)}),[a]),{wallet:t,loading:r,failure:l,refresh:a}};var C=require("react"),ln=e=>e&&typeof e=="object"&&typeof e.error=="string"?e.error:e instanceof Error?e.message:"shop_unavailable",St=e=>{let[t,n]=(0,C.useState)([]),[r,s]=(0,C.useState)([]),[l,o]=(0,C.useState)(!1),[i,a]=(0,C.useState)(!0),[u,d]=(0,C.useState)(null),[m,p]=(0,C.useState)(0);(0,C.useEffect)(()=>{let g=!0;return a(!0),e.listProducts().then(y=>{g&&(n(y.products),s(y.enquiryForm),o(y.truncated),d(null))}).catch(y=>{g&&d(ln(y))}).finally(()=>{g&&a(!1)}),()=>{g=!1}},[e,m]);let c=(0,C.useCallback)(()=>p(g=>g+1),[]);return{products:t,enquiryForm:r,truncated:l,loading:i,error:u,reload:c}};var P=require("react"),vt="greeting";function Ne(e,t){if(e.some(l=>l.id===t.id))return e;let n=e.filter(l=>l.id!==vt),r=l=>l.author==="client"==(t.author==="client");return[...n.filter(l=>!(l.pending&&r(l)&&l.text===t.text)),t]}var Tt=(e,t)=>{let[n,r]=(0,P.useState)([]),[s,l]=(0,P.useState)(""),[o,i]=(0,P.useState)(!1),[a,u]=(0,P.useState)(null),d=(0,P.useRef)(0),m=t?.pollMs??2e3;(0,P.useEffect)(()=>{let c=!0;return e.getInfo().then(g=>{c&&g.greeting&&r(y=>y.length===0?[{id:vt,cursor:"",author:"agent",text:g.greeting}]:y)}).catch(()=>{}),()=>{c=!1}},[e]),(0,P.useEffect)(()=>e.subscribe?.({onMessage:c=>r(g=>Ne(g,c)),onError:c=>u(c.error),onHealthy:()=>u(null)},{intervalMs:m}),[e,m]);let p=(0,P.useCallback)(()=>{let c=s.trim();if(!c||o)return;l(""),u(null),i(!0),d.current+=1;let g=`pending-${d.current}`,y={id:g,cursor:"",author:"client",text:c,pending:!0};r(b=>[...b,y]),e.sendMessage(c).then(b=>{i(!1),b.reply.trim()&&r(f=>f.some(I=>!I.pending&&I.author!=="client"&&I.text===b.reply)?f:(d.current+=1,[...f,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:b.reply,pending:!0}]))}).catch(b=>{u(b instanceof Error?b.message:"send_failed"),i(!1),r(R=>R.filter(f=>f.id!==g)),l(R=>R||c)})},[s,o,e]);return{messages:n,input:s,setInput:l,send:p,sending:o,error:a}};0&&(module.exports={Chat,CreditRefused,DATE_FORMATS,GRID_COLS,GRID_MAX_COLS,GRID_MAX_ROWS,HolaProvider,InsufficientCredits,OPTION_TINTS,PortalConflict,QUOTE_BALANCE_LABEL,QUOTE_DEPOSIT_LABEL,TIME_FORMATS,arrangedColumns,bandOfKind,bandOfType,buyRequestText,cellValue,createApiTransport,createHolaClient,createPortalCredits,createPortalData,createPortalShop,createWidgetTransport,creditsOfMoney,deliverableCellText,deliverableCellValues,deliverableStatus,deriveFields,emptyTableResponses,facetValues,footprintOf,footprintWith,formatDeliverableDate,groupDeliverableVersions,includesFor,inferSpec,isDeliverableChecked,mergeMessage,modeOf,money,normalizeDeliverableColType,normalizeDeliverableItem,optionTintIndex,orderBilling,parseArrangement,parseDashboardSpec,parseDeliverableItems,parseDeliverableTable,parseTableResponses,paymentAsked,paymentPayMethods,placeWidgets,priceFor,priceLabel,publishedVersionOf,quantityRange,quoteSchedule,renderModel,setResponse,setTableReview,shelfPriceLabel,shelfProblem,shortenUrl,splitLayout,textDeltaOf,thinkingDeltaOf,toolEventOf,totalFor,useArtifactUrl,useChat,useCredits,useHolaClient,useShop,useThread});
|
package/dist/index.d.cts
CHANGED
|
@@ -555,7 +555,13 @@ declare function publishedVersionOf(data: Record<string, unknown>): number;
|
|
|
555
555
|
* other is a column that changes meaning depending on where it was made. Widening it is a release
|
|
556
556
|
* — a tenant App pins its copy of this package — so the reader below stays tolerant and anything
|
|
557
557
|
* it does not recognise still lands as `text` rather than throwing. */
|
|
558
|
-
type DeliverableColType = "text" | "number" | "url" | "date" | "boolean" | "select" | "multi_select";
|
|
558
|
+
type DeliverableColType = "text" | "number" | "url" | "date" | "boolean" | "select" | "multi_select" | "file";
|
|
559
|
+
/** How much of a date to show. `relative` is the one that is not a format at all but an
|
|
560
|
+
* interpretation — "3 days ago" — and it is the right default nowhere and the right answer often. */
|
|
561
|
+
declare const DATE_FORMATS: readonly ["short", "medium", "long", "iso", "relative"];
|
|
562
|
+
declare const TIME_FORMATS: readonly ["none", "12h", "24h"];
|
|
563
|
+
type DateFormat = (typeof DATE_FORMATS)[number];
|
|
564
|
+
type TimeFormat = (typeof TIME_FORMATS)[number];
|
|
559
565
|
type DeliverableColumn = {
|
|
560
566
|
key: string;
|
|
561
567
|
label: string;
|
|
@@ -563,6 +569,12 @@ type DeliverableColumn = {
|
|
|
563
569
|
/** The closed vocabulary for a `select` / `multi_select`. Absent or empty = an OPEN enum, which is
|
|
564
570
|
* what every select was before this existed and what they all still are on older payloads. */
|
|
565
571
|
options?: string[];
|
|
572
|
+
/** How a `date` column reads. Absent = `medium`, which is what every date rendered as before this
|
|
573
|
+
* existed — so an older payload keeps exactly the look it had. */
|
|
574
|
+
dateFormat?: DateFormat;
|
|
575
|
+
/** Whether a `date` column shows a time, and in which clock. Absent = no time. A date column
|
|
576
|
+
* holds an instant either way; this only decides how much of it is worth showing. */
|
|
577
|
+
timeFormat?: TimeFormat;
|
|
566
578
|
/** The customer may fill this column in from their portal — their values live in the deliverable's
|
|
567
579
|
* `responses`, layered over the operator's cells. Absent = read-only (the default). */
|
|
568
580
|
clientEditable?: boolean;
|
|
@@ -571,11 +583,35 @@ type DeliverableRow = {
|
|
|
571
583
|
id: string;
|
|
572
584
|
cells: Record<string, unknown>;
|
|
573
585
|
};
|
|
586
|
+
/** How a deliverable table is ARRANGED — the same idea as a service slice's saved view, stored
|
|
587
|
+
* differently because there is nowhere else to put it.
|
|
588
|
+
*
|
|
589
|
+
* A service slice is a real table with a `table_id`, so its views live in their own table keyed by
|
|
590
|
+
* it. A deliverable's table is JSON inside a `client_tasks` row: it has no id to key anything to.
|
|
591
|
+
* So the arrangement travels INSIDE the payload — one per table rather than a set of named tabs,
|
|
592
|
+
* which is the honest shape for something with no identity to hang tabs off.
|
|
593
|
+
*
|
|
594
|
+
* Every field optional: the arrangement is absent on every table written before this, and absent
|
|
595
|
+
* has to mean "as authored". */
|
|
596
|
+
type DeliverableArrangement = {
|
|
597
|
+
/** Column keys the table does not show. The values stay in the rows. */
|
|
598
|
+
hidden?: string[];
|
|
599
|
+
/** Column keys left to right; ones it omits follow in the table's own order. */
|
|
600
|
+
order?: string[];
|
|
601
|
+
/** Column keys that wrap rather than clamping to one line. */
|
|
602
|
+
wrap?: string[];
|
|
603
|
+
/** Column widths in pixels, keyed by column. */
|
|
604
|
+
widths?: Record<string, number>;
|
|
605
|
+
/** How many leading columns stay put while the rest scroll. */
|
|
606
|
+
frozen?: number;
|
|
607
|
+
};
|
|
574
608
|
type DeliverableTable = {
|
|
575
609
|
/** The operator's name for this table (e.g. "Twitter influencers"). Optional for older payloads. */
|
|
576
610
|
name?: string;
|
|
577
611
|
columns: DeliverableColumn[];
|
|
578
612
|
rows: DeliverableRow[];
|
|
613
|
+
/** How it is arranged. Absent = as authored, which is what every existing table means. */
|
|
614
|
+
view?: DeliverableArrangement;
|
|
579
615
|
};
|
|
580
616
|
/** Legacy tables used `link`/`checkbox`; the current vocabulary is `url`/`boolean`. */
|
|
581
617
|
declare function normalizeDeliverableColType(t: unknown): DeliverableColType;
|
|
@@ -583,6 +619,37 @@ declare function normalizeDeliverableColType(t: unknown): DeliverableColType;
|
|
|
583
619
|
* columns carried `id` not `key`, so a legacy column keeps its cells by keying on that id). Returns
|
|
584
620
|
* null when `value` is not a table payload. */
|
|
585
621
|
declare function parseDeliverableTable(value: string): DeliverableTable | null;
|
|
622
|
+
/** Read an arrangement defensively, and return NOTHING rather than an empty object when there is
|
|
623
|
+
* none — an absent arrangement and one that says nothing are the same table, and storing the
|
|
624
|
+
* difference invites a reader to treat "{}" as a deliberate blank. */
|
|
625
|
+
declare function parseArrangement(raw: unknown): DeliverableArrangement | undefined;
|
|
626
|
+
/** The columns a table SHOWS, in the order it shows them. Columns the arrangement does not mention
|
|
627
|
+
* follow in the table's own order — so a column added after the arrangement was saved appears at
|
|
628
|
+
* the end rather than disappearing. */
|
|
629
|
+
declare function arrangedColumns(t: DeliverableTable): DeliverableColumn[];
|
|
630
|
+
/** WHICH TINT an option wears, as an index into a palette — never the palette itself.
|
|
631
|
+
*
|
|
632
|
+
* The SDK is headless, so it answers "which bucket" and each app maps that to its own colours: the
|
|
633
|
+
* console has design-system tokens, a tenant App has its own. What matters is that both derive the
|
|
634
|
+
* bucket the SAME way, so `blog` is the same colour to the operator choosing it and the customer
|
|
635
|
+
* reading it. Deriving it in two places is how those two drift apart.
|
|
636
|
+
*
|
|
637
|
+
* KEYED OFF THE VALUE, not its position in the vocabulary. Position is simpler and wrong the first
|
|
638
|
+
* time somebody reorders or deletes an option: every chip below the change recolours, and a status
|
|
639
|
+
* the team reads by colour quietly becomes a different colour.
|
|
640
|
+
*
|
|
641
|
+
* Six buckets. Past that the eye stops distinguishing and starts guessing; a seventh option wraps
|
|
642
|
+
* onto the first, which is honest — the colour is a hint, never the value, and every chip says its
|
|
643
|
+
* own name. */
|
|
644
|
+
declare const OPTION_TINTS = 6;
|
|
645
|
+
declare function optionTintIndex(value: string): number;
|
|
646
|
+
/** `https://bunbase.example/blog/why-bun` → `bunbase.example/…/why-bun`.
|
|
647
|
+
*
|
|
648
|
+
* The middle of a URL is never the informative part and a full one crowds out every column beside
|
|
649
|
+
* it. Shared for the same reason as the tint: a link that reads one way to the operator and another
|
|
650
|
+
* to the customer is the same table shown twice. Falls back to the raw string when it does not
|
|
651
|
+
* parse — a `url` column holds whatever was typed. */
|
|
652
|
+
declare function shortenUrl(raw: string): string;
|
|
586
653
|
/** A cell value as display text (a stored null/undefined reads as empty). */
|
|
587
654
|
declare function deliverableCellText(v: unknown): string;
|
|
588
655
|
/** The members of a `multi_select` cell.
|
|
@@ -617,7 +684,7 @@ declare function setResponse(responses: TableResponses, rowId: string, colKey: s
|
|
|
617
684
|
/** Set the review verdict + comment (immutably) — for the submit (approve / send back) action. */
|
|
618
685
|
declare function setTableReview(responses: TableResponses, verdict: TableReviewVerdict, comment: string): TableResponses;
|
|
619
686
|
/** A `date` cell stores YYYY-MM-DD; format it as e.g. "Aug 18, 2026" (raw string if unparseable). */
|
|
620
|
-
declare function formatDeliverableDate(v: string): string;
|
|
687
|
+
declare function formatDeliverableDate(v: string, format?: DateFormat, time?: TimeFormat): string;
|
|
621
688
|
|
|
622
689
|
/** Extract a streamed text delta from a raw pi turn event, or null. */
|
|
623
690
|
declare const textDeltaOf: (event: unknown) => string | null;
|
|
@@ -1604,4 +1671,4 @@ declare const useThread: (client: HolaClient, options?: {
|
|
|
1604
1671
|
pollMs?: number;
|
|
1605
1672
|
}) => UseThread;
|
|
1606
1673
|
|
|
1607
|
-
export { type Agg, type ApiTransportConfig, type Band, type ChartView, Chat, type ChatMessage, type ChosenPrice, type CreateHolaClientOptions, type CreditEntry, type CreditHistory, type CreditPack, CreditRefused, type CreditTotals, type CreditWallet, type CustomerPayment, type DashboardLayout, type DashboardSpec, type DataSource, type DeliverableColType, type DeliverableColumn, type DeliverableItem, type DeliverableItemKind, type DeliverableReviewState, type DeliverableRow, type DeliverableTable, type DeliverableVersion, type DonutWidget, GRID_COLS, GRID_MAX_COLS, GRID_MAX_ROWS, type HolaArtifact, type HolaAuthor, type HolaClient, type HolaCompletion, type HolaEmployeeInfo, type HolaError, type HolaIdentity, type HolaMessage, HolaProvider, type HolaStreamHandlers, type HolaSubscribeHandlers, type HolaSubscribeOptions, type HolaToolEvent, type HolaTransport, type InquiryQuote, InsufficientCredits, type OrderBilling, type PaidWithCredits, type PendingTopup, type PlacedWidget, type Point, PortalConflict, type PortalCredits, type PortalData, type PortalDocument, type PortalDocumentSummary, type PortalField, type PortalFile, type PortalRow, type PortalRowAuthor, type PortalRowPage, type PortalShop, type PortalShopConfig, type PortalTable, type Purchased, QUOTE_BALANCE_LABEL, QUOTE_DEPOSIT_LABEL, type QuoteScheduleLine, type QuoteTerms, type QuotedLine, type ResolvedWidget, type SeriesWidget, type ShopApplication, type ShopApplyResult, type ShopFormField, type ShopInclusion, type ShopMode, type ShopPricing, type ShopProduct, type ShopShelf, type ShopVariant, type StatView, type StatWidget, type TableResponses, type TableReviewVerdict, type TableWidget, type TextWidget, type ThreadMessage, type TopupStarted, type TransferDetails, type UseChat, type UseCredits, type UseShop, type UseThread, type Widget, type WidgetTransportConfig, type WidgetType, bandOfKind, bandOfType, buyRequestText, cellValue, createApiTransport, createHolaClient, createPortalCredits, createPortalData, createPortalShop, createWidgetTransport, creditsOfMoney, deliverableCellText, deliverableCellValues, deliverableStatus, deriveFields, emptyTableResponses, facetValues, footprintOf, footprintWith, formatDeliverableDate, groupDeliverableVersions, includesFor, inferSpec, isDeliverableChecked, mergeMessage, modeOf, money, normalizeDeliverableColType, normalizeDeliverableItem, orderBilling, parseDashboardSpec, parseDeliverableItems, parseDeliverableTable, parseTableResponses, paymentAsked, paymentPayMethods, placeWidgets, priceFor, priceLabel, publishedVersionOf, quantityRange, quoteSchedule, renderModel, setResponse, setTableReview, shelfPriceLabel, shelfProblem, splitLayout, textDeltaOf, thinkingDeltaOf, toolEventOf, totalFor, useArtifactUrl, useChat, useCredits, useHolaClient, useShop, useThread };
|
|
1674
|
+
export { type Agg, type ApiTransportConfig, type Band, type ChartView, Chat, type ChatMessage, type ChosenPrice, type CreateHolaClientOptions, type CreditEntry, type CreditHistory, type CreditPack, CreditRefused, type CreditTotals, type CreditWallet, type CustomerPayment, DATE_FORMATS, type DashboardLayout, type DashboardSpec, type DataSource, type DateFormat, type DeliverableArrangement, type DeliverableColType, type DeliverableColumn, type DeliverableItem, type DeliverableItemKind, type DeliverableReviewState, type DeliverableRow, type DeliverableTable, type DeliverableVersion, type DonutWidget, GRID_COLS, GRID_MAX_COLS, GRID_MAX_ROWS, type HolaArtifact, type HolaAuthor, type HolaClient, type HolaCompletion, type HolaEmployeeInfo, type HolaError, type HolaIdentity, type HolaMessage, HolaProvider, type HolaStreamHandlers, type HolaSubscribeHandlers, type HolaSubscribeOptions, type HolaToolEvent, type HolaTransport, type InquiryQuote, InsufficientCredits, OPTION_TINTS, type OrderBilling, type PaidWithCredits, type PendingTopup, type PlacedWidget, type Point, PortalConflict, type PortalCredits, type PortalData, type PortalDocument, type PortalDocumentSummary, type PortalField, type PortalFile, type PortalRow, type PortalRowAuthor, type PortalRowPage, type PortalShop, type PortalShopConfig, type PortalTable, type Purchased, QUOTE_BALANCE_LABEL, QUOTE_DEPOSIT_LABEL, type QuoteScheduleLine, type QuoteTerms, type QuotedLine, type ResolvedWidget, type SeriesWidget, type ShopApplication, type ShopApplyResult, type ShopFormField, type ShopInclusion, type ShopMode, type ShopPricing, type ShopProduct, type ShopShelf, type ShopVariant, type StatView, type StatWidget, TIME_FORMATS, type TableResponses, type TableReviewVerdict, type TableWidget, type TextWidget, type ThreadMessage, type TimeFormat, type TopupStarted, type TransferDetails, type UseChat, type UseCredits, type UseShop, type UseThread, type Widget, type WidgetTransportConfig, type WidgetType, arrangedColumns, bandOfKind, bandOfType, buyRequestText, cellValue, createApiTransport, createHolaClient, createPortalCredits, createPortalData, createPortalShop, createWidgetTransport, creditsOfMoney, deliverableCellText, deliverableCellValues, deliverableStatus, deriveFields, emptyTableResponses, facetValues, footprintOf, footprintWith, formatDeliverableDate, groupDeliverableVersions, includesFor, inferSpec, isDeliverableChecked, mergeMessage, modeOf, money, normalizeDeliverableColType, normalizeDeliverableItem, optionTintIndex, orderBilling, parseArrangement, parseDashboardSpec, parseDeliverableItems, parseDeliverableTable, parseTableResponses, paymentAsked, paymentPayMethods, placeWidgets, priceFor, priceLabel, publishedVersionOf, quantityRange, quoteSchedule, renderModel, setResponse, setTableReview, shelfPriceLabel, shelfProblem, shortenUrl, splitLayout, textDeltaOf, thinkingDeltaOf, toolEventOf, totalFor, useArtifactUrl, useChat, useCredits, useHolaClient, useShop, useThread };
|
package/dist/index.d.ts
CHANGED
|
@@ -555,7 +555,13 @@ declare function publishedVersionOf(data: Record<string, unknown>): number;
|
|
|
555
555
|
* other is a column that changes meaning depending on where it was made. Widening it is a release
|
|
556
556
|
* — a tenant App pins its copy of this package — so the reader below stays tolerant and anything
|
|
557
557
|
* it does not recognise still lands as `text` rather than throwing. */
|
|
558
|
-
type DeliverableColType = "text" | "number" | "url" | "date" | "boolean" | "select" | "multi_select";
|
|
558
|
+
type DeliverableColType = "text" | "number" | "url" | "date" | "boolean" | "select" | "multi_select" | "file";
|
|
559
|
+
/** How much of a date to show. `relative` is the one that is not a format at all but an
|
|
560
|
+
* interpretation — "3 days ago" — and it is the right default nowhere and the right answer often. */
|
|
561
|
+
declare const DATE_FORMATS: readonly ["short", "medium", "long", "iso", "relative"];
|
|
562
|
+
declare const TIME_FORMATS: readonly ["none", "12h", "24h"];
|
|
563
|
+
type DateFormat = (typeof DATE_FORMATS)[number];
|
|
564
|
+
type TimeFormat = (typeof TIME_FORMATS)[number];
|
|
559
565
|
type DeliverableColumn = {
|
|
560
566
|
key: string;
|
|
561
567
|
label: string;
|
|
@@ -563,6 +569,12 @@ type DeliverableColumn = {
|
|
|
563
569
|
/** The closed vocabulary for a `select` / `multi_select`. Absent or empty = an OPEN enum, which is
|
|
564
570
|
* what every select was before this existed and what they all still are on older payloads. */
|
|
565
571
|
options?: string[];
|
|
572
|
+
/** How a `date` column reads. Absent = `medium`, which is what every date rendered as before this
|
|
573
|
+
* existed — so an older payload keeps exactly the look it had. */
|
|
574
|
+
dateFormat?: DateFormat;
|
|
575
|
+
/** Whether a `date` column shows a time, and in which clock. Absent = no time. A date column
|
|
576
|
+
* holds an instant either way; this only decides how much of it is worth showing. */
|
|
577
|
+
timeFormat?: TimeFormat;
|
|
566
578
|
/** The customer may fill this column in from their portal — their values live in the deliverable's
|
|
567
579
|
* `responses`, layered over the operator's cells. Absent = read-only (the default). */
|
|
568
580
|
clientEditable?: boolean;
|
|
@@ -571,11 +583,35 @@ type DeliverableRow = {
|
|
|
571
583
|
id: string;
|
|
572
584
|
cells: Record<string, unknown>;
|
|
573
585
|
};
|
|
586
|
+
/** How a deliverable table is ARRANGED — the same idea as a service slice's saved view, stored
|
|
587
|
+
* differently because there is nowhere else to put it.
|
|
588
|
+
*
|
|
589
|
+
* A service slice is a real table with a `table_id`, so its views live in their own table keyed by
|
|
590
|
+
* it. A deliverable's table is JSON inside a `client_tasks` row: it has no id to key anything to.
|
|
591
|
+
* So the arrangement travels INSIDE the payload — one per table rather than a set of named tabs,
|
|
592
|
+
* which is the honest shape for something with no identity to hang tabs off.
|
|
593
|
+
*
|
|
594
|
+
* Every field optional: the arrangement is absent on every table written before this, and absent
|
|
595
|
+
* has to mean "as authored". */
|
|
596
|
+
type DeliverableArrangement = {
|
|
597
|
+
/** Column keys the table does not show. The values stay in the rows. */
|
|
598
|
+
hidden?: string[];
|
|
599
|
+
/** Column keys left to right; ones it omits follow in the table's own order. */
|
|
600
|
+
order?: string[];
|
|
601
|
+
/** Column keys that wrap rather than clamping to one line. */
|
|
602
|
+
wrap?: string[];
|
|
603
|
+
/** Column widths in pixels, keyed by column. */
|
|
604
|
+
widths?: Record<string, number>;
|
|
605
|
+
/** How many leading columns stay put while the rest scroll. */
|
|
606
|
+
frozen?: number;
|
|
607
|
+
};
|
|
574
608
|
type DeliverableTable = {
|
|
575
609
|
/** The operator's name for this table (e.g. "Twitter influencers"). Optional for older payloads. */
|
|
576
610
|
name?: string;
|
|
577
611
|
columns: DeliverableColumn[];
|
|
578
612
|
rows: DeliverableRow[];
|
|
613
|
+
/** How it is arranged. Absent = as authored, which is what every existing table means. */
|
|
614
|
+
view?: DeliverableArrangement;
|
|
579
615
|
};
|
|
580
616
|
/** Legacy tables used `link`/`checkbox`; the current vocabulary is `url`/`boolean`. */
|
|
581
617
|
declare function normalizeDeliverableColType(t: unknown): DeliverableColType;
|
|
@@ -583,6 +619,37 @@ declare function normalizeDeliverableColType(t: unknown): DeliverableColType;
|
|
|
583
619
|
* columns carried `id` not `key`, so a legacy column keeps its cells by keying on that id). Returns
|
|
584
620
|
* null when `value` is not a table payload. */
|
|
585
621
|
declare function parseDeliverableTable(value: string): DeliverableTable | null;
|
|
622
|
+
/** Read an arrangement defensively, and return NOTHING rather than an empty object when there is
|
|
623
|
+
* none — an absent arrangement and one that says nothing are the same table, and storing the
|
|
624
|
+
* difference invites a reader to treat "{}" as a deliberate blank. */
|
|
625
|
+
declare function parseArrangement(raw: unknown): DeliverableArrangement | undefined;
|
|
626
|
+
/** The columns a table SHOWS, in the order it shows them. Columns the arrangement does not mention
|
|
627
|
+
* follow in the table's own order — so a column added after the arrangement was saved appears at
|
|
628
|
+
* the end rather than disappearing. */
|
|
629
|
+
declare function arrangedColumns(t: DeliverableTable): DeliverableColumn[];
|
|
630
|
+
/** WHICH TINT an option wears, as an index into a palette — never the palette itself.
|
|
631
|
+
*
|
|
632
|
+
* The SDK is headless, so it answers "which bucket" and each app maps that to its own colours: the
|
|
633
|
+
* console has design-system tokens, a tenant App has its own. What matters is that both derive the
|
|
634
|
+
* bucket the SAME way, so `blog` is the same colour to the operator choosing it and the customer
|
|
635
|
+
* reading it. Deriving it in two places is how those two drift apart.
|
|
636
|
+
*
|
|
637
|
+
* KEYED OFF THE VALUE, not its position in the vocabulary. Position is simpler and wrong the first
|
|
638
|
+
* time somebody reorders or deletes an option: every chip below the change recolours, and a status
|
|
639
|
+
* the team reads by colour quietly becomes a different colour.
|
|
640
|
+
*
|
|
641
|
+
* Six buckets. Past that the eye stops distinguishing and starts guessing; a seventh option wraps
|
|
642
|
+
* onto the first, which is honest — the colour is a hint, never the value, and every chip says its
|
|
643
|
+
* own name. */
|
|
644
|
+
declare const OPTION_TINTS = 6;
|
|
645
|
+
declare function optionTintIndex(value: string): number;
|
|
646
|
+
/** `https://bunbase.example/blog/why-bun` → `bunbase.example/…/why-bun`.
|
|
647
|
+
*
|
|
648
|
+
* The middle of a URL is never the informative part and a full one crowds out every column beside
|
|
649
|
+
* it. Shared for the same reason as the tint: a link that reads one way to the operator and another
|
|
650
|
+
* to the customer is the same table shown twice. Falls back to the raw string when it does not
|
|
651
|
+
* parse — a `url` column holds whatever was typed. */
|
|
652
|
+
declare function shortenUrl(raw: string): string;
|
|
586
653
|
/** A cell value as display text (a stored null/undefined reads as empty). */
|
|
587
654
|
declare function deliverableCellText(v: unknown): string;
|
|
588
655
|
/** The members of a `multi_select` cell.
|
|
@@ -617,7 +684,7 @@ declare function setResponse(responses: TableResponses, rowId: string, colKey: s
|
|
|
617
684
|
/** Set the review verdict + comment (immutably) — for the submit (approve / send back) action. */
|
|
618
685
|
declare function setTableReview(responses: TableResponses, verdict: TableReviewVerdict, comment: string): TableResponses;
|
|
619
686
|
/** A `date` cell stores YYYY-MM-DD; format it as e.g. "Aug 18, 2026" (raw string if unparseable). */
|
|
620
|
-
declare function formatDeliverableDate(v: string): string;
|
|
687
|
+
declare function formatDeliverableDate(v: string, format?: DateFormat, time?: TimeFormat): string;
|
|
621
688
|
|
|
622
689
|
/** Extract a streamed text delta from a raw pi turn event, or null. */
|
|
623
690
|
declare const textDeltaOf: (event: unknown) => string | null;
|
|
@@ -1604,4 +1671,4 @@ declare const useThread: (client: HolaClient, options?: {
|
|
|
1604
1671
|
pollMs?: number;
|
|
1605
1672
|
}) => UseThread;
|
|
1606
1673
|
|
|
1607
|
-
export { type Agg, type ApiTransportConfig, type Band, type ChartView, Chat, type ChatMessage, type ChosenPrice, type CreateHolaClientOptions, type CreditEntry, type CreditHistory, type CreditPack, CreditRefused, type CreditTotals, type CreditWallet, type CustomerPayment, type DashboardLayout, type DashboardSpec, type DataSource, type DeliverableColType, type DeliverableColumn, type DeliverableItem, type DeliverableItemKind, type DeliverableReviewState, type DeliverableRow, type DeliverableTable, type DeliverableVersion, type DonutWidget, GRID_COLS, GRID_MAX_COLS, GRID_MAX_ROWS, type HolaArtifact, type HolaAuthor, type HolaClient, type HolaCompletion, type HolaEmployeeInfo, type HolaError, type HolaIdentity, type HolaMessage, HolaProvider, type HolaStreamHandlers, type HolaSubscribeHandlers, type HolaSubscribeOptions, type HolaToolEvent, type HolaTransport, type InquiryQuote, InsufficientCredits, type OrderBilling, type PaidWithCredits, type PendingTopup, type PlacedWidget, type Point, PortalConflict, type PortalCredits, type PortalData, type PortalDocument, type PortalDocumentSummary, type PortalField, type PortalFile, type PortalRow, type PortalRowAuthor, type PortalRowPage, type PortalShop, type PortalShopConfig, type PortalTable, type Purchased, QUOTE_BALANCE_LABEL, QUOTE_DEPOSIT_LABEL, type QuoteScheduleLine, type QuoteTerms, type QuotedLine, type ResolvedWidget, type SeriesWidget, type ShopApplication, type ShopApplyResult, type ShopFormField, type ShopInclusion, type ShopMode, type ShopPricing, type ShopProduct, type ShopShelf, type ShopVariant, type StatView, type StatWidget, type TableResponses, type TableReviewVerdict, type TableWidget, type TextWidget, type ThreadMessage, type TopupStarted, type TransferDetails, type UseChat, type UseCredits, type UseShop, type UseThread, type Widget, type WidgetTransportConfig, type WidgetType, bandOfKind, bandOfType, buyRequestText, cellValue, createApiTransport, createHolaClient, createPortalCredits, createPortalData, createPortalShop, createWidgetTransport, creditsOfMoney, deliverableCellText, deliverableCellValues, deliverableStatus, deriveFields, emptyTableResponses, facetValues, footprintOf, footprintWith, formatDeliverableDate, groupDeliverableVersions, includesFor, inferSpec, isDeliverableChecked, mergeMessage, modeOf, money, normalizeDeliverableColType, normalizeDeliverableItem, orderBilling, parseDashboardSpec, parseDeliverableItems, parseDeliverableTable, parseTableResponses, paymentAsked, paymentPayMethods, placeWidgets, priceFor, priceLabel, publishedVersionOf, quantityRange, quoteSchedule, renderModel, setResponse, setTableReview, shelfPriceLabel, shelfProblem, splitLayout, textDeltaOf, thinkingDeltaOf, toolEventOf, totalFor, useArtifactUrl, useChat, useCredits, useHolaClient, useShop, useThread };
|
|
1674
|
+
export { type Agg, type ApiTransportConfig, type Band, type ChartView, Chat, type ChatMessage, type ChosenPrice, type CreateHolaClientOptions, type CreditEntry, type CreditHistory, type CreditPack, CreditRefused, type CreditTotals, type CreditWallet, type CustomerPayment, DATE_FORMATS, type DashboardLayout, type DashboardSpec, type DataSource, type DateFormat, type DeliverableArrangement, type DeliverableColType, type DeliverableColumn, type DeliverableItem, type DeliverableItemKind, type DeliverableReviewState, type DeliverableRow, type DeliverableTable, type DeliverableVersion, type DonutWidget, GRID_COLS, GRID_MAX_COLS, GRID_MAX_ROWS, type HolaArtifact, type HolaAuthor, type HolaClient, type HolaCompletion, type HolaEmployeeInfo, type HolaError, type HolaIdentity, type HolaMessage, HolaProvider, type HolaStreamHandlers, type HolaSubscribeHandlers, type HolaSubscribeOptions, type HolaToolEvent, type HolaTransport, type InquiryQuote, InsufficientCredits, OPTION_TINTS, type OrderBilling, type PaidWithCredits, type PendingTopup, type PlacedWidget, type Point, PortalConflict, type PortalCredits, type PortalData, type PortalDocument, type PortalDocumentSummary, type PortalField, type PortalFile, type PortalRow, type PortalRowAuthor, type PortalRowPage, type PortalShop, type PortalShopConfig, type PortalTable, type Purchased, QUOTE_BALANCE_LABEL, QUOTE_DEPOSIT_LABEL, type QuoteScheduleLine, type QuoteTerms, type QuotedLine, type ResolvedWidget, type SeriesWidget, type ShopApplication, type ShopApplyResult, type ShopFormField, type ShopInclusion, type ShopMode, type ShopPricing, type ShopProduct, type ShopShelf, type ShopVariant, type StatView, type StatWidget, TIME_FORMATS, type TableResponses, type TableReviewVerdict, type TableWidget, type TextWidget, type ThreadMessage, type TimeFormat, type TopupStarted, type TransferDetails, type UseChat, type UseCredits, type UseShop, type UseThread, type Widget, type WidgetTransportConfig, type WidgetType, arrangedColumns, bandOfKind, bandOfType, buyRequestText, cellValue, createApiTransport, createHolaClient, createPortalCredits, createPortalData, createPortalShop, createWidgetTransport, creditsOfMoney, deliverableCellText, deliverableCellValues, deliverableStatus, deriveFields, emptyTableResponses, facetValues, footprintOf, footprintWith, formatDeliverableDate, groupDeliverableVersions, includesFor, inferSpec, isDeliverableChecked, mergeMessage, modeOf, money, normalizeDeliverableColType, normalizeDeliverableItem, optionTintIndex, orderBilling, parseArrangement, parseDashboardSpec, parseDeliverableItems, parseDeliverableTable, parseTableResponses, paymentAsked, paymentPayMethods, placeWidgets, priceFor, priceLabel, publishedVersionOf, quantityRange, quoteSchedule, renderModel, setResponse, setTableReview, shelfPriceLabel, shelfProblem, shortenUrl, splitLayout, textDeltaOf, thinkingDeltaOf, toolEventOf, totalFor, useArtifactUrl, useChat, useCredits, useHolaClient, useShop, useThread };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
var
|
|
3
|
-
`))r.startsWith(":")||(r.startsWith("event:")?t=r.slice(6).trim():r.startsWith("data:")&&n.push(r.slice(5).replace(
|
|
4
|
-
`)}:null},
|
|
2
|
+
var me=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},N=e=>{let t=me(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},q=e=>{let t=me(e);return t?.type==="thinking_delta"&&typeof t.delta=="string"?t.delta:null},j=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 nt=/^ /,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"}},rt=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(nt,"")));return n.length>0?{event:t,data:n.join(`
|
|
4
|
+
`)}:null},ot=(e,t,n)=>{let r;try{r=JSON.parse(e.data)}catch{return}if(e.event==="session"){let i=r.sessionId;i&&(n(i),t.onSession?.(i));return}if(e.event==="turn_event"){t.onEvent?.(r);let i=N(r);i&&t.onText?.(i);let l=q(r);l&&t.onThinking?.(l);let o=j(r);o&&t.onTool?.(o);return}if(e.event==="chat_completed"){let i=r;n(i.sessionId),t.onComplete?.(i);return}e.event==="chat_error"&&t.onError?.(x(r))},S=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()},ge=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()},fe=async(e,t,n,r)=>{let i=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:r});if(!(i.ok&&i.body)){t.onError?.({error:`stream_failed_${i.status}`});return}let l=i.body.getReader(),o=new TextDecoder,s="",a=()=>{let d=s.indexOf(`
|
|
5
5
|
|
|
6
|
-
`);for(;d!==-1;){let m=
|
|
6
|
+
`);for(;d!==-1;){let m=s.slice(0,d);s=s.slice(d+2);let p=rt(m);p&&ot(p,t,n),d=s.indexOf(`
|
|
7
7
|
|
|
8
|
-
`)}},u=async()=>{let d=await a.read();if(!d.done)return i+=o.decode(d.value,{stream:!0}),l(),u()};await u()};var Je=/\/+$/,V="/api/v1/end-user",Ke=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()}`}),a=async o=>{let i=await fetch(`${t}${V}/chat${r("?")}`,{method:"POST",headers:await s(),body:JSON.stringify({message:o})});if(!i.ok)throw new Error(`hola: message failed (${i.status})`);return{reply:(await i.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>P(`${t}${V}/chat/info${r("?")}`,await s()),sendMessage:a,streamMessage:async(o,i)=>{try{let l=await a(o);i.onText?.(l.reply),i.onComplete?.(l)}catch(l){i.onError?.(w(l))}},subscribe:(o,i)=>{let l=i?.since??"0",u=!1,d,m=i?.intervalMs??3e3,p=typeof document<"u",c=()=>p&&document.visibilityState==="hidden",g=!1,y=()=>{if(!u){if(c()){g=!0;return}d=setTimeout(b,m)}},b=async()=>{try{let x=await P(`${t}${V}/chat/thread?since=${encodeURIComponent(l)}${r("&")}`,await s());for(let T of x.messages)o.onMessage(T);l=x.cursor,o.onHealthy?.()}catch(x){o.onError?.(w(x))}y()},v=()=>{u||!g||c()||(g=!1,d&&clearTimeout(d),d=setTimeout(b,0))};p&&document.addEventListener("visibilitychange",v);let f=()=>{u=!0,d&&clearTimeout(d),p&&document.removeEventListener("visibilitychange",v)};return i?.signal?.addEventListener("abort",f),d=setTimeout(b,0),f}}};import{useEffect as Xe,useState as Ye}from"react";var B=(e,t)=>{let[n,r]=Ye("");return Xe(()=>{if(!e){r("");return}let s=Uint8Array.from(atob(e),o=>o.charCodeAt(0)),a=URL.createObjectURL(new Blob([s],{type:t}));return r(a),()=>URL.revokeObjectURL(a)},[e,t]),n};import{useEffect as rt,useRef as ot}from"react";import{createContext as Ze,useContext as et}from"react";import{jsx as nt}from"react/jsx-runtime";var de=Ze(null),tt=({client:e,children:t})=>nt(de.Provider,{value:e,children:t}),j=()=>{let e=et(de);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};import{useCallback as pe,useEffect as ce,useRef as me,useState as E}from"react";var G=e=>{let[t,n]=E([]),[r,s]=E(""),[a,o]=E(!1),[i,l]=E(null),u=me(0),d=me(null);ce(()=>()=>d.current?.abort(),[]);let m=pe(()=>{let c=u.current;return u.current+=1,c},[]);ce(()=>{let c=!0;return e.getInfo().then(g=>{c&&g.greeting&&n([{id:m(),role:"assistant",text:g.greeting}])}).catch(()=>{}),()=>{c=!1}},[e,m]);let p=pe(()=>{let c=r.trim();if(!c||a)return;s(""),l(null),o(!0);let g=m(),y=m();n(f=>[...f,{id:g,role:"user",text:c},{id:y,role:"assistant",text:"",streaming:!0}]);let b=f=>{n(x=>x.map(T=>T.id===y?f(T):T))},v=new AbortController;d.current=v,e.streamMessage(c,{onText:f=>b(x=>({...x,text:x.text+f})),onComplete:f=>{b(x=>({...x,text:f.reply||x.text,artifacts:f.artifacts,streaming:!1})),o(!1)},onError:f=>{b(x=>({...x,streaming:!1})),l(f.error),o(!1)}},v.signal).catch(f=>{b(x=>({...x,streaming:!1})),l(f instanceof Error?f.message:"stream_failed"),o(!1)}).finally(()=>{o(!1),b(f=>f.streaming?{...f,streaming:!1}:f)})},[r,a,e,m]);return{messages:t,input:r,setInput:s,send:p,sending:a,error:i}};import{jsx as C,jsxs as Q}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"}},st=({artifact:e})=>{let t=B(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},it=()=>{let e=j(),{messages:t,input:n,setInput:r,send:s,sending:a,error:o}=G(e),i=ot(null);rt(()=>{let u=i.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let l=u=>{u.preventDefault(),s()};return Q("div",{style:S.root,children:[C("div",{ref:i,style:S.log,children:t.map(u=>Q("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(st,{artifact:d},d.filename))}):null]},u.id))}),o?C("div",{style:S.error,children:o}):null,Q("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:a||n.trim().length===0,style:S.button,type:"submit",children:"Send"})]})]})};var at=/\/+$/,z=e=>{let t=e.sessionId,n=e.baseUrl.replace(at,""),r=o=>`${n}/endpoint/${encodeURIComponent(e.token)}${o}`,s={"content-type":"application/json"},a=(o,i)=>({url:r(o),headers:s,body:JSON.stringify({message:i,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>P(r("/config"),{}),sendMessage:async o=>{let i=await le(a("/message",o));return t=i.sessionId,i},streamMessage:(o,i,l)=>ue(a("/message/stream",o),i,u=>{t=u},l),subscribe:(o,i)=>{let l=i?.since??"0",u=!1,d,m=i?.intervalMs??3e3,p=async()=>{let g=t;if(g)try{let y=await P(r(`/messages?session=${encodeURIComponent(g)}&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(p,m))},c=()=>{u=!0,d&&clearTimeout(d)};return i?.signal?.addEventListener("abort",c),d=setTimeout(p,0),c}}};var lt=e=>"transport"in e?e.transport:z(e);var ut=/^https?:\/\//i,dt=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,pt=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function ct(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(ut.test(e))return"url";if(dt.test(e))return"date"}return"text"}function ge(e){let t=[],n=new Map;for(let r of e)for(let[s,a]of Object.entries(r.data??{})){if(a==null)continue;let o=n.get(s);o||(o=new Map,n.set(s,o),t.push(s));let i=ct(a);o.set(i,(o.get(i)??0)+1)}return t.map(r=>{let s=n.get(r)??new Map,a="text",o=-1;for(let[i,l]of s)l>o&&(o=l,a=i);return{key:r,label:pt(r),type:a}})}var mt=e=>typeof e=="number"?e:Number(e)||0,fe=e=>/rate|position|rank|score|percent|avg/i.test(e),gt=/posted|published|sent|completed|shipped|launched|_at/i,ft=new Set(["service","order","end_user_id"]);function ye(e,t){let n=e.filter(l=>!ft.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"),a=n.find(l=>l.type==="date"&>.test(l.key))??n.find(l=>l.type==="date"),o=n.filter(l=>l.type==="number"&&!fe(l.key)).map(l=>({field:l,total:t.reduce((u,d)=>u+mt(d.data[l.key]),0)})).sort((l,u)=>u.total-l.total).find(l=>l.total>0)?.field??null,i=[{type:"stat",label:"Items",agg:"count"}];for(let l of r){let u=fe(l.key);i.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return a&&i.push({type:"line",x:a.key,y:o?.key,agg:"sum",title:o?`${o.label} by day`:"Items by day"}),s&&i.push({type:"donut",groupBy:s.key,title:s.label}),i.push({type:"table",columns:n.map(l=>l.key)}),{version:1,widgets:i}}var be=6,he=6,xe=4,we={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},yt=e=>Math.max(1,Math.min(6,Math.round(e))),bt=e=>Math.max(1,Math.min(4,Math.round(e)));function W(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function Pe(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function Se(e){return we[e]}function J(e,t,n){let r=we[e];return{w:t===void 0?r.w:yt(t),h:n===void 0?r.h:bt(n)}}function K(e){let t=[],n=[],r=(o,i,l,u)=>{if(o<0||o+l>6)return!1;for(let d=0;d<u;d+=1){let m=n[i+d];if(m){for(let p=0;p<l;p+=1)if(m[o+p])return!1}}return!0},s=(o,i,l,u)=>{for(let d=0;d<u;d+=1){let m=n[i+d]??[];for(let p=0;p<l;p+=1)m[o+p]=!0;n[i+d]=m}},a=(o,i)=>{for(let l=0;;l+=1)for(let u=0;u+o<=6;u+=1)if(r(u,l,o,i))return{gx:u,gy:l}};for(let o of e){let i=J(W(o.kind),o.w,o.h),u=o.gx!==void 0&&o.gy!==void 0&&r(o.gx,o.gy,i.w,i.h)&&o.gx!==void 0&&o.gy!==void 0?{gx:o.gx,gy:o.gy}:a(i.w,i.h);s(u.gx,u.gy,i.w,i.h),t.push({widget:o,gx:u.gx,gy:u.gy,w:i.w,h:i.h})}return t}function ve(e){let t=[],n=[];for(let r of e)W(r.kind)==="block"?n.push(r):t.push(r);return{tiles:K(t),blocks:n}}var ke=new Set(["service","order","end_user_id"]),X=e=>typeof e=="number"?e:Number(e)||0,Te=e=>e==null?"":String(e);function Y(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 ht(e,t,n,r){let s=new Map;for(let a of e){let o=new Date(Te(a.data[t]));if(Number.isNaN(o.getTime()))continue;let i=o.toISOString().slice(0,10),l=s.get(i)??[];l.push(n?X(a.data[n]):1),s.set(i,l)}return[...s.entries()].sort((a,o)=>a[0]<o[0]?-1:1).map(([a,o])=>({label:new Date(`${a}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:n?Y(r,o):o.length}))}function xt(e,t,n,r="sum"){let s=new Map;for(let a of e){let o=Te(a.data[t]).trim();if(!o)continue;let i=s.get(o)??[];i.push(n?X(a.data[n]):1),s.set(o,i)}return[...s.entries()].map(([a,o])=>({label:a,value:n?Y(r,o):o.length})).sort((a,o)=>o.value-a.value)}function wt(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 a=r.map(o=>X(o.data[s.key]));return{kind:"stat",label:e.label??s.label,value:Y(e.agg??"sum",a)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let s=ht(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=xt(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(a=>t.get(a)).filter(a=>a!==void 0&&!ke.has(a.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,a=l=>({byKey:new Map(l.fields.map(u=>[u.key,u])),cols:l.fields.filter(u=>!ke.has(u.key)),rows:l.rows}),o=a({fields:t,rows:n});for(let[l,u]of Object.entries(r))s.set(l,a(u));let i=[];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 m=wt(l,d.byKey,d.cols,d.rows);m&&i.push({...m,w:l.w,h:l.h,gx:l.gx,gy:l.gy})}return i}var Pt=new Set(["sum","avg","count","min","max","last"]),Re=e=>typeof e=="string"&&Pt.has(e)?e:void 0,h=e=>typeof e=="string"&&e!==""?e:void 0,A=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,M=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 St(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:Re(t.agg),w:A(t.w),h:M(t.h),gx:k(t.gx),gy:k(t.gy)};case"line":case"bar":{let n=h(t.x);return n?{type:t.type,source:h(t.source),title:h(t.title),x:n,y:h(t.y)??h(t.column),agg:Re(t.agg),w:A(t.w),h:M(t.h),gx:k(t.gx),gy:k(t.gy)}:null}case"donut":{let n=h(t.groupBy)??h(t.column);return n?{type:"donut",source:h(t.source),title:h(t.title),groupBy:n,w:A(t.w),h:M(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:h(t.source),title:h(t.title),columns:n,w:A(t.w),h:M(t.h),gx:k(t.gx),gy:k(t.gy)}}case"text":{let n=h(t.body);return n?{type:"text",title:h(t.title),body:n,w:A(t.w),h:M(t.h),gx:k(t.gx),gy:k(t.gy)}:null}default:return null}}function De(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(St).filter(a=>a!==null);if(r.length===0)return null;let s=t.version;return{version:typeof s=="number"?s:1,title:h(t.title),widgets:r}}function Z(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 ee(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 Ie(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let r=JSON.parse(t);if(Array.isArray(r))return r.map(Z).filter(s=>s!==null)}catch{}let n=String(e.file??"");return n?[{kind:"file",value:n}]:[]}function Ae(e,t,n,r=""){let a=ee(e).find(i=>i.v===t)?.items??[],o=a.filter(i=>i.kind==="file").map(i=>n.get(i.value)??"");return a.some(i=>i.kind==="table")&&o.push(r),o.length===0||o.some(i=>i==="")?"awaiting":o.some(i=>i==="revise")?"revise":"accepted"}function Me(e){return Number(e.published_version)||0}function te(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="multi_select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function He(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let n=t.columns.map((a,o)=>({key:typeof a.key=="string"&&a.key?a.key:typeof a.id=="string"&&a.id?a.id:`column_${o+1}`,label:typeof a.label=="string"?a.label:"",type:te(a.type),...(()=>{let i=Array.isArray(a.options)?[...new Set(a.options.map(l=>String(l).trim()).filter(l=>l!==""))]:[];return i.length>0?{options:i}:{}})(),...a.clientEditable===!0?{clientEditable:!0}:{}})),r=t.rows.map((a,o)=>({id:typeof a.id=="string"&&a.id?a.id:`row_${o}`,cells:a.cells&&typeof a.cells=="object"?a.cells:{}})),s=typeof t.name=="string"?t.name:void 0;return{columns:n,rows:r,...s?{name:s}:{}}}}catch{}return null}function ne(e){return e==null?"":String(e)}function Ee(e){let t=ne(e).trim();if(t==="")return[];try{let n=JSON.parse(t);if(Array.isArray(n))return n.map(r=>String(r).trim()).filter(r=>r!=="")}catch{}return t.split(",").map(n=>n.trim()).filter(n=>n!=="")}function We(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function $(){return{cells:{},verdict:"",comment:""}}function $e(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 Oe(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 Fe(e,t,n,r){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[n]:r}}}}function _e(e,t,n){return{...e,verdict:t,comment:n}}function Le(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 D=class extends Error{code;status;constructor(t,n,r){super(n),this.name="CreditRefused",this.code=t,this.status=r}},F=class extends D{credits;balance;short;constructor(t,n){super("insufficient_credits",t,402),this.name="InsufficientCredits",this.credits=n.credits,this.balance=n.balance,this.short=n.short}},vt=/\/+$/,kt="/api/v1/end-user",oe="Pre-payment",se="After-payment";function Tt(e,t){if(e<=0)return[];let n=t&&typeof t.upfront=="number"&&Number.isFinite(t.upfront)?Math.max(0,Math.min(t.upfront,e)):e,r=Math.round((e-n)*100)/100,s=[];return n>0&&s.push({label:oe,amount:n}),r>0&&s.push({label:se,amount:r}),s}var re=e=>e.status!=="paid"&&e.asked!==!1,Ct=(e,t)=>e.payMethods&&e.payMethods.length>0?[...e.payMethods]:[...t],Rt=(e,t)=>{let n=typeof t=="number"&&Number.isFinite(t)&&t>0?t:1;return!Number.isFinite(e)||e<=0?0:Math.ceil(e*n)},O=e=>{let t=e.label.trim().toLowerCase();return t===oe.toLowerCase()?0:t===se.toLowerCase()?2:1},Dt=(e,t,n)=>{let r=t.filter(p=>p.order===n),s=p=>p.reduce((c,g)=>c+g.amount,0),a=s(r),o=s(r.filter(p=>p.status==="paid")),i=e.value>0,l=[...r].sort((p,c)=>O(p)!==O(c)?O(p)-O(c):(p.dueDate||p.paidAt).localeCompare(c.dueDate||c.paidAt)),u=l.filter(re),d=l.filter(p=>p.status!=="paid"&&!re(p)),m=a>0?s(u):e.value-o;return{value:e.value,priced:i,billed:a,paid:o,due:Math.max(0,m),scheduled:s(d),lines:l,asked:u,upcoming:d,awaitingPayment:i&&o<=0}},It=e=>{let{credits:t,balance:n,short:r}=e;return typeof t!="number"||typeof n!="number"||typeof r!="number"||!(Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r))?null:{credits:t,balance:n,short:r}},At=e=>{let t=e.baseUrl.replace(vt,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async(s,a={method:"GET"})=>{try{let o=await fetch(`${t}${kt}${s}`,{method:a.method,headers:{"content-type":"application/json",authorization:`Bearer ${await n()}`},...a.body===void 0?{}:{body:JSON.stringify(a.body)}});if(!o.ok){let i=await o.json().catch(()=>({})),l=i.message??`${a.method} ${s} \u2192 ${String(o.status)}`,u=It(i);throw o.status===402&&i.error==="insufficient_credits"&&u?new F(l,u):new D(i.error??"request_failed",l,o.status)}return await o.json()}catch(o){throw o instanceof D?o:w(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,a)=>r(`/payments/${encodeURIComponent(s)}/sent`,{method:"POST",body:{reference:a??""}}),payWithCredits:s=>r(`/payments/${encodeURIComponent(s)}/pay-with-credits`,{method:"POST",body:{}}),inquiryQuote:s=>r(`/inquiries/${encodeURIComponent(s)}/quote`),acceptInquiry:(s,a)=>r(`/inquiries/${encodeURIComponent(s)}/accept`,{method:"POST",body:{version:a}}),enquire:(s,a,o)=>r("/shop/enquire",{method:"POST",body:{productId:s,answers:a,name:o??""}})}};var Mt=/\/+$/,R="/api/v1/end-user",H=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function Ht(e){let t="";for(let r=0;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return btoa(t)}var Et=e=>{let t=e.baseUrl.replace(Mt,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async()=>({"content-type":"application/json",authorization:`Bearer ${await n()}`}),s=async(o,i)=>{try{let l=await fetch(`${t}${R}${o}`,{method:i.method,headers:await r(),...i.body===void 0?{}:{body:JSON.stringify(i.body)}});if(l.status===409){let u=await l.json().catch(()=>({}));throw new H(u.message??"Someone else saved this first.")}if(!l.ok){let u=await l.text().catch(()=>""),d=`${i.method} ${o} \u2192 ${String(l.status)}`;try{let m=JSON.parse(u);m.message&&(d=m.message)}catch{d=u?`${d}: ${u}`:d}throw w({error:d})}return await l.json()}catch(l){throw l instanceof H?l:w(l)}},a=o=>`/tables/${encodeURIComponent(o)}`;return{listTables:async()=>(await P(`${t}${R}/tables`,await r())).tables,listRows:async(o,i)=>await P(`${t}${R}${a(o)}/rows?limit=${String(i??100)}`,await r()),insertRow:async(o,i)=>{let{rowIds:l}=await s(`${a(o)}/rows`,{method:"POST",body:{rows:[i]}}),u=l[0];if(!u)throw w(new Error("The row was not created."));return u},patchRow:async(o,i,l)=>(await s(`${a(o)}/rows/${encodeURIComponent(i)}`,{method:"PATCH",body:l})).updated,deleteRow:async(o,i)=>(await s(`/${encodeURIComponent(o)}/${encodeURIComponent(i)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await P(`${t}${R}/tables/files/rows?limit=200`,await r())).rows.map(i=>({id:i.rowId,filename:String(i.data.filename??""),source:String(i.data.source??"client"),campaign:String(i.data.campaign??""),size:typeof i.data.size=="number"?i.data.size:0,createdAt:i.createdAt})),uploadFile:async(o,i)=>{let l=new Uint8Array(await o.arrayBuffer());return await s("/files",{method:"POST",body:{filename:o.name,mime:o.type||"application/octet-stream",data:Ht(l),...i===void 0?{}:{message:i}}})},fileLink:async o=>await P(`${t}${R}/files/${encodeURIComponent(o)}/url`,await r()),deleteFile:async o=>(await s(`/files/${encodeURIComponent(o)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await P(`${t}${R}/documents`,await r())).documents,readDocument:async o=>(await P(`${t}${R}/documents/${encodeURIComponent(o)}`,await r())).document,saveDocument:async(o,i)=>await s(`/documents/${encodeURIComponent(o)}`,{method:"PATCH",body:i})}};var Wt=/\/+$/,$t="/api/v1/end-user",Ot=e=>{let t=e.baseUrl.replace(Wt,""),n=async(r,s)=>{let a;try{a=await fetch(`${t}${$t}${r}`,s===void 0?{}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})}catch(o){throw w(o)}if(a.status===429)throw w({error:"rate_limited",retryable:!0});if(!a.ok)throw w({error:`shop_request_failed_${String(a.status)}`});try{return await a.json()}catch(o){throw w(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,enquiryForm:Array.isArray(r.enquiryForm)?r.enquiryForm:[]}},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 Ft=new Set(["buy","ask"]);function _t(e){return Ft.has(e.mode)?e.mode:"ask"}var Lt={kind:"quoted"};function _(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 Ue(e,t){let n=/^[a-z]+$/i.test(t)&&!t.endsWith("s")?"s":"";return`${e.toLocaleString()} ${t}${n}`}function Ne(e,t){return e.kind==="quoted"?"Priced on enquiry":e.kind==="flat"?_(e.price,t):`${_(e.unitPrice,t)} per ${e.unitStep===1?e.unit:Ue(e.unitStep,e.unit)}`}function Ut(e){let t=e.currency,n=e.pricing;if(n.kind!=="variants")return Ne(n,t);let r=n.variants.map(s=>s.price).filter(s=>typeof s=="number");return r.length>0?`From ${_(Math.min(...r),t)}`:"Priced on enquiry"}function Nt(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}:Lt}function qt(e,t){return e.kind==="flat"?e.price:e.kind==="per_unit"?e.unitPrice*Math.ceil(t/Math.max(e.unitStep,1)):null}function Vt(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 Bt(e,t){let n=e.variants?.find(r=>r.name===t);return n&&n.includes.length>0?n.includes:e.includes}function jt(e,t){let n=[];for(let r of e){let s=t(r).trim();s&&!n.includes(s)&&n.push(s)}return n}function Gt(e,t,n,r){let s=t?`${e.name} \u2014 ${t}`:e.name,a=n.kind==="per_unit"?`, ${Ue(r,n.unit)}`:"";return`I'd like to buy ${s}${a}. How do I go ahead?`}function Qt(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 qe,useEffect as zt,useState as ie}from"react";var Jt=e=>{let[t,n]=ie(null),[r,s]=ie(!0),[a,o]=ie(null),i=qe(async()=>{try{n(await e.wallet()),o(null)}catch{o("Couldn't read your balance just now.")}finally{s(!1)}},[e]),l=qe(()=>{i().catch(()=>{})},[i]);return zt(()=>(l(),window.addEventListener("focus",l),()=>{window.removeEventListener("focus",l)}),[l]),{wallet:t,loading:r,failure:a,refresh:l}};import{useCallback as Kt,useEffect as Xt,useState as I}from"react";var Yt=e=>e&&typeof e=="object"&&typeof e.error=="string"?e.error:e instanceof Error?e.message:"shop_unavailable",Zt=e=>{let[t,n]=I([]),[r,s]=I([]),[a,o]=I(!1),[i,l]=I(!0),[u,d]=I(null),[m,p]=I(0);Xt(()=>{let g=!0;return l(!0),e.listProducts().then(y=>{g&&(n(y.products),s(y.enquiryForm),o(y.truncated),d(null))}).catch(y=>{g&&d(Yt(y))}).finally(()=>{g&&l(!1)}),()=>{g=!1}},[e,m]);let c=Kt(()=>p(g=>g+1),[]);return{products:t,enquiryForm:r,truncated:a,loading:i,error:u,reload:c}};import{useCallback as en,useEffect as Ve,useRef as tn,useState as L}from"react";var Be="greeting";function je(e,t){if(e.some(a=>a.id===t.id))return e;let n=e.filter(a=>a.id!==Be),r=a=>a.author==="client"==(t.author==="client");return[...n.filter(a=>!(a.pending&&r(a)&&a.text===t.text)),t]}var nn=(e,t)=>{let[n,r]=L([]),[s,a]=L(""),[o,i]=L(!1),[l,u]=L(null),d=tn(0),m=t?.pollMs??2e3;Ve(()=>{let c=!0;return e.getInfo().then(g=>{c&&g.greeting&&r(y=>y.length===0?[{id:Be,cursor:"",author:"agent",text:g.greeting}]:y)}).catch(()=>{}),()=>{c=!1}},[e]),Ve(()=>e.subscribe?.({onMessage:c=>r(g=>je(g,c)),onError:c=>u(c.error),onHealthy:()=>u(null)},{intervalMs:m}),[e,m]);let p=en(()=>{let c=s.trim();if(!c||o)return;a(""),u(null),i(!0),d.current+=1;let g=`pending-${d.current}`,y={id:g,cursor:"",author:"client",text:c,pending:!0};r(b=>[...b,y]),e.sendMessage(c).then(b=>{i(!1),b.reply.trim()&&r(f=>f.some(T=>!T.pending&&T.author!=="client"&&T.text===b.reply)?f:(d.current+=1,[...f,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:b.reply,pending:!0}]))}).catch(b=>{u(b instanceof Error?b.message:"send_failed"),i(!1),r(v=>v.filter(f=>f.id!==g)),a(v=>v||c)})},[s,o,e]);return{messages:n,input:s,setInput:a,send:p,sending:o,error:l}};export{it as Chat,D as CreditRefused,be as GRID_COLS,he as GRID_MAX_COLS,xe as GRID_MAX_ROWS,tt as HolaProvider,F as InsufficientCredits,H as PortalConflict,se as QUOTE_BALANCE_LABEL,oe as QUOTE_DEPOSIT_LABEL,W as bandOfKind,Pe as bandOfType,Gt as buyRequestText,Oe as cellValue,Ke as createApiTransport,lt as createHolaClient,At as createPortalCredits,Et as createPortalData,Ot as createPortalShop,z as createWidgetTransport,Rt as creditsOfMoney,ne as deliverableCellText,Ee as deliverableCellValues,Ae as deliverableStatus,ge as deriveFields,$ as emptyTableResponses,jt as facetValues,Se as footprintOf,J as footprintWith,Le as formatDeliverableDate,ee as groupDeliverableVersions,Bt as includesFor,ye as inferSpec,We as isDeliverableChecked,je as mergeMessage,_t as modeOf,_ as money,te as normalizeDeliverableColType,Z as normalizeDeliverableItem,Dt as orderBilling,De as parseDashboardSpec,Ie as parseDeliverableItems,He as parseDeliverableTable,$e as parseTableResponses,re as paymentAsked,Ct as paymentPayMethods,K as placeWidgets,Nt as priceFor,Ne as priceLabel,Me as publishedVersionOf,Vt as quantityRange,Tt as quoteSchedule,Ce as renderModel,Fe as setResponse,_e as setTableReview,Ut as shelfPriceLabel,Qt as shelfProblem,ve as splitLayout,U as textDeltaOf,N as thinkingDeltaOf,q as toolEventOf,qt as totalFor,B as useArtifactUrl,G as useChat,Jt as useCredits,j as useHolaClient,Zt as useShop,nn as useThread};
|
|
8
|
+
`)}},u=async()=>{let d=await l.read();if(!d.done)return s+=o.decode(d.value,{stream:!0}),a(),u()};await u()};var st=/\/+$/,B="/api/v1/end-user",it=e=>{let t=e.baseUrl.replace(st,""),n=()=>typeof e.token=="function"?e.token():e.token,r=o=>e.project?`${o}project=${encodeURIComponent(e.project)}`:"",i=async()=>({"content-type":"application/json",authorization:`Bearer ${await n()}`}),l=async o=>{let s=await fetch(`${t}${B}/chat${r("?")}`,{method:"POST",headers:await i(),body:JSON.stringify({message:o})});if(!s.ok)throw new Error(`hola: message failed (${s.status})`);return{reply:(await s.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>S(`${t}${B}/chat/info${r("?")}`,await i()),sendMessage:l,streamMessage:async(o,s)=>{try{let a=await l(o);s.onText?.(a.reply),s.onComplete?.(a)}catch(a){s.onError?.(x(a))}},subscribe:(o,s)=>{let a=s?.since??"0",u=!1,d,m=s?.intervalMs??3e3,p=typeof document<"u",c=()=>p&&document.visibilityState==="hidden",g=!1,y=()=>{if(!u){if(c()){g=!0;return}d=setTimeout(b,m)}},b=async()=>{try{let w=await S(`${t}${B}/chat/thread?since=${encodeURIComponent(a)}${r("&")}`,await i());for(let k of w.messages)o.onMessage(k);a=w.cursor,o.onHealthy?.()}catch(w){o.onError?.(x(w))}y()},T=()=>{u||!g||c()||(g=!1,d&&clearTimeout(d),d=setTimeout(b,0))};p&&document.addEventListener("visibilitychange",T);let f=()=>{u=!0,d&&clearTimeout(d),p&&document.removeEventListener("visibilitychange",T)};return s?.signal?.addEventListener("abort",f),d=setTimeout(b,0),f}}};import{useEffect as at,useState as lt}from"react";var V=(e,t)=>{let[n,r]=lt("");return at(()=>{if(!e){r("");return}let i=Uint8Array.from(atob(e),o=>o.charCodeAt(0)),l=URL.createObjectURL(new Blob([i],{type:t}));return r(l),()=>URL.revokeObjectURL(l)},[e,t]),n};import{useEffect as mt,useRef as gt}from"react";import{createContext as ut,useContext as dt}from"react";import{jsx as ct}from"react/jsx-runtime";var ye=ut(null),pt=({client:e,children:t})=>ct(ye.Provider,{value:e,children:t}),G=()=>{let e=dt(ye);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};import{useCallback as be,useEffect as he,useRef as we,useState as O}from"react";var Q=e=>{let[t,n]=O([]),[r,i]=O(""),[l,o]=O(!1),[s,a]=O(null),u=we(0),d=we(null);he(()=>()=>d.current?.abort(),[]);let m=be(()=>{let c=u.current;return u.current+=1,c},[]);he(()=>{let c=!0;return e.getInfo().then(g=>{c&&g.greeting&&n([{id:m(),role:"assistant",text:g.greeting}])}).catch(()=>{}),()=>{c=!1}},[e,m]);let p=be(()=>{let c=r.trim();if(!c||l)return;i(""),a(null),o(!0);let g=m(),y=m();n(f=>[...f,{id:g,role:"user",text:c},{id:y,role:"assistant",text:"",streaming:!0}]);let b=f=>{n(w=>w.map(k=>k.id===y?f(k):k))},T=new AbortController;d.current=T,e.streamMessage(c,{onText:f=>b(w=>({...w,text:w.text+f})),onComplete:f=>{b(w=>({...w,text:f.reply||w.text,artifacts:f.artifacts,streaming:!1})),o(!1)},onError:f=>{b(w=>({...w,streaming:!1})),a(f.error),o(!1)}},T.signal).catch(f=>{b(w=>({...w,streaming:!1})),a(f instanceof Error?f.message:"stream_failed"),o(!1)}).finally(()=>{o(!1),b(f=>f.streaming?{...f,streaming:!1}:f)})},[r,l,e,m]);return{messages:t,input:r,setInput:i,send:p,sending:l,error:s}};import{jsx as C,jsxs as z}from"react/jsx-runtime";var v={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),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:v.image})}):C("a",{download:e.filename,href:n,style:v.link,children:e.filename}):null},yt=()=>{let e=G(),{messages:t,input:n,setInput:r,send:i,sending:l,error:o}=Q(e),s=gt(null);mt(()=>{let u=s.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let a=u=>{u.preventDefault(),i()};return z("div",{style:v.root,children:[C("div",{ref:s,style:v.log,children:t.map(u=>z("div",{style:u.role==="user"?v.user:v.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?C("div",{style:v.artifacts,children:u.artifacts.map(d=>C(ft,{artifact:d},d.filename))}):null]},u.id))}),o?C("div",{style:v.error,children:o}):null,z("form",{onSubmit:a,style:v.form,children:[C("input",{"aria-label":"Message",onChange:u=>r(u.target.value),placeholder:"Type a message\u2026",style:v.input,value:n}),C("button",{disabled:l||n.trim().length===0,style:v.button,type:"submit",children:"Send"})]})]})};var bt=/\/+$/,J=e=>{let t=e.sessionId,n=e.baseUrl.replace(bt,""),r=o=>`${n}/endpoint/${encodeURIComponent(e.token)}${o}`,i={"content-type":"application/json"},l=(o,s)=>({url:r(o),headers:i,body:JSON.stringify({message:s,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>S(r("/config"),{}),sendMessage:async o=>{let s=await ge(l("/message",o));return t=s.sessionId,s},streamMessage:(o,s,a)=>fe(l("/message/stream",o),s,u=>{t=u},a),subscribe:(o,s)=>{let a=s?.since??"0",u=!1,d,m=s?.intervalMs??3e3,p=async()=>{let g=t;if(g)try{let y=await S(r(`/messages?session=${encodeURIComponent(g)}&since=${encodeURIComponent(a)}`),{});for(let b of y.messages)o.onMessage(b);a=y.cursor,o.onHealthy?.()}catch(y){o.onError?.(x(y))}u||(d=setTimeout(p,m))},c=()=>{u=!0,d&&clearTimeout(d)};return s?.signal?.addEventListener("abort",c),d=setTimeout(p,0),c}}};var ht=e=>"transport"in e?e.transport:J(e);var wt=/^https?:\/\//i,xt=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,St=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function vt(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(wt.test(e))return"url";if(xt.test(e))return"date"}return"text"}function xe(e){let t=[],n=new Map;for(let r of e)for(let[i,l]of Object.entries(r.data??{})){if(l==null)continue;let o=n.get(i);o||(o=new Map,n.set(i,o),t.push(i));let s=vt(l);o.set(s,(o.get(s)??0)+1)}return t.map(r=>{let i=n.get(r)??new Map,l="text",o=-1;for(let[s,a]of i)a>o&&(o=a,l=s);return{key:r,label:St(r),type:l}})}var Tt=e=>typeof e=="number"?e:Number(e)||0,Se=e=>/rate|position|rank|score|percent|avg/i.test(e),Pt=/posted|published|sent|completed|shipped|launched|_at/i,kt=new Set(["service","order","end_user_id"]);function ve(e,t){let n=e.filter(a=>!kt.has(a.key)),r=n.filter(a=>a.type==="number").slice(0,3),i=n.find(a=>a.key==="status")??n.find(a=>a.type==="select"),l=n.find(a=>a.type==="date"&&Pt.test(a.key))??n.find(a=>a.type==="date"),o=n.filter(a=>a.type==="number"&&!Se(a.key)).map(a=>({field:a,total:t.reduce((u,d)=>u+Tt(d.data[a.key]),0)})).sort((a,u)=>u.total-a.total).find(a=>a.total>0)?.field??null,s=[{type:"stat",label:"Items",agg:"count"}];for(let a of r){let u=Se(a.key);s.push({type:"stat",metric:a.key,agg:u?"avg":"sum",label:u?`Avg ${a.label.toLowerCase()}`:a.label})}return l&&s.push({type:"line",x:l.key,y:o?.key,agg:"sum",title:o?`${o.label} by day`:"Items by day"}),i&&s.push({type:"donut",groupBy:i.key,title:i.label}),s.push({type:"table",columns:n.map(a=>a.key)}),{version:1,widgets:s}}var Te=6,Pe=6,ke=4,Ce={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},Ct=e=>Math.max(1,Math.min(6,Math.round(e))),Rt=e=>Math.max(1,Math.min(4,Math.round(e)));function H(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function Re(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function De(e){return Ce[e]}function K(e,t,n){let r=Ce[e];return{w:t===void 0?r.w:Ct(t),h:n===void 0?r.h:Rt(n)}}function X(e){let t=[],n=[],r=(o,s,a,u)=>{if(o<0||o+a>6)return!1;for(let d=0;d<u;d+=1){let m=n[s+d];if(m){for(let p=0;p<a;p+=1)if(m[o+p])return!1}}return!0},i=(o,s,a,u)=>{for(let d=0;d<u;d+=1){let m=n[s+d]??[];for(let p=0;p<a;p+=1)m[o+p]=!0;n[s+d]=m}},l=(o,s)=>{for(let a=0;;a+=1)for(let u=0;u+o<=6;u+=1)if(r(u,a,o,s))return{gx:u,gy:a}};for(let o of e){let s=K(H(o.kind),o.w,o.h),u=o.gx!==void 0&&o.gy!==void 0&&r(o.gx,o.gy,s.w,s.h)&&o.gx!==void 0&&o.gy!==void 0?{gx:o.gx,gy:o.gy}:l(s.w,s.h);i(u.gx,u.gy,s.w,s.h),t.push({widget:o,gx:u.gx,gy:u.gy,w:s.w,h:s.h})}return t}function Ie(e){let t=[],n=[];for(let r of e)H(r.kind)==="block"?n.push(r):t.push(r);return{tiles:X(t),blocks:n}}var Ae=new Set(["service","order","end_user_id"]),Y=e=>typeof e=="number"?e:Number(e)||0,Me=e=>e==null?"":String(e);function Z(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,i)=>r+i,0);return e==="avg"?Math.round(n/t.length*100)/100:n}function Dt(e,t,n,r){let i=new Map;for(let l of e){let o=new Date(Me(l.data[t]));if(Number.isNaN(o.getTime()))continue;let s=o.toISOString().slice(0,10),a=i.get(s)??[];a.push(n?Y(l.data[n]):1),i.set(s,a)}return[...i.entries()].sort((l,o)=>l[0]<o[0]?-1:1).map(([l,o])=>({label:new Date(`${l}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:n?Z(r,o):o.length}))}function It(e,t,n,r="sum"){let i=new Map;for(let l of e){let o=Me(l.data[t]).trim();if(!o)continue;let s=i.get(o)??[];s.push(n?Y(l.data[n]):1),i.set(o,s)}return[...i.entries()].map(([l,o])=>({label:l,value:n?Z(r,o):o.length})).sort((l,o)=>o.value-l.value)}function At(e,t,n,r){switch(e.type){case"stat":{let i=e.metric?t.get(e.metric):void 0;if(e.metric&&!i)return null;if(!i)return{kind:"stat",label:e.label??"Items",value:r.length};let l=r.map(o=>Y(o.data[i.key]));return{kind:"stat",label:e.label??i.label,value:Z(e.agg??"sum",l)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let i=Dt(r,e.x,e.y,e.agg??"sum");return i.length<2?null:{kind:"series",draw:e.type,title:e.title??"By day",points:i}}case"donut":{if(!t.has(e.groupBy))return null;let i=It(r,e.groupBy,e.metric,e.agg??"sum");return i.length===0?null:{kind:"donut",title:e.title??t.get(e.groupBy)?.label??"Breakdown",points:i}}case"table":{let i=e.columns?e.columns.map(l=>t.get(l)).filter(l=>l!==void 0&&!Ae.has(l.key)):n;return i.length===0?null:{kind:"table",title:e.title,columns:i,rows:r}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function Fe(e,t,n,r={}){let i=new Map,l=a=>({byKey:new Map(a.fields.map(u=>[u.key,u])),cols:a.fields.filter(u=>!Ae.has(u.key)),rows:a.rows}),o=l({fields:t,rows:n});for(let[a,u]of Object.entries(r))i.set(a,l(u));let s=[];for(let a of e.widgets){let u=a.type==="text"?void 0:a.source,d=u?i.get(u):o;if(!d)continue;let m=At(a,d.byKey,d.cols,d.rows);m&&s.push({...m,w:a.w,h:a.h,gx:a.gx,gy:a.gy})}return s}var Mt=new Set(["sum","avg","count","min","max","last"]),Ee=e=>typeof e=="string"&&Mt.has(e)?e:void 0,h=e=>typeof e=="string"&&e!==""?e:void 0,M=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,P=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function Ft(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:Ee(t.agg),w:M(t.w),h:F(t.h),gx:P(t.gx),gy:P(t.gy)};case"line":case"bar":{let n=h(t.x);return n?{type:t.type,source:h(t.source),title:h(t.title),x:n,y:h(t.y)??h(t.column),agg:Ee(t.agg),w:M(t.w),h:F(t.h),gx:P(t.gx),gy:P(t.gy)}:null}case"donut":{let n=h(t.groupBy)??h(t.column);return n?{type:"donut",source:h(t.source),title:h(t.title),groupBy:n,w:M(t.w),h:F(t.h),gx:P(t.gx),gy:P(t.gy)}:null}case"table":{let n=Array.isArray(t.columns)?t.columns.filter(r=>typeof r=="string"):void 0;return{type:"table",source:h(t.source),title:h(t.title),columns:n,w:M(t.w),h:F(t.h),gx:P(t.gx),gy:P(t.gy)}}case"text":{let n=h(t.body);return n?{type:"text",title:h(t.title),body:n,w:M(t.w),h:F(t.h),gx:P(t.gx),gy:P(t.gy)}:null}default:return null}}function Oe(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(Ft).filter(l=>l!==null);if(r.length===0)return null;let i=t.version;return{version:typeof i=="number"?i:1,title:h(t.title),widgets:r}}function ee(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",i=typeof t.v=="number"&&t.v>=1?Math.floor(t.v):void 0;return n?{kind:r,value:n,...i?{v:i}:{}}:null}return null}function te(e){let t=new Map;for(let n of e){let r=n.v??1,i=t.get(r)??[];i.push(n),t.set(r,i)}return[...t.entries()].sort(([n],[r])=>n-r).map(([n,r])=>({v:n,items:r}))}function He(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let r=JSON.parse(t);if(Array.isArray(r))return r.map(ee).filter(i=>i!==null)}catch{}let n=String(e.file??"");return n?[{kind:"file",value:n}]:[]}function _e(e,t,n,r=""){let l=te(e).find(s=>s.v===t)?.items??[],o=l.filter(s=>s.kind==="file").map(s=>n.get(s.value)??"");return l.some(s=>s.kind==="table")&&o.push(r),o.length===0||o.some(s=>s==="")?"awaiting":o.some(s=>s==="revise")?"revise":"accepted"}function $e(e){return Number(e.published_version)||0}var re=["short","medium","long","iso","relative"],oe=["none","12h","24h"];function se(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="multi_select"||e==="file"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function Le(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let n=t.columns.map((o,s)=>({key:typeof o.key=="string"&&o.key?o.key:typeof o.id=="string"&&o.id?o.id:`column_${s+1}`,label:typeof o.label=="string"?o.label:"",type:se(o.type),...(()=>{let a=Array.isArray(o.options)?[...new Set(o.options.map(u=>String(u).trim()).filter(u=>u!==""))]:[];return a.length>0?{options:a}:{}})(),...re.includes(o.dateFormat)?{dateFormat:o.dateFormat}:{},...oe.includes(o.timeFormat)?{timeFormat:o.timeFormat}:{},...o.clientEditable===!0?{clientEditable:!0}:{}})),r=t.rows.map((o,s)=>({id:typeof o.id=="string"&&o.id?o.id:`row_${s}`,cells:o.cells&&typeof o.cells=="object"?o.cells:{}})),i=typeof t.name=="string"?t.name:void 0,l=ie(t.view);return{columns:n,rows:r,...i?{name:i}:{},...l?{view:l}:{}}}}catch{}return null}var D=e=>{if(!Array.isArray(e))return;let t=e.map(n=>String(n).trim()).filter(n=>n!=="");return t.length>0?t:void 0};function ie(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t=e,n={};if(t.widths&&typeof t.widths=="object"&&!Array.isArray(t.widths))for(let[l,o]of Object.entries(t.widths))typeof o=="number"&&Number.isFinite(o)&&o>0&&(n[l]=Math.round(o));let r=typeof t.frozen=="number"&&Number.isFinite(t.frozen)&&t.frozen>0?Math.floor(t.frozen):void 0,i={...D(t.hidden)?{hidden:D(t.hidden)}:{},...D(t.order)?{order:D(t.order)}:{},...D(t.wrap)?{wrap:D(t.wrap)}:{},...Object.keys(n).length>0?{widths:n}:{},...r?{frozen:r}:{}};return Object.keys(i).length>0?i:void 0}function Ue(e){let t=e.view;if(!t)return e.columns;let n=new Set(e.columns.map(s=>s.key)),r=new Set(t.hidden??[]),i=(t.order??[]).filter(s=>n.has(s)),l=e.columns.map(s=>s.key).filter(s=>!i.includes(s)),o=new Map(e.columns.map(s=>[s.key,s]));return[...i,...l].filter(s=>!r.has(s)).map(s=>o.get(s)).filter(s=>!!s)}var ae=6;function Ne(e){let t=e.trim().toLowerCase();if(t==="")return-1;let n=2166136261;for(let r=0;r<t.length;r++)n^=t.charCodeAt(r),n=Math.imul(n,16777619);return Math.abs(n)%ae}function qe(e){try{let t=new URL(e),n=t.pathname.split("/").filter(Boolean).pop()??"";return n===""?t.host:`${t.host}/\u2026/${n}`}catch{return e}}function le(e){return e==null?"":String(e)}function je(e){let t=le(e).trim();if(t==="")return[];try{let n=JSON.parse(t);if(Array.isArray(n))return n.map(r=>String(r).trim()).filter(r=>r!=="")}catch{}return t.split(",").map(n=>n.trim()).filter(n=>n!=="")}function Be(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function _(){return{cells:{},verdict:"",comment:""}}function Ve(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 Ge(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 Qe(e,t,n,r){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[n]:r}}}}function ze(e,t,n){return{...e,verdict:t,comment:n}}function Je(e,t="medium",n="none"){let r=new Date(/^\d{4}-\d{2}-\d{2}$/.test(e)?`${e}T00:00:00`:e);if(Number.isNaN(r.getTime()))return e;if(t==="iso"){let o=a=>String(a).padStart(2,"0"),s=`${r.getFullYear()}-${o(r.getMonth()+1)}-${o(r.getDate())}`;return n==="none"?s:`${s} ${o(r.getHours())}:${o(r.getMinutes())}`}if(t==="relative")return Ot(r);let i=t==="short"?{year:"numeric",month:"numeric",day:"numeric"}:t==="long"?{year:"numeric",month:"long",day:"numeric",weekday:"long"}:{year:"numeric",month:"short",day:"numeric"},l=n==="none"?{}:{hour:"numeric",minute:"2-digit",hour12:n==="12h"};return r.toLocaleString(void 0,{...i,...l})}var Et=6e4,We=36e5,ne=864e5;function Ot(e){let t=e.getTime()-Date.now(),n=Math.abs(t);if(n>30*ne)return e.toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"});let r=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"});return n<We?r.format(Math.round(t/Et),"minute"):n<ne?r.format(Math.round(t/We),"hour"):r.format(Math.round(t/ne),"day")}var I=class extends Error{code;status;constructor(t,n,r){super(n),this.name="CreditRefused",this.code=t,this.status=r}},W=class extends I{credits;balance;short;constructor(t,n){super("insufficient_credits",t,402),this.name="InsufficientCredits",this.credits=n.credits,this.balance=n.balance,this.short=n.short}},Ht=/\/+$/,_t="/api/v1/end-user",de="Pre-payment",pe="After-payment";function $t(e,t){if(e<=0)return[];let n=t&&typeof t.upfront=="number"&&Number.isFinite(t.upfront)?Math.max(0,Math.min(t.upfront,e)):e,r=Math.round((e-n)*100)/100,i=[];return n>0&&i.push({label:de,amount:n}),r>0&&i.push({label:pe,amount:r}),i}var ue=e=>e.status!=="paid"&&e.asked!==!1,Wt=(e,t)=>e.payMethods&&e.payMethods.length>0?[...e.payMethods]:[...t],Lt=(e,t)=>{let n=typeof t=="number"&&Number.isFinite(t)&&t>0?t:1;return!Number.isFinite(e)||e<=0?0:Math.ceil(e*n)},$=e=>{let t=e.label.trim().toLowerCase();return t===de.toLowerCase()?0:t===pe.toLowerCase()?2:1},Ut=(e,t,n)=>{let r=t.filter(p=>p.order===n),i=p=>p.reduce((c,g)=>c+g.amount,0),l=i(r),o=i(r.filter(p=>p.status==="paid")),s=e.value>0,a=[...r].sort((p,c)=>$(p)!==$(c)?$(p)-$(c):(p.dueDate||p.paidAt).localeCompare(c.dueDate||c.paidAt)),u=a.filter(ue),d=a.filter(p=>p.status!=="paid"&&!ue(p)),m=l>0?i(u):e.value-o;return{value:e.value,priced:s,billed:l,paid:o,due:Math.max(0,m),scheduled:i(d),lines:a,asked:u,upcoming:d,awaitingPayment:s&&o<=0}},Nt=e=>{let{credits:t,balance:n,short:r}=e;return typeof t!="number"||typeof n!="number"||typeof r!="number"||!(Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r))?null:{credits:t,balance:n,short:r}},qt=e=>{let t=e.baseUrl.replace(Ht,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async(i,l={method:"GET"})=>{try{let o=await fetch(`${t}${_t}${i}`,{method:l.method,headers:{"content-type":"application/json",authorization:`Bearer ${await n()}`},...l.body===void 0?{}:{body:JSON.stringify(l.body)}});if(!o.ok){let s=await o.json().catch(()=>({})),a=s.message??`${l.method} ${i} \u2192 ${String(o.status)}`,u=Nt(s);throw o.status===402&&s.error==="insufficient_credits"&&u?new W(a,u):new I(s.error??"request_failed",a,o.status)}return await o.json()}catch(o){throw o instanceof I?o:x(o)}};return{wallet:()=>r("/credits"),history:()=>r("/credits/history"),topup:i=>r("/credits/checkout",{method:"POST",body:{packId:i}}),checkout:i=>r("/shop/checkout",{method:"POST",body:i}),payments:()=>r("/payments"),paymentMethods:()=>r("/payment-methods"),markPaymentSent:(i,l)=>r(`/payments/${encodeURIComponent(i)}/sent`,{method:"POST",body:{reference:l??""}}),payWithCredits:i=>r(`/payments/${encodeURIComponent(i)}/pay-with-credits`,{method:"POST",body:{}}),inquiryQuote:i=>r(`/inquiries/${encodeURIComponent(i)}/quote`),acceptInquiry:(i,l)=>r(`/inquiries/${encodeURIComponent(i)}/accept`,{method:"POST",body:{version:l}}),enquire:(i,l,o)=>r("/shop/enquire",{method:"POST",body:{productId:i,answers:l,name:o??""}})}};var jt=/\/+$/,R="/api/v1/end-user",E=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function Bt(e){let t="";for(let r=0;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return btoa(t)}var Vt=e=>{let t=e.baseUrl.replace(jt,""),n=()=>typeof e.token=="function"?e.token():e.token,r=async()=>({"content-type":"application/json",authorization:`Bearer ${await n()}`}),i=async(o,s)=>{try{let a=await fetch(`${t}${R}${o}`,{method:s.method,headers:await r(),...s.body===void 0?{}:{body:JSON.stringify(s.body)}});if(a.status===409){let u=await a.json().catch(()=>({}));throw new E(u.message??"Someone else saved this first.")}if(!a.ok){let u=await a.text().catch(()=>""),d=`${s.method} ${o} \u2192 ${String(a.status)}`;try{let m=JSON.parse(u);m.message&&(d=m.message)}catch{d=u?`${d}: ${u}`:d}throw x({error:d})}return await a.json()}catch(a){throw a instanceof E?a:x(a)}},l=o=>`/tables/${encodeURIComponent(o)}`;return{listTables:async()=>(await S(`${t}${R}/tables`,await r())).tables,listRows:async(o,s)=>await S(`${t}${R}${l(o)}/rows?limit=${String(s??100)}`,await r()),insertRow:async(o,s)=>{let{rowIds:a}=await i(`${l(o)}/rows`,{method:"POST",body:{rows:[s]}}),u=a[0];if(!u)throw x(new Error("The row was not created."));return u},patchRow:async(o,s,a)=>(await i(`${l(o)}/rows/${encodeURIComponent(s)}`,{method:"PATCH",body:a})).updated,deleteRow:async(o,s)=>(await i(`/${encodeURIComponent(o)}/${encodeURIComponent(s)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await S(`${t}${R}/tables/files/rows?limit=200`,await r())).rows.map(s=>({id:s.rowId,filename:String(s.data.filename??""),source:String(s.data.source??"client"),campaign:String(s.data.campaign??""),size:typeof s.data.size=="number"?s.data.size:0,createdAt:s.createdAt})),uploadFile:async(o,s)=>{let a=new Uint8Array(await o.arrayBuffer());return await i("/files",{method:"POST",body:{filename:o.name,mime:o.type||"application/octet-stream",data:Bt(a),...s===void 0?{}:{message:s}}})},fileLink:async o=>await S(`${t}${R}/files/${encodeURIComponent(o)}/url`,await r()),deleteFile:async o=>(await i(`/files/${encodeURIComponent(o)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await S(`${t}${R}/documents`,await r())).documents,readDocument:async o=>(await S(`${t}${R}/documents/${encodeURIComponent(o)}`,await r())).document,saveDocument:async(o,s)=>await i(`/documents/${encodeURIComponent(o)}`,{method:"PATCH",body:s})}};var Gt=/\/+$/,Qt="/api/v1/end-user",zt=e=>{let t=e.baseUrl.replace(Gt,""),n=async(r,i)=>{let l;try{l=await fetch(`${t}${Qt}${r}`,i===void 0?{}:{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i)})}catch(o){throw x(o)}if(l.status===429)throw x({error:"rate_limited",retryable:!0});if(!l.ok)throw x({error:`shop_request_failed_${String(l.status)}`});try{return await l.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(i=>({...i,currency:typeof i.currency=="string"?i.currency:""})),truncated:r.truncated===!0,enquiryForm:Array.isArray(r.enquiryForm)?r.enquiryForm:[]}},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 Jt=new Set(["buy","ask"]);function Kt(e){return Jt.has(e.mode)?e.mode:"ask"}var Xt={kind:"quoted"};function L(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 Ke(e,t){let n=/^[a-z]+$/i.test(t)&&!t.endsWith("s")?"s":"";return`${e.toLocaleString()} ${t}${n}`}function Xe(e,t){return e.kind==="quoted"?"Priced on enquiry":e.kind==="flat"?L(e.price,t):`${L(e.unitPrice,t)} per ${e.unitStep===1?e.unit:Ke(e.unitStep,e.unit)}`}function Yt(e){let t=e.currency,n=e.pricing;if(n.kind!=="variants")return Xe(n,t);let r=n.variants.map(i=>i.price).filter(i=>typeof i=="number");return r.length>0?`From ${L(Math.min(...r),t)}`:"Priced on enquiry"}function Zt(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}:Xt}function en(e,t){return e.kind==="flat"?e.price:e.kind==="per_unit"?e.unitPrice*Math.ceil(t/Math.max(e.unitStep,1)):null}function tn(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 nn(e,t){let n=e.variants?.find(r=>r.name===t);return n&&n.includes.length>0?n.includes:e.includes}function rn(e,t){let n=[];for(let r of e){let i=t(r).trim();i&&!n.includes(i)&&n.push(i)}return n}function on(e,t,n,r){let i=t?`${e.name} \u2014 ${t}`:e.name,l=n.kind==="per_unit"?`, ${Ke(r,n.unit)}`:"";return`I'd like to buy ${i}${l}. How do I go ahead?`}function sn(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 Ye,useEffect as an,useState as ce}from"react";var ln=e=>{let[t,n]=ce(null),[r,i]=ce(!0),[l,o]=ce(null),s=Ye(async()=>{try{n(await e.wallet()),o(null)}catch{o("Couldn't read your balance just now.")}finally{i(!1)}},[e]),a=Ye(()=>{s().catch(()=>{})},[s]);return an(()=>(a(),window.addEventListener("focus",a),()=>{window.removeEventListener("focus",a)}),[a]),{wallet:t,loading:r,failure:l,refresh:a}};import{useCallback as un,useEffect as dn,useState as A}from"react";var pn=e=>e&&typeof e=="object"&&typeof e.error=="string"?e.error:e instanceof Error?e.message:"shop_unavailable",cn=e=>{let[t,n]=A([]),[r,i]=A([]),[l,o]=A(!1),[s,a]=A(!0),[u,d]=A(null),[m,p]=A(0);dn(()=>{let g=!0;return a(!0),e.listProducts().then(y=>{g&&(n(y.products),i(y.enquiryForm),o(y.truncated),d(null))}).catch(y=>{g&&d(pn(y))}).finally(()=>{g&&a(!1)}),()=>{g=!1}},[e,m]);let c=un(()=>p(g=>g+1),[]);return{products:t,enquiryForm:r,truncated:l,loading:s,error:u,reload:c}};import{useCallback as mn,useEffect as Ze,useRef as gn,useState as U}from"react";var et="greeting";function tt(e,t){if(e.some(l=>l.id===t.id))return e;let n=e.filter(l=>l.id!==et),r=l=>l.author==="client"==(t.author==="client");return[...n.filter(l=>!(l.pending&&r(l)&&l.text===t.text)),t]}var fn=(e,t)=>{let[n,r]=U([]),[i,l]=U(""),[o,s]=U(!1),[a,u]=U(null),d=gn(0),m=t?.pollMs??2e3;Ze(()=>{let c=!0;return e.getInfo().then(g=>{c&&g.greeting&&r(y=>y.length===0?[{id:et,cursor:"",author:"agent",text:g.greeting}]:y)}).catch(()=>{}),()=>{c=!1}},[e]),Ze(()=>e.subscribe?.({onMessage:c=>r(g=>tt(g,c)),onError:c=>u(c.error),onHealthy:()=>u(null)},{intervalMs:m}),[e,m]);let p=mn(()=>{let c=i.trim();if(!c||o)return;l(""),u(null),s(!0),d.current+=1;let g=`pending-${d.current}`,y={id:g,cursor:"",author:"client",text:c,pending:!0};r(b=>[...b,y]),e.sendMessage(c).then(b=>{s(!1),b.reply.trim()&&r(f=>f.some(k=>!k.pending&&k.author!=="client"&&k.text===b.reply)?f:(d.current+=1,[...f,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:b.reply,pending:!0}]))}).catch(b=>{u(b instanceof Error?b.message:"send_failed"),s(!1),r(T=>T.filter(f=>f.id!==g)),l(T=>T||c)})},[i,o,e]);return{messages:n,input:i,setInput:l,send:p,sending:o,error:a}};export{yt as Chat,I as CreditRefused,re as DATE_FORMATS,Te as GRID_COLS,Pe as GRID_MAX_COLS,ke as GRID_MAX_ROWS,pt as HolaProvider,W as InsufficientCredits,ae as OPTION_TINTS,E as PortalConflict,pe as QUOTE_BALANCE_LABEL,de as QUOTE_DEPOSIT_LABEL,oe as TIME_FORMATS,Ue as arrangedColumns,H as bandOfKind,Re as bandOfType,on as buyRequestText,Ge as cellValue,it as createApiTransport,ht as createHolaClient,qt as createPortalCredits,Vt as createPortalData,zt as createPortalShop,J as createWidgetTransport,Lt as creditsOfMoney,le as deliverableCellText,je as deliverableCellValues,_e as deliverableStatus,xe as deriveFields,_ as emptyTableResponses,rn as facetValues,De as footprintOf,K as footprintWith,Je as formatDeliverableDate,te as groupDeliverableVersions,nn as includesFor,ve as inferSpec,Be as isDeliverableChecked,tt as mergeMessage,Kt as modeOf,L as money,se as normalizeDeliverableColType,ee as normalizeDeliverableItem,Ne as optionTintIndex,Ut as orderBilling,ie as parseArrangement,Oe as parseDashboardSpec,He as parseDeliverableItems,Le as parseDeliverableTable,Ve as parseTableResponses,ue as paymentAsked,Wt as paymentPayMethods,X as placeWidgets,Zt as priceFor,Xe as priceLabel,$e as publishedVersionOf,tn as quantityRange,$t as quoteSchedule,Fe as renderModel,Qe as setResponse,ze as setTableReview,Yt as shelfPriceLabel,sn as shelfProblem,qe as shortenUrl,Ie as splitLayout,N as textDeltaOf,q as thinkingDeltaOf,j as toolEventOf,en as totalFor,V as useArtifactUrl,Q as useChat,ln as useCredits,G as useHolaClient,cn as useShop,fn as useThread};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@holaboss/client",
|
|
3
|
-
"version": "0.2.0-beta.
|
|
3
|
+
"version": "0.2.0-beta.34",
|
|
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",
|