@holaboss/client 0.2.0-beta.16 → 0.2.0-beta.18
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 +20 -2
- package/dist/index.d.ts +20 -2
- 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 q=Object.defineProperty;var Ue=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var Ve=(e,t)=>{for(var r in t)q(e,r,{get:t[r],enumerable:!0})},je=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Fe(t))!Ne.call(e,i)&&i!==r&&q(e,i,{get:()=>t[i],enumerable:!(o=Ue(t,i))||o.enumerable});return e};var
|
|
3
|
-
`))o.startsWith(":")||(o.startsWith("event:")?t=o.slice(6).trim():o.startsWith("data:")&&r.push(o.slice(5).replace(
|
|
4
|
-
`)}:null},Je=(e,t,r)=>{let o;try{o=JSON.parse(e.data)}catch{return}if(e.event==="session"){let i=o.sessionId;i&&(r(i),t.onSession?.(i));return}if(e.event==="turn_event"){t.onEvent?.(o);let i=$(o);i&&t.onText?.(i);let a=O(o);a&&t.onThinking?.(a);let n=_(o);n&&t.onTool?.(n);return}if(e.event==="chat_completed"){let i=o;r(i.sessionId),t.onComplete?.(i);return}e.event==="chat_error"&&t.onError?.(C(o))},v=async(e,t)=>{let r=await fetch(e,{headers:t});if(!r.ok)throw new Error(`hola: request failed (${r.status})`);return await r.json()},
|
|
2
|
+
var q=Object.defineProperty;var Ue=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var Ve=(e,t)=>{for(var r in t)q(e,r,{get:t[r],enumerable:!0})},je=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Fe(t))!Ne.call(e,i)&&i!==r&&q(e,i,{get:()=>t[i],enumerable:!(o=Ue(t,i))||o.enumerable});return e};var Be=e=>je(q({},"__esModule",{value:!0}),e);var gt={};Ve(gt,{Chat:()=>Ie,GRID_COLS:()=>ee,GRID_MAX_COLS:()=>te,GRID_MAX_ROWS:()=>ne,HolaProvider:()=>Se,PortalConflict:()=>H,bandOfKind:()=>A,bandOfType:()=>re,cellValue:()=>ye,createApiTransport:()=>De,createHolaClient:()=>He,createPortalData:()=>Oe,createWidgetTransport:()=>B,deliverableCellText:()=>me,deliverableStatus:()=>pe,deriveFields:()=>Q,emptyTableResponses:()=>E,footprintOf:()=>oe,footprintWith:()=>G,formatDeliverableDate:()=>xe,groupDeliverableVersions:()=>X,inferSpec:()=>Z,isDeliverableChecked:()=>fe,mergeMessage:()=>ve,normalizeDeliverableColType:()=>K,normalizeDeliverableItem:()=>J,parseDashboardSpec:()=>ue,parseDeliverableItems:()=>de,parseDeliverableTable:()=>ge,parseTableResponses:()=>be,placeWidgets:()=>z,publishedVersionOf:()=>ce,renderModel:()=>le,setResponse:()=>he,setTableReview:()=>we,splitLayout:()=>se,textDeltaOf:()=>$,thinkingDeltaOf:()=>O,toolEventOf:()=>_,useArtifactUrl:()=>U,useChat:()=>V,useHolaClient:()=>N,useThread:()=>Le});module.exports=Be(gt);var Te=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},$=e=>{let t=Te(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},O=e=>{let t=Te(e);return t?.type==="thinking_delta"&&typeof t.delta=="string"?t.delta:null},_=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 Ge=/^ /,C=e=>{if(e&&typeof e=="object"){let t=e,r=typeof t.error=="string"?t.error:"request_failed";return typeof t.retryable=="boolean"?{error:r,retryable:t.retryable}:{error:r}}return{error:"request_failed"}},ze=e=>{let t="message",r=[];for(let o of e.split(`
|
|
3
|
+
`))o.startsWith(":")||(o.startsWith("event:")?t=o.slice(6).trim():o.startsWith("data:")&&r.push(o.slice(5).replace(Ge,"")));return r.length>0?{event:t,data:r.join(`
|
|
4
|
+
`)}:null},Je=(e,t,r)=>{let o;try{o=JSON.parse(e.data)}catch{return}if(e.event==="session"){let i=o.sessionId;i&&(r(i),t.onSession?.(i));return}if(e.event==="turn_event"){t.onEvent?.(o);let i=$(o);i&&t.onText?.(i);let a=O(o);a&&t.onThinking?.(a);let n=_(o);n&&t.onTool?.(n);return}if(e.event==="chat_completed"){let i=o;r(i.sessionId),t.onComplete?.(i);return}e.event==="chat_error"&&t.onError?.(C(o))},v=async(e,t)=>{let r=await fetch(e,{headers:t});if(!r.ok)throw new Error(`hola: request failed (${r.status})`);return await r.json()},Re=async e=>{let t=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body});if(!t.ok)throw new Error(`hola: message failed (${t.status})`);return await t.json()},ke=async(e,t,r,o)=>{let i=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:o});if(!(i.ok&&i.body)){t.onError?.({error:`stream_failed_${i.status}`});return}let a=i.body.getReader(),n=new TextDecoder,s="",l=()=>{let d=s.indexOf(`
|
|
5
5
|
|
|
6
|
-
`);for(;d!==-1;){let
|
|
6
|
+
`);for(;d!==-1;){let g=s.slice(0,d);s=s.slice(d+2);let m=ze(g);m&&Je(m,t,r),d=s.indexOf(`
|
|
7
7
|
|
|
8
|
-
`)}},u=async()=>{let d=await a.read();if(!d.done)return s+=n.decode(d.value,{stream:!0}),l(),u()};await u()};var Xe=/\/+$/,Y="/api/v1/end-user",Re=e=>{let t=e.baseUrl.replace(Xe,""),r=()=>typeof e.token=="function"?e.token():e.token,o=n=>e.project?`${n}project=${encodeURIComponent(e.project)}`:"",i=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),a=async n=>{let s=await fetch(`${t}${Y}/chat${o("?")}`,{method:"POST",headers:await i(),body:JSON.stringify({message:n})});if(!s.ok)throw new Error(`hola: message failed (${s.status})`);return{reply:(await s.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>v(`${t}${Y}/chat/info${o("?")}`,await i()),sendMessage:a,streamMessage:async(n,s)=>{try{let l=await a(n);s.onText?.(l.reply),s.onComplete?.(l)}catch(l){s.onError?.(C(l))}},subscribe:(n,s)=>{let l=s?.since??"0",u=!1,d,m=s?.intervalMs??3e3,g=typeof document<"u",p=()=>g&&document.visibilityState==="hidden",b=!1,h=()=>{if(!u){if(p()){b=!0;return}d=setTimeout(f,m)}},f=async()=>{try{let y=await v(`${t}${Y}/chat/thread?since=${encodeURIComponent(l)}${o("&")}`,await i());for(let P of y.messages)n.onMessage(P);l=y.cursor,n.onHealthy?.()}catch(y){n.onError?.(C(y))}h()},D=()=>{u||!b||p()||(b=!1,d&&clearTimeout(d),d=setTimeout(f,0))};g&&document.addEventListener("visibilitychange",D);let c=()=>{u=!0,d&&clearTimeout(d),g&&document.removeEventListener("visibilitychange",D)};return s?.signal?.addEventListener("abort",c),d=setTimeout(f,0),c}}};var L=require("react"),U=(e,t)=>{let[r,o]=(0,L.useState)("");return(0,L.useEffect)(()=>{if(!e){o("");return}let i=Uint8Array.from(atob(e),n=>n.charCodeAt(0)),a=URL.createObjectURL(new Blob([i],{type:t}));return o(a),()=>URL.revokeObjectURL(a)},[e,t]),r};var j=require("react");var F=require("react"),Ce=require("react/jsx-runtime"),ke=(0,F.createContext)(null),De=({client:e,children:t})=>(0,Ce.jsx)(ke.Provider,{value:e,children:t}),N=()=>{let e=(0,F.useContext)(ke);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};var w=require("react"),V=e=>{let[t,r]=(0,w.useState)([]),[o,i]=(0,w.useState)(""),[a,n]=(0,w.useState)(!1),[s,l]=(0,w.useState)(null),u=(0,w.useRef)(0),d=(0,w.useRef)(null);(0,w.useEffect)(()=>()=>d.current?.abort(),[]);let m=(0,w.useCallback)(()=>{let p=u.current;return u.current+=1,p},[]);(0,w.useEffect)(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&r([{id:m(),role:"assistant",text:b.greeting}])}).catch(()=>{}),()=>{p=!1}},[e,m]);let g=(0,w.useCallback)(()=>{let p=o.trim();if(!p||a)return;i(""),l(null),n(!0);let b=m(),h=m();r(c=>[...c,{id:b,role:"user",text:p},{id:h,role:"assistant",text:"",streaming:!0}]);let f=c=>{r(y=>y.map(P=>P.id===h?c(P):P))},D=new AbortController;d.current=D,e.streamMessage(p,{onText:c=>f(y=>({...y,text:y.text+c})),onComplete:c=>{f(y=>({...y,text:c.reply||y.text,artifacts:c.artifacts,streaming:!1})),n(!1)},onError:c=>{f(y=>({...y,streaming:!1})),l(c.error),n(!1)}},D.signal).catch(c=>{f(y=>({...y,streaming:!1})),l(c instanceof Error?c.message:"stream_failed"),n(!1)}).finally(()=>{n(!1),f(c=>c.streaming?{...c,streaming:!1}:c)})},[o,a,e,m]);return{messages:t,input:o,setInput:i,send:g,sending:a,error:s}};var x=require("react/jsx-runtime"),R={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"}},Ke=({artifact:e})=>{let t=U(e.dataBase64??"",e.mimeType),r=e.url??t;return r?e.mimeType.startsWith("image/")?(0,x.jsx)("a",{href:r,rel:"noopener noreferrer",target:"_blank",children:(0,x.jsx)("img",{alt:e.filename,src:r,style:R.image})}):(0,x.jsx)("a",{download:e.filename,href:r,style:R.link,children:e.filename}):null},Se=()=>{let e=N(),{messages:t,input:r,setInput:o,send:i,sending:a,error:n}=V(e),s=(0,j.useRef)(null);(0,j.useEffect)(()=>{let u=s.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let l=u=>{u.preventDefault(),i()};return(0,x.jsxs)("div",{style:R.root,children:[(0,x.jsx)("div",{ref:s,style:R.log,children:t.map(u=>(0,x.jsxs)("div",{style:u.role==="user"?R.user:R.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?(0,x.jsx)("div",{style:R.artifacts,children:u.artifacts.map(d=>(0,x.jsx)(Ke,{artifact:d},d.filename))}):null]},u.id))}),n?(0,x.jsx)("div",{style:R.error,children:n}):null,(0,x.jsxs)("form",{onSubmit:l,style:R.form,children:[(0,x.jsx)("input",{"aria-label":"Message",onChange:u=>o(u.target.value),placeholder:"Type a message\u2026",style:R.input,value:r}),(0,x.jsx)("button",{disabled:a||r.trim().length===0,style:R.button,type:"submit",children:"Send"})]})]})};var qe=/\/+$/,G=e=>{let t=e.sessionId,r=e.baseUrl.replace(qe,""),o=n=>`${r}/endpoint/${encodeURIComponent(e.token)}${n}`,i={"content-type":"application/json"},a=(n,s)=>({url:o(n),headers:i,body:JSON.stringify({message:s,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>v(o("/config"),{}),sendMessage:async n=>{let s=await ve(a("/message",n));return t=s.sessionId,s},streamMessage:(n,s,l)=>Te(a("/message/stream",n),s,u=>{t=u},l),subscribe:(n,s)=>{let l=s?.since??"0",u=!1,d,m=s?.intervalMs??3e3,g=async()=>{let b=t;if(b)try{let h=await v(o(`/messages?session=${encodeURIComponent(b)}&since=${encodeURIComponent(l)}`),{});for(let f of h.messages)n.onMessage(f);l=h.cursor,n.onHealthy?.()}catch(h){n.onError?.(C(h))}u||(d=setTimeout(g,m))},p=()=>{u=!0,d&&clearTimeout(d)};return s?.signal?.addEventListener("abort",p),d=setTimeout(g,0),p}}};var Pe=e=>"transport"in e?e.transport:G(e);var Ye=/^https?:\/\//i,Qe=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,Ze=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function et(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(Ye.test(e))return"url";if(Qe.test(e))return"date"}return"text"}function Q(e){let t=[],r=new Map;for(let o of e)for(let[i,a]of Object.entries(o.data??{})){if(a==null)continue;let n=r.get(i);n||(n=new Map,r.set(i,n),t.push(i));let s=et(a);n.set(s,(n.get(s)??0)+1)}return t.map(o=>{let i=r.get(o)??new Map,a="text",n=-1;for(let[s,l]of i)l>n&&(n=l,a=s);return{key:o,label:Ze(o),type:a}})}var tt=e=>typeof e=="number"?e:Number(e)||0,Ie=e=>/rate|position|rank|score|percent|avg/i.test(e),nt=/posted|published|sent|completed|shipped|launched|_at/i,rt=new Set(["service","order","end_user_id"]);function Z(e,t){let r=e.filter(l=>!rt.has(l.key)),o=r.filter(l=>l.type==="number").slice(0,3),i=r.find(l=>l.key==="status")??r.find(l=>l.type==="select"),a=r.find(l=>l.type==="date"&&nt.test(l.key))??r.find(l=>l.type==="date"),n=r.filter(l=>l.type==="number"&&!Ie(l.key)).map(l=>({field:l,total:t.reduce((u,d)=>u+tt(d.data[l.key]),0)})).sort((l,u)=>u.total-l.total).find(l=>l.total>0)?.field??null,s=[{type:"stat",label:"Items",agg:"count"}];for(let l of o){let u=Ie(l.key);s.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return a&&s.push({type:"line",x:a.key,y:n?.key,agg:"sum",title:n?`${n.label} by day`:"Items by day"}),i&&s.push({type:"donut",groupBy:i.key,title:i.label}),s.push({type:"table",columns:r.map(l=>l.key)}),{version:1,widgets:s}}var ee=6,te=6,ne=4,He={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},ot=e=>Math.max(1,Math.min(6,Math.round(e))),st=e=>Math.max(1,Math.min(4,Math.round(e)));function W(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 oe(e){return He[e]}function B(e,t,r){let o=He[e];return{w:t===void 0?o.w:ot(t),h:r===void 0?o.h:st(r)}}function z(e){let t=[],r=[],o=(n,s,l,u)=>{if(n<0||n+l>6)return!1;for(let d=0;d<u;d+=1){let m=r[s+d];if(m){for(let g=0;g<l;g+=1)if(m[n+g])return!1}}return!0},i=(n,s,l,u)=>{for(let d=0;d<u;d+=1){let m=r[s+d]??[];for(let g=0;g<l;g+=1)m[n+g]=!0;r[s+d]=m}},a=(n,s)=>{for(let l=0;;l+=1)for(let u=0;u+n<=6;u+=1)if(o(u,l,n,s))return{gx:u,gy:l}};for(let n of e){let s=B(W(n.kind),n.w,n.h),u=n.gx!==void 0&&n.gy!==void 0&&o(n.gx,n.gy,s.w,s.h)&&n.gx!==void 0&&n.gy!==void 0?{gx:n.gx,gy:n.gy}:a(s.w,s.h);i(u.gx,u.gy,s.w,s.h),t.push({widget:n,gx:u.gx,gy:u.gy,w:s.w,h:s.h})}return t}function se(e){let t=[],r=[];for(let o of e)W(o.kind)==="block"?r.push(o):t.push(o);return{tiles:z(t),blocks:r}}var We=new Set(["service","order","end_user_id"]),Me=e=>typeof e=="number"?e:Number(e)||0,Ae=e=>e==null?"":String(e);function Ee(e,t){if(e==="count")return t.length;if(t.length===0)return 0;if(e==="last")return t[t.length-1]??0;if(e==="min")return Math.min(...t);if(e==="max")return Math.max(...t);let r=t.reduce((o,i)=>o+i,0);return e==="avg"?Math.round(r/t.length*100)/100:r}function it(e,t,r,o){let i=new Map;for(let a of e){let n=new Date(Ae(a.data[t]));if(Number.isNaN(n.getTime()))continue;let s=n.toISOString().slice(0,10),l=i.get(s)??[];l.push(r?Me(a.data[r]):1),i.set(s,l)}return[...i.entries()].sort((a,n)=>a[0]<n[0]?-1:1).map(([a,n])=>({label:new Date(`${a}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:r?Ee(o,n):n.length}))}function at(e,t){let r=new Map;for(let o of e){let i=Ae(o.data[t]).trim();i&&r.set(i,(r.get(i)??0)+1)}return[...r.entries()].sort((o,i)=>i[1]-o[1]).map(([o,i])=>({label:o,value:i}))}function lt(e,t,r,o){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:o.length};let a=o.map(n=>Me(n.data[i.key]));return{kind:"stat",label:e.label??i.label,value:Ee(e.agg??"sum",a)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let i=it(o,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=at(o,e.groupBy);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(a=>t.get(a)).filter(a=>a!==void 0&&!We.has(a.key)):r;return i.length===0?null:{kind:"table",title:e.title,columns:i,rows:o}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function ie(e,t,r){let o=t.filter(n=>!We.has(n.key)),i=new Map(t.map(n=>[n.key,n])),a=[];for(let n of e.widgets){let s=lt(n,i,o,r);s&&a.push({...s,w:n.w,h:n.h,gx:n.gx,gy:n.gy})}return a}var ut=new Set(["sum","avg","count","min","max","last"]),$e=e=>typeof e=="string"&&ut.has(e)?e:void 0,k=e=>typeof e=="string"&&e!==""?e:void 0,M=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,A=e=>typeof e=="number"&&e>=1?Math.min(4,Math.round(e)):void 0,S=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function dt(e){if(typeof e!="object"||e===null)return null;let t=e;switch(t.type){case"stat":return{type:"stat",label:k(t.label),metric:k(t.metric),agg:$e(t.agg),w:M(t.w),h:A(t.h),gx:S(t.gx),gy:S(t.gy)};case"line":case"bar":{let r=k(t.x);return r?{type:t.type,title:k(t.title),x:r,y:k(t.y),agg:$e(t.agg),w:M(t.w),h:A(t.h),gx:S(t.gx),gy:S(t.gy)}:null}case"donut":{let r=k(t.groupBy);return r?{type:"donut",title:k(t.title),groupBy:r,w:M(t.w),h:A(t.h),gx:S(t.gx),gy:S(t.gy)}:null}case"table":{let r=Array.isArray(t.columns)?t.columns.filter(o=>typeof o=="string"):void 0;return{type:"table",title:k(t.title),columns:r,w:M(t.w),h:A(t.h),gx:S(t.gx),gy:S(t.gy)}}case"text":{let r=k(t.body);return r?{type:"text",title:k(t.title),body:r,w:M(t.w),h:A(t.h),gx:S(t.gx),gy:S(t.gy)}:null}default:return null}}function ae(e){let t=e;if(typeof e=="string"){if(e.trim()==="")return null;try{t=JSON.parse(e)}catch{return null}}if(typeof t!="object"||t===null)return null;let r=t.widgets;if(!Array.isArray(r))return null;let o=r.map(dt).filter(a=>a!==null);if(o.length===0)return null;let i=t.version;return{version:typeof i=="number"?i:1,title:k(t.title),widgets:o}}function J(e){if(typeof e=="string")return e?{kind:"file",value:e}:null;if(e&&typeof e=="object"){let t=e,r=typeof t.value=="string"?t.value:"",o=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 r?{kind:o,value:r,...i?{v:i}:{}}:null}return null}function X(e){let t=new Map;for(let r of e){let o=r.v??1,i=t.get(o)??[];i.push(r),t.set(o,i)}return[...t.entries()].sort(([r],[o])=>r-o).map(([r,o])=>({v:r,items:o}))}function le(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let o=JSON.parse(t);if(Array.isArray(o))return o.map(J).filter(i=>i!==null)}catch{}let r=String(e.file??"");return r?[{kind:"file",value:r}]:[]}function ue(e,t,r,o=""){let a=X(e).find(s=>s.v===t)?.items??[],n=a.filter(s=>s.kind==="file").map(s=>r.get(s.value)??"");return a.some(s=>s.kind==="table")&&n.push(o),n.length===0||n.some(s=>s==="")?"awaiting":n.some(s=>s==="revise")?"revise":"accepted"}function de(e){return Number(e.published_version)||0}function K(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function pe(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let r=t.columns.map((a,n)=>({key:typeof a.key=="string"&&a.key?a.key:typeof a.id=="string"&&a.id?a.id:`column_${n+1}`,label:typeof a.label=="string"?a.label:"",type:K(a.type),...a.clientEditable===!0?{clientEditable:!0}:{}})),o=t.rows.map((a,n)=>({id:typeof a.id=="string"&&a.id?a.id:`row_${n}`,cells:a.cells&&typeof a.cells=="object"?a.cells:{}})),i=typeof t.name=="string"?t.name:void 0;return{columns:r,rows:o,...i?{name:i}:{}}}}catch{}return null}function ce(e){return e==null?"":String(e)}function me(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function E(){return{cells:{},verdict:"",comment:""}}function ge(e){if(typeof e!="string"||e.trim()==="")return E();try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let r=t;return{cells:r.cells&&typeof r.cells=="object"?r.cells:r,verdict:r.verdict==="accepted"||r.verdict==="revise"?r.verdict:"",comment:typeof r.comment=="string"?r.comment:""}}}catch{}return E()}function fe(e,t,r){if(e.clientEditable){let o=r.cells[t.id];if(o&&e.key in o)return o[e.key]}return t.cells[e.key]}function be(e,t,r,o){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[r]:o}}}}function ye(e,t,r){return{...e,verdict:t,comment:r}}function he(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 pt=/\/+$/,I="/api/v1/end-user",H=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function ct(e){let t="";for(let o=0;o<e.length;o+=32768)t+=String.fromCharCode(...e.subarray(o,o+32768));return btoa(t)}var Oe=e=>{let t=e.baseUrl.replace(pt,""),r=()=>typeof e.token=="function"?e.token():e.token,o=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),i=async(n,s)=>{try{let l=await fetch(`${t}${I}${n}`,{method:s.method,headers:await o(),...s.body===void 0?{}:{body:JSON.stringify(s.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=`${s.method} ${n} \u2192 ${String(l.status)}`;try{let m=JSON.parse(u);m.message&&(d=m.message)}catch{d=u?`${d}: ${u}`:d}throw C({error:d})}return await l.json()}catch(l){throw l instanceof H?l:C(l)}},a=n=>`/tables/${encodeURIComponent(n)}`;return{listTables:async()=>(await v(`${t}${I}/tables`,await o())).tables,listRows:async(n,s)=>await v(`${t}${I}${a(n)}/rows?limit=${String(s??100)}`,await o()),insertRow:async(n,s)=>{let{rowIds:l}=await i(`${a(n)}/rows`,{method:"POST",body:{rows:[s]}}),u=l[0];if(!u)throw C(new Error("The row was not created."));return u},patchRow:async(n,s,l)=>(await i(`${a(n)}/rows/${encodeURIComponent(s)}`,{method:"PATCH",body:l})).updated,deleteRow:async(n,s)=>(await i(`/${encodeURIComponent(n)}/${encodeURIComponent(s)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await v(`${t}${I}/tables/files/rows?limit=200`,await o())).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(n,s)=>{let l=new Uint8Array(await n.arrayBuffer());return await i("/files",{method:"POST",body:{filename:n.name,mime:n.type||"application/octet-stream",data:ct(l),...s===void 0?{}:{message:s}}})},fileLink:async n=>await v(`${t}${I}/files/${encodeURIComponent(n)}/url`,await o()),deleteFile:async n=>(await i(`/files/${encodeURIComponent(n)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await v(`${t}${I}/documents`,await o())).documents,readDocument:async n=>(await v(`${t}${I}/documents/${encodeURIComponent(n)}`,await o())).document,saveDocument:async(n,s)=>await i(`/documents/${encodeURIComponent(n)}`,{method:"PATCH",body:s})}};var T=require("react"),_e="greeting";function we(e,t){if(e.some(a=>a.id===t.id))return e;let r=e.filter(a=>a.id!==_e),o=a=>a.author==="client"==(t.author==="client");return[...r.filter(a=>!(a.pending&&o(a)&&a.text===t.text)),t]}var Le=(e,t)=>{let[r,o]=(0,T.useState)([]),[i,a]=(0,T.useState)(""),[n,s]=(0,T.useState)(!1),[l,u]=(0,T.useState)(null),d=(0,T.useRef)(0),m=t?.pollMs??2e3;(0,T.useEffect)(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&o(h=>h.length===0?[{id:_e,cursor:"",author:"agent",text:b.greeting}]:h)}).catch(()=>{}),()=>{p=!1}},[e]),(0,T.useEffect)(()=>e.subscribe?.({onMessage:p=>o(b=>we(b,p)),onError:p=>u(p.error),onHealthy:()=>u(null)},{intervalMs:m}),[e,m]);let g=(0,T.useCallback)(()=>{let p=i.trim();if(!p||n)return;a(""),u(null),s(!0),d.current+=1;let b=`pending-${d.current}`,h={id:b,cursor:"",author:"client",text:p,pending:!0};o(f=>[...f,h]),e.sendMessage(p).then(f=>{s(!1),f.reply.trim()&&o(c=>c.some(P=>!P.pending&&P.author!=="client"&&P.text===f.reply)?c:(d.current+=1,[...c,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:f.reply,pending:!0}]))}).catch(f=>{u(f instanceof Error?f.message:"send_failed"),s(!1),o(D=>D.filter(c=>c.id!==b)),a(D=>D||p)})},[i,n,e]);return{messages:r,input:i,setInput:a,send:g,sending:n,error:l}};0&&(module.exports={Chat,GRID_COLS,GRID_MAX_COLS,GRID_MAX_ROWS,HolaProvider,PortalConflict,bandOfKind,bandOfType,cellValue,createApiTransport,createHolaClient,createPortalData,createWidgetTransport,deliverableCellText,deliverableStatus,deriveFields,emptyTableResponses,footprintOf,footprintWith,formatDeliverableDate,groupDeliverableVersions,inferSpec,isDeliverableChecked,mergeMessage,normalizeDeliverableColType,normalizeDeliverableItem,parseDashboardSpec,parseDeliverableItems,parseDeliverableTable,parseTableResponses,placeWidgets,publishedVersionOf,renderModel,setResponse,setTableReview,splitLayout,textDeltaOf,thinkingDeltaOf,toolEventOf,useArtifactUrl,useChat,useHolaClient,useThread});
|
|
8
|
+
`)}},u=async()=>{let d=await a.read();if(!d.done)return s+=n.decode(d.value,{stream:!0}),l(),u()};await u()};var Xe=/\/+$/,Y="/api/v1/end-user",De=e=>{let t=e.baseUrl.replace(Xe,""),r=()=>typeof e.token=="function"?e.token():e.token,o=n=>e.project?`${n}project=${encodeURIComponent(e.project)}`:"",i=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),a=async n=>{let s=await fetch(`${t}${Y}/chat${o("?")}`,{method:"POST",headers:await i(),body:JSON.stringify({message:n})});if(!s.ok)throw new Error(`hola: message failed (${s.status})`);return{reply:(await s.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>v(`${t}${Y}/chat/info${o("?")}`,await i()),sendMessage:a,streamMessage:async(n,s)=>{try{let l=await a(n);s.onText?.(l.reply),s.onComplete?.(l)}catch(l){s.onError?.(C(l))}},subscribe:(n,s)=>{let l=s?.since??"0",u=!1,d,g=s?.intervalMs??3e3,m=typeof document<"u",p=()=>m&&document.visibilityState==="hidden",b=!1,h=()=>{if(!u){if(p()){b=!0;return}d=setTimeout(f,g)}},f=async()=>{try{let y=await v(`${t}${Y}/chat/thread?since=${encodeURIComponent(l)}${o("&")}`,await i());for(let P of y.messages)n.onMessage(P);l=y.cursor,n.onHealthy?.()}catch(y){n.onError?.(C(y))}h()},D=()=>{u||!b||p()||(b=!1,d&&clearTimeout(d),d=setTimeout(f,0))};m&&document.addEventListener("visibilitychange",D);let c=()=>{u=!0,d&&clearTimeout(d),m&&document.removeEventListener("visibilitychange",D)};return s?.signal?.addEventListener("abort",c),d=setTimeout(f,0),c}}};var L=require("react"),U=(e,t)=>{let[r,o]=(0,L.useState)("");return(0,L.useEffect)(()=>{if(!e){o("");return}let i=Uint8Array.from(atob(e),n=>n.charCodeAt(0)),a=URL.createObjectURL(new Blob([i],{type:t}));return o(a),()=>URL.revokeObjectURL(a)},[e,t]),r};var j=require("react");var F=require("react"),Pe=require("react/jsx-runtime"),Ce=(0,F.createContext)(null),Se=({client:e,children:t})=>(0,Pe.jsx)(Ce.Provider,{value:e,children:t}),N=()=>{let e=(0,F.useContext)(Ce);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};var w=require("react"),V=e=>{let[t,r]=(0,w.useState)([]),[o,i]=(0,w.useState)(""),[a,n]=(0,w.useState)(!1),[s,l]=(0,w.useState)(null),u=(0,w.useRef)(0),d=(0,w.useRef)(null);(0,w.useEffect)(()=>()=>d.current?.abort(),[]);let g=(0,w.useCallback)(()=>{let p=u.current;return u.current+=1,p},[]);(0,w.useEffect)(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&r([{id:g(),role:"assistant",text:b.greeting}])}).catch(()=>{}),()=>{p=!1}},[e,g]);let m=(0,w.useCallback)(()=>{let p=o.trim();if(!p||a)return;i(""),l(null),n(!0);let b=g(),h=g();r(c=>[...c,{id:b,role:"user",text:p},{id:h,role:"assistant",text:"",streaming:!0}]);let f=c=>{r(y=>y.map(P=>P.id===h?c(P):P))},D=new AbortController;d.current=D,e.streamMessage(p,{onText:c=>f(y=>({...y,text:y.text+c})),onComplete:c=>{f(y=>({...y,text:c.reply||y.text,artifacts:c.artifacts,streaming:!1})),n(!1)},onError:c=>{f(y=>({...y,streaming:!1})),l(c.error),n(!1)}},D.signal).catch(c=>{f(y=>({...y,streaming:!1})),l(c instanceof Error?c.message:"stream_failed"),n(!1)}).finally(()=>{n(!1),f(c=>c.streaming?{...c,streaming:!1}:c)})},[o,a,e,g]);return{messages:t,input:o,setInput:i,send:m,sending:a,error:s}};var x=require("react/jsx-runtime"),R={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"}},Ke=({artifact:e})=>{let t=U(e.dataBase64??"",e.mimeType),r=e.url??t;return r?e.mimeType.startsWith("image/")?(0,x.jsx)("a",{href:r,rel:"noopener noreferrer",target:"_blank",children:(0,x.jsx)("img",{alt:e.filename,src:r,style:R.image})}):(0,x.jsx)("a",{download:e.filename,href:r,style:R.link,children:e.filename}):null},Ie=()=>{let e=N(),{messages:t,input:r,setInput:o,send:i,sending:a,error:n}=V(e),s=(0,j.useRef)(null);(0,j.useEffect)(()=>{let u=s.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let l=u=>{u.preventDefault(),i()};return(0,x.jsxs)("div",{style:R.root,children:[(0,x.jsx)("div",{ref:s,style:R.log,children:t.map(u=>(0,x.jsxs)("div",{style:u.role==="user"?R.user:R.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?(0,x.jsx)("div",{style:R.artifacts,children:u.artifacts.map(d=>(0,x.jsx)(Ke,{artifact:d},d.filename))}):null]},u.id))}),n?(0,x.jsx)("div",{style:R.error,children:n}):null,(0,x.jsxs)("form",{onSubmit:l,style:R.form,children:[(0,x.jsx)("input",{"aria-label":"Message",onChange:u=>o(u.target.value),placeholder:"Type a message\u2026",style:R.input,value:r}),(0,x.jsx)("button",{disabled:a||r.trim().length===0,style:R.button,type:"submit",children:"Send"})]})]})};var qe=/\/+$/,B=e=>{let t=e.sessionId,r=e.baseUrl.replace(qe,""),o=n=>`${r}/endpoint/${encodeURIComponent(e.token)}${n}`,i={"content-type":"application/json"},a=(n,s)=>({url:o(n),headers:i,body:JSON.stringify({message:s,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>v(o("/config"),{}),sendMessage:async n=>{let s=await Re(a("/message",n));return t=s.sessionId,s},streamMessage:(n,s,l)=>ke(a("/message/stream",n),s,u=>{t=u},l),subscribe:(n,s)=>{let l=s?.since??"0",u=!1,d,g=s?.intervalMs??3e3,m=async()=>{let b=t;if(b)try{let h=await v(o(`/messages?session=${encodeURIComponent(b)}&since=${encodeURIComponent(l)}`),{});for(let f of h.messages)n.onMessage(f);l=h.cursor,n.onHealthy?.()}catch(h){n.onError?.(C(h))}u||(d=setTimeout(m,g))},p=()=>{u=!0,d&&clearTimeout(d)};return s?.signal?.addEventListener("abort",p),d=setTimeout(m,0),p}}};var He=e=>"transport"in e?e.transport:B(e);var Ye=/^https?:\/\//i,Qe=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,Ze=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function et(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(Ye.test(e))return"url";if(Qe.test(e))return"date"}return"text"}function Q(e){let t=[],r=new Map;for(let o of e)for(let[i,a]of Object.entries(o.data??{})){if(a==null)continue;let n=r.get(i);n||(n=new Map,r.set(i,n),t.push(i));let s=et(a);n.set(s,(n.get(s)??0)+1)}return t.map(o=>{let i=r.get(o)??new Map,a="text",n=-1;for(let[s,l]of i)l>n&&(n=l,a=s);return{key:o,label:Ze(o),type:a}})}var tt=e=>typeof e=="number"?e:Number(e)||0,Ae=e=>/rate|position|rank|score|percent|avg/i.test(e),nt=/posted|published|sent|completed|shipped|launched|_at/i,rt=new Set(["service","order","end_user_id"]);function Z(e,t){let r=e.filter(l=>!rt.has(l.key)),o=r.filter(l=>l.type==="number").slice(0,3),i=r.find(l=>l.key==="status")??r.find(l=>l.type==="select"),a=r.find(l=>l.type==="date"&&nt.test(l.key))??r.find(l=>l.type==="date"),n=r.filter(l=>l.type==="number"&&!Ae(l.key)).map(l=>({field:l,total:t.reduce((u,d)=>u+tt(d.data[l.key]),0)})).sort((l,u)=>u.total-l.total).find(l=>l.total>0)?.field??null,s=[{type:"stat",label:"Items",agg:"count"}];for(let l of o){let u=Ae(l.key);s.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return a&&s.push({type:"line",x:a.key,y:n?.key,agg:"sum",title:n?`${n.label} by day`:"Items by day"}),i&&s.push({type:"donut",groupBy:i.key,title:i.label}),s.push({type:"table",columns:r.map(l=>l.key)}),{version:1,widgets:s}}var ee=6,te=6,ne=4,We={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},ot=e=>Math.max(1,Math.min(6,Math.round(e))),st=e=>Math.max(1,Math.min(4,Math.round(e)));function A(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 oe(e){return We[e]}function G(e,t,r){let o=We[e];return{w:t===void 0?o.w:ot(t),h:r===void 0?o.h:st(r)}}function z(e){let t=[],r=[],o=(n,s,l,u)=>{if(n<0||n+l>6)return!1;for(let d=0;d<u;d+=1){let g=r[s+d];if(g){for(let m=0;m<l;m+=1)if(g[n+m])return!1}}return!0},i=(n,s,l,u)=>{for(let d=0;d<u;d+=1){let g=r[s+d]??[];for(let m=0;m<l;m+=1)g[n+m]=!0;r[s+d]=g}},a=(n,s)=>{for(let l=0;;l+=1)for(let u=0;u+n<=6;u+=1)if(o(u,l,n,s))return{gx:u,gy:l}};for(let n of e){let s=G(A(n.kind),n.w,n.h),u=n.gx!==void 0&&n.gy!==void 0&&o(n.gx,n.gy,s.w,s.h)&&n.gx!==void 0&&n.gy!==void 0?{gx:n.gx,gy:n.gy}:a(s.w,s.h);i(u.gx,u.gy,s.w,s.h),t.push({widget:n,gx:u.gx,gy:u.gy,w:s.w,h:s.h})}return t}function se(e){let t=[],r=[];for(let o of e)A(o.kind)==="block"?r.push(o):t.push(o);return{tiles:z(t),blocks:r}}var Me=new Set(["service","order","end_user_id"]),ie=e=>typeof e=="number"?e:Number(e)||0,Ee=e=>e==null?"":String(e);function ae(e,t){if(e==="count")return t.length;if(t.length===0)return 0;if(e==="last")return t[t.length-1]??0;if(e==="min")return Math.min(...t);if(e==="max")return Math.max(...t);let r=t.reduce((o,i)=>o+i,0);return e==="avg"?Math.round(r/t.length*100)/100:r}function it(e,t,r,o){let i=new Map;for(let a of e){let n=new Date(Ee(a.data[t]));if(Number.isNaN(n.getTime()))continue;let s=n.toISOString().slice(0,10),l=i.get(s)??[];l.push(r?ie(a.data[r]):1),i.set(s,l)}return[...i.entries()].sort((a,n)=>a[0]<n[0]?-1:1).map(([a,n])=>({label:new Date(`${a}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:r?ae(o,n):n.length}))}function at(e,t,r,o="sum"){let i=new Map;for(let a of e){let n=Ee(a.data[t]).trim();if(!n)continue;let s=i.get(n)??[];s.push(r?ie(a.data[r]):1),i.set(n,s)}return[...i.entries()].map(([a,n])=>({label:a,value:r?ae(o,n):n.length})).sort((a,n)=>n.value-a.value)}function lt(e,t,r,o){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:o.length};let a=o.map(n=>ie(n.data[i.key]));return{kind:"stat",label:e.label??i.label,value:ae(e.agg??"sum",a)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let i=it(o,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=at(o,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(a=>t.get(a)).filter(a=>a!==void 0&&!Me.has(a.key)):r;return i.length===0?null:{kind:"table",title:e.title,columns:i,rows:o}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function le(e,t,r){let o=t.filter(n=>!Me.has(n.key)),i=new Map(t.map(n=>[n.key,n])),a=[];for(let n of e.widgets){let s=lt(n,i,o,r);s&&a.push({...s,w:n.w,h:n.h,gx:n.gx,gy:n.gy})}return a}var ut=new Set(["sum","avg","count","min","max","last"]),$e=e=>typeof e=="string"&&ut.has(e)?e:void 0,k=e=>typeof e=="string"&&e!==""?e:void 0,W=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,S=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function dt(e){if(typeof e!="object"||e===null)return null;let t=e;switch(t.type){case"stat":return{type:"stat",label:k(t.label),metric:k(t.metric),agg:$e(t.agg),w:W(t.w),h:M(t.h),gx:S(t.gx),gy:S(t.gy)};case"line":case"bar":{let r=k(t.x);return r?{type:t.type,title:k(t.title),x:r,y:k(t.y),agg:$e(t.agg),w:W(t.w),h:M(t.h),gx:S(t.gx),gy:S(t.gy)}:null}case"donut":{let r=k(t.groupBy);return r?{type:"donut",title:k(t.title),groupBy:r,w:W(t.w),h:M(t.h),gx:S(t.gx),gy:S(t.gy)}:null}case"table":{let r=Array.isArray(t.columns)?t.columns.filter(o=>typeof o=="string"):void 0;return{type:"table",title:k(t.title),columns:r,w:W(t.w),h:M(t.h),gx:S(t.gx),gy:S(t.gy)}}case"text":{let r=k(t.body);return r?{type:"text",title:k(t.title),body:r,w:W(t.w),h:M(t.h),gx:S(t.gx),gy:S(t.gy)}:null}default:return null}}function ue(e){let t=e;if(typeof e=="string"){if(e.trim()==="")return null;try{t=JSON.parse(e)}catch{return null}}if(typeof t!="object"||t===null)return null;let r=t.widgets;if(!Array.isArray(r))return null;let o=r.map(dt).filter(a=>a!==null);if(o.length===0)return null;let i=t.version;return{version:typeof i=="number"?i:1,title:k(t.title),widgets:o}}function J(e){if(typeof e=="string")return e?{kind:"file",value:e}:null;if(e&&typeof e=="object"){let t=e,r=typeof t.value=="string"?t.value:"",o=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 r?{kind:o,value:r,...i?{v:i}:{}}:null}return null}function X(e){let t=new Map;for(let r of e){let o=r.v??1,i=t.get(o)??[];i.push(r),t.set(o,i)}return[...t.entries()].sort(([r],[o])=>r-o).map(([r,o])=>({v:r,items:o}))}function de(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let o=JSON.parse(t);if(Array.isArray(o))return o.map(J).filter(i=>i!==null)}catch{}let r=String(e.file??"");return r?[{kind:"file",value:r}]:[]}function pe(e,t,r,o=""){let a=X(e).find(s=>s.v===t)?.items??[],n=a.filter(s=>s.kind==="file").map(s=>r.get(s.value)??"");return a.some(s=>s.kind==="table")&&n.push(o),n.length===0||n.some(s=>s==="")?"awaiting":n.some(s=>s==="revise")?"revise":"accepted"}function ce(e){return Number(e.published_version)||0}function K(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function ge(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let r=t.columns.map((a,n)=>({key:typeof a.key=="string"&&a.key?a.key:typeof a.id=="string"&&a.id?a.id:`column_${n+1}`,label:typeof a.label=="string"?a.label:"",type:K(a.type),...a.clientEditable===!0?{clientEditable:!0}:{}})),o=t.rows.map((a,n)=>({id:typeof a.id=="string"&&a.id?a.id:`row_${n}`,cells:a.cells&&typeof a.cells=="object"?a.cells:{}})),i=typeof t.name=="string"?t.name:void 0;return{columns:r,rows:o,...i?{name:i}:{}}}}catch{}return null}function me(e){return e==null?"":String(e)}function fe(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function E(){return{cells:{},verdict:"",comment:""}}function be(e){if(typeof e!="string"||e.trim()==="")return E();try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let r=t;return{cells:r.cells&&typeof r.cells=="object"?r.cells:r,verdict:r.verdict==="accepted"||r.verdict==="revise"?r.verdict:"",comment:typeof r.comment=="string"?r.comment:""}}}catch{}return E()}function ye(e,t,r){if(e.clientEditable){let o=r.cells[t.id];if(o&&e.key in o)return o[e.key]}return t.cells[e.key]}function he(e,t,r,o){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[r]:o}}}}function we(e,t,r){return{...e,verdict:t,comment:r}}function xe(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 pt=/\/+$/,I="/api/v1/end-user",H=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function ct(e){let t="";for(let o=0;o<e.length;o+=32768)t+=String.fromCharCode(...e.subarray(o,o+32768));return btoa(t)}var Oe=e=>{let t=e.baseUrl.replace(pt,""),r=()=>typeof e.token=="function"?e.token():e.token,o=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),i=async(n,s)=>{try{let l=await fetch(`${t}${I}${n}`,{method:s.method,headers:await o(),...s.body===void 0?{}:{body:JSON.stringify(s.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=`${s.method} ${n} \u2192 ${String(l.status)}`;try{let g=JSON.parse(u);g.message&&(d=g.message)}catch{d=u?`${d}: ${u}`:d}throw C({error:d})}return await l.json()}catch(l){throw l instanceof H?l:C(l)}},a=n=>`/tables/${encodeURIComponent(n)}`;return{listTables:async()=>(await v(`${t}${I}/tables`,await o())).tables,listRows:async(n,s)=>await v(`${t}${I}${a(n)}/rows?limit=${String(s??100)}`,await o()),insertRow:async(n,s)=>{let{rowIds:l}=await i(`${a(n)}/rows`,{method:"POST",body:{rows:[s]}}),u=l[0];if(!u)throw C(new Error("The row was not created."));return u},patchRow:async(n,s,l)=>(await i(`${a(n)}/rows/${encodeURIComponent(s)}`,{method:"PATCH",body:l})).updated,deleteRow:async(n,s)=>(await i(`/${encodeURIComponent(n)}/${encodeURIComponent(s)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await v(`${t}${I}/tables/files/rows?limit=200`,await o())).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(n,s)=>{let l=new Uint8Array(await n.arrayBuffer());return await i("/files",{method:"POST",body:{filename:n.name,mime:n.type||"application/octet-stream",data:ct(l),...s===void 0?{}:{message:s}}})},fileLink:async n=>await v(`${t}${I}/files/${encodeURIComponent(n)}/url`,await o()),deleteFile:async n=>(await i(`/files/${encodeURIComponent(n)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await v(`${t}${I}/documents`,await o())).documents,readDocument:async n=>(await v(`${t}${I}/documents/${encodeURIComponent(n)}`,await o())).document,saveDocument:async(n,s)=>await i(`/documents/${encodeURIComponent(n)}`,{method:"PATCH",body:s})}};var T=require("react"),_e="greeting";function ve(e,t){if(e.some(a=>a.id===t.id))return e;let r=e.filter(a=>a.id!==_e),o=a=>a.author==="client"==(t.author==="client");return[...r.filter(a=>!(a.pending&&o(a)&&a.text===t.text)),t]}var Le=(e,t)=>{let[r,o]=(0,T.useState)([]),[i,a]=(0,T.useState)(""),[n,s]=(0,T.useState)(!1),[l,u]=(0,T.useState)(null),d=(0,T.useRef)(0),g=t?.pollMs??2e3;(0,T.useEffect)(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&o(h=>h.length===0?[{id:_e,cursor:"",author:"agent",text:b.greeting}]:h)}).catch(()=>{}),()=>{p=!1}},[e]),(0,T.useEffect)(()=>e.subscribe?.({onMessage:p=>o(b=>ve(b,p)),onError:p=>u(p.error),onHealthy:()=>u(null)},{intervalMs:g}),[e,g]);let m=(0,T.useCallback)(()=>{let p=i.trim();if(!p||n)return;a(""),u(null),s(!0),d.current+=1;let b=`pending-${d.current}`,h={id:b,cursor:"",author:"client",text:p,pending:!0};o(f=>[...f,h]),e.sendMessage(p).then(f=>{s(!1),f.reply.trim()&&o(c=>c.some(P=>!P.pending&&P.author!=="client"&&P.text===f.reply)?c:(d.current+=1,[...c,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:f.reply,pending:!0}]))}).catch(f=>{u(f instanceof Error?f.message:"send_failed"),s(!1),o(D=>D.filter(c=>c.id!==b)),a(D=>D||p)})},[i,n,e]);return{messages:r,input:i,setInput:a,send:m,sending:n,error:l}};0&&(module.exports={Chat,GRID_COLS,GRID_MAX_COLS,GRID_MAX_ROWS,HolaProvider,PortalConflict,bandOfKind,bandOfType,cellValue,createApiTransport,createHolaClient,createPortalData,createWidgetTransport,deliverableCellText,deliverableStatus,deriveFields,emptyTableResponses,footprintOf,footprintWith,formatDeliverableDate,groupDeliverableVersions,inferSpec,isDeliverableChecked,mergeMessage,normalizeDeliverableColType,normalizeDeliverableItem,parseDashboardSpec,parseDeliverableItems,parseDeliverableTable,parseTableResponses,placeWidgets,publishedVersionOf,renderModel,setResponse,setTableReview,splitLayout,textDeltaOf,thinkingDeltaOf,toolEventOf,useArtifactUrl,useChat,useHolaClient,useThread});
|
package/dist/index.d.cts
CHANGED
|
@@ -176,11 +176,22 @@ type PortalTable = {
|
|
|
176
176
|
writable_fields: string[];
|
|
177
177
|
row_count: number;
|
|
178
178
|
};
|
|
179
|
+
/** Who last wrote a row. `employee` is the company's AI employee, `org_member` its
|
|
180
|
+
* staff, `end_user` this customer. Null on rows written before the platform
|
|
181
|
+
* recorded it — unknown rather than assumed. */
|
|
182
|
+
type PortalRowAuthor = {
|
|
183
|
+
kind: "org_member" | "employee" | "end_user";
|
|
184
|
+
id: string | null;
|
|
185
|
+
};
|
|
179
186
|
type PortalRow = {
|
|
180
187
|
rowId: string;
|
|
181
188
|
data: Record<string, unknown>;
|
|
182
189
|
createdAt: string;
|
|
183
190
|
updatedAt: string;
|
|
191
|
+
/** Bumped on every write. Quote it back on a patch (`If-Match`) and a save made
|
|
192
|
+
* against a value that has since moved is refused instead of overwriting it. */
|
|
193
|
+
revision: number;
|
|
194
|
+
updatedBy: PortalRowAuthor | null;
|
|
184
195
|
};
|
|
185
196
|
type PortalRowPage = {
|
|
186
197
|
rows: PortalRow[];
|
|
@@ -321,11 +332,18 @@ interface SeriesWidget {
|
|
|
321
332
|
gx?: number | undefined;
|
|
322
333
|
gy?: number | undefined;
|
|
323
334
|
}
|
|
324
|
-
/** A breakdown
|
|
335
|
+
/** A breakdown per distinct value of `groupBy`.
|
|
336
|
+
*
|
|
337
|
+
* `metric` + `agg` say WHAT is measured for each group; omit `metric` and it counts rows, which was
|
|
338
|
+
* the only thing this could do and stays the default — every donut authored before this renders
|
|
339
|
+
* identically. With one, "how many newsletters per status" becomes "how many RECIPIENTS per
|
|
340
|
+
* status", which is usually the number the dashboard exists to show. */
|
|
325
341
|
interface DonutWidget {
|
|
326
342
|
type: "donut";
|
|
327
343
|
title?: string | undefined;
|
|
328
344
|
groupBy: string;
|
|
345
|
+
metric?: string | undefined;
|
|
346
|
+
agg?: Agg | undefined;
|
|
329
347
|
w?: number | undefined;
|
|
330
348
|
h?: number | undefined;
|
|
331
349
|
gx?: number | undefined;
|
|
@@ -607,4 +625,4 @@ declare const useThread: (client: HolaClient, options?: {
|
|
|
607
625
|
pollMs?: number;
|
|
608
626
|
}) => UseThread;
|
|
609
627
|
|
|
610
|
-
export { type Agg, type ApiTransportConfig, type Band, type ChartView, Chat, type ChatMessage, type CreateHolaClientOptions, type DashboardLayout, type DashboardSpec, 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 PlacedWidget, type Point, PortalConflict, type PortalData, type PortalDocument, type PortalDocumentSummary, type PortalField, type PortalFile, type PortalRow, type PortalRowPage, type PortalTable, type ResolvedWidget, type SeriesWidget, type StatView, type StatWidget, type TableResponses, type TableReviewVerdict, type TableWidget, type TextWidget, type ThreadMessage, type UseChat, type UseThread, type Widget, type WidgetTransportConfig, type WidgetType, bandOfKind, bandOfType, cellValue, createApiTransport, createHolaClient, createPortalData, createWidgetTransport, deliverableCellText, deliverableStatus, deriveFields, emptyTableResponses, footprintOf, footprintWith, formatDeliverableDate, groupDeliverableVersions, inferSpec, isDeliverableChecked, mergeMessage, normalizeDeliverableColType, normalizeDeliverableItem, parseDashboardSpec, parseDeliverableItems, parseDeliverableTable, parseTableResponses, placeWidgets, publishedVersionOf, renderModel, setResponse, setTableReview, splitLayout, textDeltaOf, thinkingDeltaOf, toolEventOf, useArtifactUrl, useChat, useHolaClient, useThread };
|
|
628
|
+
export { type Agg, type ApiTransportConfig, type Band, type ChartView, Chat, type ChatMessage, type CreateHolaClientOptions, type DashboardLayout, type DashboardSpec, 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 PlacedWidget, type Point, PortalConflict, type PortalData, type PortalDocument, type PortalDocumentSummary, type PortalField, type PortalFile, type PortalRow, type PortalRowAuthor, type PortalRowPage, type PortalTable, type ResolvedWidget, type SeriesWidget, type StatView, type StatWidget, type TableResponses, type TableReviewVerdict, type TableWidget, type TextWidget, type ThreadMessage, type UseChat, type UseThread, type Widget, type WidgetTransportConfig, type WidgetType, bandOfKind, bandOfType, cellValue, createApiTransport, createHolaClient, createPortalData, createWidgetTransport, deliverableCellText, deliverableStatus, deriveFields, emptyTableResponses, footprintOf, footprintWith, formatDeliverableDate, groupDeliverableVersions, inferSpec, isDeliverableChecked, mergeMessage, normalizeDeliverableColType, normalizeDeliverableItem, parseDashboardSpec, parseDeliverableItems, parseDeliverableTable, parseTableResponses, placeWidgets, publishedVersionOf, renderModel, setResponse, setTableReview, splitLayout, textDeltaOf, thinkingDeltaOf, toolEventOf, useArtifactUrl, useChat, useHolaClient, useThread };
|
package/dist/index.d.ts
CHANGED
|
@@ -176,11 +176,22 @@ type PortalTable = {
|
|
|
176
176
|
writable_fields: string[];
|
|
177
177
|
row_count: number;
|
|
178
178
|
};
|
|
179
|
+
/** Who last wrote a row. `employee` is the company's AI employee, `org_member` its
|
|
180
|
+
* staff, `end_user` this customer. Null on rows written before the platform
|
|
181
|
+
* recorded it — unknown rather than assumed. */
|
|
182
|
+
type PortalRowAuthor = {
|
|
183
|
+
kind: "org_member" | "employee" | "end_user";
|
|
184
|
+
id: string | null;
|
|
185
|
+
};
|
|
179
186
|
type PortalRow = {
|
|
180
187
|
rowId: string;
|
|
181
188
|
data: Record<string, unknown>;
|
|
182
189
|
createdAt: string;
|
|
183
190
|
updatedAt: string;
|
|
191
|
+
/** Bumped on every write. Quote it back on a patch (`If-Match`) and a save made
|
|
192
|
+
* against a value that has since moved is refused instead of overwriting it. */
|
|
193
|
+
revision: number;
|
|
194
|
+
updatedBy: PortalRowAuthor | null;
|
|
184
195
|
};
|
|
185
196
|
type PortalRowPage = {
|
|
186
197
|
rows: PortalRow[];
|
|
@@ -321,11 +332,18 @@ interface SeriesWidget {
|
|
|
321
332
|
gx?: number | undefined;
|
|
322
333
|
gy?: number | undefined;
|
|
323
334
|
}
|
|
324
|
-
/** A breakdown
|
|
335
|
+
/** A breakdown per distinct value of `groupBy`.
|
|
336
|
+
*
|
|
337
|
+
* `metric` + `agg` say WHAT is measured for each group; omit `metric` and it counts rows, which was
|
|
338
|
+
* the only thing this could do and stays the default — every donut authored before this renders
|
|
339
|
+
* identically. With one, "how many newsletters per status" becomes "how many RECIPIENTS per
|
|
340
|
+
* status", which is usually the number the dashboard exists to show. */
|
|
325
341
|
interface DonutWidget {
|
|
326
342
|
type: "donut";
|
|
327
343
|
title?: string | undefined;
|
|
328
344
|
groupBy: string;
|
|
345
|
+
metric?: string | undefined;
|
|
346
|
+
agg?: Agg | undefined;
|
|
329
347
|
w?: number | undefined;
|
|
330
348
|
h?: number | undefined;
|
|
331
349
|
gx?: number | undefined;
|
|
@@ -607,4 +625,4 @@ declare const useThread: (client: HolaClient, options?: {
|
|
|
607
625
|
pollMs?: number;
|
|
608
626
|
}) => UseThread;
|
|
609
627
|
|
|
610
|
-
export { type Agg, type ApiTransportConfig, type Band, type ChartView, Chat, type ChatMessage, type CreateHolaClientOptions, type DashboardLayout, type DashboardSpec, 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 PlacedWidget, type Point, PortalConflict, type PortalData, type PortalDocument, type PortalDocumentSummary, type PortalField, type PortalFile, type PortalRow, type PortalRowPage, type PortalTable, type ResolvedWidget, type SeriesWidget, type StatView, type StatWidget, type TableResponses, type TableReviewVerdict, type TableWidget, type TextWidget, type ThreadMessage, type UseChat, type UseThread, type Widget, type WidgetTransportConfig, type WidgetType, bandOfKind, bandOfType, cellValue, createApiTransport, createHolaClient, createPortalData, createWidgetTransport, deliverableCellText, deliverableStatus, deriveFields, emptyTableResponses, footprintOf, footprintWith, formatDeliverableDate, groupDeliverableVersions, inferSpec, isDeliverableChecked, mergeMessage, normalizeDeliverableColType, normalizeDeliverableItem, parseDashboardSpec, parseDeliverableItems, parseDeliverableTable, parseTableResponses, placeWidgets, publishedVersionOf, renderModel, setResponse, setTableReview, splitLayout, textDeltaOf, thinkingDeltaOf, toolEventOf, useArtifactUrl, useChat, useHolaClient, useThread };
|
|
628
|
+
export { type Agg, type ApiTransportConfig, type Band, type ChartView, Chat, type ChatMessage, type CreateHolaClientOptions, type DashboardLayout, type DashboardSpec, 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 PlacedWidget, type Point, PortalConflict, type PortalData, type PortalDocument, type PortalDocumentSummary, type PortalField, type PortalFile, type PortalRow, type PortalRowAuthor, type PortalRowPage, type PortalTable, type ResolvedWidget, type SeriesWidget, type StatView, type StatWidget, type TableResponses, type TableReviewVerdict, type TableWidget, type TextWidget, type ThreadMessage, type UseChat, type UseThread, type Widget, type WidgetTransportConfig, type WidgetType, bandOfKind, bandOfType, cellValue, createApiTransport, createHolaClient, createPortalData, createWidgetTransport, deliverableCellText, deliverableStatus, deriveFields, emptyTableResponses, footprintOf, footprintWith, formatDeliverableDate, groupDeliverableVersions, inferSpec, isDeliverableChecked, mergeMessage, normalizeDeliverableColType, normalizeDeliverableItem, parseDashboardSpec, parseDeliverableItems, parseDeliverableTable, parseTableResponses, placeWidgets, publishedVersionOf, renderModel, setResponse, setTableReview, splitLayout, textDeltaOf, thinkingDeltaOf, toolEventOf, useArtifactUrl, useChat, useHolaClient, useThread };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
var
|
|
3
|
-
`))o.startsWith(":")||(o.startsWith("event:")?t=o.slice(6).trim():o.startsWith("data:")&&r.push(o.slice(5).replace(
|
|
4
|
-
`)}:null},$e=(e,t,r)=>{let o;try{o=JSON.parse(e.data)}catch{return}if(e.event==="session"){let
|
|
2
|
+
var Y=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},$=e=>{let t=Y(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},O=e=>{let t=Y(e);return t?.type==="thinking_delta"&&typeof t.delta=="string"?t.delta:null},_=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 Me=/^ /,R=e=>{if(e&&typeof e=="object"){let t=e,r=typeof t.error=="string"?t.error:"request_failed";return typeof t.retryable=="boolean"?{error:r,retryable:t.retryable}:{error:r}}return{error:"request_failed"}},Ee=e=>{let t="message",r=[];for(let o of e.split(`
|
|
3
|
+
`))o.startsWith(":")||(o.startsWith("event:")?t=o.slice(6).trim():o.startsWith("data:")&&r.push(o.slice(5).replace(Me,"")));return r.length>0?{event:t,data:r.join(`
|
|
4
|
+
`)}:null},$e=(e,t,r)=>{let o;try{o=JSON.parse(e.data)}catch{return}if(e.event==="session"){let a=o.sessionId;a&&(r(a),t.onSession?.(a));return}if(e.event==="turn_event"){t.onEvent?.(o);let a=$(o);a&&t.onText?.(a);let i=O(o);i&&t.onThinking?.(i);let n=_(o);n&&t.onTool?.(n);return}if(e.event==="chat_completed"){let a=o;r(a.sessionId),t.onComplete?.(a);return}e.event==="chat_error"&&t.onError?.(R(o))},w=async(e,t)=>{let r=await fetch(e,{headers:t});if(!r.ok)throw new Error(`hola: request failed (${r.status})`);return await r.json()},Q=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()},Z=async(e,t,r,o)=>{let a=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:o});if(!(a.ok&&a.body)){t.onError?.({error:`stream_failed_${a.status}`});return}let i=a.body.getReader(),n=new TextDecoder,s="",l=()=>{let d=s.indexOf(`
|
|
5
5
|
|
|
6
|
-
`);for(;d!==-1;){let
|
|
6
|
+
`);for(;d!==-1;){let g=s.slice(0,d);s=s.slice(d+2);let m=Ee(g);m&&$e(m,t,r),d=s.indexOf(`
|
|
7
7
|
|
|
8
|
-
`)}},u=async()=>{let d=await a.read();if(!d.done)return s+=n.decode(d.value,{stream:!0}),l(),u()};await u()};var Oe=/\/+$/,L="/api/v1/end-user",_e=e=>{let t=e.baseUrl.replace(Oe,""),r=()=>typeof e.token=="function"?e.token():e.token,o=n=>e.project?`${n}project=${encodeURIComponent(e.project)}`:"",i=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),a=async n=>{let s=await fetch(`${t}${L}/chat${o("?")}`,{method:"POST",headers:await i(),body:JSON.stringify({message:n})});if(!s.ok)throw new Error(`hola: message failed (${s.status})`);return{reply:(await s.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>w(`${t}${L}/chat/info${o("?")}`,await i()),sendMessage:a,streamMessage:async(n,s)=>{try{let l=await a(n);s.onText?.(l.reply),s.onComplete?.(l)}catch(l){s.onError?.(R(l))}},subscribe:(n,s)=>{let l=s?.since??"0",u=!1,d,m=s?.intervalMs??3e3,g=typeof document<"u",p=()=>g&&document.visibilityState==="hidden",b=!1,h=()=>{if(!u){if(p()){b=!0;return}d=setTimeout(f,m)}},f=async()=>{try{let y=await w(`${t}${L}/chat/thread?since=${encodeURIComponent(l)}${o("&")}`,await i());for(let D of y.messages)n.onMessage(D);l=y.cursor,n.onHealthy?.()}catch(y){n.onError?.(R(y))}h()},T=()=>{u||!b||p()||(b=!1,d&&clearTimeout(d),d=setTimeout(f,0))};g&&document.addEventListener("visibilitychange",T);let c=()=>{u=!0,d&&clearTimeout(d),g&&document.removeEventListener("visibilitychange",T)};return s?.signal?.addEventListener("abort",c),d=setTimeout(f,0),c}}};import{useEffect as Le,useState as Ue}from"react";var U=(e,t)=>{let[r,o]=Ue("");return Le(()=>{if(!e){o("");return}let i=Uint8Array.from(atob(e),n=>n.charCodeAt(0)),a=URL.createObjectURL(new Blob([i],{type:t}));return o(a),()=>URL.revokeObjectURL(a)},[e,t]),r};import{useEffect as Ge,useRef as Be}from"react";import{createContext as Fe,useContext as Ne}from"react";import{jsx as je}from"react/jsx-runtime";var Q=Fe(null),Ve=({client:e,children:t})=>je(Q.Provider,{value:e,children:t}),F=()=>{let e=Ne(Q);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};import{useCallback as Z,useEffect as ee,useRef as te,useState as W}from"react";var N=e=>{let[t,r]=W([]),[o,i]=W(""),[a,n]=W(!1),[s,l]=W(null),u=te(0),d=te(null);ee(()=>()=>d.current?.abort(),[]);let m=Z(()=>{let p=u.current;return u.current+=1,p},[]);ee(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&r([{id:m(),role:"assistant",text:b.greeting}])}).catch(()=>{}),()=>{p=!1}},[e,m]);let g=Z(()=>{let p=o.trim();if(!p||a)return;i(""),l(null),n(!0);let b=m(),h=m();r(c=>[...c,{id:b,role:"user",text:p},{id:h,role:"assistant",text:"",streaming:!0}]);let f=c=>{r(y=>y.map(D=>D.id===h?c(D):D))},T=new AbortController;d.current=T,e.streamMessage(p,{onText:c=>f(y=>({...y,text:y.text+c})),onComplete:c=>{f(y=>({...y,text:c.reply||y.text,artifacts:c.artifacts,streaming:!1})),n(!1)},onError:c=>{f(y=>({...y,streaming:!1})),l(c.error),n(!1)}},T.signal).catch(c=>{f(y=>({...y,streaming:!1})),l(c instanceof Error?c.message:"stream_failed"),n(!1)}).finally(()=>{n(!1),f(c=>c.streaming?{...c,streaming:!1}:c)})},[o,a,e,m]);return{messages:t,input:o,setInput:i,send:g,sending:a,error:s}};import{jsx as C,jsxs as V}from"react/jsx-runtime";var x={root:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif",fontSize:14,color:"#111827"},log:{flex:1,overflowY:"auto",padding:12,display:"flex",flexDirection:"column",gap:8},user:{alignSelf:"flex-end",background:"#111827",color:"#ffffff",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},assistant:{alignSelf:"flex-start",background:"#f1f1f4",color:"#111827",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},artifacts:{display:"flex",flexDirection:"column",gap:6,marginTop:6},image:{maxHeight:220,borderRadius:8,border:"1px solid #e5e7eb"},link:{color:"#2563eb",textDecoration:"underline",wordBreak:"break-all"},error:{color:"#b91c1c",padding:"4px 12px",fontSize:13},form:{display:"flex",gap:8,borderTop:"1px solid #e5e7eb",padding:8},input:{flex:1,border:"1px solid #d1d5db",borderRadius:8,padding:"8px 10px",fontSize:14,outline:"none"},button:{border:"none",background:"#111827",color:"#ffffff",borderRadius:8,padding:"8px 14px",fontSize:14,cursor:"pointer"}},ze=({artifact:e})=>{let t=U(e.dataBase64??"",e.mimeType),r=e.url??t;return r?e.mimeType.startsWith("image/")?C("a",{href:r,rel:"noopener noreferrer",target:"_blank",children:C("img",{alt:e.filename,src:r,style:x.image})}):C("a",{download:e.filename,href:r,style:x.link,children:e.filename}):null},Je=()=>{let e=F(),{messages:t,input:r,setInput:o,send:i,sending:a,error:n}=N(e),s=Be(null);Ge(()=>{let u=s.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let l=u=>{u.preventDefault(),i()};return V("div",{style:x.root,children:[C("div",{ref:s,style:x.log,children:t.map(u=>V("div",{style:u.role==="user"?x.user:x.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?C("div",{style:x.artifacts,children:u.artifacts.map(d=>C(ze,{artifact:d},d.filename))}):null]},u.id))}),n?C("div",{style:x.error,children:n}):null,V("form",{onSubmit:l,style:x.form,children:[C("input",{"aria-label":"Message",onChange:u=>o(u.target.value),placeholder:"Type a message\u2026",style:x.input,value:r}),C("button",{disabled:a||r.trim().length===0,style:x.button,type:"submit",children:"Send"})]})]})};var Xe=/\/+$/,j=e=>{let t=e.sessionId,r=e.baseUrl.replace(Xe,""),o=n=>`${r}/endpoint/${encodeURIComponent(e.token)}${n}`,i={"content-type":"application/json"},a=(n,s)=>({url:o(n),headers:i,body:JSON.stringify({message:s,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>w(o("/config"),{}),sendMessage:async n=>{let s=await q(a("/message",n));return t=s.sessionId,s},streamMessage:(n,s,l)=>Y(a("/message/stream",n),s,u=>{t=u},l),subscribe:(n,s)=>{let l=s?.since??"0",u=!1,d,m=s?.intervalMs??3e3,g=async()=>{let b=t;if(b)try{let h=await w(o(`/messages?session=${encodeURIComponent(b)}&since=${encodeURIComponent(l)}`),{});for(let f of h.messages)n.onMessage(f);l=h.cursor,n.onHealthy?.()}catch(h){n.onError?.(R(h))}u||(d=setTimeout(g,m))},p=()=>{u=!0,d&&clearTimeout(d)};return s?.signal?.addEventListener("abort",p),d=setTimeout(g,0),p}}};var Ke=e=>"transport"in e?e.transport:j(e);var qe=/^https?:\/\//i,Ye=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,Qe=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function Ze(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(qe.test(e))return"url";if(Ye.test(e))return"date"}return"text"}function ne(e){let t=[],r=new Map;for(let o of e)for(let[i,a]of Object.entries(o.data??{})){if(a==null)continue;let n=r.get(i);n||(n=new Map,r.set(i,n),t.push(i));let s=Ze(a);n.set(s,(n.get(s)??0)+1)}return t.map(o=>{let i=r.get(o)??new Map,a="text",n=-1;for(let[s,l]of i)l>n&&(n=l,a=s);return{key:o,label:Qe(o),type:a}})}var et=e=>typeof e=="number"?e:Number(e)||0,re=e=>/rate|position|rank|score|percent|avg/i.test(e),tt=/posted|published|sent|completed|shipped|launched|_at/i,nt=new Set(["service","order","end_user_id"]);function oe(e,t){let r=e.filter(l=>!nt.has(l.key)),o=r.filter(l=>l.type==="number").slice(0,3),i=r.find(l=>l.key==="status")??r.find(l=>l.type==="select"),a=r.find(l=>l.type==="date"&&tt.test(l.key))??r.find(l=>l.type==="date"),n=r.filter(l=>l.type==="number"&&!re(l.key)).map(l=>({field:l,total:t.reduce((u,d)=>u+et(d.data[l.key]),0)})).sort((l,u)=>u.total-l.total).find(l=>l.total>0)?.field??null,s=[{type:"stat",label:"Items",agg:"count"}];for(let l of o){let u=re(l.key);s.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return a&&s.push({type:"line",x:a.key,y:n?.key,agg:"sum",title:n?`${n.label} by day`:"Items by day"}),i&&s.push({type:"donut",groupBy:i.key,title:i.label}),s.push({type:"table",columns:r.map(l=>l.key)}),{version:1,widgets:s}}var se=6,ie=6,ae=4,le={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},rt=e=>Math.max(1,Math.min(6,Math.round(e))),ot=e=>Math.max(1,Math.min(4,Math.round(e)));function M(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function ue(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function de(e){return le[e]}function G(e,t,r){let o=le[e];return{w:t===void 0?o.w:rt(t),h:r===void 0?o.h:ot(r)}}function B(e){let t=[],r=[],o=(n,s,l,u)=>{if(n<0||n+l>6)return!1;for(let d=0;d<u;d+=1){let m=r[s+d];if(m){for(let g=0;g<l;g+=1)if(m[n+g])return!1}}return!0},i=(n,s,l,u)=>{for(let d=0;d<u;d+=1){let m=r[s+d]??[];for(let g=0;g<l;g+=1)m[n+g]=!0;r[s+d]=m}},a=(n,s)=>{for(let l=0;;l+=1)for(let u=0;u+n<=6;u+=1)if(o(u,l,n,s))return{gx:u,gy:l}};for(let n of e){let s=G(M(n.kind),n.w,n.h),u=n.gx!==void 0&&n.gy!==void 0&&o(n.gx,n.gy,s.w,s.h)&&n.gx!==void 0&&n.gy!==void 0?{gx:n.gx,gy:n.gy}:a(s.w,s.h);i(u.gx,u.gy,s.w,s.h),t.push({widget:n,gx:u.gx,gy:u.gy,w:s.w,h:s.h})}return t}function pe(e){let t=[],r=[];for(let o of e)M(o.kind)==="block"?r.push(o):t.push(o);return{tiles:B(t),blocks:r}}var ce=new Set(["service","order","end_user_id"]),me=e=>typeof e=="number"?e:Number(e)||0,ge=e=>e==null?"":String(e);function fe(e,t){if(e==="count")return t.length;if(t.length===0)return 0;if(e==="last")return t[t.length-1]??0;if(e==="min")return Math.min(...t);if(e==="max")return Math.max(...t);let r=t.reduce((o,i)=>o+i,0);return e==="avg"?Math.round(r/t.length*100)/100:r}function st(e,t,r,o){let i=new Map;for(let a of e){let n=new Date(ge(a.data[t]));if(Number.isNaN(n.getTime()))continue;let s=n.toISOString().slice(0,10),l=i.get(s)??[];l.push(r?me(a.data[r]):1),i.set(s,l)}return[...i.entries()].sort((a,n)=>a[0]<n[0]?-1:1).map(([a,n])=>({label:new Date(`${a}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:r?fe(o,n):n.length}))}function it(e,t){let r=new Map;for(let o of e){let i=ge(o.data[t]).trim();i&&r.set(i,(r.get(i)??0)+1)}return[...r.entries()].sort((o,i)=>i[1]-o[1]).map(([o,i])=>({label:o,value:i}))}function at(e,t,r,o){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:o.length};let a=o.map(n=>me(n.data[i.key]));return{kind:"stat",label:e.label??i.label,value:fe(e.agg??"sum",a)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let i=st(o,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(o,e.groupBy);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(a=>t.get(a)).filter(a=>a!==void 0&&!ce.has(a.key)):r;return i.length===0?null:{kind:"table",title:e.title,columns:i,rows:o}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function be(e,t,r){let o=t.filter(n=>!ce.has(n.key)),i=new Map(t.map(n=>[n.key,n])),a=[];for(let n of e.widgets){let s=at(n,i,o,r);s&&a.push({...s,w:n.w,h:n.h,gx:n.gx,gy:n.gy})}return a}var lt=new Set(["sum","avg","count","min","max","last"]),ye=e=>typeof e=="string"&<.has(e)?e:void 0,v=e=>typeof e=="string"&&e!==""?e:void 0,P=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,I=e=>typeof e=="number"&&e>=1?Math.min(4,Math.round(e)):void 0,k=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function ut(e){if(typeof e!="object"||e===null)return null;let t=e;switch(t.type){case"stat":return{type:"stat",label:v(t.label),metric:v(t.metric),agg:ye(t.agg),w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)};case"line":case"bar":{let r=v(t.x);return r?{type:t.type,title:v(t.title),x:r,y:v(t.y),agg:ye(t.agg),w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}:null}case"donut":{let r=v(t.groupBy);return r?{type:"donut",title:v(t.title),groupBy:r,w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}:null}case"table":{let r=Array.isArray(t.columns)?t.columns.filter(o=>typeof o=="string"):void 0;return{type:"table",title:v(t.title),columns:r,w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}}case"text":{let r=v(t.body);return r?{type:"text",title:v(t.title),body:r,w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}:null}default:return null}}function he(e){let t=e;if(typeof e=="string"){if(e.trim()==="")return null;try{t=JSON.parse(e)}catch{return null}}if(typeof t!="object"||t===null)return null;let r=t.widgets;if(!Array.isArray(r))return null;let o=r.map(ut).filter(a=>a!==null);if(o.length===0)return null;let i=t.version;return{version:typeof i=="number"?i:1,title:v(t.title),widgets:o}}function z(e){if(typeof e=="string")return e?{kind:"file",value:e}:null;if(e&&typeof e=="object"){let t=e,r=typeof t.value=="string"?t.value:"",o=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 r?{kind:o,value:r,...i?{v:i}:{}}:null}return null}function J(e){let t=new Map;for(let r of e){let o=r.v??1,i=t.get(o)??[];i.push(r),t.set(o,i)}return[...t.entries()].sort(([r],[o])=>r-o).map(([r,o])=>({v:r,items:o}))}function we(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let o=JSON.parse(t);if(Array.isArray(o))return o.map(z).filter(i=>i!==null)}catch{}let r=String(e.file??"");return r?[{kind:"file",value:r}]:[]}function xe(e,t,r,o=""){let a=J(e).find(s=>s.v===t)?.items??[],n=a.filter(s=>s.kind==="file").map(s=>r.get(s.value)??"");return a.some(s=>s.kind==="table")&&n.push(o),n.length===0||n.some(s=>s==="")?"awaiting":n.some(s=>s==="revise")?"revise":"accepted"}function ve(e){return Number(e.published_version)||0}function X(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function Te(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let r=t.columns.map((a,n)=>({key:typeof a.key=="string"&&a.key?a.key:typeof a.id=="string"&&a.id?a.id:`column_${n+1}`,label:typeof a.label=="string"?a.label:"",type:X(a.type),...a.clientEditable===!0?{clientEditable:!0}:{}})),o=t.rows.map((a,n)=>({id:typeof a.id=="string"&&a.id?a.id:`row_${n}`,cells:a.cells&&typeof a.cells=="object"?a.cells:{}})),i=typeof t.name=="string"?t.name:void 0;return{columns:r,rows:o,...i?{name:i}:{}}}}catch{}return null}function Re(e){return e==null?"":String(e)}function ke(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function A(){return{cells:{},verdict:"",comment:""}}function De(e){if(typeof e!="string"||e.trim()==="")return A();try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let r=t;return{cells:r.cells&&typeof r.cells=="object"?r.cells:r,verdict:r.verdict==="accepted"||r.verdict==="revise"?r.verdict:"",comment:typeof r.comment=="string"?r.comment:""}}}catch{}return A()}function Ce(e,t,r){if(e.clientEditable){let o=r.cells[t.id];if(o&&e.key in o)return o[e.key]}return t.cells[e.key]}function Se(e,t,r,o){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[r]:o}}}}function Pe(e,t,r){return{...e,verdict:t,comment:r}}function Ie(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 dt=/\/+$/,S="/api/v1/end-user",H=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function pt(e){let t="";for(let o=0;o<e.length;o+=32768)t+=String.fromCharCode(...e.subarray(o,o+32768));return btoa(t)}var ct=e=>{let t=e.baseUrl.replace(dt,""),r=()=>typeof e.token=="function"?e.token():e.token,o=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),i=async(n,s)=>{try{let l=await fetch(`${t}${S}${n}`,{method:s.method,headers:await o(),...s.body===void 0?{}:{body:JSON.stringify(s.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=`${s.method} ${n} \u2192 ${String(l.status)}`;try{let m=JSON.parse(u);m.message&&(d=m.message)}catch{d=u?`${d}: ${u}`:d}throw R({error:d})}return await l.json()}catch(l){throw l instanceof H?l:R(l)}},a=n=>`/tables/${encodeURIComponent(n)}`;return{listTables:async()=>(await w(`${t}${S}/tables`,await o())).tables,listRows:async(n,s)=>await w(`${t}${S}${a(n)}/rows?limit=${String(s??100)}`,await o()),insertRow:async(n,s)=>{let{rowIds:l}=await i(`${a(n)}/rows`,{method:"POST",body:{rows:[s]}}),u=l[0];if(!u)throw R(new Error("The row was not created."));return u},patchRow:async(n,s,l)=>(await i(`${a(n)}/rows/${encodeURIComponent(s)}`,{method:"PATCH",body:l})).updated,deleteRow:async(n,s)=>(await i(`/${encodeURIComponent(n)}/${encodeURIComponent(s)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await w(`${t}${S}/tables/files/rows?limit=200`,await o())).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(n,s)=>{let l=new Uint8Array(await n.arrayBuffer());return await i("/files",{method:"POST",body:{filename:n.name,mime:n.type||"application/octet-stream",data:pt(l),...s===void 0?{}:{message:s}}})},fileLink:async n=>await w(`${t}${S}/files/${encodeURIComponent(n)}/url`,await o()),deleteFile:async n=>(await i(`/files/${encodeURIComponent(n)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await w(`${t}${S}/documents`,await o())).documents,readDocument:async n=>(await w(`${t}${S}/documents/${encodeURIComponent(n)}`,await o())).document,saveDocument:async(n,s)=>await i(`/documents/${encodeURIComponent(n)}`,{method:"PATCH",body:s})}};import{useCallback as mt,useEffect as He,useRef as gt,useState as E}from"react";var We="greeting";function Me(e,t){if(e.some(a=>a.id===t.id))return e;let r=e.filter(a=>a.id!==We),o=a=>a.author==="client"==(t.author==="client");return[...r.filter(a=>!(a.pending&&o(a)&&a.text===t.text)),t]}var ft=(e,t)=>{let[r,o]=E([]),[i,a]=E(""),[n,s]=E(!1),[l,u]=E(null),d=gt(0),m=t?.pollMs??2e3;He(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&o(h=>h.length===0?[{id:We,cursor:"",author:"agent",text:b.greeting}]:h)}).catch(()=>{}),()=>{p=!1}},[e]),He(()=>e.subscribe?.({onMessage:p=>o(b=>Me(b,p)),onError:p=>u(p.error),onHealthy:()=>u(null)},{intervalMs:m}),[e,m]);let g=mt(()=>{let p=i.trim();if(!p||n)return;a(""),u(null),s(!0),d.current+=1;let b=`pending-${d.current}`,h={id:b,cursor:"",author:"client",text:p,pending:!0};o(f=>[...f,h]),e.sendMessage(p).then(f=>{s(!1),f.reply.trim()&&o(c=>c.some(D=>!D.pending&&D.author!=="client"&&D.text===f.reply)?c:(d.current+=1,[...c,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:f.reply,pending:!0}]))}).catch(f=>{u(f instanceof Error?f.message:"send_failed"),s(!1),o(T=>T.filter(c=>c.id!==b)),a(T=>T||p)})},[i,n,e]);return{messages:r,input:i,setInput:a,send:g,sending:n,error:l}};export{Je as Chat,se as GRID_COLS,ie as GRID_MAX_COLS,ae as GRID_MAX_ROWS,Ve as HolaProvider,H as PortalConflict,M as bandOfKind,ue as bandOfType,Ce as cellValue,_e as createApiTransport,Ke as createHolaClient,ct as createPortalData,j as createWidgetTransport,Re as deliverableCellText,xe as deliverableStatus,ne as deriveFields,A as emptyTableResponses,de as footprintOf,G as footprintWith,Ie as formatDeliverableDate,J as groupDeliverableVersions,oe as inferSpec,ke as isDeliverableChecked,Me as mergeMessage,X as normalizeDeliverableColType,z as normalizeDeliverableItem,he as parseDashboardSpec,we as parseDeliverableItems,Te as parseDeliverableTable,De as parseTableResponses,B as placeWidgets,ve as publishedVersionOf,be as renderModel,Se as setResponse,Pe as setTableReview,pe as splitLayout,$ as textDeltaOf,O as thinkingDeltaOf,_ as toolEventOf,U as useArtifactUrl,N as useChat,F as useHolaClient,ft as useThread};
|
|
8
|
+
`)}},u=async()=>{let d=await i.read();if(!d.done)return s+=n.decode(d.value,{stream:!0}),l(),u()};await u()};var Oe=/\/+$/,L="/api/v1/end-user",_e=e=>{let t=e.baseUrl.replace(Oe,""),r=()=>typeof e.token=="function"?e.token():e.token,o=n=>e.project?`${n}project=${encodeURIComponent(e.project)}`:"",a=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),i=async n=>{let s=await fetch(`${t}${L}/chat${o("?")}`,{method:"POST",headers:await a(),body:JSON.stringify({message:n})});if(!s.ok)throw new Error(`hola: message failed (${s.status})`);return{reply:(await s.json()).reply??"",sessionId:"",artifacts:[]}};return{sessionId:()=>"",getInfo:async()=>w(`${t}${L}/chat/info${o("?")}`,await a()),sendMessage:i,streamMessage:async(n,s)=>{try{let l=await i(n);s.onText?.(l.reply),s.onComplete?.(l)}catch(l){s.onError?.(R(l))}},subscribe:(n,s)=>{let l=s?.since??"0",u=!1,d,g=s?.intervalMs??3e3,m=typeof document<"u",p=()=>m&&document.visibilityState==="hidden",b=!1,h=()=>{if(!u){if(p()){b=!0;return}d=setTimeout(f,g)}},f=async()=>{try{let y=await w(`${t}${L}/chat/thread?since=${encodeURIComponent(l)}${o("&")}`,await a());for(let D of y.messages)n.onMessage(D);l=y.cursor,n.onHealthy?.()}catch(y){n.onError?.(R(y))}h()},T=()=>{u||!b||p()||(b=!1,d&&clearTimeout(d),d=setTimeout(f,0))};m&&document.addEventListener("visibilitychange",T);let c=()=>{u=!0,d&&clearTimeout(d),m&&document.removeEventListener("visibilitychange",T)};return s?.signal?.addEventListener("abort",c),d=setTimeout(f,0),c}}};import{useEffect as Le,useState as Ue}from"react";var U=(e,t)=>{let[r,o]=Ue("");return Le(()=>{if(!e){o("");return}let a=Uint8Array.from(atob(e),n=>n.charCodeAt(0)),i=URL.createObjectURL(new Blob([a],{type:t}));return o(i),()=>URL.revokeObjectURL(i)},[e,t]),r};import{useEffect as Be,useRef as Ge}from"react";import{createContext as Fe,useContext as Ne}from"react";import{jsx as je}from"react/jsx-runtime";var ee=Fe(null),Ve=({client:e,children:t})=>je(ee.Provider,{value:e,children:t}),F=()=>{let e=Ne(ee);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};import{useCallback as te,useEffect as ne,useRef as re,useState as A}from"react";var N=e=>{let[t,r]=A([]),[o,a]=A(""),[i,n]=A(!1),[s,l]=A(null),u=re(0),d=re(null);ne(()=>()=>d.current?.abort(),[]);let g=te(()=>{let p=u.current;return u.current+=1,p},[]);ne(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&r([{id:g(),role:"assistant",text:b.greeting}])}).catch(()=>{}),()=>{p=!1}},[e,g]);let m=te(()=>{let p=o.trim();if(!p||i)return;a(""),l(null),n(!0);let b=g(),h=g();r(c=>[...c,{id:b,role:"user",text:p},{id:h,role:"assistant",text:"",streaming:!0}]);let f=c=>{r(y=>y.map(D=>D.id===h?c(D):D))},T=new AbortController;d.current=T,e.streamMessage(p,{onText:c=>f(y=>({...y,text:y.text+c})),onComplete:c=>{f(y=>({...y,text:c.reply||y.text,artifacts:c.artifacts,streaming:!1})),n(!1)},onError:c=>{f(y=>({...y,streaming:!1})),l(c.error),n(!1)}},T.signal).catch(c=>{f(y=>({...y,streaming:!1})),l(c instanceof Error?c.message:"stream_failed"),n(!1)}).finally(()=>{n(!1),f(c=>c.streaming?{...c,streaming:!1}:c)})},[o,i,e,g]);return{messages:t,input:o,setInput:a,send:m,sending:i,error:s}};import{jsx as C,jsxs as V}from"react/jsx-runtime";var x={root:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif",fontSize:14,color:"#111827"},log:{flex:1,overflowY:"auto",padding:12,display:"flex",flexDirection:"column",gap:8},user:{alignSelf:"flex-end",background:"#111827",color:"#ffffff",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},assistant:{alignSelf:"flex-start",background:"#f1f1f4",color:"#111827",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},artifacts:{display:"flex",flexDirection:"column",gap:6,marginTop:6},image:{maxHeight:220,borderRadius:8,border:"1px solid #e5e7eb"},link:{color:"#2563eb",textDecoration:"underline",wordBreak:"break-all"},error:{color:"#b91c1c",padding:"4px 12px",fontSize:13},form:{display:"flex",gap:8,borderTop:"1px solid #e5e7eb",padding:8},input:{flex:1,border:"1px solid #d1d5db",borderRadius:8,padding:"8px 10px",fontSize:14,outline:"none"},button:{border:"none",background:"#111827",color:"#ffffff",borderRadius:8,padding:"8px 14px",fontSize:14,cursor:"pointer"}},ze=({artifact:e})=>{let t=U(e.dataBase64??"",e.mimeType),r=e.url??t;return r?e.mimeType.startsWith("image/")?C("a",{href:r,rel:"noopener noreferrer",target:"_blank",children:C("img",{alt:e.filename,src:r,style:x.image})}):C("a",{download:e.filename,href:r,style:x.link,children:e.filename}):null},Je=()=>{let e=F(),{messages:t,input:r,setInput:o,send:a,sending:i,error:n}=N(e),s=Ge(null);Be(()=>{let u=s.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let l=u=>{u.preventDefault(),a()};return V("div",{style:x.root,children:[C("div",{ref:s,style:x.log,children:t.map(u=>V("div",{style:u.role==="user"?x.user:x.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?C("div",{style:x.artifacts,children:u.artifacts.map(d=>C(ze,{artifact:d},d.filename))}):null]},u.id))}),n?C("div",{style:x.error,children:n}):null,V("form",{onSubmit:l,style:x.form,children:[C("input",{"aria-label":"Message",onChange:u=>o(u.target.value),placeholder:"Type a message\u2026",style:x.input,value:r}),C("button",{disabled:i||r.trim().length===0,style:x.button,type:"submit",children:"Send"})]})]})};var Xe=/\/+$/,j=e=>{let t=e.sessionId,r=e.baseUrl.replace(Xe,""),o=n=>`${r}/endpoint/${encodeURIComponent(e.token)}${n}`,a={"content-type":"application/json"},i=(n,s)=>({url:o(n),headers:a,body:JSON.stringify({message:s,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>w(o("/config"),{}),sendMessage:async n=>{let s=await Q(i("/message",n));return t=s.sessionId,s},streamMessage:(n,s,l)=>Z(i("/message/stream",n),s,u=>{t=u},l),subscribe:(n,s)=>{let l=s?.since??"0",u=!1,d,g=s?.intervalMs??3e3,m=async()=>{let b=t;if(b)try{let h=await w(o(`/messages?session=${encodeURIComponent(b)}&since=${encodeURIComponent(l)}`),{});for(let f of h.messages)n.onMessage(f);l=h.cursor,n.onHealthy?.()}catch(h){n.onError?.(R(h))}u||(d=setTimeout(m,g))},p=()=>{u=!0,d&&clearTimeout(d)};return s?.signal?.addEventListener("abort",p),d=setTimeout(m,0),p}}};var Ke=e=>"transport"in e?e.transport:j(e);var qe=/^https?:\/\//i,Ye=/^\d{4}-\d{2}-\d{2}(?:[T ]|$)/,Qe=e=>e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase());function Ze(e){if(typeof e=="number")return"number";if(typeof e=="boolean")return"boolean";if(typeof e=="string"){if(qe.test(e))return"url";if(Ye.test(e))return"date"}return"text"}function oe(e){let t=[],r=new Map;for(let o of e)for(let[a,i]of Object.entries(o.data??{})){if(i==null)continue;let n=r.get(a);n||(n=new Map,r.set(a,n),t.push(a));let s=Ze(i);n.set(s,(n.get(s)??0)+1)}return t.map(o=>{let a=r.get(o)??new Map,i="text",n=-1;for(let[s,l]of a)l>n&&(n=l,i=s);return{key:o,label:Qe(o),type:i}})}var et=e=>typeof e=="number"?e:Number(e)||0,se=e=>/rate|position|rank|score|percent|avg/i.test(e),tt=/posted|published|sent|completed|shipped|launched|_at/i,nt=new Set(["service","order","end_user_id"]);function ie(e,t){let r=e.filter(l=>!nt.has(l.key)),o=r.filter(l=>l.type==="number").slice(0,3),a=r.find(l=>l.key==="status")??r.find(l=>l.type==="select"),i=r.find(l=>l.type==="date"&&tt.test(l.key))??r.find(l=>l.type==="date"),n=r.filter(l=>l.type==="number"&&!se(l.key)).map(l=>({field:l,total:t.reduce((u,d)=>u+et(d.data[l.key]),0)})).sort((l,u)=>u.total-l.total).find(l=>l.total>0)?.field??null,s=[{type:"stat",label:"Items",agg:"count"}];for(let l of o){let u=se(l.key);s.push({type:"stat",metric:l.key,agg:u?"avg":"sum",label:u?`Avg ${l.label.toLowerCase()}`:l.label})}return i&&s.push({type:"line",x:i.key,y:n?.key,agg:"sum",title:n?`${n.label} by day`:"Items by day"}),a&&s.push({type:"donut",groupBy:a.key,title:a.label}),s.push({type:"table",columns:r.map(l=>l.key)}),{version:1,widgets:s}}var ae=6,le=6,ue=4,de={stat:{w:1,h:1},chart:{w:2,h:2},block:{w:6,h:2}},rt=e=>Math.max(1,Math.min(6,Math.round(e))),ot=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 ce(e){return de[e]}function B(e,t,r){let o=de[e];return{w:t===void 0?o.w:rt(t),h:r===void 0?o.h:ot(r)}}function G(e){let t=[],r=[],o=(n,s,l,u)=>{if(n<0||n+l>6)return!1;for(let d=0;d<u;d+=1){let g=r[s+d];if(g){for(let m=0;m<l;m+=1)if(g[n+m])return!1}}return!0},a=(n,s,l,u)=>{for(let d=0;d<u;d+=1){let g=r[s+d]??[];for(let m=0;m<l;m+=1)g[n+m]=!0;r[s+d]=g}},i=(n,s)=>{for(let l=0;;l+=1)for(let u=0;u+n<=6;u+=1)if(o(u,l,n,s))return{gx:u,gy:l}};for(let n of e){let s=B(W(n.kind),n.w,n.h),u=n.gx!==void 0&&n.gy!==void 0&&o(n.gx,n.gy,s.w,s.h)&&n.gx!==void 0&&n.gy!==void 0?{gx:n.gx,gy:n.gy}:i(s.w,s.h);a(u.gx,u.gy,s.w,s.h),t.push({widget:n,gx:u.gx,gy:u.gy,w:s.w,h:s.h})}return t}function ge(e){let t=[],r=[];for(let o of e)W(o.kind)==="block"?r.push(o):t.push(o);return{tiles:G(t),blocks:r}}var me=new Set(["service","order","end_user_id"]),z=e=>typeof e=="number"?e:Number(e)||0,fe=e=>e==null?"":String(e);function J(e,t){if(e==="count")return t.length;if(t.length===0)return 0;if(e==="last")return t[t.length-1]??0;if(e==="min")return Math.min(...t);if(e==="max")return Math.max(...t);let r=t.reduce((o,a)=>o+a,0);return e==="avg"?Math.round(r/t.length*100)/100:r}function st(e,t,r,o){let a=new Map;for(let i of e){let n=new Date(fe(i.data[t]));if(Number.isNaN(n.getTime()))continue;let s=n.toISOString().slice(0,10),l=a.get(s)??[];l.push(r?z(i.data[r]):1),a.set(s,l)}return[...a.entries()].sort((i,n)=>i[0]<n[0]?-1:1).map(([i,n])=>({label:new Date(`${i}T00:00:00`).toLocaleDateString(void 0,{month:"short",day:"numeric"}),value:r?J(o,n):n.length}))}function it(e,t,r,o="sum"){let a=new Map;for(let i of e){let n=fe(i.data[t]).trim();if(!n)continue;let s=a.get(n)??[];s.push(r?z(i.data[r]):1),a.set(n,s)}return[...a.entries()].map(([i,n])=>({label:i,value:r?J(o,n):n.length})).sort((i,n)=>n.value-i.value)}function at(e,t,r,o){switch(e.type){case"stat":{let a=e.metric?t.get(e.metric):void 0;if(e.metric&&!a)return null;if(!a)return{kind:"stat",label:e.label??"Items",value:o.length};let i=o.map(n=>z(n.data[a.key]));return{kind:"stat",label:e.label??a.label,value:J(e.agg??"sum",i)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let a=st(o,e.x,e.y,e.agg??"sum");return a.length<2?null:{kind:"series",draw:e.type,title:e.title??"By day",points:a}}case"donut":{if(!t.has(e.groupBy))return null;let a=it(o,e.groupBy,e.metric,e.agg??"sum");return a.length===0?null:{kind:"donut",title:e.title??t.get(e.groupBy)?.label??"Breakdown",points:a}}case"table":{let a=e.columns?e.columns.map(i=>t.get(i)).filter(i=>i!==void 0&&!me.has(i.key)):r;return a.length===0?null:{kind:"table",title:e.title,columns:a,rows:o}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function be(e,t,r){let o=t.filter(n=>!me.has(n.key)),a=new Map(t.map(n=>[n.key,n])),i=[];for(let n of e.widgets){let s=at(n,a,o,r);s&&i.push({...s,w:n.w,h:n.h,gx:n.gx,gy:n.gy})}return i}var lt=new Set(["sum","avg","count","min","max","last"]),ye=e=>typeof e=="string"&<.has(e)?e:void 0,v=e=>typeof e=="string"&&e!==""?e:void 0,P=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,I=e=>typeof e=="number"&&e>=1?Math.min(4,Math.round(e)):void 0,k=e=>typeof e=="number"&&e>=0?Math.round(e):void 0;function ut(e){if(typeof e!="object"||e===null)return null;let t=e;switch(t.type){case"stat":return{type:"stat",label:v(t.label),metric:v(t.metric),agg:ye(t.agg),w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)};case"line":case"bar":{let r=v(t.x);return r?{type:t.type,title:v(t.title),x:r,y:v(t.y),agg:ye(t.agg),w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}:null}case"donut":{let r=v(t.groupBy);return r?{type:"donut",title:v(t.title),groupBy:r,w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}:null}case"table":{let r=Array.isArray(t.columns)?t.columns.filter(o=>typeof o=="string"):void 0;return{type:"table",title:v(t.title),columns:r,w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}}case"text":{let r=v(t.body);return r?{type:"text",title:v(t.title),body:r,w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}:null}default:return null}}function he(e){let t=e;if(typeof e=="string"){if(e.trim()==="")return null;try{t=JSON.parse(e)}catch{return null}}if(typeof t!="object"||t===null)return null;let r=t.widgets;if(!Array.isArray(r))return null;let o=r.map(ut).filter(i=>i!==null);if(o.length===0)return null;let a=t.version;return{version:typeof a=="number"?a:1,title:v(t.title),widgets:o}}function X(e){if(typeof e=="string")return e?{kind:"file",value:e}:null;if(e&&typeof e=="object"){let t=e,r=typeof t.value=="string"?t.value:"",o=t.kind==="link"||t.kind==="text"||t.kind==="table"?t.kind:"file",a=typeof t.v=="number"&&t.v>=1?Math.floor(t.v):void 0;return r?{kind:o,value:r,...a?{v:a}:{}}:null}return null}function K(e){let t=new Map;for(let r of e){let o=r.v??1,a=t.get(o)??[];a.push(r),t.set(o,a)}return[...t.entries()].sort(([r],[o])=>r-o).map(([r,o])=>({v:r,items:o}))}function we(e){let t=e.files;if(typeof t=="string"&&t.trim()!=="")try{let o=JSON.parse(t);if(Array.isArray(o))return o.map(X).filter(a=>a!==null)}catch{}let r=String(e.file??"");return r?[{kind:"file",value:r}]:[]}function xe(e,t,r,o=""){let i=K(e).find(s=>s.v===t)?.items??[],n=i.filter(s=>s.kind==="file").map(s=>r.get(s.value)??"");return i.some(s=>s.kind==="table")&&n.push(o),n.length===0||n.some(s=>s==="")?"awaiting":n.some(s=>s==="revise")?"revise":"accepted"}function ve(e){return Number(e.published_version)||0}function q(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function Te(e){try{let t=JSON.parse(e);if(Array.isArray(t.columns)&&Array.isArray(t.rows)&&t.columns.length){let r=t.columns.map((i,n)=>({key:typeof i.key=="string"&&i.key?i.key:typeof i.id=="string"&&i.id?i.id:`column_${n+1}`,label:typeof i.label=="string"?i.label:"",type:q(i.type),...i.clientEditable===!0?{clientEditable:!0}:{}})),o=t.rows.map((i,n)=>({id:typeof i.id=="string"&&i.id?i.id:`row_${n}`,cells:i.cells&&typeof i.cells=="object"?i.cells:{}})),a=typeof t.name=="string"?t.name:void 0;return{columns:r,rows:o,...a?{name:a}:{}}}}catch{}return null}function Re(e){return e==null?"":String(e)}function ke(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function M(){return{cells:{},verdict:"",comment:""}}function De(e){if(typeof e!="string"||e.trim()==="")return M();try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let r=t;return{cells:r.cells&&typeof r.cells=="object"?r.cells:r,verdict:r.verdict==="accepted"||r.verdict==="revise"?r.verdict:"",comment:typeof r.comment=="string"?r.comment:""}}}catch{}return M()}function Ce(e,t,r){if(e.clientEditable){let o=r.cells[t.id];if(o&&e.key in o)return o[e.key]}return t.cells[e.key]}function Se(e,t,r,o){return{...e,cells:{...e.cells,[t]:{...e.cells[t]??{},[r]:o}}}}function Pe(e,t,r){return{...e,verdict:t,comment:r}}function Ie(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 dt=/\/+$/,S="/api/v1/end-user",H=class extends Error{constructor(t){super(t),this.name="PortalConflict"}};function pt(e){let t="";for(let o=0;o<e.length;o+=32768)t+=String.fromCharCode(...e.subarray(o,o+32768));return btoa(t)}var ct=e=>{let t=e.baseUrl.replace(dt,""),r=()=>typeof e.token=="function"?e.token():e.token,o=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),a=async(n,s)=>{try{let l=await fetch(`${t}${S}${n}`,{method:s.method,headers:await o(),...s.body===void 0?{}:{body:JSON.stringify(s.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=`${s.method} ${n} \u2192 ${String(l.status)}`;try{let g=JSON.parse(u);g.message&&(d=g.message)}catch{d=u?`${d}: ${u}`:d}throw R({error:d})}return await l.json()}catch(l){throw l instanceof H?l:R(l)}},i=n=>`/tables/${encodeURIComponent(n)}`;return{listTables:async()=>(await w(`${t}${S}/tables`,await o())).tables,listRows:async(n,s)=>await w(`${t}${S}${i(n)}/rows?limit=${String(s??100)}`,await o()),insertRow:async(n,s)=>{let{rowIds:l}=await a(`${i(n)}/rows`,{method:"POST",body:{rows:[s]}}),u=l[0];if(!u)throw R(new Error("The row was not created."));return u},patchRow:async(n,s,l)=>(await a(`${i(n)}/rows/${encodeURIComponent(s)}`,{method:"PATCH",body:l})).updated,deleteRow:async(n,s)=>(await a(`/${encodeURIComponent(n)}/${encodeURIComponent(s)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await w(`${t}${S}/tables/files/rows?limit=200`,await o())).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(n,s)=>{let l=new Uint8Array(await n.arrayBuffer());return await a("/files",{method:"POST",body:{filename:n.name,mime:n.type||"application/octet-stream",data:pt(l),...s===void 0?{}:{message:s}}})},fileLink:async n=>await w(`${t}${S}/files/${encodeURIComponent(n)}/url`,await o()),deleteFile:async n=>(await a(`/files/${encodeURIComponent(n)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await w(`${t}${S}/documents`,await o())).documents,readDocument:async n=>(await w(`${t}${S}/documents/${encodeURIComponent(n)}`,await o())).document,saveDocument:async(n,s)=>await a(`/documents/${encodeURIComponent(n)}`,{method:"PATCH",body:s})}};import{useCallback as gt,useEffect as He,useRef as mt,useState as E}from"react";var Ae="greeting";function We(e,t){if(e.some(i=>i.id===t.id))return e;let r=e.filter(i=>i.id!==Ae),o=i=>i.author==="client"==(t.author==="client");return[...r.filter(i=>!(i.pending&&o(i)&&i.text===t.text)),t]}var ft=(e,t)=>{let[r,o]=E([]),[a,i]=E(""),[n,s]=E(!1),[l,u]=E(null),d=mt(0),g=t?.pollMs??2e3;He(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&o(h=>h.length===0?[{id:Ae,cursor:"",author:"agent",text:b.greeting}]:h)}).catch(()=>{}),()=>{p=!1}},[e]),He(()=>e.subscribe?.({onMessage:p=>o(b=>We(b,p)),onError:p=>u(p.error),onHealthy:()=>u(null)},{intervalMs:g}),[e,g]);let m=gt(()=>{let p=a.trim();if(!p||n)return;i(""),u(null),s(!0),d.current+=1;let b=`pending-${d.current}`,h={id:b,cursor:"",author:"client",text:p,pending:!0};o(f=>[...f,h]),e.sendMessage(p).then(f=>{s(!1),f.reply.trim()&&o(c=>c.some(D=>!D.pending&&D.author!=="client"&&D.text===f.reply)?c:(d.current+=1,[...c,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:f.reply,pending:!0}]))}).catch(f=>{u(f instanceof Error?f.message:"send_failed"),s(!1),o(T=>T.filter(c=>c.id!==b)),i(T=>T||p)})},[a,n,e]);return{messages:r,input:a,setInput:i,send:m,sending:n,error:l}};export{Je as Chat,ae as GRID_COLS,le as GRID_MAX_COLS,ue as GRID_MAX_ROWS,Ve as HolaProvider,H as PortalConflict,W as bandOfKind,pe as bandOfType,Ce as cellValue,_e as createApiTransport,Ke as createHolaClient,ct as createPortalData,j as createWidgetTransport,Re as deliverableCellText,xe as deliverableStatus,oe as deriveFields,M as emptyTableResponses,ce as footprintOf,B as footprintWith,Ie as formatDeliverableDate,K as groupDeliverableVersions,ie as inferSpec,ke as isDeliverableChecked,We as mergeMessage,q as normalizeDeliverableColType,X as normalizeDeliverableItem,he as parseDashboardSpec,we as parseDeliverableItems,Te as parseDeliverableTable,De as parseTableResponses,G as placeWidgets,ve as publishedVersionOf,be as renderModel,Se as setResponse,Pe as setTableReview,ge as splitLayout,$ as textDeltaOf,O as thinkingDeltaOf,_ as toolEventOf,U as useArtifactUrl,N as useChat,F as useHolaClient,ft 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.18",
|
|
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",
|