@holaboss/client 0.2.0-beta.18 → 0.2.0-beta.19
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 +4 -4
- package/dist/index.d.cts +36 -3
- package/dist/index.d.ts +36 -3
- package/dist/index.js +5 -5
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
var q=Object.defineProperty;var
|
|
2
|
+
var q=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var Ue=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 a of Ue(t))!Ne.call(e,a)&&a!==r&&q(e,a,{get:()=>t[a],enumerable:!(o=Le(t,a))||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:()=>ce,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:()=>pe,renderModel:()=>le,setResponse:()=>he,setTableReview:()=>we,splitLayout:()=>se,textDeltaOf:()=>$,thinkingDeltaOf:()=>O,toolEventOf:()=>_,useArtifactUrl:()=>L,useChat:()=>V,useHolaClient:()=>N,useThread:()=>Fe});module.exports=Be(gt);var Re=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},$=e=>{let t=Re(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},O=e=>{let t=Re(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
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
|
|
4
|
+
`)}:null},Je=(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 l=O(o);l&&t.onThinking?.(l);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?.(C(o))},R=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()},Te=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 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 l=a.body.getReader(),n=new TextDecoder,s="",i=()=>{let d=s.indexOf(`
|
|
5
5
|
|
|
6
|
-
`);for(;d!==-1;){let
|
|
6
|
+
`);for(;d!==-1;){let c=s.slice(0,d);s=s.slice(d+2);let m=ze(c);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",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});
|
|
8
|
+
`)}},u=async()=>{let d=await l.read();if(!d.done)return s+=n.decode(d.value,{stream:!0}),i(),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)}`:"",a=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),l=async n=>{let s=await fetch(`${t}${Y}/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()=>R(`${t}${Y}/chat/info${o("?")}`,await a()),sendMessage:l,streamMessage:async(n,s)=>{try{let i=await l(n);s.onText?.(i.reply),s.onComplete?.(i)}catch(i){s.onError?.(C(i))}},subscribe:(n,s)=>{let i=s?.since??"0",u=!1,d,c=s?.intervalMs??3e3,m=typeof document<"u",p=()=>m&&document.visibilityState==="hidden",b=!1,w=()=>{if(!u){if(p()){b=!0;return}d=setTimeout(f,c)}},f=async()=>{try{let h=await R(`${t}${Y}/chat/thread?since=${encodeURIComponent(i)}${o("&")}`,await a());for(let P of h.messages)n.onMessage(P);i=h.cursor,n.onHealthy?.()}catch(h){n.onError?.(C(h))}w()},D=()=>{u||!b||p()||(b=!1,d&&clearTimeout(d),d=setTimeout(f,0))};m&&document.addEventListener("visibilitychange",D);let g=()=>{u=!0,d&&clearTimeout(d),m&&document.removeEventListener("visibilitychange",D)};return s?.signal?.addEventListener("abort",g),d=setTimeout(f,0),g}}};var F=require("react"),L=(e,t)=>{let[r,o]=(0,F.useState)("");return(0,F.useEffect)(()=>{if(!e){o("");return}let a=Uint8Array.from(atob(e),n=>n.charCodeAt(0)),l=URL.createObjectURL(new Blob([a],{type:t}));return o(l),()=>URL.revokeObjectURL(l)},[e,t]),r};var j=require("react");var U=require("react"),Pe=require("react/jsx-runtime"),Ce=(0,U.createContext)(null),Se=({client:e,children:t})=>(0,Pe.jsx)(Ce.Provider,{value:e,children:t}),N=()=>{let e=(0,U.useContext)(Ce);if(!e)throw new Error("useHolaClient must be used within <HolaProvider>");return e};var x=require("react"),V=e=>{let[t,r]=(0,x.useState)([]),[o,a]=(0,x.useState)(""),[l,n]=(0,x.useState)(!1),[s,i]=(0,x.useState)(null),u=(0,x.useRef)(0),d=(0,x.useRef)(null);(0,x.useEffect)(()=>()=>d.current?.abort(),[]);let c=(0,x.useCallback)(()=>{let p=u.current;return u.current+=1,p},[]);(0,x.useEffect)(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&r([{id:c(),role:"assistant",text:b.greeting}])}).catch(()=>{}),()=>{p=!1}},[e,c]);let m=(0,x.useCallback)(()=>{let p=o.trim();if(!p||l)return;a(""),i(null),n(!0);let b=c(),w=c();r(g=>[...g,{id:b,role:"user",text:p},{id:w,role:"assistant",text:"",streaming:!0}]);let f=g=>{r(h=>h.map(P=>P.id===w?g(P):P))},D=new AbortController;d.current=D,e.streamMessage(p,{onText:g=>f(h=>({...h,text:h.text+g})),onComplete:g=>{f(h=>({...h,text:g.reply||h.text,artifacts:g.artifacts,streaming:!1})),n(!1)},onError:g=>{f(h=>({...h,streaming:!1})),i(g.error),n(!1)}},D.signal).catch(g=>{f(h=>({...h,streaming:!1})),i(g instanceof Error?g.message:"stream_failed"),n(!1)}).finally(()=>{n(!1),f(g=>g.streaming?{...g,streaming:!1}:g)})},[o,l,e,c]);return{messages:t,input:o,setInput:a,send:m,sending:l,error:s}};var v=require("react/jsx-runtime"),k={root:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif",fontSize:14,color:"#111827"},log:{flex:1,overflowY:"auto",padding:12,display:"flex",flexDirection:"column",gap:8},user:{alignSelf:"flex-end",background:"#111827",color:"#ffffff",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},assistant:{alignSelf:"flex-start",background:"#f1f1f4",color:"#111827",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},artifacts:{display:"flex",flexDirection:"column",gap:6,marginTop:6},image:{maxHeight:220,borderRadius:8,border:"1px solid #e5e7eb"},link:{color:"#2563eb",textDecoration:"underline",wordBreak:"break-all"},error:{color:"#b91c1c",padding:"4px 12px",fontSize:13},form:{display:"flex",gap:8,borderTop:"1px solid #e5e7eb",padding:8},input:{flex:1,border:"1px solid #d1d5db",borderRadius:8,padding:"8px 10px",fontSize:14,outline:"none"},button:{border:"none",background:"#111827",color:"#ffffff",borderRadius:8,padding:"8px 14px",fontSize:14,cursor:"pointer"}},Ke=({artifact:e})=>{let t=L(e.dataBase64??"",e.mimeType),r=e.url??t;return r?e.mimeType.startsWith("image/")?(0,v.jsx)("a",{href:r,rel:"noopener noreferrer",target:"_blank",children:(0,v.jsx)("img",{alt:e.filename,src:r,style:k.image})}):(0,v.jsx)("a",{download:e.filename,href:r,style:k.link,children:e.filename}):null},Ie=()=>{let e=N(),{messages:t,input:r,setInput:o,send:a,sending:l,error:n}=V(e),s=(0,j.useRef)(null);(0,j.useEffect)(()=>{let u=s.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let i=u=>{u.preventDefault(),a()};return(0,v.jsxs)("div",{style:k.root,children:[(0,v.jsx)("div",{ref:s,style:k.log,children:t.map(u=>(0,v.jsxs)("div",{style:u.role==="user"?k.user:k.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?(0,v.jsx)("div",{style:k.artifacts,children:u.artifacts.map(d=>(0,v.jsx)(Ke,{artifact:d},d.filename))}):null]},u.id))}),n?(0,v.jsx)("div",{style:k.error,children:n}):null,(0,v.jsxs)("form",{onSubmit:i,style:k.form,children:[(0,v.jsx)("input",{"aria-label":"Message",onChange:u=>o(u.target.value),placeholder:"Type a message\u2026",style:k.input,value:r}),(0,v.jsx)("button",{disabled:l||r.trim().length===0,style:k.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}`,a={"content-type":"application/json"},l=(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:()=>R(o("/config"),{}),sendMessage:async n=>{let s=await Te(l("/message",n));return t=s.sessionId,s},streamMessage:(n,s,i)=>ke(l("/message/stream",n),s,u=>{t=u},i),subscribe:(n,s)=>{let i=s?.since??"0",u=!1,d,c=s?.intervalMs??3e3,m=async()=>{let b=t;if(b)try{let w=await R(o(`/messages?session=${encodeURIComponent(b)}&since=${encodeURIComponent(i)}`),{});for(let f of w.messages)n.onMessage(f);i=w.cursor,n.onHealthy?.()}catch(w){n.onError?.(C(w))}u||(d=setTimeout(m,c))},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[a,l]of Object.entries(o.data??{})){if(l==null)continue;let n=r.get(a);n||(n=new Map,r.set(a,n),t.push(a));let s=et(l);n.set(s,(n.get(s)??0)+1)}return t.map(o=>{let a=r.get(o)??new Map,l="text",n=-1;for(let[s,i]of a)i>n&&(n=i,l=s);return{key:o,label:Ze(o),type:l}})}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(i=>!rt.has(i.key)),o=r.filter(i=>i.type==="number").slice(0,3),a=r.find(i=>i.key==="status")??r.find(i=>i.type==="select"),l=r.find(i=>i.type==="date"&&nt.test(i.key))??r.find(i=>i.type==="date"),n=r.filter(i=>i.type==="number"&&!Ae(i.key)).map(i=>({field:i,total:t.reduce((u,d)=>u+tt(d.data[i.key]),0)})).sort((i,u)=>u.total-i.total).find(i=>i.total>0)?.field??null,s=[{type:"stat",label:"Items",agg:"count"}];for(let i of o){let u=Ae(i.key);s.push({type:"stat",metric:i.key,agg:u?"avg":"sum",label:u?`Avg ${i.label.toLowerCase()}`:i.label})}return l&&s.push({type:"line",x:l.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(i=>i.key)}),{version:1,widgets:s}}var ee=6,te=6,ne=4,Me={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 Me[e]}function G(e,t,r){let o=Me[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,i,u)=>{if(n<0||n+i>6)return!1;for(let d=0;d<u;d+=1){let c=r[s+d];if(c){for(let m=0;m<i;m+=1)if(c[n+m])return!1}}return!0},a=(n,s,i,u)=>{for(let d=0;d<u;d+=1){let c=r[s+d]??[];for(let m=0;m<i;m+=1)c[n+m]=!0;r[s+d]=c}},l=(n,s)=>{for(let i=0;;i+=1)for(let u=0;u+n<=6;u+=1)if(o(u,i,n,s))return{gx:u,gy:i}};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}:l(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 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 We=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,a)=>o+a,0);return e==="avg"?Math.round(r/t.length*100)/100:r}function it(e,t,r,o){let a=new Map;for(let l of e){let n=new Date(Ee(l.data[t]));if(Number.isNaN(n.getTime()))continue;let s=n.toISOString().slice(0,10),i=a.get(s)??[];i.push(r?ie(l.data[r]):1),a.set(s,i)}return[...a.entries()].sort((l,n)=>l[0]<n[0]?-1:1).map(([l,n])=>({label:new Date(`${l}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 a=new Map;for(let l of e){let n=Ee(l.data[t]).trim();if(!n)continue;let s=a.get(n)??[];s.push(r?ie(l.data[r]):1),a.set(n,s)}return[...a.entries()].map(([l,n])=>({label:l,value:r?ae(o,n):n.length})).sort((l,n)=>n.value-l.value)}function lt(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 l=o.map(n=>ie(n.data[a.key]));return{kind:"stat",label:e.label??a.label,value:ae(e.agg??"sum",l)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let a=it(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=at(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(l=>t.get(l)).filter(l=>l!==void 0&&!We.has(l.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 le(e,t,r,o={}){let a=new Map,l=i=>({byKey:new Map(i.fields.map(u=>[u.key,u])),cols:i.fields.filter(u=>!We.has(u.key)),rows:i.rows}),n=l({fields:t,rows:r});for(let[i,u]of Object.entries(o))a.set(i,l(u));let s=[];for(let i of e.widgets){let u=i.type==="text"?void 0:i.source,d=u?a.get(u):n;if(!d)continue;let c=lt(i,d.byKey,d.cols,d.rows);c&&s.push({...c,w:i.w,h:i.h,gx:i.gx,gy:i.gy})}return s}var ut=new Set(["sum","avg","count","min","max","last"]),$e=e=>typeof e=="string"&&ut.has(e)?e:void 0,y=e=>typeof e=="string"&&e!==""?e:void 0,M=e=>typeof e=="number"&&e>=1?Math.min(6,Math.round(e)):void 0,W=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",source:y(t.source),label:y(t.label),metric:y(t.metric)??y(t.column),agg:$e(t.agg),w:M(t.w),h:W(t.h),gx:S(t.gx),gy:S(t.gy)};case"line":case"bar":{let r=y(t.x);return r?{type:t.type,source:y(t.source),title:y(t.title),x:r,y:y(t.y)??y(t.column),agg:$e(t.agg),w:M(t.w),h:W(t.h),gx:S(t.gx),gy:S(t.gy)}:null}case"donut":{let r=y(t.groupBy)??y(t.column);return r?{type:"donut",source:y(t.source),title:y(t.title),groupBy:r,w:M(t.w),h:W(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",source:y(t.source),title:y(t.title),columns:r,w:M(t.w),h:W(t.h),gx:S(t.gx),gy:S(t.gy)}}case"text":{let r=y(t.body);return r?{type:"text",title:y(t.title),body:r,w:M(t.w),h:W(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(l=>l!==null);if(o.length===0)return null;let a=t.version;return{version:typeof a=="number"?a:1,title:y(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",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 X(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 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(a=>a!==null)}catch{}let r=String(e.file??"");return r?[{kind:"file",value:r}]:[]}function ce(e,t,r,o=""){let l=X(e).find(s=>s.v===t)?.items??[],n=l.filter(s=>s.kind==="file").map(s=>r.get(s.value)??"");return l.some(s=>s.kind==="table")&&n.push(o),n.length===0||n.some(s=>s==="")?"awaiting":n.some(s=>s==="revise")?"revise":"accepted"}function pe(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((l,n)=>({key:typeof l.key=="string"&&l.key?l.key:typeof l.id=="string"&&l.id?l.id:`column_${n+1}`,label:typeof l.label=="string"?l.label:"",type:K(l.type),...l.clientEditable===!0?{clientEditable:!0}:{}})),o=t.rows.map((l,n)=>({id:typeof l.id=="string"&&l.id?l.id:`row_${n}`,cells:l.cells&&typeof l.cells=="object"?l.cells:{}})),a=typeof t.name=="string"?t.name:void 0;return{columns:r,rows:o,...a?{name:a}:{}}}}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 ct=/\/+$/,I="/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 Oe=e=>{let t=e.baseUrl.replace(ct,""),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 i=await fetch(`${t}${I}${n}`,{method:s.method,headers:await o(),...s.body===void 0?{}:{body:JSON.stringify(s.body)}});if(i.status===409){let u=await i.json().catch(()=>({}));throw new H(u.message??"Someone else saved this first.")}if(!i.ok){let u=await i.text().catch(()=>""),d=`${s.method} ${n} \u2192 ${String(i.status)}`;try{let c=JSON.parse(u);c.message&&(d=c.message)}catch{d=u?`${d}: ${u}`:d}throw C({error:d})}return await i.json()}catch(i){throw i instanceof H?i:C(i)}},l=n=>`/tables/${encodeURIComponent(n)}`;return{listTables:async()=>(await R(`${t}${I}/tables`,await o())).tables,listRows:async(n,s)=>await R(`${t}${I}${l(n)}/rows?limit=${String(s??100)}`,await o()),insertRow:async(n,s)=>{let{rowIds:i}=await a(`${l(n)}/rows`,{method:"POST",body:{rows:[s]}}),u=i[0];if(!u)throw C(new Error("The row was not created."));return u},patchRow:async(n,s,i)=>(await a(`${l(n)}/rows/${encodeURIComponent(s)}`,{method:"PATCH",body:i})).updated,deleteRow:async(n,s)=>(await a(`/${encodeURIComponent(n)}/${encodeURIComponent(s)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await R(`${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 i=new Uint8Array(await n.arrayBuffer());return await a("/files",{method:"POST",body:{filename:n.name,mime:n.type||"application/octet-stream",data:pt(i),...s===void 0?{}:{message:s}}})},fileLink:async n=>await R(`${t}${I}/files/${encodeURIComponent(n)}/url`,await o()),deleteFile:async n=>(await a(`/files/${encodeURIComponent(n)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await R(`${t}${I}/documents`,await o())).documents,readDocument:async n=>(await R(`${t}${I}/documents/${encodeURIComponent(n)}`,await o())).document,saveDocument:async(n,s)=>await a(`/documents/${encodeURIComponent(n)}`,{method:"PATCH",body:s})}};var T=require("react"),_e="greeting";function ve(e,t){if(e.some(l=>l.id===t.id))return e;let r=e.filter(l=>l.id!==_e),o=l=>l.author==="client"==(t.author==="client");return[...r.filter(l=>!(l.pending&&o(l)&&l.text===t.text)),t]}var Fe=(e,t)=>{let[r,o]=(0,T.useState)([]),[a,l]=(0,T.useState)(""),[n,s]=(0,T.useState)(!1),[i,u]=(0,T.useState)(null),d=(0,T.useRef)(0),c=t?.pollMs??2e3;(0,T.useEffect)(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&o(w=>w.length===0?[{id:_e,cursor:"",author:"agent",text:b.greeting}]:w)}).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:c}),[e,c]);let m=(0,T.useCallback)(()=>{let p=a.trim();if(!p||n)return;l(""),u(null),s(!0),d.current+=1;let b=`pending-${d.current}`,w={id:b,cursor:"",author:"client",text:p,pending:!0};o(f=>[...f,w]),e.sendMessage(p).then(f=>{s(!1),f.reply.trim()&&o(g=>g.some(P=>!P.pending&&P.author!=="client"&&P.text===f.reply)?g:(d.current+=1,[...g,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:f.reply,pending:!0}]))}).catch(f=>{u(f instanceof Error?f.message:"send_failed"),s(!1),o(D=>D.filter(g=>g.id!==b)),l(D=>D||p)})},[a,n,e]);return{messages:r,input:a,setInput:l,send:m,sending:n,error:i}};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
|
@@ -311,6 +311,8 @@ type WidgetType = "stat" | "line" | "bar" | "donut" | "table" | "text";
|
|
|
311
311
|
/** A headline number: one metric reduced by `agg` (omit `metric` to count the rows). */
|
|
312
312
|
interface StatWidget {
|
|
313
313
|
type: "stat";
|
|
314
|
+
/** Which table to read. Absent = the dashboard's primary table. See `Widget.source`. */
|
|
315
|
+
source?: string | undefined;
|
|
314
316
|
label?: string | undefined;
|
|
315
317
|
metric?: string | undefined;
|
|
316
318
|
agg?: Agg | undefined;
|
|
@@ -323,6 +325,8 @@ interface StatWidget {
|
|
|
323
325
|
* rows per day. `line` and `bar` differ only in how the renderer draws the same points. */
|
|
324
326
|
interface SeriesWidget {
|
|
325
327
|
type: "line" | "bar";
|
|
328
|
+
/** Which table to read. Absent = the dashboard's primary table. See `Widget.source`. */
|
|
329
|
+
source?: string | undefined;
|
|
326
330
|
title?: string | undefined;
|
|
327
331
|
x: string;
|
|
328
332
|
y?: string | undefined;
|
|
@@ -340,6 +344,8 @@ interface SeriesWidget {
|
|
|
340
344
|
* status", which is usually the number the dashboard exists to show. */
|
|
341
345
|
interface DonutWidget {
|
|
342
346
|
type: "donut";
|
|
347
|
+
/** Which table to read. Absent = the dashboard's primary table. See `Widget.source`. */
|
|
348
|
+
source?: string | undefined;
|
|
343
349
|
title?: string | undefined;
|
|
344
350
|
groupBy: string;
|
|
345
351
|
metric?: string | undefined;
|
|
@@ -352,6 +358,8 @@ interface DonutWidget {
|
|
|
352
358
|
/** A row table: `columns` (by key, in order) or every non-plumbing column when omitted. */
|
|
353
359
|
interface TableWidget {
|
|
354
360
|
type: "table";
|
|
361
|
+
/** Which table to read. Absent = the dashboard's primary table. See `Widget.source`. */
|
|
362
|
+
source?: string | undefined;
|
|
355
363
|
title?: string | undefined;
|
|
356
364
|
columns?: string[] | undefined;
|
|
357
365
|
w?: number | undefined;
|
|
@@ -369,6 +377,15 @@ interface TextWidget {
|
|
|
369
377
|
gx?: number | undefined;
|
|
370
378
|
gy?: number | undefined;
|
|
371
379
|
}
|
|
380
|
+
/**
|
|
381
|
+
* `source` — which table a widget reads.
|
|
382
|
+
*
|
|
383
|
+
* One dashboard, many tables: a service's work items, its spend, a channel breakdown. Absent means
|
|
384
|
+
* the primary table, which is what every spec authored before this said implicitly, so an old spec
|
|
385
|
+
* keeps rendering unchanged. The renderer supplies the named tables; a widget naming one it was not
|
|
386
|
+
* given is dropped rather than silently redrawn against the primary — a chart of the wrong table is
|
|
387
|
+
* worse than no chart, because it looks right.
|
|
388
|
+
*/
|
|
372
389
|
type Widget = StatWidget | SeriesWidget | DonutWidget | TableWidget | TextWidget;
|
|
373
390
|
interface DashboardSpec {
|
|
374
391
|
version: number;
|
|
@@ -431,9 +448,25 @@ type ResolvedWidget = {
|
|
|
431
448
|
gx?: number | undefined;
|
|
432
449
|
gy?: number | undefined;
|
|
433
450
|
};
|
|
434
|
-
/**
|
|
435
|
-
|
|
436
|
-
|
|
451
|
+
/** One table a dashboard can draw from. */
|
|
452
|
+
interface DataSource {
|
|
453
|
+
fields: PortalField[];
|
|
454
|
+
rows: PortalRow[];
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Resolve a whole spec against the data. The result is render-ready and free of widgets that would
|
|
458
|
+
* draw nothing.
|
|
459
|
+
*
|
|
460
|
+
* `fields`/`rows` are the PRIMARY source — what a widget binds to when it names none, and what every
|
|
461
|
+
* dashboard used to be limited to. `others` adds further tables by name, which is what lets one
|
|
462
|
+
* dashboard mix them: a widget's `source` picks which table it reads, so the posts chart and the
|
|
463
|
+
* spend stat can sit on the same canvas over different data.
|
|
464
|
+
*
|
|
465
|
+
* A widget naming a source we were not given is DROPPED, like any other widget that would draw
|
|
466
|
+
* nothing. Falling back to the primary would be worse than silence: it would draw a real chart, with
|
|
467
|
+
* a plausible shape, of the wrong table.
|
|
468
|
+
*/
|
|
469
|
+
declare function renderModel(spec: DashboardSpec, fields: PortalField[], rows: PortalRow[], others?: Record<string, DataSource>): ResolvedWidget[];
|
|
437
470
|
|
|
438
471
|
type Band = "stat" | "chart" | "block";
|
|
439
472
|
type StatView = Extract<ResolvedWidget, {
|
package/dist/index.d.ts
CHANGED
|
@@ -311,6 +311,8 @@ type WidgetType = "stat" | "line" | "bar" | "donut" | "table" | "text";
|
|
|
311
311
|
/** A headline number: one metric reduced by `agg` (omit `metric` to count the rows). */
|
|
312
312
|
interface StatWidget {
|
|
313
313
|
type: "stat";
|
|
314
|
+
/** Which table to read. Absent = the dashboard's primary table. See `Widget.source`. */
|
|
315
|
+
source?: string | undefined;
|
|
314
316
|
label?: string | undefined;
|
|
315
317
|
metric?: string | undefined;
|
|
316
318
|
agg?: Agg | undefined;
|
|
@@ -323,6 +325,8 @@ interface StatWidget {
|
|
|
323
325
|
* rows per day. `line` and `bar` differ only in how the renderer draws the same points. */
|
|
324
326
|
interface SeriesWidget {
|
|
325
327
|
type: "line" | "bar";
|
|
328
|
+
/** Which table to read. Absent = the dashboard's primary table. See `Widget.source`. */
|
|
329
|
+
source?: string | undefined;
|
|
326
330
|
title?: string | undefined;
|
|
327
331
|
x: string;
|
|
328
332
|
y?: string | undefined;
|
|
@@ -340,6 +344,8 @@ interface SeriesWidget {
|
|
|
340
344
|
* status", which is usually the number the dashboard exists to show. */
|
|
341
345
|
interface DonutWidget {
|
|
342
346
|
type: "donut";
|
|
347
|
+
/** Which table to read. Absent = the dashboard's primary table. See `Widget.source`. */
|
|
348
|
+
source?: string | undefined;
|
|
343
349
|
title?: string | undefined;
|
|
344
350
|
groupBy: string;
|
|
345
351
|
metric?: string | undefined;
|
|
@@ -352,6 +358,8 @@ interface DonutWidget {
|
|
|
352
358
|
/** A row table: `columns` (by key, in order) or every non-plumbing column when omitted. */
|
|
353
359
|
interface TableWidget {
|
|
354
360
|
type: "table";
|
|
361
|
+
/** Which table to read. Absent = the dashboard's primary table. See `Widget.source`. */
|
|
362
|
+
source?: string | undefined;
|
|
355
363
|
title?: string | undefined;
|
|
356
364
|
columns?: string[] | undefined;
|
|
357
365
|
w?: number | undefined;
|
|
@@ -369,6 +377,15 @@ interface TextWidget {
|
|
|
369
377
|
gx?: number | undefined;
|
|
370
378
|
gy?: number | undefined;
|
|
371
379
|
}
|
|
380
|
+
/**
|
|
381
|
+
* `source` — which table a widget reads.
|
|
382
|
+
*
|
|
383
|
+
* One dashboard, many tables: a service's work items, its spend, a channel breakdown. Absent means
|
|
384
|
+
* the primary table, which is what every spec authored before this said implicitly, so an old spec
|
|
385
|
+
* keeps rendering unchanged. The renderer supplies the named tables; a widget naming one it was not
|
|
386
|
+
* given is dropped rather than silently redrawn against the primary — a chart of the wrong table is
|
|
387
|
+
* worse than no chart, because it looks right.
|
|
388
|
+
*/
|
|
372
389
|
type Widget = StatWidget | SeriesWidget | DonutWidget | TableWidget | TextWidget;
|
|
373
390
|
interface DashboardSpec {
|
|
374
391
|
version: number;
|
|
@@ -431,9 +448,25 @@ type ResolvedWidget = {
|
|
|
431
448
|
gx?: number | undefined;
|
|
432
449
|
gy?: number | undefined;
|
|
433
450
|
};
|
|
434
|
-
/**
|
|
435
|
-
|
|
436
|
-
|
|
451
|
+
/** One table a dashboard can draw from. */
|
|
452
|
+
interface DataSource {
|
|
453
|
+
fields: PortalField[];
|
|
454
|
+
rows: PortalRow[];
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Resolve a whole spec against the data. The result is render-ready and free of widgets that would
|
|
458
|
+
* draw nothing.
|
|
459
|
+
*
|
|
460
|
+
* `fields`/`rows` are the PRIMARY source — what a widget binds to when it names none, and what every
|
|
461
|
+
* dashboard used to be limited to. `others` adds further tables by name, which is what lets one
|
|
462
|
+
* dashboard mix them: a widget's `source` picks which table it reads, so the posts chart and the
|
|
463
|
+
* spend stat can sit on the same canvas over different data.
|
|
464
|
+
*
|
|
465
|
+
* A widget naming a source we were not given is DROPPED, like any other widget that would draw
|
|
466
|
+
* nothing. Falling back to the primary would be worse than silence: it would draw a real chart, with
|
|
467
|
+
* a plausible shape, of the wrong table.
|
|
468
|
+
*/
|
|
469
|
+
declare function renderModel(spec: DashboardSpec, fields: PortalField[], rows: PortalRow[], others?: Record<string, DataSource>): ResolvedWidget[];
|
|
437
470
|
|
|
438
471
|
type Band = "stat" | "chart" | "block";
|
|
439
472
|
type StatView = Extract<ResolvedWidget, {
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client'
|
|
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
|
|
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 We=/^ /,T=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(We,"")));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 l=o.sessionId;l&&(r(l),t.onSession?.(l));return}if(e.event==="turn_event"){t.onEvent?.(o);let l=$(o);l&&t.onText?.(l);let a=O(o);a&&t.onThinking?.(a);let n=_(o);n&&t.onTool?.(n);return}if(e.event==="chat_completed"){let l=o;r(l.sessionId),t.onComplete?.(l);return}e.event==="chat_error"&&t.onError?.(T(o))},x=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 l=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:o});if(!(l.ok&&l.body)){t.onError?.({error:`stream_failed_${l.status}`});return}let a=l.body.getReader(),n=new TextDecoder,s="",i=()=>{let d=s.indexOf(`
|
|
5
5
|
|
|
6
|
-
`);for(;d!==-1;){let
|
|
6
|
+
`);for(;d!==-1;){let c=s.slice(0,d);s=s.slice(d+2);let m=Ee(c);m&&$e(m,t,r),d=s.indexOf(`
|
|
7
7
|
|
|
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};
|
|
8
|
+
`)}},u=async()=>{let d=await a.read();if(!d.done)return s+=n.decode(d.value,{stream:!0}),i(),u()};await u()};var Oe=/\/+$/,F="/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)}`:"",l=async()=>({"content-type":"application/json",authorization:`Bearer ${await r()}`}),a=async n=>{let s=await fetch(`${t}${F}/chat${o("?")}`,{method:"POST",headers:await l(),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()=>x(`${t}${F}/chat/info${o("?")}`,await l()),sendMessage:a,streamMessage:async(n,s)=>{try{let i=await a(n);s.onText?.(i.reply),s.onComplete?.(i)}catch(i){s.onError?.(T(i))}},subscribe:(n,s)=>{let i=s?.since??"0",u=!1,d,c=s?.intervalMs??3e3,m=typeof document<"u",p=()=>m&&document.visibilityState==="hidden",b=!1,w=()=>{if(!u){if(p()){b=!0;return}d=setTimeout(f,c)}},f=async()=>{try{let h=await x(`${t}${F}/chat/thread?since=${encodeURIComponent(i)}${o("&")}`,await l());for(let D of h.messages)n.onMessage(D);i=h.cursor,n.onHealthy?.()}catch(h){n.onError?.(T(h))}w()},R=()=>{u||!b||p()||(b=!1,d&&clearTimeout(d),d=setTimeout(f,0))};m&&document.addEventListener("visibilitychange",R);let g=()=>{u=!0,d&&clearTimeout(d),m&&document.removeEventListener("visibilitychange",R)};return s?.signal?.addEventListener("abort",g),d=setTimeout(f,0),g}}};import{useEffect as Fe,useState as Le}from"react";var L=(e,t)=>{let[r,o]=Le("");return Fe(()=>{if(!e){o("");return}let l=Uint8Array.from(atob(e),n=>n.charCodeAt(0)),a=URL.createObjectURL(new Blob([l],{type:t}));return o(a),()=>URL.revokeObjectURL(a)},[e,t]),r};import{useEffect as Be,useRef as Ge}from"react";import{createContext as Ue,useContext as Ne}from"react";import{jsx as je}from"react/jsx-runtime";var ee=Ue(null),Ve=({client:e,children:t})=>je(ee.Provider,{value:e,children:t}),U=()=>{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,l]=A(""),[a,n]=A(!1),[s,i]=A(null),u=re(0),d=re(null);ne(()=>()=>d.current?.abort(),[]);let c=te(()=>{let p=u.current;return u.current+=1,p},[]);ne(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&r([{id:c(),role:"assistant",text:b.greeting}])}).catch(()=>{}),()=>{p=!1}},[e,c]);let m=te(()=>{let p=o.trim();if(!p||a)return;l(""),i(null),n(!0);let b=c(),w=c();r(g=>[...g,{id:b,role:"user",text:p},{id:w,role:"assistant",text:"",streaming:!0}]);let f=g=>{r(h=>h.map(D=>D.id===w?g(D):D))},R=new AbortController;d.current=R,e.streamMessage(p,{onText:g=>f(h=>({...h,text:h.text+g})),onComplete:g=>{f(h=>({...h,text:g.reply||h.text,artifacts:g.artifacts,streaming:!1})),n(!1)},onError:g=>{f(h=>({...h,streaming:!1})),i(g.error),n(!1)}},R.signal).catch(g=>{f(h=>({...h,streaming:!1})),i(g instanceof Error?g.message:"stream_failed"),n(!1)}).finally(()=>{n(!1),f(g=>g.streaming?{...g,streaming:!1}:g)})},[o,a,e,c]);return{messages:t,input:o,setInput:l,send:m,sending:a,error:s}};import{jsx as C,jsxs as V}from"react/jsx-runtime";var v={root:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif",fontSize:14,color:"#111827"},log:{flex:1,overflowY:"auto",padding:12,display:"flex",flexDirection:"column",gap:8},user:{alignSelf:"flex-end",background:"#111827",color:"#ffffff",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},assistant:{alignSelf:"flex-start",background:"#f1f1f4",color:"#111827",borderRadius:12,padding:"8px 12px",maxWidth:"80%",whiteSpace:"pre-wrap"},artifacts:{display:"flex",flexDirection:"column",gap:6,marginTop:6},image:{maxHeight:220,borderRadius:8,border:"1px solid #e5e7eb"},link:{color:"#2563eb",textDecoration:"underline",wordBreak:"break-all"},error:{color:"#b91c1c",padding:"4px 12px",fontSize:13},form:{display:"flex",gap:8,borderTop:"1px solid #e5e7eb",padding:8},input:{flex:1,border:"1px solid #d1d5db",borderRadius:8,padding:"8px 10px",fontSize:14,outline:"none"},button:{border:"none",background:"#111827",color:"#ffffff",borderRadius:8,padding:"8px 14px",fontSize:14,cursor:"pointer"}},ze=({artifact:e})=>{let t=L(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:v.image})}):C("a",{download:e.filename,href:r,style:v.link,children:e.filename}):null},Je=()=>{let e=U(),{messages:t,input:r,setInput:o,send:l,sending:a,error:n}=N(e),s=Ge(null);Be(()=>{let u=s.current;u&&(u.scrollTop=u.scrollHeight)},[t]);let i=u=>{u.preventDefault(),l()};return V("div",{style:v.root,children:[C("div",{ref:s,style:v.log,children:t.map(u=>V("div",{style:u.role==="user"?v.user:v.assistant,children:[u.text||(u.streaming?"\u2026":""),u.artifacts&&u.artifacts.length>0?C("div",{style:v.artifacts,children:u.artifacts.map(d=>C(ze,{artifact:d},d.filename))}):null]},u.id))}),n?C("div",{style:v.error,children:n}):null,V("form",{onSubmit:i,style:v.form,children:[C("input",{"aria-label":"Message",onChange:u=>o(u.target.value),placeholder:"Type a message\u2026",style:v.input,value:r}),C("button",{disabled:a||r.trim().length===0,style:v.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}`,l={"content-type":"application/json"},a=(n,s)=>({url:o(n),headers:l,body:JSON.stringify({message:s,...t?{sessionId:t}:{},...e.identity?{externalUserId:e.identity.externalUserId,userHmac:e.identity.userHmac}:{}})});return{sessionId:()=>t,getInfo:()=>x(o("/config"),{}),sendMessage:async n=>{let s=await Q(a("/message",n));return t=s.sessionId,s},streamMessage:(n,s,i)=>Z(a("/message/stream",n),s,u=>{t=u},i),subscribe:(n,s)=>{let i=s?.since??"0",u=!1,d,c=s?.intervalMs??3e3,m=async()=>{let b=t;if(b)try{let w=await x(o(`/messages?session=${encodeURIComponent(b)}&since=${encodeURIComponent(i)}`),{});for(let f of w.messages)n.onMessage(f);i=w.cursor,n.onHealthy?.()}catch(w){n.onError?.(T(w))}u||(d=setTimeout(m,c))},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[l,a]of Object.entries(o.data??{})){if(a==null)continue;let n=r.get(l);n||(n=new Map,r.set(l,n),t.push(l));let s=Ze(a);n.set(s,(n.get(s)??0)+1)}return t.map(o=>{let l=r.get(o)??new Map,a="text",n=-1;for(let[s,i]of l)i>n&&(n=i,a=s);return{key:o,label:Qe(o),type:a}})}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(i=>!nt.has(i.key)),o=r.filter(i=>i.type==="number").slice(0,3),l=r.find(i=>i.key==="status")??r.find(i=>i.type==="select"),a=r.find(i=>i.type==="date"&&tt.test(i.key))??r.find(i=>i.type==="date"),n=r.filter(i=>i.type==="number"&&!se(i.key)).map(i=>({field:i,total:t.reduce((u,d)=>u+et(d.data[i.key]),0)})).sort((i,u)=>u.total-i.total).find(i=>i.total>0)?.field??null,s=[{type:"stat",label:"Items",agg:"count"}];for(let i of o){let u=se(i.key);s.push({type:"stat",metric:i.key,agg:u?"avg":"sum",label:u?`Avg ${i.label.toLowerCase()}`:i.label})}return a&&s.push({type:"line",x:a.key,y:n?.key,agg:"sum",title:n?`${n.label} by day`:"Items by day"}),l&&s.push({type:"donut",groupBy:l.key,title:l.label}),s.push({type:"table",columns:r.map(i=>i.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 M(e){return e==="stat"?"stat":e==="series"||e==="donut"?"chart":"block"}function ce(e){return e==="stat"?"stat":e==="line"||e==="bar"||e==="donut"?"chart":"block"}function pe(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,i,u)=>{if(n<0||n+i>6)return!1;for(let d=0;d<u;d+=1){let c=r[s+d];if(c){for(let m=0;m<i;m+=1)if(c[n+m])return!1}}return!0},l=(n,s,i,u)=>{for(let d=0;d<u;d+=1){let c=r[s+d]??[];for(let m=0;m<i;m+=1)c[n+m]=!0;r[s+d]=c}},a=(n,s)=>{for(let i=0;;i+=1)for(let u=0;u+n<=6;u+=1)if(o(u,i,n,s))return{gx:u,gy:i}};for(let n of e){let s=B(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);l(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)M(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,l)=>o+l,0);return e==="avg"?Math.round(r/t.length*100)/100:r}function st(e,t,r,o){let l=new Map;for(let a of e){let n=new Date(fe(a.data[t]));if(Number.isNaN(n.getTime()))continue;let s=n.toISOString().slice(0,10),i=l.get(s)??[];i.push(r?z(a.data[r]):1),l.set(s,i)}return[...l.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?J(o,n):n.length}))}function it(e,t,r,o="sum"){let l=new Map;for(let a of e){let n=fe(a.data[t]).trim();if(!n)continue;let s=l.get(n)??[];s.push(r?z(a.data[r]):1),l.set(n,s)}return[...l.entries()].map(([a,n])=>({label:a,value:r?J(o,n):n.length})).sort((a,n)=>n.value-a.value)}function at(e,t,r,o){switch(e.type){case"stat":{let l=e.metric?t.get(e.metric):void 0;if(e.metric&&!l)return null;if(!l)return{kind:"stat",label:e.label??"Items",value:o.length};let a=o.map(n=>z(n.data[l.key]));return{kind:"stat",label:e.label??l.label,value:J(e.agg??"sum",a)}}case"line":case"bar":{if(!t.has(e.x)||e.y&&!t.has(e.y))return null;let l=st(o,e.x,e.y,e.agg??"sum");return l.length<2?null:{kind:"series",draw:e.type,title:e.title??"By day",points:l}}case"donut":{if(!t.has(e.groupBy))return null;let l=it(o,e.groupBy,e.metric,e.agg??"sum");return l.length===0?null:{kind:"donut",title:e.title??t.get(e.groupBy)?.label??"Breakdown",points:l}}case"table":{let l=e.columns?e.columns.map(a=>t.get(a)).filter(a=>a!==void 0&&!me.has(a.key)):r;return l.length===0?null:{kind:"table",title:e.title,columns:l,rows:o}}case"text":return{kind:"text",title:e.title,body:e.body};default:return null}}function be(e,t,r,o={}){let l=new Map,a=i=>({byKey:new Map(i.fields.map(u=>[u.key,u])),cols:i.fields.filter(u=>!me.has(u.key)),rows:i.rows}),n=a({fields:t,rows:r});for(let[i,u]of Object.entries(o))l.set(i,a(u));let s=[];for(let i of e.widgets){let u=i.type==="text"?void 0:i.source,d=u?l.get(u):n;if(!d)continue;let c=at(i,d.byKey,d.cols,d.rows);c&&s.push({...c,w:i.w,h:i.h,gx:i.gx,gy:i.gy})}return s}var lt=new Set(["sum","avg","count","min","max","last"]),ye=e=>typeof e=="string"&<.has(e)?e:void 0,y=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",source:y(t.source),label:y(t.label),metric:y(t.metric)??y(t.column),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=y(t.x);return r?{type:t.type,source:y(t.source),title:y(t.title),x:r,y:y(t.y)??y(t.column),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=y(t.groupBy)??y(t.column);return r?{type:"donut",source:y(t.source),title:y(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",source:y(t.source),title:y(t.title),columns:r,w:P(t.w),h:I(t.h),gx:k(t.gx),gy:k(t.gy)}}case"text":{let r=y(t.body);return r?{type:"text",title:y(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 l=t.version;return{version:typeof l=="number"?l:1,title:y(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",l=typeof t.v=="number"&&t.v>=1?Math.floor(t.v):void 0;return r?{kind:o,value:r,...l?{v:l}:{}}:null}return null}function K(e){let t=new Map;for(let r of e){let o=r.v??1,l=t.get(o)??[];l.push(r),t.set(o,l)}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(l=>l!==null)}catch{}let r=String(e.file??"");return r?[{kind:"file",value:r}]:[]}function xe(e,t,r,o=""){let a=K(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 q(e){return e==="number"||e==="date"||e==="boolean"||e==="select"||e==="url"?e:e==="link"?"url":e==="checkbox"?"boolean":"text"}function Re(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:q(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:{}})),l=typeof t.name=="string"?t.name:void 0;return{columns:r,rows:o,...l?{name:l}:{}}}}catch{}return null}function Te(e){return e==null?"":String(e)}function ke(e){return e===!0||e==="true"||e==="1"||e==="yes"||e==="\u2713"}function W(){return{cells:{},verdict:"",comment:""}}function De(e){if(typeof e!="string"||e.trim()==="")return W();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 W()}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 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 pt=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()}`}),l=async(n,s)=>{try{let i=await fetch(`${t}${S}${n}`,{method:s.method,headers:await o(),...s.body===void 0?{}:{body:JSON.stringify(s.body)}});if(i.status===409){let u=await i.json().catch(()=>({}));throw new H(u.message??"Someone else saved this first.")}if(!i.ok){let u=await i.text().catch(()=>""),d=`${s.method} ${n} \u2192 ${String(i.status)}`;try{let c=JSON.parse(u);c.message&&(d=c.message)}catch{d=u?`${d}: ${u}`:d}throw T({error:d})}return await i.json()}catch(i){throw i instanceof H?i:T(i)}},a=n=>`/tables/${encodeURIComponent(n)}`;return{listTables:async()=>(await x(`${t}${S}/tables`,await o())).tables,listRows:async(n,s)=>await x(`${t}${S}${a(n)}/rows?limit=${String(s??100)}`,await o()),insertRow:async(n,s)=>{let{rowIds:i}=await l(`${a(n)}/rows`,{method:"POST",body:{rows:[s]}}),u=i[0];if(!u)throw T(new Error("The row was not created."));return u},patchRow:async(n,s,i)=>(await l(`${a(n)}/rows/${encodeURIComponent(s)}`,{method:"PATCH",body:i})).updated,deleteRow:async(n,s)=>(await l(`/${encodeURIComponent(n)}/${encodeURIComponent(s)}`,{method:"DELETE"})).deleted,listFiles:async()=>(await x(`${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 i=new Uint8Array(await n.arrayBuffer());return await l("/files",{method:"POST",body:{filename:n.name,mime:n.type||"application/octet-stream",data:ct(i),...s===void 0?{}:{message:s}}})},fileLink:async n=>await x(`${t}${S}/files/${encodeURIComponent(n)}/url`,await o()),deleteFile:async n=>(await l(`/files/${encodeURIComponent(n)}`,{method:"DELETE"})).deleted,listDocuments:async()=>(await x(`${t}${S}/documents`,await o())).documents,readDocument:async n=>(await x(`${t}${S}/documents/${encodeURIComponent(n)}`,await o())).document,saveDocument:async(n,s)=>await l(`/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 Me(e,t){if(e.some(a=>a.id===t.id))return e;let r=e.filter(a=>a.id!==Ae),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([]),[l,a]=E(""),[n,s]=E(!1),[i,u]=E(null),d=mt(0),c=t?.pollMs??2e3;He(()=>{let p=!0;return e.getInfo().then(b=>{p&&b.greeting&&o(w=>w.length===0?[{id:Ae,cursor:"",author:"agent",text:b.greeting}]:w)}).catch(()=>{}),()=>{p=!1}},[e]),He(()=>e.subscribe?.({onMessage:p=>o(b=>Me(b,p)),onError:p=>u(p.error),onHealthy:()=>u(null)},{intervalMs:c}),[e,c]);let m=gt(()=>{let p=l.trim();if(!p||n)return;a(""),u(null),s(!0),d.current+=1;let b=`pending-${d.current}`,w={id:b,cursor:"",author:"client",text:p,pending:!0};o(f=>[...f,w]),e.sendMessage(p).then(f=>{s(!1),f.reply.trim()&&o(g=>g.some(D=>!D.pending&&D.author!=="client"&&D.text===f.reply)?g:(d.current+=1,[...g,{id:`pending-agent-${d.current}`,cursor:"",author:"agent",text:f.reply,pending:!0}]))}).catch(f=>{u(f instanceof Error?f.message:"send_failed"),s(!1),o(R=>R.filter(g=>g.id!==b)),a(R=>R||p)})},[l,n,e]);return{messages:r,input:l,setInput:a,send:m,sending:n,error:i}};export{Je as Chat,ae as GRID_COLS,le as GRID_MAX_COLS,ue as GRID_MAX_ROWS,Ve as HolaProvider,H as PortalConflict,M as bandOfKind,ce as bandOfType,Ce as cellValue,_e as createApiTransport,Ke as createHolaClient,pt as createPortalData,j as createWidgetTransport,Te as deliverableCellText,xe as deliverableStatus,oe as deriveFields,W as emptyTableResponses,pe as footprintOf,B as footprintWith,Ie as formatDeliverableDate,K as groupDeliverableVersions,ie as inferSpec,ke as isDeliverableChecked,Me as mergeMessage,q as normalizeDeliverableColType,X as normalizeDeliverableItem,he as parseDashboardSpec,we as parseDeliverableItems,Re 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,L as useArtifactUrl,N as useChat,U 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.19",
|
|
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",
|