@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 CHANGED
@@ -1,8 +1,8 @@
1
1
  'use client'
2
- var q=Object.defineProperty;var Ue=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var Ve=(e,t)=>{for(var r in t)q(e,r,{get:t[r],enumerable:!0})},je=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Fe(t))!Ne.call(e,i)&&i!==r&&q(e,i,{get:()=>t[i],enumerable:!(o=Ue(t,i))||o.enumerable});return e};var Be=e=>je(q({},"__esModule",{value:!0}),e);var gt={};Ve(gt,{Chat:()=>Ie,GRID_COLS:()=>ee,GRID_MAX_COLS:()=>te,GRID_MAX_ROWS:()=>ne,HolaProvider:()=>Se,PortalConflict:()=>H,bandOfKind:()=>A,bandOfType:()=>re,cellValue:()=>ye,createApiTransport:()=>De,createHolaClient:()=>He,createPortalData:()=>Oe,createWidgetTransport:()=>B,deliverableCellText:()=>me,deliverableStatus:()=>pe,deriveFields:()=>Q,emptyTableResponses:()=>E,footprintOf:()=>oe,footprintWith:()=>G,formatDeliverableDate:()=>xe,groupDeliverableVersions:()=>X,inferSpec:()=>Z,isDeliverableChecked:()=>fe,mergeMessage:()=>ve,normalizeDeliverableColType:()=>K,normalizeDeliverableItem:()=>J,parseDashboardSpec:()=>ue,parseDeliverableItems:()=>de,parseDeliverableTable:()=>ge,parseTableResponses:()=>be,placeWidgets:()=>z,publishedVersionOf:()=>ce,renderModel:()=>le,setResponse:()=>he,setTableReview:()=>we,splitLayout:()=>se,textDeltaOf:()=>$,thinkingDeltaOf:()=>O,toolEventOf:()=>_,useArtifactUrl:()=>U,useChat:()=>V,useHolaClient:()=>N,useThread:()=>Le});module.exports=Be(gt);var Te=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="message_update"?t.assistantMessageEvent??null:null},$=e=>{let t=Te(e);return t?.type==="text_delta"&&typeof t.delta=="string"?t.delta:null},O=e=>{let t=Te(e);return t?.type==="thinking_delta"&&typeof t.delta=="string"?t.delta:null},_=e=>{if(!e||typeof e!="object")return null;let t=e;return t.type==="tool_execution_start"&&t.toolCallId?{phase:"start",id:t.toolCallId,name:t.toolName}:t.type==="tool_execution_end"&&t.toolCallId?{phase:"end",id:t.toolCallId,isError:t.isError}:null};var Ge=/^ /,C=e=>{if(e&&typeof e=="object"){let t=e,r=typeof t.error=="string"?t.error:"request_failed";return typeof t.retryable=="boolean"?{error:r,retryable:t.retryable}:{error:r}}return{error:"request_failed"}},ze=e=>{let t="message",r=[];for(let o of e.split(`
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 i=o.sessionId;i&&(r(i),t.onSession?.(i));return}if(e.event==="turn_event"){t.onEvent?.(o);let i=$(o);i&&t.onText?.(i);let a=O(o);a&&t.onThinking?.(a);let n=_(o);n&&t.onTool?.(n);return}if(e.event==="chat_completed"){let i=o;r(i.sessionId),t.onComplete?.(i);return}e.event==="chat_error"&&t.onError?.(C(o))},v=async(e,t)=>{let r=await fetch(e,{headers:t});if(!r.ok)throw new Error(`hola: request failed (${r.status})`);return await r.json()},Re=async e=>{let t=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body});if(!t.ok)throw new Error(`hola: message failed (${t.status})`);return await t.json()},ke=async(e,t,r,o)=>{let i=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:o});if(!(i.ok&&i.body)){t.onError?.({error:`stream_failed_${i.status}`});return}let a=i.body.getReader(),n=new TextDecoder,s="",l=()=>{let d=s.indexOf(`
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 g=s.slice(0,d);s=s.slice(d+2);let m=ze(g);m&&Je(m,t,r),d=s.indexOf(`
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
- /** Resolve a whole spec against the data. The result is render-ready and free of widgets that would
435
- * draw nothing. */
436
- declare function renderModel(spec: DashboardSpec, fields: PortalField[], rows: PortalRow[]): ResolvedWidget[];
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
- /** Resolve a whole spec against the data. The result is render-ready and free of widgets that would
435
- * draw nothing. */
436
- declare function renderModel(spec: DashboardSpec, fields: PortalField[], rows: PortalRow[]): ResolvedWidget[];
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 Me=/^ /,R=e=>{if(e&&typeof e=="object"){let t=e,r=typeof t.error=="string"?t.error:"request_failed";return typeof t.retryable=="boolean"?{error:r,retryable:t.retryable}:{error:r}}return{error:"request_failed"}},Ee=e=>{let t="message",r=[];for(let o of e.split(`
3
- `))o.startsWith(":")||(o.startsWith("event:")?t=o.slice(6).trim():o.startsWith("data:")&&r.push(o.slice(5).replace(Me,"")));return r.length>0?{event:t,data:r.join(`
4
- `)}:null},$e=(e,t,r)=>{let o;try{o=JSON.parse(e.data)}catch{return}if(e.event==="session"){let a=o.sessionId;a&&(r(a),t.onSession?.(a));return}if(e.event==="turn_event"){t.onEvent?.(o);let a=$(o);a&&t.onText?.(a);let i=O(o);i&&t.onThinking?.(i);let n=_(o);n&&t.onTool?.(n);return}if(e.event==="chat_completed"){let a=o;r(a.sessionId),t.onComplete?.(a);return}e.event==="chat_error"&&t.onError?.(R(o))},w=async(e,t)=>{let r=await fetch(e,{headers:t});if(!r.ok)throw new Error(`hola: request failed (${r.status})`);return await r.json()},Q=async e=>{let t=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body});if(!t.ok)throw new Error(`hola: message failed (${t.status})`);return await t.json()},Z=async(e,t,r,o)=>{let a=await fetch(e.url,{method:"POST",headers:e.headers,body:e.body,signal:o});if(!(a.ok&&a.body)){t.onError?.({error:`stream_failed_${a.status}`});return}let i=a.body.getReader(),n=new TextDecoder,s="",l=()=>{let d=s.indexOf(`
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 g=s.slice(0,d);s=s.slice(d+2);let m=Ee(g);m&&$e(m,t,r),d=s.indexOf(`
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"&&lt.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"&&lt.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.18",
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",