@arbor-education/agent-view-frontend 0.5.1 → 0.5.2

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
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),o=require("react"),q=require("classnames"),u=require("@arbor-education/design-system.components"),xe=require("@arbor-education/ask-arbor-chat-panel"),j={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},P={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},$={briefing:"briefing",running:"running",stopped:"stopped",complete:"complete"},te={agent:"agent",user:"user",system:"system"},le={document_html:"document_html",mis_record:"mis_record",workflow:"workflow",file:"file",user_file:"user_file",link:"link"},Es={user_file:"user_file"},Rt={cancelled:"cancelled",archived:"archived"},at={in_progress:"in_progress",requires_attention:"requires_attention",available:"available"},ee={[P.complete]:{label:"Complete",icon:"circle-check",color:"var(--color-semantic-success-600)"},[P.failed]:{label:"Failed",icon:"circle-x",color:"var(--color-semantic-destructive-600)"},[P.hitl]:{label:"Requires attention",icon:"triangle-alert",color:"var(--color-semantic-warning-600)"},[P["generating-a-response"]]:{label:"Generating a response",icon:"sparkles",color:"var(--color-brand-600)"}},qe={[j["generating-a-response"]]:{status:j["generating-a-response"],title:"Active",dotColour:"green",statusIcon:{name:ee["generating-a-response"].icon,color:ee["generating-a-response"].color}},[j.hitl]:{status:j.hitl,title:"Requires attention",dotColour:"orange",statusIcon:{name:ee.hitl.icon,color:ee.hitl.color}},[j.complete]:{status:j.complete,title:"Complete",dotColour:"green",dotModifier:"grey-dark",statusIcon:{name:ee.complete.icon,color:ee.complete.color}},[j.failed]:{status:j.failed,title:"Failed",dotColour:"salmon",statusIcon:{name:ee.failed.icon,color:ee.failed.color}}},Rs=[j["generating-a-response"],j.hitl],Ts=[j.complete,j.failed],Is="m4",Os="1",Gt="msg-opening",ze="Unable to load agent tasks. Please try again.",Ls="Unable to load the resources for this agent",Ps="Unable to load this document. Please try again.",zt="Unable to load the timeline for this agent",Us="Unable to stop the agent. Please try again.",Ms="Unable to rename the agent. Please try again.",Ds="Something went wrong. Please try again.",qt="Unable to load agents. Please try again.",ve="Loading tasks…",Tt="Loading agents…",$s="Task",Hs={[$.briefing]:"Briefing",[$.running]:"Working",[$.stopped]:"Stopped",[$.complete]:"Complete"},Fs=[j["generating-a-response"],j.hitl,j.complete,j.failed],Bs={[j["generating-a-response"]]:"Agents currently working on tasks for you.",[j.hitl]:"Agents that need your input before they can continue.",[j.complete]:"Agents that have finished their work.",[j.failed]:"Agents that failed or were stopped."},Gs=()=>s.jsxs("svg",{className:"agent-view__empty-illustration",viewBox:"0 0 360 240",xmlns:"http://www.w3.org/2000/svg",role:"img","aria-label":"Preview of the agents board layout",children:[s.jsx("rect",{x:"0",y:"0",width:"360",height:"240",rx:"12",fill:"var(--color-grey-100)"}),s.jsx("rect",{x:"16",y:"16",width:"100",height:"208",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),s.jsx("rect",{x:"130",y:"16",width:"100",height:"208",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),s.jsx("rect",{x:"244",y:"16",width:"100",height:"100",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),s.jsx("rect",{x:"244",y:"124",width:"100",height:"100",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),s.jsx("rect",{x:"28",y:"52",width:"76",height:"36",rx:"6",fill:"var(--color-grey-050)"}),s.jsx("rect",{x:"28",y:"96",width:"76",height:"36",rx:"6",fill:"var(--color-grey-050)"}),s.jsx("rect",{x:"142",y:"52",width:"76",height:"36",rx:"6",fill:"var(--color-semantic-warning-050)"}),s.jsx("circle",{cx:"40",cy:"70",r:"4",fill:"var(--color-brand-600)"}),s.jsx("circle",{cx:"40",cy:"114",r:"4",fill:"var(--color-brand-600)"}),s.jsx("circle",{cx:"154",cy:"70",r:"4",fill:"var(--color-semantic-warning-600)"}),s.jsx("circle",{cx:"256",cy:"52",r:"4",fill:"var(--color-grey-400)"}),s.jsx("circle",{cx:"256",cy:"160",r:"4",fill:"var(--color-semantic-destructive-500)"})]}),zs=({status:t})=>{const e=qe[t];return e.statusIcon?s.jsx(u.Icon,{name:e.statusIcon.name,size:16,color:e.statusIcon.color,screenReaderText:e.title}):s.jsx(u.Dot,{colour:e.dotColour,label:e.title})},qs=()=>s.jsxs("section",{className:"agent-view__empty","aria-label":"About the agents board",children:[s.jsxs("div",{className:"agent-view__empty-content",children:[s.jsx(u.Heading,{level:4,children:"Your agents board"}),s.jsx("p",{className:"agent-view__empty-lead",children:"When you start an agent, it appears here so you can track progress at a glance. Agents move between columns as their status changes."}),s.jsx("ul",{className:"agent-view__empty-columns",children:Fs.map(t=>{const e=qe[t];return s.jsxs("li",{className:"agent-view__empty-column",children:[s.jsx("span",{className:"agent-view__empty-column-indicator",children:s.jsx(zs,{status:t})}),s.jsxs("span",{className:"agent-view__empty-column-text",children:[s.jsx("span",{className:"agent-view__empty-column-title",children:e.title}),s.jsx("span",{className:"agent-view__empty-column-description",children:Bs[t]})]})]},t)})}),s.jsxs("p",{className:"agent-view__empty-hint",children:["Use ",s.jsx("strong",{children:"Start an agent"})," above to begin."]})]}),s.jsx("div",{className:"agent-view__empty-visual",children:s.jsx(Gs,{})})]}),Ks=()=>({needsInput:[],complete:[],failed:[],tasks:[]}),Js=(t,e)=>({...t,...e.length>0?{children:e}:{}}),Kt=t=>{const e=[],n=[],a=[],r=[];for(const l of t){const i=l.children?Kt(l.children):Ks();if(e.push(...i.needsInput),n.push(...i.complete),a.push(...i.failed),l.status===P.hitl){e.push({...l,children:void 0});continue}if(l.status===P.complete){n.push({...l,children:void 0});continue}if(l.status===P.failed){a.push({...l,children:void 0});continue}r.push(Js(l,i.tasks))}return{needsInput:e,complete:n,failed:a,tasks:r}},It=t=>t===P.hitl?0:t===P.complete?1:t===P.failed?2:3,Ws=t=>t.map((e,n)=>({item:e,index:n})).sort((e,n)=>{const a=It(e.item.status)-It(n.item.status);return a!==0?a:e.index-n.index}).map(({item:e})=>e),rt=2,Vs=t=>{if(!t)return{canScrollUp:!1,canScrollDown:!1};const e=t.scrollHeight-t.clientHeight;return e<=rt?{canScrollUp:!1,canScrollDown:!1}:{canScrollUp:t.scrollTop>rt,canScrollDown:t.scrollTop<e-rt}},Ys=(t,e)=>{if(!t||!e)return null;const n=t.getBoundingClientRect(),a=e.getBoundingClientRect();return{top:a.top-n.top,left:a.left-n.left,width:a.width,height:a.height}},Ke=({children:t,className:e,contentClassName:n,scrollSelector:a,style:r,"aria-label":l})=>{const i=o.useRef(null),p=o.useRef(null),[d,g]=o.useState(!1),[m,S]=o.useState(!1),[x,E]=o.useState(null),H=()=>{var T;return a?((T=i.current)==null?void 0:T.querySelector(a))??null:p.current},_=()=>{const T=H(),y=Vs(T);if(g(f=>f===y.canScrollUp?f:y.canScrollUp),S(f=>f===y.canScrollDown?f:y.canScrollDown),a){const f=Ys(i.current,T);E(N=>(N==null?void 0:N.top)===(f==null?void 0:f.top)&&(N==null?void 0:N.left)===(f==null?void 0:f.left)&&(N==null?void 0:N.width)===(f==null?void 0:f.width)&&(N==null?void 0:N.height)===(f==null?void 0:f.height)?N:f)}else E(f=>f===null?f:null)};o.useLayoutEffect(()=>{_()}),o.useEffect(()=>{const T=i.current;if(!T)return;let y=null,f=null;const N=()=>{y==null||y.removeEventListener("scroll",_),f==null||f.disconnect(),f=null,y=null},w=M=>{if(M===y){_();return}if(N(),y=M,!y){_();return}y.addEventListener("scroll",_,{passive:!0}),f=new ResizeObserver(()=>_()),f.observe(y),y.firstElementChild instanceof HTMLElement&&f.observe(y.firstElementChild),_()};w(H());const C=new MutationObserver(()=>{w(H())});return C.observe(T,{childList:!0,subtree:!0,characterData:!0}),window.addEventListener("resize",_),()=>{window.removeEventListener("resize",_),C.disconnect(),N()}},[a]);const O=T=>{const y=H();if(!y)return;const f=Math.max(y.clientHeight*.75,120);y.scrollBy({top:T==="up"?-f:f,behavior:"smooth"})},b=s.jsxs(s.Fragment,{children:[d&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"scrollable-region__fade scrollable-region__fade--top","aria-hidden":"true"}),s.jsx("button",{type:"button",className:"scrollable-region__edge scrollable-region__edge--top","aria-label":"Scroll up",onClick:()=>O("up"),children:s.jsx(u.Icon,{name:"chevron-up",size:16,color:"currentColor"})})]}),m&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"scrollable-region__fade scrollable-region__fade--bottom","aria-hidden":"true"}),s.jsx("button",{type:"button",className:"scrollable-region__edge scrollable-region__edge--bottom","aria-label":"Scroll down",onClick:()=>O("down"),children:s.jsx(u.Icon,{name:"chevron-down",size:16,color:"currentColor"})})]})]});return s.jsx("div",{ref:i,className:q("scrollable-region",e),style:r,"aria-label":l,children:a?s.jsxs(s.Fragment,{children:[t,x&&(d||m)&&s.jsx("div",{className:"scrollable-region__overlay",style:{top:x.top,left:x.left,width:x.width,height:x.height},children:b})]}):s.jsxs(s.Fragment,{children:[b,s.jsx("div",{ref:p,className:q("scrollable-region__viewport",n),children:t})]})})},Xs=48,Zs=({checklist:t})=>{const e=o.useRef(null),n=o.useRef(!1);return o.useLayoutEffect(()=>{const a=e.current;if(!a)return;const r=a.scrollHeight-a.scrollTop-a.clientHeight;(!n.current||r<=Xs)&&(a.scrollTop=a.scrollHeight,n.current=!0)},[t]),t.length===0?s.jsx("p",{className:"agent-view__progress-empty",children:"No tasks to display."}):s.jsx(Ke,{className:"agent-view__progress-scroll",scrollSelector:".agent-view__progress-list",children:s.jsx("ul",{ref:e,className:"agent-view__progress-list","aria-label":"Agent tasks",children:Ws(t).map(a=>{const r=ee[a.status];return s.jsxs("li",{className:q("agent-view__progress-item",`agent-view__progress-item--${a.status.replace(/_/g,"-")}`),children:[s.jsx(u.Icon,{name:r.icon,size:16,color:r.color,screenReaderText:`${r.label}:`}),s.jsxs("div",{className:"agent-view__progress-item-content",children:[s.jsx("span",{className:"agent-view__progress-label",children:a.task}),a.status!==P.complete&&s.jsx("span",{className:"agent-view__progress-description",children:a.description})]})]},a.task)})})})},Qs=({prompts:t,classNamePrefix:e="agent-workspace",onSelect:n})=>t.length===0?null:s.jsx("div",{className:`${e}__chips`,children:t.map(a=>s.jsx("button",{type:"button",className:`${e}__chip`,onClick:()=>n(a),children:a},a))});class en{constructor(e,n){this.connector=e,this.canSend=n.canSend,this.onTurn=n.onTurn,this.onAwaitingChange=n.onAwaitingChange}get canRate(){return!1}get canLoadHistory(){return!1}get canListInteractions(){return!1}get canSendNotification(){return!1}get ratingPopupUrls(){return{}}async sendMessage(e){var n,a;if(!this.canSend())return null;(n=this.onAwaitingChange)==null||n.call(this,!0);try{const r=await this.connector.sendMessage(e.userMessage,e.uploadFiles);return this.onTurn(r),{id:r.message.id,text:r.message.text,type:xe.CHAT_RESPONSE_TYPE_AGENT,...r.message.followUpPrompts?{followUpPrompts:r.message.followUpPrompts}:{}}}catch{return{id:`error-${Date.now()}`,text:Ds,type:xe.CHAT_RESPONSE_TYPE_ERROR}}finally{(a=this.onAwaitingChange)==null||a.call(this,!1)}}async loadHistory(e){return null}async listInteractions(){return null}async rateMessage(e){}async sendNotification(e){return!1}}const tn=({connector:t,phase:e,chatHistory:n,chatSessionKey:a,startQuery:r,clarificationMessage:l,enableUpload:i=!1,onTurn:p,onAwaitingChange:d,onClarificationPrompt:g,onDismissClarification:m})=>{const S=o.useMemo(()=>new en(t,{canSend:()=>e===$.running,onTurn:p,onAwaitingChange:d}),[t,e,p,d]),x=e!==$.running,E=e===$.running;return s.jsxs("section",{className:"agent-workspace__chat-body","aria-label":"Chat",children:[l&&s.jsxs("div",{className:"agent-workspace__clarification",role:"region","aria-label":"Agent question",children:[s.jsx("p",{className:"agent-workspace__clarification-text",children:l.text}),l.followUpPrompts&&s.jsx(Qs,{prompts:l.followUpPrompts,onSelect:g}),s.jsx("button",{type:"button",className:"agent-workspace__clarification-dismiss",onClick:m,children:"Dismiss"})]}),s.jsx("div",{className:"agent-workspace__ask-arbor",children:s.jsx(Ke,{scrollSelector:".chat-panel-message-list",children:s.jsx(xe.ChatPanel,{connector:S,chatHistory:n,startQuery:r,lockConversation:x,enableUpload:i,speechEnabled:E,speechLanguage:"en-GB",speechSubmissionDelay:1e3,slashMenuItems:[],menuContent:[],introHeading:"Message your agent",introBody:"Ask questions, share trip details, or paste a link. The agent will update the checklist as it works.",placeholder:E?"Message the agent, paste a link, or attach a file…":"The agent is not accepting messages."},a)})}),e===$.stopped&&s.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[s.jsx(u.Icon,{name:"circle-alert",size:16,color:"var(--color-semantic-warning-600)"}),s.jsx("span",{children:"You stopped the agent. Its progress is saved in the checklist."})]}),e===$.complete&&s.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[s.jsx(u.Icon,{name:"party-popper",size:16,color:"var(--color-semantic-success-600)"}),s.jsx("span",{children:"The agent has finished."})]})]})},Jt=({item:t,depth:e,canRequestInput:n,onAttentionItemClick:a})=>{const r=ee[t.status],l=t.status.replace(/_/g,"-"),i=t.status===P.hitl&&n&&a,p=s.jsxs("div",{className:"agent-workspace__task-row",children:[s.jsx(u.Icon,{name:r.icon,size:16,color:r.color,screenReaderText:`${r.label}:`}),s.jsxs("div",{className:"agent-workspace__task-content",children:[s.jsx("span",{className:"agent-workspace__task-label",children:t.task}),t.status!==P.complete&&t.description&&s.jsx("span",{className:"agent-workspace__task-description",children:t.description})]})]});return s.jsxs("li",{className:q("agent-workspace__task",`agent-workspace__task--${l}`,{"agent-workspace__task--child":e>0}),children:[i?s.jsx("button",{type:"button",className:"agent-workspace__task-button","aria-label":`Provide input for ${t.task}`,onClick:()=>a(t),children:p}):p,t.children&&t.children.length>0&&s.jsx("ul",{className:"agent-workspace__task-children",children:t.children.map(d=>s.jsx(Jt,{item:d,depth:e+1,canRequestInput:n,onAttentionItemClick:a},d.task))})]})},Ge=({items:t,ariaLabel:e,canRequestInput:n,onAttentionItemClick:a})=>s.jsx("ul",{className:"agent-workspace__task-list","aria-label":e,children:t.map(r=>s.jsx(Jt,{item:r,depth:0,canRequestInput:n,onAttentionItemClick:a},r.task))}),sn=({checklist:t,isLoading:e,error:n,phase:a,canRequestInput:r,onAttentionItemClick:l})=>{const i=o.useMemo(()=>t?Kt(t):null,[t]);return s.jsxs("section",{className:"agent-workspace__panel agent-workspace__panel--checklist","aria-label":"Checklist",children:[s.jsx("div",{className:"agent-workspace__panel-header",children:s.jsx(u.Heading,{level:4,children:"Checklist"})}),s.jsx("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:s.jsxs(Ke,{children:[e&&s.jsxs("div",{className:"agent-workspace__loading",children:[s.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:ve}),s.jsx("span",{children:ve})]}),!e&&n&&s.jsx("p",{className:"agent-workspace__error",role:"alert",children:n}),!e&&!n&&i&&s.jsxs(s.Fragment,{children:[i.needsInput.length>0&&s.jsxs("div",{className:"agent-workspace__task-group",children:[s.jsx("p",{className:"agent-workspace__task-group-label",children:"Needs your input"}),s.jsx(Ge,{items:i.needsInput,ariaLabel:"Tasks needing your input",canRequestInput:r,onAttentionItemClick:l})]}),i.complete.length>0&&s.jsxs("div",{className:q("agent-workspace__task-group",{"agent-workspace__task-group--following":i.needsInput.length>0}),children:[(i.needsInput.length>0||i.failed.length>0||i.tasks.length>0)&&s.jsx("p",{className:"agent-workspace__task-group-label",children:"Completed"}),s.jsx(Ge,{items:i.complete,ariaLabel:"Completed tasks",canRequestInput:r,onAttentionItemClick:l})]}),i.failed.length>0&&s.jsxs("div",{className:q("agent-workspace__task-group",{"agent-workspace__task-group--following":i.needsInput.length>0||i.complete.length>0}),children:[(i.needsInput.length>0||i.complete.length>0||i.tasks.length>0)&&s.jsx("p",{className:"agent-workspace__task-group-label",children:"Failed"}),s.jsx(Ge,{items:i.failed,ariaLabel:"Failed tasks",canRequestInput:r,onAttentionItemClick:l})]}),i.tasks.length>0&&s.jsxs("div",{className:q("agent-workspace__task-group",{"agent-workspace__task-group--following":i.needsInput.length>0||i.complete.length>0||i.failed.length>0}),children:[(i.needsInput.length>0||i.complete.length>0||i.failed.length>0)&&s.jsx("p",{className:"agent-workspace__task-group-label",children:"Working on"}),s.jsx(Ge,{items:i.tasks,ariaLabel:"Agent tasks",canRequestInput:r,onAttentionItemClick:l})]})]}),!e&&!n&&(!i||i.needsInput.length===0&&i.complete.length===0&&i.failed.length===0&&i.tasks.length===0)&&s.jsx("p",{className:"agent-workspace__empty",children:a===$.briefing?"Tasks will appear here once the agent starts.":"No tasks to display."})]})})]})},nn=({resource:t,html:e,isLoading:n,error:a,onClose:r})=>{o.useEffect(()=>{if(!t)return;const i=u.SlideoverUtils.removeSlideover;return u.SlideoverUtils.removeSlideover=()=>{i(),r()},()=>{u.SlideoverUtils.removeSlideover=i}},[t,r]),o.useEffect(()=>{if(!t)return;const i=p=>{p.key==="Escape"&&u.SlideoverUtils.removeSlideover()};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[t]);const l=o.useMemo(()=>t?[{centerHeaderText:!1,children:s.jsxs("div",{className:"resource-preview-slideover__body",children:[n&&s.jsxs("div",{className:"resource-preview-slideover__status",children:[s.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:"Loading document"}),s.jsx("span",{children:"Loading document…"})]}),!n&&a&&s.jsx("p",{className:"resource-preview-slideover__error",role:"alert",children:a}),!n&&!a&&e!==null&&s.jsx("iframe",{className:"resource-preview-slideover__frame",title:t.title,sandbox:"",srcDoc:e})]})}]:[],[t,e,n,a]);return s.jsx("div",{className:"resource-preview-slideover",children:s.jsx(u.SlideoverManager,{slideovers:l})})},an={[le.mis_record]:{icon:"table",label:"Arbor MIS",color:"var(--color-brand-600)"},[le.document_html]:{icon:"file",label:"Document",color:"var(--color-semantic-caution-800)"},[le.file]:{icon:"file",label:"File",color:"var(--color-semantic-caution-800)"},[le.user_file]:{icon:"upload",label:"File upload",color:"var(--color-semantic-caution-800)"},[le.workflow]:{icon:"list-tree",label:"Workflow",color:"var(--color-semantic-warning-700)"},[le.link]:{icon:"link",label:"Link",color:"var(--color-semantic-info-700)"}},rn=({resources:t,isLoading:e=!1,error:n=null,onOpenResource:a})=>s.jsxs("section",{className:"agent-workspace__panel agent-workspace__panel--documents","aria-label":"Resources",children:[s.jsxs("div",{className:"agent-workspace__panel-header",children:[s.jsx(u.Heading,{level:4,children:"Resources"}),s.jsx("span",{className:"agent-workspace__panel-count",children:t.length})]}),s.jsx("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:s.jsxs(Ke,{children:[e&&s.jsxs("div",{className:"agent-workspace__loading",children:[s.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:"Loading resources"}),s.jsx("span",{children:"Loading resources…"})]}),!e&&n&&s.jsx("p",{className:"agent-workspace__error",role:"alert",children:n}),!e&&!n&&t.length>0&&s.jsx("ul",{className:"agent-workspace__resource-list","aria-label":"Agent resources",children:t.map(r=>{const l=an[r.type],i=r.misRecordUrl;return s.jsx("li",{className:"agent-workspace__resource",children:i?s.jsx("a",{className:"agent-workspace__resource-card",href:i,target:"_blank",rel:"noreferrer",onClick:p=>{p.preventDefault(),a(r)},children:s.jsx(Ot,{resource:r,config:l,external:!0})}):s.jsx("button",{type:"button",className:"agent-workspace__resource-card",onClick:()=>a(r),children:s.jsx(Ot,{resource:r,config:l})})},r.id)})}),!e&&!n&&t.length===0&&s.jsx("p",{className:"agent-workspace__empty",children:"No resources yet."})]})})]}),Ot=({resource:t,config:e,external:n=!1})=>s.jsxs(s.Fragment,{children:[s.jsx("span",{className:`agent-workspace__resource-icon agent-workspace__resource-icon--${t.type}`,children:s.jsx(u.Icon,{name:e.icon,size:16,color:e.color,screenReaderText:`${e.label}:`})}),s.jsx("span",{className:"agent-workspace__resource-content",children:s.jsxs("span",{className:"agent-workspace__resource-top",children:[s.jsx("span",{className:"agent-workspace__resource-name",children:t.title}),s.jsx("span",{className:`agent-workspace__resource-badge agent-workspace__resource-badge--${t.type}`,children:e.label})]})}),n&&s.jsx(u.Icon,{name:"external-link",size:12,color:"var(--color-grey-500)",screenReaderText:"Opens in a new tab",className:"agent-workspace__resource-open"})]}),Lt=t=>{const e=Date.parse(t);return Number.isFinite(e)?e:0},on=new Intl.DateTimeFormat("en-GB",{day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"2-digit"}),ot=t=>{const e=new Date(t);return Number.isFinite(e.getTime())?on.format(e):t},Pt=t=>t.replace(/[A-Za-z0-9]+(?:[_-][A-Za-z0-9]+)+/g,e=>e.split(/[_-]/).map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join(" ")),Ut=t=>{const n=t.replace(/[A-Za-z0-9]+(?:[_-][A-Za-z0-9]+)+/g,a=>a.split(/[_-]/).map(r=>r.toLowerCase()).join(" ")).toLowerCase();return n&&n.charAt(0).toUpperCase()+n.slice(1)},ln=60*60*1e3,Wt=60*60*1e3,Ee=24*Wt,lt=7*Ee,cn=t=>t.type!=="message-sent",dn=(t,e)=>{const n=t.filter(cn).map((r,l)=>({kind:"action",id:`action-${r.timestamp}-${l}`,timestampMs:Lt(r.timestamp),item:r})),a=e.map(r=>({kind:"chat",id:r.sessionId,timestampMs:Lt(r.timestamp),session:r}));return[...n,...a].sort((r,l)=>r.timestampMs-l.timestampMs||r.id.localeCompare(l.id))},un=t=>t>=lt?"weeks":t>=Ee?"days":"hours",gn=t=>{if(t<Ee){const a=Math.max(1,Math.round(t/Wt));return a===1?"1 hour later":`${a} hours later`}if(t<lt){const a=Math.max(1,Math.round(t/Ee));return a===1?"1 day later":`${a} days later`}const e=Math.max(1,Math.round(t/lt));if(e<5)return e===1?"1 week later":`${e} weeks later`;const n=Math.max(1,Math.round(t/(30*Ee)));return n===1?"1 month later":`${n} months later`},hn=(t,e=ln)=>{if(t.length===0)return[];const n=[t[0]];for(let a=1;a<t.length;a+=1){const r=t[a-1],l=t[a],i=l.timestampMs-r.timestampMs;i>=e&&n.push({kind:"gap",id:`gap-${r.id}-${l.id}`,durationMs:i,label:gn(i),size:un(i)}),n.push(l)}return n},pn=t=>t.type==="checklist-updated"?"checklist":t.type==="status-transition"?"status":"note",mn=({timeline:t,isLoading:e,error:n,onOpenChatSession:a})=>{const r=(t==null?void 0:t.actionLog)??[],l=(t==null?void 0:t.chatSessions)??[],i=dn(r,l),p=hn(i),d=!e&&!n&&i.length===0;return s.jsxs("section",{className:"agent-workspace__timeline","aria-label":"Agent timeline",children:[e&&s.jsx("p",{className:"agent-workspace__timeline-status",role:"status",children:"Loading timeline…"}),n&&s.jsx("p",{className:"agent-workspace__timeline-status",role:"alert",children:n||zt}),d&&s.jsx("p",{className:"agent-workspace__timeline-status",role:"status",children:"No timeline activity yet."}),!e&&!n&&!d&&s.jsxs("div",{className:"agent-timeline",children:[s.jsx("div",{className:"agent-timeline__track","aria-hidden":"true"}),s.jsxs("div",{className:"agent-timeline__station agent-timeline__station--terminus",children:[s.jsx("span",{className:"agent-timeline__station-rail",children:s.jsx("span",{className:"agent-timeline__station-node agent-timeline__station-node--terminus","aria-hidden":"true",children:s.jsx(u.Icon,{name:"arrow-right-from-line",size:16,color:"currentColor"})})}),s.jsx("div",{className:"agent-timeline__label",children:s.jsx("strong",{className:"agent-timeline__label-type",children:"Start"})})]}),p.map(g=>{if(g.kind==="gap")return s.jsxs("div",{className:`agent-timeline__gap agent-timeline__gap--${g.size}`,role:"separator","aria-label":g.label,children:[s.jsx("span",{className:"agent-timeline__gap-rail","aria-hidden":"true",children:s.jsx("span",{className:"agent-timeline__gap-dot"})}),s.jsx("span",{className:"agent-timeline__gap-label",children:g.label})]},g.id);if(g.kind==="chat")return s.jsxs("div",{className:"agent-timeline__chat-station",children:[s.jsx("button",{type:"button",className:"agent-timeline__chat-node","aria-label":`Open chat session from ${ot(g.session.timestamp)}`,onClick:()=>a(g.session.sessionId),children:s.jsx(u.Icon,{name:"sparkles",size:16,color:"currentColor"})}),s.jsxs("div",{className:"agent-timeline__label",children:[s.jsx("strong",{className:"agent-timeline__label-type",children:"Chat session"}),s.jsx("span",{className:"agent-timeline__label-time",children:ot(g.session.timestamp)})]})]},g.id);const{item:m}=g,S=pn(m),x=S==="checklist",E=S==="status";return s.jsxs("div",{className:`agent-timeline__station agent-timeline__station--${S}`,children:[s.jsx("span",{className:"agent-timeline__station-rail",children:s.jsxs("button",{type:"button",className:`agent-timeline__station-node agent-timeline__station-node--${S}`,"aria-label":`${Pt(m.type)}: ${Ut(m.entry)}`,children:[x&&s.jsx(u.Icon,{name:"check-solid",size:16,color:"currentColor"}),E&&s.jsx(u.Icon,{name:"iteration-ccw",size:16,color:"currentColor"})]})}),s.jsxs("div",{className:"agent-timeline__label",children:[s.jsx("strong",{className:"agent-timeline__label-type",children:Pt(m.type)}),s.jsx("span",{className:"agent-timeline__label-entry",children:Ut(m.entry)}),s.jsx("span",{className:"agent-timeline__label-time",children:ot(m.timestamp)})]})]},g.id)}),s.jsxs("div",{className:"agent-timeline__station agent-timeline__station--terminus",children:[s.jsx("span",{className:"agent-timeline__station-rail",children:s.jsx("span",{className:"agent-timeline__station-node agent-timeline__station-node--terminus","aria-hidden":"true",children:s.jsx(u.Icon,{name:"flag",size:16,color:"currentColor"})})}),s.jsx("div",{className:"agent-timeline__label",children:s.jsx("strong",{className:"agent-timeline__label-type",children:"Finish"})})]})]})]})},_n=["I'll get the details and come back to you","Skip this for now"],fn=t=>{var n;const e=(n=t.prompt)!=null&&n.trim()?t.prompt.trim():`I need a bit more from you on "${t.task}". ${t.description} What can you tell me?`;return{id:`clarification-${Date.now()}`,author:te.agent,text:e,followUpPrompts:t.clarificationPrompts??_n}},fe=t=>({id:t.id,text:t.text,type:t.author===te.user?xe.CHAT_RESPONSE_TYPE_USER:t.author===te.system?xe.CHAT_RESPONSE_TYPE_INFO:xe.CHAT_RESPONSE_TYPE_AGENT,...t.followUpPrompts?{followUpPrompts:t.followUpPrompts}:{}}),ct="MESSAGE_TYPE_REPOLL",Vt="agentUi:update",gt="arbor-agent-",ce={all:"ALL",checklist:"CHECKLIST",resources:"RESOURCES",chat:"CHAT",timeline:"TIMELINE"},vn=new Set(Object.values(ce)),Yt=(t,e)=>`${t.endsWith("-")?t:`${t}-`}${e}`,wn=t=>typeof t=="string"&&vn.has(t)?t:ce.all,xn=t=>{if(!t||typeof t!="object")return null;const e=t;return e.type!==ct?null:{type:ct,target:wn(e.target)}},Xt=t=>{const e=Array.isArray(t)?t:[t],n=[];for(const a of e){const r=xn(a);r&&n.push(r)}return n},kn=({enabled:t,channelPrefix:e,agentId:n,subscribeToPusher:a,onRepoll:r})=>{const l=o.useRef(r),i=e==null?void 0:e.trim(),p=!!(t&&a&&i&&n.trim());return o.useEffect(()=>{l.current=r},[r]),o.useEffect(()=>{if(!p||!a||!i)return;const d=a(Yt(i,n),Vt,g=>{for(const m of Xt(g))l.current(m.target)});return()=>{d()}},[p,i,n,a]),p};class we extends Error{constructor(e,n,a){super(a??`Agent service request failed (${e})`),this.name="AgentServiceError",this.status=e,this.detail=n}}const Sn="/api/v1",U={agentDefinitions:"/agent-definitions",agents:"/agents",conversations:"/conversations",tripOptions:"/trip-options",demoDataset:"/demo/dataset"},G={GET:"GET",POST:"POST",PATCH:"PATCH"},yn={error:"error"},Nn={user:"user"},ge={acceptJson:"application/json",acceptHtml:"text/html",acceptEventStream:"text/event-stream",contentTypeJson:"application/json",arborApplicationUrl:"X-Arbor-Application-Url"},An=100,Zt=t=>{switch(t){case Rt.cancelled:return j.failed;case Rt.archived:return j.complete;case j.hitl:case j.complete:case j.failed:case j["generating-a-response"]:return t;default:return j["generating-a-response"]}},Qt=t=>{switch(t){case at.requires_attention:return P.hitl;case at.in_progress:case at.available:return P["generating-a-response"];case P.failed:case P.complete:case P.hitl:case P["generating-a-response"]:return t;default:return P["generating-a-response"]}},ht=t=>({ref:t.name,display_name:t.display_name,agent_intent:t.agent_intent??"",description:t.description}),bn=t=>({id:t.id,name:t.name,...t.has_run_before?{hasRunBefore:t.has_run_before}:{}}),jn=new Set(Object.values(le)),Cn=t=>jn.has(t)?t:le.document_html,es=t=>({id:t.id,type:Cn(t.type),title:t.title,createdDatetime:t.created_datetime,lastUpdatedDatetime:t.last_updated_datetime,misRecordUrl:t.mis_record_url}),ts=t=>({resources:t.resources.map(es),pageNumber:t.page_number,pageSize:t.page_size,totalRecords:t.total_records}),ss=t=>({actionLog:(t.action_log??[]).map(e=>({timestamp:e.timestamp,type:e.type,entry:e.entry,origin:e.origin})),chatSessions:(t.chat_sessions??[]).map(e=>({sessionId:e.session_id,timestamp:e.timestamp}))}),dt=t=>{var n;const e=t.invocation_id??t.id;return{id:t.id,invocation_id:e,agent_definition_ref:t.agent_definition_ref,...t.agent_intent?{agent_intent:t.agent_intent}:{},invocation_name:((n=t.invocation_name)==null?void 0:n.trim())||t.agent_definition_ref,application_id:t.application_id,...t.application_name?{application_name:t.application_name}:{},created_by:t.created_by,status:Zt(t.status),context_ref:t.context_ref??null,checklist_ref:t.checklist_ref??null}},pt=t=>{var e;return{task:t.item??t.task??t.name??t.label??$s,status:Qt(t.status),description:t.description??"",...t.prompt?{prompt:t.prompt}:{},...(e=t.follow_up_prompts)!=null&&e.length?{clarificationPrompts:t.follow_up_prompts}:{}}},En=t=>Array.isArray(t)?t:t.checklist_items??t.checklist??t.items??[],mt=(t,e,n)=>{var l;const a=!Array.isArray(e)&&(e.opening_message||(l=e.opening_follow_up_prompts)!=null&&l.length)?e:n,r=a?Re(a):void 0;return{invocation_id:t,checklist:En(e).map(pt),...r?{openingMessage:r}:{}}},ns=(t,e)=>{const n=Re(e);return{invocation_id:e.invocation_id??t,checklist:(e.checklist_items??[]).map(pt),...n?{openingMessage:n}:{}}},Re=t=>{var n,a;const e=(n=t.opening_message)==null?void 0:n.trim();if(e)return{id:Gt,author:te.agent,text:e,...(a=t.opening_follow_up_prompts)!=null&&a.length?{followUpPrompts:t.opening_follow_up_prompts}:{}}},as=t=>{try{const e=JSON.parse(t);if(Array.isArray(e)){const n=e.filter(a=>!!a&&typeof a=="object"&&typeof a.text=="string").map(a=>a.text);if(n.length>0)return n.join(`
2
- `)}}catch{}return t},rs=t=>{const e=t.trim();return e.length>0?`File upload
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),o=require("react"),q=require("classnames"),u=require("@arbor-education/design-system.components"),xe=require("@arbor-education/ask-arbor-chat-panel"),j={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},P={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},$={briefing:"briefing",running:"running",stopped:"stopped",complete:"complete"},te={agent:"agent",user:"user",system:"system"},le={document_html:"document_html",mis_record:"mis_record",workflow:"workflow",file:"file",user_file:"user_file",link:"link"},zt={user_file:"user_file"},Rt={cancelled:"cancelled",archived:"archived"},at={in_progress:"in_progress",requires_attention:"requires_attention",available:"available"},ee={[P.complete]:{label:"Complete",icon:"circle-check",color:"var(--color-semantic-success-600)"},[P.failed]:{label:"Failed",icon:"circle-x",color:"var(--color-semantic-destructive-600)"},[P.hitl]:{label:"Requires attention",icon:"triangle-alert",color:"var(--color-semantic-warning-600)"},[P["generating-a-response"]]:{label:"Generating a response",icon:"sparkles",color:"var(--color-brand-600)"}},qe={[j["generating-a-response"]]:{status:j["generating-a-response"],title:"Active",dotColour:"green",statusIcon:{name:ee["generating-a-response"].icon,color:ee["generating-a-response"].color}},[j.hitl]:{status:j.hitl,title:"Requires attention",dotColour:"orange",statusIcon:{name:ee.hitl.icon,color:ee.hitl.color}},[j.complete]:{status:j.complete,title:"Complete",dotColour:"green",dotModifier:"grey-dark",statusIcon:{name:ee.complete.icon,color:ee.complete.color}},[j.failed]:{status:j.failed,title:"Failed",dotColour:"salmon",statusIcon:{name:ee.failed.icon,color:ee.failed.color}}},Rn=[j["generating-a-response"],j.hitl],Tn=[j.complete,j.failed],In="m4",On="1",qt="msg-opening",ze="Unable to load agent tasks. Please try again.",Ln="Unable to load the resources for this agent",Pn="Unable to load this document. Please try again.",Kt="Unable to load the timeline for this agent",Un="Unable to stop the agent. Please try again.",Mn="Unable to rename the agent. Please try again.",Dn="Something went wrong. Please try again.",Jt="Unable to load agents. Please try again.",ve="Loading tasks…",Tt="Loading agents…",$n="Task",Hn={[$.briefing]:"Briefing",[$.running]:"Working",[$.stopped]:"Stopped",[$.complete]:"Complete"},Fn=[j["generating-a-response"],j.hitl,j.complete,j.failed],Bn={[j["generating-a-response"]]:"Agents currently working on tasks for you.",[j.hitl]:"Agents that need your input before they can continue.",[j.complete]:"Agents that have finished their work.",[j.failed]:"Agents that failed or were stopped."},Gn=()=>n.jsxs("svg",{className:"agent-view__empty-illustration",viewBox:"0 0 360 240",xmlns:"http://www.w3.org/2000/svg",role:"img","aria-label":"Preview of the agents board layout",children:[n.jsx("rect",{x:"0",y:"0",width:"360",height:"240",rx:"12",fill:"var(--color-grey-100)"}),n.jsx("rect",{x:"16",y:"16",width:"100",height:"208",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"130",y:"16",width:"100",height:"208",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"244",y:"16",width:"100",height:"100",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"244",y:"124",width:"100",height:"100",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"28",y:"52",width:"76",height:"36",rx:"6",fill:"var(--color-grey-050)"}),n.jsx("rect",{x:"28",y:"96",width:"76",height:"36",rx:"6",fill:"var(--color-grey-050)"}),n.jsx("rect",{x:"142",y:"52",width:"76",height:"36",rx:"6",fill:"var(--color-semantic-warning-050)"}),n.jsx("circle",{cx:"40",cy:"70",r:"4",fill:"var(--color-brand-600)"}),n.jsx("circle",{cx:"40",cy:"114",r:"4",fill:"var(--color-brand-600)"}),n.jsx("circle",{cx:"154",cy:"70",r:"4",fill:"var(--color-semantic-warning-600)"}),n.jsx("circle",{cx:"256",cy:"52",r:"4",fill:"var(--color-grey-400)"}),n.jsx("circle",{cx:"256",cy:"160",r:"4",fill:"var(--color-semantic-destructive-500)"})]}),zn=({status:e})=>{const t=qe[e];return t.statusIcon?n.jsx(u.Icon,{name:t.statusIcon.name,size:16,color:t.statusIcon.color,screenReaderText:t.title}):n.jsx(u.Dot,{colour:t.dotColour,label:t.title})},qn=()=>n.jsxs("section",{className:"agent-view__empty","aria-label":"About the agents board",children:[n.jsxs("div",{className:"agent-view__empty-content",children:[n.jsx(u.Heading,{level:4,children:"Your agents board"}),n.jsx("p",{className:"agent-view__empty-lead",children:"When you start an agent, it appears here so you can track progress at a glance. Agents move between columns as their status changes."}),n.jsx("ul",{className:"agent-view__empty-columns",children:Fn.map(e=>{const t=qe[e];return n.jsxs("li",{className:"agent-view__empty-column",children:[n.jsx("span",{className:"agent-view__empty-column-indicator",children:n.jsx(zn,{status:e})}),n.jsxs("span",{className:"agent-view__empty-column-text",children:[n.jsx("span",{className:"agent-view__empty-column-title",children:t.title}),n.jsx("span",{className:"agent-view__empty-column-description",children:Bn[e]})]})]},e)})}),n.jsxs("p",{className:"agent-view__empty-hint",children:["Use ",n.jsx("strong",{children:"Start an agent"})," above to begin."]})]}),n.jsx("div",{className:"agent-view__empty-visual",children:n.jsx(Gn,{})})]}),Kn=()=>({needsInput:[],complete:[],failed:[],tasks:[]}),Jn=(e,t)=>({...e,...t.length>0?{children:t}:{}}),Wt=e=>{const t=[],s=[],a=[],r=[];for(const l of e){const i=l.children?Wt(l.children):Kn();if(t.push(...i.needsInput),s.push(...i.complete),a.push(...i.failed),l.status===P.hitl){t.push({...l,children:void 0});continue}if(l.status===P.complete){s.push({...l,children:void 0});continue}if(l.status===P.failed){a.push({...l,children:void 0});continue}r.push(Jn(l,i.tasks))}return{needsInput:t,complete:s,failed:a,tasks:r}},It=e=>e===P.hitl?0:e===P.complete?1:e===P.failed?2:3,Wn=e=>e.map((t,s)=>({item:t,index:s})).sort((t,s)=>{const a=It(t.item.status)-It(s.item.status);return a!==0?a:t.index-s.index}).map(({item:t})=>t),rt=2,Vn=e=>{if(!e)return{canScrollUp:!1,canScrollDown:!1};const t=e.scrollHeight-e.clientHeight;return t<=rt?{canScrollUp:!1,canScrollDown:!1}:{canScrollUp:e.scrollTop>rt,canScrollDown:e.scrollTop<t-rt}},Yn=(e,t)=>{if(!e||!t)return null;const s=e.getBoundingClientRect(),a=t.getBoundingClientRect();return{top:a.top-s.top,left:a.left-s.left,width:a.width,height:a.height}},Ke=({children:e,className:t,contentClassName:s,scrollSelector:a,style:r,"aria-label":l})=>{const i=o.useRef(null),p=o.useRef(null),[d,g]=o.useState(!1),[m,S]=o.useState(!1),[x,E]=o.useState(null),H=()=>{var T;return a?((T=i.current)==null?void 0:T.querySelector(a))??null:p.current},_=()=>{const T=H(),y=Vn(T);if(g(f=>f===y.canScrollUp?f:y.canScrollUp),S(f=>f===y.canScrollDown?f:y.canScrollDown),a){const f=Yn(i.current,T);E(N=>(N==null?void 0:N.top)===(f==null?void 0:f.top)&&(N==null?void 0:N.left)===(f==null?void 0:f.left)&&(N==null?void 0:N.width)===(f==null?void 0:f.width)&&(N==null?void 0:N.height)===(f==null?void 0:f.height)?N:f)}else E(f=>f===null?f:null)};o.useLayoutEffect(()=>{_()}),o.useEffect(()=>{const T=i.current;if(!T)return;let y=null,f=null;const N=()=>{y==null||y.removeEventListener("scroll",_),f==null||f.disconnect(),f=null,y=null},w=M=>{if(M===y){_();return}if(N(),y=M,!y){_();return}y.addEventListener("scroll",_,{passive:!0}),f=new ResizeObserver(()=>_()),f.observe(y),y.firstElementChild instanceof HTMLElement&&f.observe(y.firstElementChild),_()};w(H());const C=new MutationObserver(()=>{w(H())});return C.observe(T,{childList:!0,subtree:!0,characterData:!0}),window.addEventListener("resize",_),()=>{window.removeEventListener("resize",_),C.disconnect(),N()}},[a]);const O=T=>{const y=H();if(!y)return;const f=Math.max(y.clientHeight*.75,120);y.scrollBy({top:T==="up"?-f:f,behavior:"smooth"})},b=n.jsxs(n.Fragment,{children:[d&&n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"scrollable-region__fade scrollable-region__fade--top","aria-hidden":"true"}),n.jsx("button",{type:"button",className:"scrollable-region__edge scrollable-region__edge--top","aria-label":"Scroll up",onClick:()=>O("up"),children:n.jsx(u.Icon,{name:"chevron-up",size:16,color:"currentColor"})})]}),m&&n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"scrollable-region__fade scrollable-region__fade--bottom","aria-hidden":"true"}),n.jsx("button",{type:"button",className:"scrollable-region__edge scrollable-region__edge--bottom","aria-label":"Scroll down",onClick:()=>O("down"),children:n.jsx(u.Icon,{name:"chevron-down",size:16,color:"currentColor"})})]})]});return n.jsx("div",{ref:i,className:q("scrollable-region",t),style:r,"aria-label":l,children:a?n.jsxs(n.Fragment,{children:[e,x&&(d||m)&&n.jsx("div",{className:"scrollable-region__overlay",style:{top:x.top,left:x.left,width:x.width,height:x.height},children:b})]}):n.jsxs(n.Fragment,{children:[b,n.jsx("div",{ref:p,className:q("scrollable-region__viewport",s),children:e})]})})},Xn=48,Zn=({checklist:e})=>{const t=o.useRef(null),s=o.useRef(!1);return o.useLayoutEffect(()=>{const a=t.current;if(!a)return;const r=a.scrollHeight-a.scrollTop-a.clientHeight;(!s.current||r<=Xn)&&(a.scrollTop=a.scrollHeight,s.current=!0)},[e]),e.length===0?n.jsx("p",{className:"agent-view__progress-empty",children:"No tasks to display."}):n.jsx(Ke,{className:"agent-view__progress-scroll",scrollSelector:".agent-view__progress-list",children:n.jsx("ul",{ref:t,className:"agent-view__progress-list","aria-label":"Agent tasks",children:Wn(e).map(a=>{const r=ee[a.status];return n.jsxs("li",{className:q("agent-view__progress-item",`agent-view__progress-item--${a.status.replace(/_/g,"-")}`),children:[n.jsx(u.Icon,{name:r.icon,size:16,color:r.color,screenReaderText:`${r.label}:`}),n.jsxs("div",{className:"agent-view__progress-item-content",children:[n.jsx("span",{className:"agent-view__progress-label",children:a.task}),a.status!==P.complete&&n.jsx("span",{className:"agent-view__progress-description",children:a.description})]})]},a.task)})})})},Qn=({prompts:e,classNamePrefix:t="agent-workspace",onSelect:s})=>e.length===0?null:n.jsx("div",{className:`${t}__chips`,children:e.map(a=>n.jsx("button",{type:"button",className:`${t}__chip`,onClick:()=>s(a),children:a},a))});class es{constructor(t,s){this.connector=t,this.canSend=s.canSend,this.onTurn=s.onTurn,this.onAwaitingChange=s.onAwaitingChange}get canRate(){return!1}get canLoadHistory(){return!1}get canListInteractions(){return!1}get canSendNotification(){return!1}get ratingPopupUrls(){return{}}async sendMessage(t){var s,a;if(!this.canSend())return null;(s=this.onAwaitingChange)==null||s.call(this,!0);try{const r=await this.connector.sendMessage(t.userMessage,t.uploadFiles);return this.onTurn(r),{id:r.message.id,text:r.message.text,type:xe.CHAT_RESPONSE_TYPE_AGENT,...r.message.followUpPrompts?{followUpPrompts:r.message.followUpPrompts}:{}}}catch{return{id:`error-${Date.now()}`,text:Dn,type:xe.CHAT_RESPONSE_TYPE_ERROR}}finally{(a=this.onAwaitingChange)==null||a.call(this,!1)}}async loadHistory(t){return null}async listInteractions(){return null}async rateMessage(t){}async sendNotification(t){return!1}}const ts=({connector:e,phase:t,chatHistory:s,chatSessionKey:a,startQuery:r,clarificationMessage:l,enableUpload:i=!1,onTurn:p,onAwaitingChange:d,onClarificationPrompt:g,onDismissClarification:m})=>{const S=o.useMemo(()=>new es(e,{canSend:()=>t===$.running,onTurn:p,onAwaitingChange:d}),[e,t,p,d]),x=t!==$.running,E=t===$.running;return n.jsxs("section",{className:"agent-workspace__chat-body","aria-label":"Chat",children:[l&&n.jsxs("div",{className:"agent-workspace__clarification",role:"region","aria-label":"Agent question",children:[n.jsx("p",{className:"agent-workspace__clarification-text",children:l.text}),l.followUpPrompts&&n.jsx(Qn,{prompts:l.followUpPrompts,onSelect:g}),n.jsx("button",{type:"button",className:"agent-workspace__clarification-dismiss",onClick:m,children:"Dismiss"})]}),n.jsx("div",{className:"agent-workspace__ask-arbor",children:n.jsx(Ke,{scrollSelector:".chat-panel-message-list",children:n.jsx(xe.ChatPanel,{connector:S,chatHistory:s,startQuery:r,lockConversation:x,enableUpload:i,speechEnabled:E,speechLanguage:"en-GB",speechSubmissionDelay:1e3,slashMenuItems:[],menuContent:[],introHeading:"Message your agent",introBody:"Ask questions, share trip details, or paste a link. The agent will update the checklist as it works.",placeholder:E?"Message the agent, paste a link, or attach a file…":"The agent is not accepting messages."},a)})}),t===$.stopped&&n.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[n.jsx(u.Icon,{name:"circle-alert",size:16,color:"var(--color-semantic-warning-600)"}),n.jsx("span",{children:"You stopped the agent. Its progress is saved in the checklist."})]}),t===$.complete&&n.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[n.jsx(u.Icon,{name:"party-popper",size:16,color:"var(--color-semantic-success-600)"}),n.jsx("span",{children:"The agent has finished."})]})]})},Vt=({item:e,depth:t,canRequestInput:s,onAttentionItemClick:a})=>{const r=ee[e.status],l=e.status.replace(/_/g,"-"),i=e.status===P.hitl&&s&&a,p=n.jsxs("div",{className:"agent-workspace__task-row",children:[n.jsx(u.Icon,{name:r.icon,size:16,color:r.color,screenReaderText:`${r.label}:`}),n.jsxs("div",{className:"agent-workspace__task-content",children:[n.jsx("span",{className:"agent-workspace__task-label",children:e.task}),e.status!==P.complete&&e.description&&n.jsx("span",{className:"agent-workspace__task-description",children:e.description})]})]});return n.jsxs("li",{className:q("agent-workspace__task",`agent-workspace__task--${l}`,{"agent-workspace__task--child":t>0}),children:[i?n.jsx("button",{type:"button",className:"agent-workspace__task-button","aria-label":`Provide input for ${e.task}`,onClick:()=>a(e),children:p}):p,e.children&&e.children.length>0&&n.jsx("ul",{className:"agent-workspace__task-children",children:e.children.map(d=>n.jsx(Vt,{item:d,depth:t+1,canRequestInput:s,onAttentionItemClick:a},d.task))})]})},Ge=({items:e,ariaLabel:t,canRequestInput:s,onAttentionItemClick:a})=>n.jsx("ul",{className:"agent-workspace__task-list","aria-label":t,children:e.map(r=>n.jsx(Vt,{item:r,depth:0,canRequestInput:s,onAttentionItemClick:a},r.task))}),ns=({checklist:e,isLoading:t,error:s,phase:a,canRequestInput:r,onAttentionItemClick:l})=>{const i=o.useMemo(()=>e?Wt(e):null,[e]);return n.jsxs("section",{className:"agent-workspace__panel agent-workspace__panel--checklist","aria-label":"Checklist",children:[n.jsx("div",{className:"agent-workspace__panel-header",children:n.jsx(u.Heading,{level:4,children:"Checklist"})}),n.jsx("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:n.jsxs(Ke,{children:[t&&n.jsxs("div",{className:"agent-workspace__loading",children:[n.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:ve}),n.jsx("span",{children:ve})]}),!t&&s&&n.jsx("p",{className:"agent-workspace__error",role:"alert",children:s}),!t&&!s&&i&&n.jsxs(n.Fragment,{children:[i.needsInput.length>0&&n.jsxs("div",{className:"agent-workspace__task-group",children:[n.jsx("p",{className:"agent-workspace__task-group-label",children:"Needs your input"}),n.jsx(Ge,{items:i.needsInput,ariaLabel:"Tasks needing your input",canRequestInput:r,onAttentionItemClick:l})]}),i.complete.length>0&&n.jsxs("div",{className:q("agent-workspace__task-group",{"agent-workspace__task-group--following":i.needsInput.length>0}),children:[(i.needsInput.length>0||i.failed.length>0||i.tasks.length>0)&&n.jsx("p",{className:"agent-workspace__task-group-label",children:"Completed"}),n.jsx(Ge,{items:i.complete,ariaLabel:"Completed tasks",canRequestInput:r,onAttentionItemClick:l})]}),i.failed.length>0&&n.jsxs("div",{className:q("agent-workspace__task-group",{"agent-workspace__task-group--following":i.needsInput.length>0||i.complete.length>0}),children:[(i.needsInput.length>0||i.complete.length>0||i.tasks.length>0)&&n.jsx("p",{className:"agent-workspace__task-group-label",children:"Failed"}),n.jsx(Ge,{items:i.failed,ariaLabel:"Failed tasks",canRequestInput:r,onAttentionItemClick:l})]}),i.tasks.length>0&&n.jsxs("div",{className:q("agent-workspace__task-group",{"agent-workspace__task-group--following":i.needsInput.length>0||i.complete.length>0||i.failed.length>0}),children:[(i.needsInput.length>0||i.complete.length>0||i.failed.length>0)&&n.jsx("p",{className:"agent-workspace__task-group-label",children:"Working on"}),n.jsx(Ge,{items:i.tasks,ariaLabel:"Agent tasks",canRequestInput:r,onAttentionItemClick:l})]})]}),!t&&!s&&(!i||i.needsInput.length===0&&i.complete.length===0&&i.failed.length===0&&i.tasks.length===0)&&n.jsx("p",{className:"agent-workspace__empty",children:a===$.briefing?"Tasks will appear here once the agent starts.":"No tasks to display."})]})})]})},ss=({resource:e,html:t,isLoading:s,error:a,onClose:r})=>{o.useEffect(()=>{if(!e)return;const i=u.SlideoverUtils.removeSlideover;return u.SlideoverUtils.removeSlideover=()=>{i(),r()},()=>{u.SlideoverUtils.removeSlideover=i}},[e,r]),o.useEffect(()=>{if(!e)return;const i=p=>{p.key==="Escape"&&u.SlideoverUtils.removeSlideover()};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[e]);const l=o.useMemo(()=>e?[{centerHeaderText:!1,children:n.jsxs("div",{className:"resource-preview-slideover__body",children:[s&&n.jsxs("div",{className:"resource-preview-slideover__status",children:[n.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:"Loading document"}),n.jsx("span",{children:"Loading document…"})]}),!s&&a&&n.jsx("p",{className:"resource-preview-slideover__error",role:"alert",children:a}),!s&&!a&&t!==null&&n.jsx("iframe",{className:"resource-preview-slideover__frame",title:e.title,sandbox:"",srcDoc:t})]})}]:[],[e,t,s,a]);return n.jsx("div",{className:"resource-preview-slideover",children:n.jsx(u.SlideoverManager,{slideovers:l})})},as={[le.mis_record]:{icon:"table",label:"Arbor MIS",color:"var(--color-brand-600)"},[le.document_html]:{icon:"file",label:"Document",color:"var(--color-semantic-caution-800)"},[le.file]:{icon:"file",label:"File",color:"var(--color-semantic-caution-800)"},[le.user_file]:{icon:"upload",label:"File upload",color:"var(--color-semantic-caution-800)"},[le.workflow]:{icon:"list-tree",label:"Workflow",color:"var(--color-semantic-warning-700)"},[le.link]:{icon:"link",label:"Link",color:"var(--color-semantic-info-700)"}},rs=({resources:e,isLoading:t=!1,error:s=null,onOpenResource:a})=>n.jsxs("section",{className:"agent-workspace__panel agent-workspace__panel--documents","aria-label":"Resources",children:[n.jsxs("div",{className:"agent-workspace__panel-header",children:[n.jsx(u.Heading,{level:4,children:"Resources"}),n.jsx("span",{className:"agent-workspace__panel-count",children:e.length})]}),n.jsx("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:n.jsxs(Ke,{children:[t&&n.jsxs("div",{className:"agent-workspace__loading",children:[n.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:"Loading resources"}),n.jsx("span",{children:"Loading resources…"})]}),!t&&s&&n.jsx("p",{className:"agent-workspace__error",role:"alert",children:s}),!t&&!s&&e.length>0&&n.jsx("ul",{className:"agent-workspace__resource-list","aria-label":"Agent resources",children:e.map(r=>{const l=as[r.type],i=r.misRecordUrl;return n.jsx("li",{className:"agent-workspace__resource",children:i?n.jsx("a",{className:"agent-workspace__resource-card",href:i,target:"_blank",rel:"noreferrer",onClick:p=>{p.preventDefault(),a(r)},children:n.jsx(Ot,{resource:r,config:l,external:!0})}):n.jsx("button",{type:"button",className:"agent-workspace__resource-card",onClick:()=>a(r),children:n.jsx(Ot,{resource:r,config:l})})},r.id)})}),!t&&!s&&e.length===0&&n.jsx("p",{className:"agent-workspace__empty",children:"No resources yet."})]})})]}),Ot=({resource:e,config:t,external:s=!1})=>n.jsxs(n.Fragment,{children:[n.jsx("span",{className:`agent-workspace__resource-icon agent-workspace__resource-icon--${e.type}`,children:n.jsx(u.Icon,{name:t.icon,size:16,color:t.color,screenReaderText:`${t.label}:`})}),n.jsx("span",{className:"agent-workspace__resource-content",children:n.jsxs("span",{className:"agent-workspace__resource-top",children:[n.jsx("span",{className:"agent-workspace__resource-name",children:e.title}),n.jsx("span",{className:`agent-workspace__resource-badge agent-workspace__resource-badge--${e.type}`,children:t.label})]})}),s&&n.jsx(u.Icon,{name:"external-link",size:12,color:"var(--color-grey-500)",screenReaderText:"Opens in a new tab",className:"agent-workspace__resource-open"})]}),Lt=e=>{const t=Date.parse(e);return Number.isFinite(t)?t:0},os=new Intl.DateTimeFormat("en-GB",{day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"2-digit"}),ot=e=>{const t=new Date(e);return Number.isFinite(t.getTime())?os.format(t):e},Pt=e=>e.replace(/[A-Za-z0-9]+(?:[_-][A-Za-z0-9]+)+/g,t=>t.split(/[_-]/).map(s=>s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()).join(" ")),Ut=e=>{const s=e.replace(/[A-Za-z0-9]+(?:[_-][A-Za-z0-9]+)+/g,a=>a.split(/[_-]/).map(r=>r.toLowerCase()).join(" ")).toLowerCase();return s&&s.charAt(0).toUpperCase()+s.slice(1)},is=60*60*1e3,Yt=60*60*1e3,Ee=24*Yt,lt=7*Ee,ls=e=>e.type!=="message-sent",cs=(e,t)=>{const s=e.filter(ls).map((r,l)=>({kind:"action",id:`action-${r.timestamp}-${l}`,timestampMs:Lt(r.timestamp),item:r})),a=t.map(r=>({kind:"chat",id:r.sessionId,timestampMs:Lt(r.timestamp),session:r}));return[...s,...a].sort((r,l)=>r.timestampMs-l.timestampMs||r.id.localeCompare(l.id))},ds=e=>e>=lt?"weeks":e>=Ee?"days":"hours",us=e=>{if(e<Ee){const a=Math.max(1,Math.round(e/Yt));return a===1?"1 hour later":`${a} hours later`}if(e<lt){const a=Math.max(1,Math.round(e/Ee));return a===1?"1 day later":`${a} days later`}const t=Math.max(1,Math.round(e/lt));if(t<5)return t===1?"1 week later":`${t} weeks later`;const s=Math.max(1,Math.round(e/(30*Ee)));return s===1?"1 month later":`${s} months later`},gs=(e,t=is)=>{if(e.length===0)return[];const s=[e[0]];for(let a=1;a<e.length;a+=1){const r=e[a-1],l=e[a],i=l.timestampMs-r.timestampMs;i>=t&&s.push({kind:"gap",id:`gap-${r.id}-${l.id}`,durationMs:i,label:us(i),size:ds(i)}),s.push(l)}return s},hs=e=>e.type==="checklist-updated"?"checklist":e.type==="status-transition"?"status":"note",ps=({timeline:e,isLoading:t,error:s,onOpenChatSession:a})=>{const r=(e==null?void 0:e.actionLog)??[],l=(e==null?void 0:e.chatSessions)??[],i=cs(r,l),p=gs(i),d=!t&&!s&&i.length===0;return n.jsxs("section",{className:"agent-workspace__timeline","aria-label":"Agent timeline",children:[t&&n.jsx("p",{className:"agent-workspace__timeline-status",role:"status",children:"Loading timeline…"}),s&&n.jsx("p",{className:"agent-workspace__timeline-status",role:"alert",children:s||Kt}),d&&n.jsx("p",{className:"agent-workspace__timeline-status",role:"status",children:"No timeline activity yet."}),!t&&!s&&!d&&n.jsxs("div",{className:"agent-timeline",children:[n.jsx("div",{className:"agent-timeline__track","aria-hidden":"true"}),n.jsxs("div",{className:"agent-timeline__station agent-timeline__station--terminus",children:[n.jsx("span",{className:"agent-timeline__station-rail",children:n.jsx("span",{className:"agent-timeline__station-node agent-timeline__station-node--terminus","aria-hidden":"true",children:n.jsx(u.Icon,{name:"arrow-right-from-line",size:16,color:"currentColor"})})}),n.jsx("div",{className:"agent-timeline__label",children:n.jsx("strong",{className:"agent-timeline__label-type",children:"Start"})})]}),p.map(g=>{if(g.kind==="gap")return n.jsxs("div",{className:`agent-timeline__gap agent-timeline__gap--${g.size}`,role:"separator","aria-label":g.label,children:[n.jsx("span",{className:"agent-timeline__gap-rail","aria-hidden":"true",children:n.jsx("span",{className:"agent-timeline__gap-dot"})}),n.jsx("span",{className:"agent-timeline__gap-label",children:g.label})]},g.id);if(g.kind==="chat")return n.jsxs("div",{className:"agent-timeline__chat-station",children:[n.jsx("button",{type:"button",className:"agent-timeline__chat-node","aria-label":`Open chat session from ${ot(g.session.timestamp)}`,onClick:()=>a(g.session.sessionId),children:n.jsx(u.Icon,{name:"sparkles",size:16,color:"currentColor"})}),n.jsxs("div",{className:"agent-timeline__label",children:[n.jsx("strong",{className:"agent-timeline__label-type",children:"Chat session"}),n.jsx("span",{className:"agent-timeline__label-time",children:ot(g.session.timestamp)})]})]},g.id);const{item:m}=g,S=hs(m),x=S==="checklist",E=S==="status";return n.jsxs("div",{className:`agent-timeline__station agent-timeline__station--${S}`,children:[n.jsx("span",{className:"agent-timeline__station-rail",children:n.jsxs("button",{type:"button",className:`agent-timeline__station-node agent-timeline__station-node--${S}`,"aria-label":`${Pt(m.type)}: ${Ut(m.entry)}`,children:[x&&n.jsx(u.Icon,{name:"check-solid",size:16,color:"currentColor"}),E&&n.jsx(u.Icon,{name:"iteration-ccw",size:16,color:"currentColor"})]})}),n.jsxs("div",{className:"agent-timeline__label",children:[n.jsx("strong",{className:"agent-timeline__label-type",children:Pt(m.type)}),n.jsx("span",{className:"agent-timeline__label-entry",children:Ut(m.entry)}),n.jsx("span",{className:"agent-timeline__label-time",children:ot(m.timestamp)})]})]},g.id)}),n.jsxs("div",{className:"agent-timeline__station agent-timeline__station--terminus",children:[n.jsx("span",{className:"agent-timeline__station-rail",children:n.jsx("span",{className:"agent-timeline__station-node agent-timeline__station-node--terminus","aria-hidden":"true",children:n.jsx(u.Icon,{name:"flag",size:16,color:"currentColor"})})}),n.jsx("div",{className:"agent-timeline__label",children:n.jsx("strong",{className:"agent-timeline__label-type",children:"Finish"})})]})]})]})},ms=["I'll get the details and come back to you","Skip this for now"],_s=e=>{var s;const t=(s=e.prompt)!=null&&s.trim()?e.prompt.trim():`I need a bit more from you on "${e.task}". ${e.description} What can you tell me?`;return{id:`clarification-${Date.now()}`,author:te.agent,text:t,followUpPrompts:e.clarificationPrompts??ms}},fs=e=>e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),vs=e=>e.kind===zt.user_file?`<strong>${fs(e.text)}</strong>`:e.text,fe=e=>({id:e.id,text:vs(e),type:e.author===te.user?xe.CHAT_RESPONSE_TYPE_USER:e.author===te.system?xe.CHAT_RESPONSE_TYPE_INFO:xe.CHAT_RESPONSE_TYPE_AGENT,...e.followUpPrompts?{followUpPrompts:e.followUpPrompts}:{}}),ct="MESSAGE_TYPE_REPOLL",Xt="agentUi:update",gt="arbor-agent-",ce={all:"ALL",checklist:"CHECKLIST",resources:"RESOURCES",chat:"CHAT",timeline:"TIMELINE"},ws=new Set(Object.values(ce)),Zt=(e,t)=>`${e.endsWith("-")?e:`${e}-`}${t}`,xs=e=>typeof e=="string"&&ws.has(e)?e:ce.all,ks=e=>{if(!e||typeof e!="object")return null;const t=e;return t.type!==ct?null:{type:ct,target:xs(t.target)}},Qt=e=>{const t=Array.isArray(e)?e:[e],s=[];for(const a of t){const r=ks(a);r&&s.push(r)}return s},Ss=({enabled:e,channelPrefix:t,agentId:s,subscribeToPusher:a,onRepoll:r})=>{const l=o.useRef(r),i=t==null?void 0:t.trim(),p=!!(e&&a&&i&&s.trim());return o.useEffect(()=>{l.current=r},[r]),o.useEffect(()=>{if(!p||!a||!i)return;const d=a(Zt(i,s),Xt,g=>{for(const m of Qt(g))l.current(m.target)});return()=>{d()}},[p,i,s,a]),p};class we extends Error{constructor(t,s,a){super(a??`Agent service request failed (${t})`),this.name="AgentServiceError",this.status=t,this.detail=s}}const ys="/api/v1",U={agentDefinitions:"/agent-definitions",agents:"/agents",conversations:"/conversations",tripOptions:"/trip-options",demoDataset:"/demo/dataset"},G={GET:"GET",POST:"POST",PATCH:"PATCH"},Ns={error:"error"},As={user:"user"},ge={acceptJson:"application/json",acceptHtml:"text/html",acceptEventStream:"text/event-stream",contentTypeJson:"application/json",arborApplicationUrl:"X-Arbor-Application-Url"},bs=100,en=e=>{switch(e){case Rt.cancelled:return j.failed;case Rt.archived:return j.complete;case j.hitl:case j.complete:case j.failed:case j["generating-a-response"]:return e;default:return j["generating-a-response"]}},tn=e=>{switch(e){case at.requires_attention:return P.hitl;case at.in_progress:case at.available:return P["generating-a-response"];case P.failed:case P.complete:case P.hitl:case P["generating-a-response"]:return e;default:return P["generating-a-response"]}},ht=e=>({ref:e.name,display_name:e.display_name,agent_intent:e.agent_intent??"",description:e.description}),js=e=>({id:e.id,name:e.name,...e.has_run_before?{hasRunBefore:e.has_run_before}:{}}),Cs=new Set(Object.values(le)),Es=e=>Cs.has(e)?e:le.document_html,nn=e=>({id:e.id,type:Es(e.type),title:e.title,createdDatetime:e.created_datetime,lastUpdatedDatetime:e.last_updated_datetime,misRecordUrl:e.mis_record_url}),sn=e=>({resources:e.resources.map(nn),pageNumber:e.page_number,pageSize:e.page_size,totalRecords:e.total_records}),an=e=>({actionLog:(e.action_log??[]).map(t=>({timestamp:t.timestamp,type:t.type,entry:t.entry,origin:t.origin})),chatSessions:(e.chat_sessions??[]).map(t=>({sessionId:t.session_id,timestamp:t.timestamp}))}),dt=e=>{var s;const t=e.invocation_id??e.id;return{id:e.id,invocation_id:t,agent_definition_ref:e.agent_definition_ref,...e.agent_intent?{agent_intent:e.agent_intent}:{},invocation_name:((s=e.invocation_name)==null?void 0:s.trim())||e.agent_definition_ref,application_id:e.application_id,...e.application_name?{application_name:e.application_name}:{},created_by:e.created_by,status:en(e.status),context_ref:e.context_ref??null,checklist_ref:e.checklist_ref??null}},pt=e=>{var t;return{task:e.item??e.task??e.name??e.label??$n,status:tn(e.status),description:e.description??"",...e.prompt?{prompt:e.prompt}:{},...(t=e.follow_up_prompts)!=null&&t.length?{clarificationPrompts:e.follow_up_prompts}:{}}},Rs=e=>Array.isArray(e)?e:e.checklist_items??e.checklist??e.items??[],mt=(e,t,s)=>{var l;const a=!Array.isArray(t)&&(t.opening_message||(l=t.opening_follow_up_prompts)!=null&&l.length)?t:s,r=a?Re(a):void 0;return{invocation_id:e,checklist:Rs(t).map(pt),...r?{openingMessage:r}:{}}},rn=(e,t)=>{const s=Re(t);return{invocation_id:t.invocation_id??e,checklist:(t.checklist_items??[]).map(pt),...s?{openingMessage:s}:{}}},Re=e=>{var s,a;const t=(s=e.opening_message)==null?void 0:s.trim();if(t)return{id:qt,author:te.agent,text:t,...(a=e.opening_follow_up_prompts)!=null&&a.length?{followUpPrompts:e.opening_follow_up_prompts}:{}}},Ts=e=>{try{const t=JSON.parse(e);if(Array.isArray(t)){const s=t.filter(a=>!!a&&typeof a=="object"&&typeof a.text=="string").map(a=>a.text);if(s.length>0)return s.join(`
2
+ `)}}catch{}return e},Is=e=>{const t=e.trim();return t.length>0?`File upload
3
3
 
4
- ${e}`:"File upload"},os=t=>t.filter(e=>e.message_type==="user_file"&&e.role==="user"?!0:(e.role==="user"||e.role==="assistant")&&typeof e.content=="string"&&e.content.length>0&&e.message_type!=="tool_request").map(e=>{if(e.message_type==="user_file"){const n=typeof e.content=="string"?e.content:"",a=as(n);return{id:e.message_id,author:te.user,kind:Es.user_file,text:rs(a)}}return{id:e.message_id,author:e.role==="user"?te.user:te.agent,text:e.content}}),Rn=/:invocationId\b/g,Tn=/:resourceId\b/g,In=t=>t.trim().replace(/^Bearer\s+/i,""),On=t=>t.endsWith("/")?t.slice(0,-1):t;class Je{constructor(e){var a;this.baseUrl=On(e.baseUrl??"");const n=(a=e.token)==null?void 0:a.trim();this.token=n?In(n):void 0,this.customHeaders=e.headers,this.urls=e.urls??{},this.fetchImpl=e.fetch??globalThis.fetch.bind(globalThis)}setHeaders(e){this.customHeaders=e}async listAgentDefinitions(){return(await this.request(G.GET,this.resolveUrl("agentDefinitions",U.agentDefinitions))).agent_definitions??[]}getAgentDefinition(e){return this.request(G.GET,this.apiUrl(`${U.agentDefinitions}/${encodeURIComponent(e)}`))}listTripOptions(){return this.request(G.GET,this.apiUrl(U.tripOptions))}getDataset(){return this.request(G.GET,this.apiUrl(U.demoDataset))}setDataset(e){return this.request(G.POST,this.apiUrl(U.demoDataset),{dataset:e})}listAgents(e={}){const n=new URLSearchParams;e.status&&n.set("status",e.status),e.agentDefinitionRef&&n.set("agent_definition_ref",e.agentDefinitionRef);const a=n.toString()?`?${n.toString()}`:"";return this.request(G.GET,`${this.resolveUrl("agents",U.agents)}${a}`)}createAgent(e,n={}){var i,p;const a={agent_definition_ref:e},r=(i=n.invocationName)==null?void 0:i.trim(),l=(p=n.agentIntent)==null?void 0:p.trim();return r&&(a.invocation_name=r),l&&(a.agent_intent=l),this.request(G.POST,this.resolveUrl("agents",U.agents),a)}getAgent(e){return this.request(G.GET,this.resolveUrl("agent",`${U.agents}/${encodeURIComponent(e)}`,e))}updateAgent(e,n){const r={invocation_name:n.invocationName.trim()};return this.request(G.PATCH,this.resolveUrl("agent",`${U.agents}/${encodeURIComponent(e)}`,e),r)}getAgentChecklist(e){return this.request(G.GET,this.resolveUrl("agentChecklist",`${U.agents}/${encodeURIComponent(e)}/checklist`,e))}getAgentResources(e,n={}){const a=new URLSearchParams;n.pageNumber!==void 0&&a.set("page_number",String(n.pageNumber)),n.pageSize!==void 0&&a.set("page_size",String(n.pageSize)),n.type&&a.set("type",n.type);const r=a.toString(),l=this.resolveUrl("agentResources",`${U.agents}/${encodeURIComponent(e)}/resources`,e);return this.request(G.GET,r?`${l}?${r}`:l)}async listAllAgentResources(e){const n=An;let a=1;const r=[];let l=Number.POSITIVE_INFINITY;for(;r.length<l;){const i=ts(await this.getAgentResources(e,{pageNumber:a,pageSize:n}));if(l=i.totalRecords,i.resources.length===0||(r.push(...i.resources),r.length>=l))break;a+=1}return r}getAgentResourceHtml(e,n){return this.requestText(G.GET,this.resolveResourceHtmlUrl(e,n))}getAgentTimeline(e){return this.request(G.GET,this.resolveUrl("agentTimeline",`${U.agents}/${encodeURIComponent(e)}/agent-timeline`,e))}getAgentContext(e){return this.request(G.GET,this.apiUrl(`${U.agents}/${encodeURIComponent(e)}/context`))}cancelAgent(e){return this.request(G.POST,this.resolveUrl("stopAgent",`${U.agents}/${encodeURIComponent(e)}/cancel`,e))}archiveAgent(e){return this.request(G.POST,this.apiUrl(`${U.agents}/${encodeURIComponent(e)}/archive`))}getConversation(e){return this.request(G.GET,this.resolveUrl("agentConversation",`${U.conversations}/${encodeURIComponent(e)}`,e))}async chat(e,n,a={}){const r=!!(a.uploadFiles&&a.uploadFiles.length>0),l=await this.fetchImpl(this.resolveUrl("agentChat",`${U.agents}/${encodeURIComponent(e)}/chat`,e),{method:G.POST,headers:{...this.customHeaders,...this.authHeaders(),Accept:ge.acceptEventStream,...r?{}:{"Content-Type":ge.contentTypeJson}},body:r?Pn(n,a.uploadFiles??[]):JSON.stringify(n),signal:a.signal});if(!l.ok)throw await this.toError(l);if(!l.body)throw new we(l.status,null,"Chat response contained no stream body");return this.consumeSse(l.body,a.onEvent)}authHeaders(){return this.token?{Authorization:`Bearer ${this.token}`}:{}}apiUrl(e){return`${this.baseUrl}${Sn}${e}`}resolveUrl(e,n,a,r){const l=this.urls[e];if(!l)return this.apiUrl(n);let i=l;return a&&(i=i.replace(Rn,encodeURIComponent(a))),r&&(i=i.replace(Tn,encodeURIComponent(r))),i}resolveResourceHtmlUrl(e,n){return this.urls.agentResourceHtml?this.resolveUrl("agentResourceHtml",`${U.agents}/${encodeURIComponent(e)}/resources/${encodeURIComponent(n)}`,e,n):this.urls.agentResources?`${this.resolveUrl("agentResources",`${U.agents}/${encodeURIComponent(e)}/resources`,e).replace(/\/$/,"")}/${encodeURIComponent(n)}`:this.apiUrl(`${U.agents}/${encodeURIComponent(e)}/resources/${encodeURIComponent(n)}`)}async request(e,n,a){const r=await this.fetchImpl(n,{method:e,headers:{...this.customHeaders,...this.authHeaders(),Accept:ge.acceptJson,...a===void 0?{}:{"Content-Type":ge.contentTypeJson}},...a===void 0?{}:{body:JSON.stringify(a)}});if(!r.ok)throw await this.toError(r);if(r.status!==204)return await r.json()}async requestText(e,n){const a=await this.fetchImpl(n,{method:e,headers:{...this.customHeaders,...this.authHeaders(),Accept:ge.acceptHtml}});if(!a.ok)throw await this.toError(a);return a.text()}async toError(e){let n=null;try{n=await e.json()}catch{}return new we(e.status,n,`Agent service request failed (${e.status} ${e.statusText})`)}async consumeSse(e,n){const a=e.getReader(),r=new TextDecoder;let l="",i;const p=d=>{const{event:g,data:m}=Ln(d);if(m===null)return;if(g===yn.error){const x=Mt(m);throw new we(502,x,(x==null?void 0:x.message)??"Chat stream error")}const S=Mt(m);S&&(i=S,n==null||n(S))};for(;;){const{done:d,value:g}=await a.read();if(d)break;l+=r.decode(g,{stream:!0});const m=l.split(`
4
+ ${t}`:"File upload"},Mt=e=>{var s;const t=(s=e.filename)==null?void 0:s.trim();return t||null},on=e=>e.filter(t=>Mt(t)&&t.role==="user"?!0:(t.role==="user"||t.role==="assistant")&&typeof t.content=="string"&&t.content.length>0&&t.message_type!=="tool_request").map(t=>{const s=Mt(t);return s&&t.role==="user"?{id:t.message_id,author:te.user,kind:zt.user_file,text:s}:{id:t.message_id,author:t.role==="user"?te.user:te.agent,text:t.content}}),Os=/:invocationId\b/g,Ls=/:resourceId\b/g,Ps=e=>e.trim().replace(/^Bearer\s+/i,""),Us=e=>e.endsWith("/")?e.slice(0,-1):e;class Je{constructor(t){var a;this.baseUrl=Us(t.baseUrl??"");const s=(a=t.token)==null?void 0:a.trim();this.token=s?Ps(s):void 0,this.customHeaders=t.headers,this.urls=t.urls??{},this.fetchImpl=t.fetch??globalThis.fetch.bind(globalThis)}setHeaders(t){this.customHeaders=t}async listAgentDefinitions(){return(await this.request(G.GET,this.resolveUrl("agentDefinitions",U.agentDefinitions))).agent_definitions??[]}getAgentDefinition(t){return this.request(G.GET,this.apiUrl(`${U.agentDefinitions}/${encodeURIComponent(t)}`))}listTripOptions(){return this.request(G.GET,this.apiUrl(U.tripOptions))}getDataset(){return this.request(G.GET,this.apiUrl(U.demoDataset))}setDataset(t){return this.request(G.POST,this.apiUrl(U.demoDataset),{dataset:t})}listAgents(t={}){const s=new URLSearchParams;t.status&&s.set("status",t.status),t.agentDefinitionRef&&s.set("agent_definition_ref",t.agentDefinitionRef);const a=s.toString()?`?${s.toString()}`:"";return this.request(G.GET,`${this.resolveUrl("agents",U.agents)}${a}`)}createAgent(t,s={}){var i,p;const a={agent_definition_ref:t},r=(i=s.invocationName)==null?void 0:i.trim(),l=(p=s.agentIntent)==null?void 0:p.trim();return r&&(a.invocation_name=r),l&&(a.agent_intent=l),this.request(G.POST,this.resolveUrl("agents",U.agents),a)}getAgent(t){return this.request(G.GET,this.resolveUrl("agent",`${U.agents}/${encodeURIComponent(t)}`,t))}updateAgent(t,s){const r={invocation_name:s.invocationName.trim()};return this.request(G.PATCH,this.resolveUrl("agent",`${U.agents}/${encodeURIComponent(t)}`,t),r)}getAgentChecklist(t){return this.request(G.GET,this.resolveUrl("agentChecklist",`${U.agents}/${encodeURIComponent(t)}/checklist`,t))}getAgentResources(t,s={}){const a=new URLSearchParams;s.pageNumber!==void 0&&a.set("page_number",String(s.pageNumber)),s.pageSize!==void 0&&a.set("page_size",String(s.pageSize)),s.type&&a.set("type",s.type);const r=a.toString(),l=this.resolveUrl("agentResources",`${U.agents}/${encodeURIComponent(t)}/resources`,t);return this.request(G.GET,r?`${l}?${r}`:l)}async listAllAgentResources(t){const s=bs;let a=1;const r=[];let l=Number.POSITIVE_INFINITY;for(;r.length<l;){const i=sn(await this.getAgentResources(t,{pageNumber:a,pageSize:s}));if(l=i.totalRecords,i.resources.length===0||(r.push(...i.resources),r.length>=l))break;a+=1}return r}getAgentResourceHtml(t,s){return this.requestText(G.GET,this.resolveResourceHtmlUrl(t,s))}getAgentTimeline(t){return this.request(G.GET,this.resolveUrl("agentTimeline",`${U.agents}/${encodeURIComponent(t)}/agent-timeline`,t))}getAgentContext(t){return this.request(G.GET,this.apiUrl(`${U.agents}/${encodeURIComponent(t)}/context`))}cancelAgent(t){return this.request(G.POST,this.resolveUrl("stopAgent",`${U.agents}/${encodeURIComponent(t)}/cancel`,t))}archiveAgent(t){return this.request(G.POST,this.apiUrl(`${U.agents}/${encodeURIComponent(t)}/archive`))}getConversation(t){return this.request(G.GET,this.resolveUrl("agentConversation",`${U.conversations}/${encodeURIComponent(t)}`,t))}async chat(t,s,a={}){const r=!!(a.uploadFiles&&a.uploadFiles.length>0),l=await this.fetchImpl(this.resolveUrl("agentChat",`${U.agents}/${encodeURIComponent(t)}/chat`,t),{method:G.POST,headers:{...this.customHeaders,...this.authHeaders(),Accept:ge.acceptEventStream,...r?{}:{"Content-Type":ge.contentTypeJson}},body:r?Ds(s,a.uploadFiles??[]):JSON.stringify(s),signal:a.signal});if(!l.ok)throw await this.toError(l);if(!l.body)throw new we(l.status,null,"Chat response contained no stream body");return this.consumeSse(l.body,a.onEvent)}authHeaders(){return this.token?{Authorization:`Bearer ${this.token}`}:{}}apiUrl(t){return`${this.baseUrl}${ys}${t}`}resolveUrl(t,s,a,r){const l=this.urls[t];if(!l)return this.apiUrl(s);let i=l;return a&&(i=i.replace(Os,encodeURIComponent(a))),r&&(i=i.replace(Ls,encodeURIComponent(r))),i}resolveResourceHtmlUrl(t,s){return this.urls.agentResourceHtml?this.resolveUrl("agentResourceHtml",`${U.agents}/${encodeURIComponent(t)}/resources/${encodeURIComponent(s)}`,t,s):this.urls.agentResources?`${this.resolveUrl("agentResources",`${U.agents}/${encodeURIComponent(t)}/resources`,t).replace(/\/$/,"")}/${encodeURIComponent(s)}`:this.apiUrl(`${U.agents}/${encodeURIComponent(t)}/resources/${encodeURIComponent(s)}`)}async request(t,s,a){const r=await this.fetchImpl(s,{method:t,headers:{...this.customHeaders,...this.authHeaders(),Accept:ge.acceptJson,...a===void 0?{}:{"Content-Type":ge.contentTypeJson}},...a===void 0?{}:{body:JSON.stringify(a)}});if(!r.ok)throw await this.toError(r);if(r.status!==204)return await r.json()}async requestText(t,s){const a=await this.fetchImpl(s,{method:t,headers:{...this.customHeaders,...this.authHeaders(),Accept:ge.acceptHtml}});if(!a.ok)throw await this.toError(a);return a.text()}async toError(t){let s=null;try{s=await t.json()}catch{}return new we(t.status,s,`Agent service request failed (${t.status} ${t.statusText})`)}async consumeSse(t,s){const a=t.getReader(),r=new TextDecoder;let l="",i;const p=d=>{const{event:g,data:m}=Ms(d);if(m===null)return;if(g===Ns.error){const x=Dt(m);throw new we(502,x,(x==null?void 0:x.message)??"Chat stream error")}const S=Dt(m);S&&(i=S,s==null||s(S))};for(;;){const{done:d,value:g}=await a.read();if(d)break;l+=r.decode(g,{stream:!0});const m=l.split(`
5
5
 
6
- `);l=m.pop()??"";for(const S of m)p(S)}if(l.trim()&&p(l),!i)throw new we(502,null,"Chat stream ended without any events");return i}}const Ln=t=>{let e=null;const n=[];for(const a of t.split(`
7
- `)){const r=a.trimEnd();r.startsWith("event:")?e=r.slice(6).trim():r.startsWith("data:")&&n.push(r.slice(5).trim())}return{event:e,data:n.length>0?n.join(`
8
- `):null}},Mt=t=>{try{return JSON.parse(t)}catch{return}};function Pn(t,e){const n=new FormData;n.append("body",JSON.stringify(t));for(const a of e)n.append("files",a,a.name);return n}const Un={id:Gt,author:te.agent,text:"Type a question or upload a file. You can ask it how it's progressing, or send an instruction and it'll act on it."};let Dt=0;const Mn=t=>(Dt+=1,`${t}-${Date.now()}-${Dt}`),Dn=t=>{const e=t.destination?` to ${t.destination}`:"";return`Let's get started on ${t.tripName.trim()||t.destination.trim()||"this task"}${e}. What will you do first?`};class is{constructor(e,n,a={}){this.seededChecklist=[],this.client=e,this.agentId=n,this.chatId=a.chatId??n,this.opening=a.openingMessage??Un,this.model=a.model}openingMessage(){return this.opening}async bootstrapConversation(){const e=await this.client.getConversation(this.chatId),n=os(e.messages);return n.length===0?[this.opening]:n}async start(e){return{...await this.exchange(Dn(e)),phase:$.running}}sendMessage(e,n){return this.exchange(e,n)}async stop(){await this.client.cancelAgent(this.agentId)}seedChecklist(e){this.seededChecklist=e}async exchange(e,n){var i;const a=[{role:Nn.user,content:e}],r=await this.client.chat(this.agentId,{messages:a,chat_id:this.chatId,...this.model?{model:this.model}:{},moderation_enabled:!0,meta:{feature_id:"agent_view",source:"agent_view_frontend"}},...n&&n.length>0?[{uploadFiles:n}]:[]),l={id:r.event_id||Mn("msg-agent"),author:te.agent,text:r.message.content,...(i=r.follow_up_prompts)!=null&&i.length?{followUpPrompts:r.follow_up_prompts}:{}};try{const p=await this.client.getAgent(this.agentId),{checklist:d}=ns(this.agentId,p);return this.seededChecklist=d,{message:l,checklist:d}}catch{return{message:l,...this.seededChecklist.length?{checklist:this.seededChecklist}:{}}}}}const _t=(t,e)=>n=>{var a,r;return new is(t,n.invocation_id,{model:e==null?void 0:e.model,chatId:((a=e==null?void 0:e.resolveChatId)==null?void 0:a.call(e,n))??(e==null?void 0:e.chatId)??n.invocation_id,openingMessage:((r=e==null?void 0:e.resolveOpeningMessage)==null?void 0:r.call(e,n))??(e==null?void 0:e.openingMessage)})},ls=t=>t instanceof we?t.message:t instanceof TypeError?"Network error while contacting the agent service.":t instanceof Error&&t.message?t.message:qt,$n=t=>{const e={};for(const n of t){const a=Re(n);if(!a)continue;const r=n.invocation_id??n.id;e[r]=a,e[n.id]=a}return e},Hn=t=>JSON.stringify(t),it=(t,e)=>JSON.stringify(t)===JSON.stringify(e),cs=t=>{const{jwt:e,headers:n,urls:a}=t,r=JSON.stringify(n??{}),l=Hn(a),i=o.useMemo(()=>new Je({token:e,headers:n,urls:a}),[e,l]);o.useLayoutEffect(()=>{i.setHeaders(n)},[i,r]);const[p,d]=o.useState([]),[g,m]=o.useState([]),[S,x]=o.useState({}),[E,H]=o.useState("loading"),[_,O]=o.useState(null),[b,T]=o.useState(0),y=o.useCallback((R,D)=>{const F=R.map(dt),K=D.map(ht),W=$n(R);d(L=>it(L,F)?L:F),m(L=>it(L,K)?L:K),x(L=>it(L,W)?L:W),H("idle"),O(null)},[]);o.useEffect(()=>{let R=!1;return H("loading"),O(null),(async()=>{try{const[D,F]=await Promise.all([i.listAgents(),i.listAgentDefinitions()]);if(R)return;y(D,F)}catch(D){if(R)return;d([]),m([]),x({}),H("error"),O(ls(D))}})(),()=>{R=!0}},[y,i,b]);const f=o.useCallback(()=>{T(R=>R+1)},[]),N=o.useCallback(async()=>{try{const[R,D]=await Promise.all([i.listAgents(),i.listAgentDefinitions()]);y(R,D)}catch{}},[y,i]),w=o.useCallback(async R=>{const[D,F]=await Promise.all([i.getAgentChecklist(R),i.getAgent(R).catch(()=>null)]);return mt(R,D,F??void 0)},[i]),C=o.useCallback(async R=>i.listAllAgentResources(R),[i]),M=o.useCallback(async({definition:R,invocationName:D})=>{const F=await i.createAgent(R.ref,{invocationName:D}),K=await i.getAgent(F.id),W=dt(K),L=Re(K);return d(Y=>[W,...Y]),L&&x(Y=>({...Y,[W.invocation_id]:L,[W.id]:L})),W},[i]),ke=o.useMemo(()=>_t(i,{resolveOpeningMessage:R=>S[R.invocation_id]??S[R.id]}),[i,S]);return{agents:p,agentDefinitions:g,loadState:E,loadError:_,reload:f,refresh:N,fetchAgentChecklist:w,fetchAgentResources:C,createAgent:M,chatConnector:ke}},Fn=t=>JSON.stringify(t),ds=t=>{const{agent:e,jwt:n,headers:a,urls:r,chatId:l}=t,i=JSON.stringify(a??{}),p=Fn(r),d=o.useMemo(()=>new Je({token:n,headers:a,urls:{agent:r.agentUrl,agentChecklist:r.agentChecklistUrl,...r.agentResourcesUrl?{agentResources:r.agentResourcesUrl}:{},...r.agentTimelineUrl?{agentTimeline:r.agentTimelineUrl}:{},agentChat:r.agentChatUrl,agentConversation:r.agentConversationUrl,...r.stopAgentUrl?{stopAgent:r.stopAgentUrl}:{}}}),[n,p]);o.useLayoutEffect(()=>{d.setHeaders(a)},[d,i]);const g=o.useCallback(async _=>{const[O,b]=await Promise.all([d.getAgentChecklist(_),d.getAgent(_).catch(()=>null)]);return mt(_,O,b??void 0)},[d]),m=o.useCallback(async _=>d.listAllAgentResources(_),[d]),S=o.useCallback(async(_,O)=>d.getAgentResourceHtml(_,O),[d]),x=o.useCallback(async _=>{const O=await d.getAgentTimeline(_);return ss(O)},[d]),E=o.useCallback(async(_,O)=>{await d.updateAgent(_,{invocationName:O})},[d]);return{connector:o.useMemo(()=>_t(d,{chatId:l??e.invocation_id})(e),[d,e.invocation_id,l]),fetchAgentChecklist:g,fetchAgentResources:m,fetchAgentResourceHtml:S,fetchAgentTimeline:x,updateAgentInvocationName:E}},Bn=3e4,Gn=(t,e)=>{const n=t.hasRunBefore?e||"This trip":t.tripName.trim()||"A new trip",a=t.destination?` to ${t.destination}`:"",r=t.hasRunBefore?" It has run before.":"";return`${n}${a}.${r}`.trim()},zn=t=>{switch(t){case j.failed:return $.stopped;case j.complete:return $.complete;default:return $.running}},$t=(t,e)=>{e([fe(t)])},qn=(t,e)=>t.length===e.length&&t.every((n,a)=>{const r=e[a];return r!==void 0&&n.id===r.id&&n.text===r.text}),us=({agent:t,invocationId:e,open:n,onClose:a,jwt:r,headers:l,agentUrl:i,agentChecklistUrl:p,agentResourcesUrl:d,agentTimelineUrl:g,agentChatUrl:m,agentConversationUrl:S,stopAgentUrl:x,chatId:E,enableUpload:H,initialBrief:_,initialPhase:O,initialChecklist:b,usePusherToRepoll:T=!1,pusherChannelPrefix:y=gt,subscribeToPusher:f})=>{const[N,w]=o.useState(E??e),[C,M]=o.useState("chat"),[ke,R]=o.useState(!1),{connector:D,fetchAgentChecklist:F,fetchAgentResources:K,fetchAgentResourceHtml:W,fetchAgentTimeline:L,updateAgentInvocationName:Y}=ds({agent:{...t,invocation_id:e},jwt:r,headers:l,chatId:N,urls:{agentUrl:i,agentChecklistUrl:p,agentResourcesUrl:d,agentTimelineUrl:g,agentChatUrl:m,agentConversationUrl:S,stopAgentUrl:x}}),B=o.useRef(D),[Se,he]=o.useState(t.invocation_name),[re,pe]=o.useState(0),[Te,de]=o.useState(null),[V,ye]=o.useState(O??(_?$.running:zn(t.status))),[me,X]=o.useState([]),[Ie,Z]=o.useState(0),[Oe,Le]=o.useState(),[Pe,_e]=o.useState(null),[We,Ne]=o.useState([]),[Ve,Ae]=o.useState(!1),[Ye,be]=o.useState(null),[Xe,je]=o.useState(null),[Ue,h]=o.useState(null),[A,k]=o.useState(!1),[J,se]=o.useState(null),[Q,oe]=o.useState(null),[Me,ft]=o.useState(!1),[ps,Ze]=o.useState(null),[Qe,De]=o.useState(b??null),[ms,vt]=o.useState(!1),[_s,et]=o.useState(null),[wt,xt]=o.useState(!1),[kt,St]=o.useState(null),[$e,tt]=o.useState(!1),[He,fs]=o.useState(!1),[Fe,vs]=o.useState(!1),yt=o.useRef($e),Nt=o.useRef(t.invocation_name),At=o.useRef(0),bt=o.useRef(0);o.useEffect(()=>{B.current=D},[D]),o.useEffect(()=>{Nt.current=t.invocation_name},[t.invocation_name]),o.useEffect(()=>{yt.current=$e},[$e]),o.useEffect(()=>{w(E??e),M("chat"),R(!1),X([]),Z(c=>c+1),de(null)},[e,E]),o.useEffect(()=>{he(t.invocation_name),pe(c=>c+1)},[t.invocation_name]),o.useEffect(()=>{if(!n||_)return;const c=B.current.bootstrapConversation;if(!c){$t(B.current.openingMessage(),X);return}let v=!1;return tt(!0),(async()=>{try{const I=await c.call(B.current);if(v)return;X(I.map(fe))}catch{v||$t(B.current.openingMessage(),X)}finally{v||tt(!1)}})(),()=>{v=!0}},[n,_,e,N]);const ne=o.useCallback(()=>{const c=++At.current;(async()=>{var v,I;try{const z=await F(e);if(c!==At.current)return;De(ie=>JSON.stringify(ie)===JSON.stringify(z.checklist)?ie:z.checklist),et(null),(I=(v=B.current).seedChecklist)==null||I.call(v,z.checklist)}catch{}})()},[F,e]),ue=o.useCallback(()=>{d&&(async()=>{try{const c=await K(e);Ne(c),be(null)}catch{}})()},[d,K,e]),ae=o.useCallback(()=>{if(!g)return;const c=++bt.current;(async()=>{try{const v=await L(e);if(c!==bt.current)return;oe(I=>JSON.stringify(I)===JSON.stringify(v)?I:v),Ze(null)}catch{}})()},[g,L,e]),Ce=o.useCallback(c=>{const v=B.current.bootstrapConversation;v&&(async()=>{try{const I=await v.call(B.current);if(yt.current)return;const z=I.map(fe);let ie=!1;X(Et=>qn(Et,z)?Et:(ie=!0,z)),ie&&(c!=null&&c.refreshSidePanelsOnChange)&&(ne(),ae())}catch{}})()},[ne,ae]),ws=o.useCallback(c=>{switch(c){case ce.checklist:ne();return;case ce.resources:ue();return;case ce.chat:Ce();return;case ce.timeline:ae();return;case ce.all:default:ne(),ue(),Ce(),ae()}},[ne,Ce,ue,ae]),jt=kn({enabled:n&&T,channelPrefix:y,agentId:t.id,subscribeToPusher:f,onRepoll:ws});o.useEffect(()=>{if(!n||_||jt)return;const c=window.setInterval(()=>{Ce({refreshSidePanelsOnChange:!0})},Bn);return()=>{window.clearInterval(c)}},[n,_,jt,e,N,Ce]);const xs=o.useCallback(c=>{var v,I;c.checklist?(De(c.checklist),(I=(v=B.current).seedChecklist)==null||I.call(v,c.checklist)):ne(),c.phase&&ye(c.phase),ue(),ae()},[ne,ue,ae]);o.useEffect(()=>{var c,v;!n||_||b&&b.length>0&&((v=(c=B.current).seedChecklist)==null||v.call(c,b))},[n,_,b]),o.useEffect(()=>{if(!n||_)return;let c=!1;return vt(v=>b!=null&&b.length?!1:v||Qe===null||Qe.length===0),et(null),(async()=>{var v,I;try{const z=await F(e);if(c)return;b!=null&&b.length||(De(z.checklist),(I=(v=B.current).seedChecklist)==null||I.call(v,z.checklist))}catch{!c&&!(b!=null&&b.length)&&et(ze)}finally{c||vt(!1)}})(),()=>{c=!0}},[n,e,_,b,F]),o.useEffect(()=>{if(!n||!d)return;let c=!1;return Ae(!0),be(null),(async()=>{try{const v=await K(e);c||Ne(v)}catch{c||be(Ls)}finally{c||Ae(!1)}})(),()=>{c=!0}},[n,e,d,K]);const ks=o.useCallback(()=>{je(null),h(null),se(null),k(!1)},[]),Ss=o.useCallback(c=>{if(c.misRecordUrl){window.open(c.misRecordUrl,"_blank","noopener,noreferrer");return}je(c),h(null),se(null),k(!0),(async()=>{try{const v=await W(e,c.id);h(v)}catch{se(Ps)}finally{k(!1)}})()},[W,e]);o.useEffect(()=>{if(!n||!g)return;let c=!1;return ft(v=>v||Q===null),Ze(null),(async()=>{try{const v=await L(e);c||oe(v)}catch{c||Ze(zt)}finally{c||ft(!1)}})(),()=>{c=!0}},[n,e,g,L]),o.useEffect(()=>{if(!n||!_)return;let c=!1;const v={id:`user-brief-${Date.now()}`,author:te.user,text:Gn(_,Nt.current)};return(async()=>{var z,ie;const I=await B.current.start(_);c||(X([fe(B.current.openingMessage()),fe(v),fe(I.message)]),I.checklist?(De(I.checklist),(ie=(z=B.current).seedChecklist)==null||ie.call(z,I.checklist)):ne(),ye(I.phase??$.running),ue(),ae())})(),()=>{c=!0}},[n,_,e,ne,ue,ae]);const ys=o.useCallback(c=>{_e(fn(c))},[]),st=E??e,Be=Q==null?void 0:Q.chatSessions,Ct=Be!=null&&Be.length?Be.reduce((c,v)=>Date.parse(v.timestamp)<Date.parse(c.timestamp)?v:c).sessionId:void 0,nt=o.useCallback(()=>{M("chat"),R(!1),N!==st&&(w(st),X([]),Z(c=>c+1))},[N,st]),Ns=o.useCallback(c=>{if(c===Ct){nt();return}w(c),R(!0),M("chat"),X([]),Z(v=>v+1)},[Ct,nt]),As=o.useCallback(c=>{_e(null),Le(c),Z(v=>v+1)},[]),bs=o.useCallback(async()=>{St(null),xt(!0);try{await B.current.stop(),ye($.stopped)}catch{St(Us)}finally{xt(!1)}},[]),js=o.useCallback(c=>{const v=c.trim(),I=Se;if(de(null),!v){pe(z=>z+1);return}v!==I&&(he(v),(async()=>{try{await Y(e,v)}catch{he(I),pe(z=>z+1),de(Ms)}})())},[Se,e,Y]),Cs=Qe;return s.jsxs(u.Modal,{open:n,closeHandler:a,hideCloseButton:!0,className:"agent-workspace",children:[s.jsxs(u.Modal.Header,{className:"agent-workspace__header",children:[s.jsxs("div",{className:"agent-workspace__header-title",children:[s.jsx("span",{className:"agent-workspace__header-avatar","aria-hidden":"true",children:s.jsx(u.Icon,{name:"ask-arbor",size:24})}),s.jsx(u.Modal.Title,{children:s.jsx(u.EditableText,{className:"agent-workspace__header-name",text:Se,onEditSave:js},re)}),s.jsx("span",{className:q("agent-workspace__phase",`agent-workspace__phase--${V}`),children:Hs[V]}),Te&&s.jsx("p",{className:"agent-workspace__error agent-workspace__name-error",role:"alert",children:Te})]}),s.jsxs("div",{className:"agent-workspace__header-actions",children:[s.jsx(u.Button,{variant:He?"secondary":"primary",size:"S",iconLeftName:"clipboard-list",iconLeftScreenReaderText:"Toggle checklist","aria-pressed":!He,onClick:()=>fs(c=>!c),children:"Checklist"}),s.jsx(u.Button,{variant:Fe?"secondary":"primary",size:"S",iconLeftName:"files",iconLeftScreenReaderText:"Toggle resources","aria-pressed":!Fe,onClick:()=>vs(c=>!c),children:"Resources"}),s.jsx(u.Button,{variant:"secondary",size:"S",iconLeftName:"x",iconLeftScreenReaderText:"Close",onClick:a,children:"Close"})]})]}),s.jsxs(u.Modal.Body,{className:q("agent-workspace__body",{"agent-workspace__body--no-checklist":He,"agent-workspace__body--no-resources":Fe}),children:[s.jsxs("section",{className:q("agent-workspace__panel","agent-workspace__panel--chat",{"agent-workspace__panel--timeline":!!g&&C==="timeline"}),"aria-label":"Agent",children:[s.jsxs("div",{className:"agent-workspace__panel-header",children:[s.jsx(u.Heading,{level:4,children:"Agent"}),x&&V===$.running&&s.jsx(u.Button,{className:"agent-workspace__panel-header-action",variant:"secondary-destructive",size:"S",iconLeftName:"circle-x",iconLeftScreenReaderText:"Stop",disabled:wt,onClick:()=>void bs(),children:wt?"Stopping…":"Stop agent"})]}),kt&&s.jsx("p",{className:"agent-workspace__error agent-workspace__stop-error",role:"alert",children:kt}),g&&s.jsxs(u.Tabs,{className:"agent-workspace__center-tabs","aria-label":"Center panel",children:[s.jsx(u.Tabs.Item,{active:C==="chat",tabElementProps:{id:"agent-center-tab-chat",onClick:()=>M("chat")},children:"Chat"}),s.jsx(u.Tabs.Item,{active:C==="timeline",tabElementProps:{id:"agent-center-tab-timeline",onClick:()=>M("timeline")},children:"Timeline"})]}),g&&C==="chat"&&ke&&s.jsx("div",{className:"agent-workspace__center-back",children:s.jsx(u.Button,{variant:"tertiary",size:"S",iconLeftName:"arrow-left",iconLeftScreenReaderText:"Back to main chat",onClick:nt,children:"Back to main chat"})}),g&&C==="timeline"&&s.jsx(mn,{timeline:Q,isLoading:Me,error:ps,onOpenChatSession:Ns}),s.jsx("div",{className:"agent-workspace__chat-keep-alive",hidden:!!g&&C!=="chat",children:s.jsx(tn,{connector:D,phase:V,chatHistory:me,chatSessionKey:Ie,startQuery:Oe,clarificationMessage:Pe,enableUpload:H,onTurn:xs,onAwaitingChange:tt,onClarificationPrompt:As,onDismissClarification:()=>_e(null)})})]}),!He&&s.jsx(sn,{checklist:Cs,isLoading:ms,error:_s,phase:V,canRequestInput:V===$.running&&!$e,onAttentionItemClick:ys}),!Fe&&s.jsx(rn,{resources:We,isLoading:Ve,error:Ye,onOpenResource:Ss}),s.jsx(nn,{resource:Xe,html:Ue,isLoading:A,error:J,onClose:ks})]})]})},Kn="Unable to load agent definitions. Please try again.",Jn="Unable to start the agent.",Ht="Loading agents…",gs=({open:t,onClose:e,onStart:n,agentDefinitions:a,definitionsState:r="idle",definitionsError:l=null,onRetryDefinitions:i,embedded:p=!1})=>{const[d,g]=o.useState(void 0),[m,S]=o.useState(""),[x,E]=o.useState(!1),[H,_]=o.useState(null),O=[...a].sort((w,C)=>w.display_name.localeCompare(C.display_name)).map(w=>({value:w.ref,label:w.display_name}));o.useEffect(()=>{t&&(g(void 0),S(""),E(!1),_(null))},[t]);const b=d!==void 0&&m.trim().length>0,T=o.useCallback(w=>{const C=a.find(M=>M.ref===w[0]);C&&g(C)},[a]),y=o.useCallback(async()=>{if(!(!d||!b||x)){E(!0),_(null);try{await n({definition:d,invocationName:m.trim()})}catch(w){_(w instanceof Error?w.message:Jn)}finally{E(!1)}}},[b,d,m,x,n]);if(r==="idle"&&a.length===0||!t)return null;const f=s.jsxs("div",{className:"new-agent__header-title",children:[s.jsx("span",{className:"new-agent__header-avatar","aria-hidden":"true",children:s.jsx(u.Icon,{name:"ask-arbor",size:24})}),p?s.jsx("h2",{className:"new-agent__title",children:"Start an agent"}):s.jsx(u.Modal.Title,{children:"Start an agent"})]});let N;return r==="loading"?N=s.jsxs("div",{className:"new-agent__state","aria-live":"polite",children:[s.jsx(u.Icon,{name:"loader",size:24,color:"var(--color-brand-600)",className:"new-agent__spinner",screenReaderText:Ht}),s.jsx("p",{className:"new-agent__state-message",children:Ht})]}):r==="error"?N=s.jsxs("div",{className:"new-agent__state new-agent__state--error",role:"alert",children:[s.jsx(u.Icon,{name:"triangle-alert",size:24,color:"var(--color-semantic-destructive-600)"}),s.jsx("p",{className:"new-agent__state-message",children:l??Kn}),i?s.jsx(u.Button,{variant:"secondary",size:"S",onClick:i,children:"Try again"}):null]}):N=s.jsxs("form",{className:"new-agent__form","aria-label":"Start an agent",onSubmit:w=>{w.preventDefault(),b&&!x&&y()},children:[s.jsxs("div",{className:"new-agent__type-field",children:[s.jsx("label",{className:"new-agent__type-label",htmlFor:"new-agent-type",children:"What would you like your agent to do?"}),s.jsx(u.SelectDropdown,{id:"new-agent-type",placeholder:"Which agent would you like to start?",options:O,selectedValues:d?[d.ref]:[],onSelectionChange:T})]}),s.jsxs("div",{className:"new-agent__type-field",children:[s.jsx("label",{className:"new-agent__type-label",htmlFor:"new-agent-invocation-name",children:"Name"}),s.jsx(u.TextInput,{id:"new-agent-invocation-name",value:m,placeholder:"What would you like to call your agent?",onChange:w=>S(w.target.value)})]}),H?s.jsx("p",{className:"new-agent__error",role:"alert",children:H}):null,s.jsx("div",{className:"new-agent__actions",children:s.jsx(u.Button,{type:"submit",variant:"primary",className:q("new-agent__start-button",{"new-agent__start-button--starting":x}),disabled:!b||x,iconLeftName:x?"loader":"sparkles",iconLeftScreenReaderText:x?"Starting":void 0,children:x?"Starting…":"Start"})})]}),p?s.jsxs("div",{className:q("new-agent","new-agent--embedded"),children:[s.jsx("div",{className:"new-agent__header",children:f}),s.jsx("div",{className:"new-agent__body",children:N})]}):s.jsxs(u.Modal,{open:t,closeHandler:e,className:"new-agent",children:[s.jsx(u.Modal.Header,{className:"new-agent__header",children:f}),s.jsx(u.Modal.Body,{className:"new-agent__body",children:N})]})},Ft=t=>{window.location.assign(t)},Wn=({open:t,authToken:e,headers:n,agentDefinitionsUrl:a,agentsUrl:r,closeUrl:l,successUrl:i,onClose:p,onStart:d,embedded:g=!1})=>{const m=JSON.stringify(n??{}),S=o.useMemo(()=>new Je({token:e,headers:n,urls:{agentDefinitions:a,agents:r}}),[e,a,r,m]),[x,E]=o.useState([]),[H,_]=o.useState("loading"),[O,b]=o.useState(null),[T,y]=o.useState(0);o.useEffect(()=>{if(!t)return;let C=!1;return _("loading"),b(null),(async()=>{try{const M=await S.listAgentDefinitions();if(C)return;E(M.map(ht)),_("idle")}catch(M){if(C)return;E([]),b(ls(M)),_("error")}})(),()=>{C=!0}},[S,t,T]);const f=o.useCallback(()=>{p==null||p(),l&&Ft(l)},[l,p]),N=o.useCallback(async C=>{await S.createAgent(C.definition.ref,{invocationName:C.invocationName}),d==null||d(C),i&&Ft(i)},[S,d,i]),w=o.useCallback(()=>{y(C=>C+1)},[]);return s.jsx(gs,{open:t,onClose:f,onStart:N,agentDefinitions:x,definitionsState:H,definitionsError:O,onRetryDefinitions:w,embedded:g})},Vn=t=>"agentDefinitionsUrl"in t,hs=t=>Vn(t)?s.jsx(Wn,{...t}):s.jsx(gs,{...t}),Yn=t=>t!==void 0&&t.some(e=>e.status===P.hitl),Xn=(t,e)=>Yn(e)?j.hitl:t.status,Zn=({column:t,label:e})=>t.statusIcon?s.jsx("span",{className:"agent-view__status-indicator",children:s.jsx(u.Icon,{name:t.statusIcon.name,size:16,color:t.statusIcon.color,className:q({"agent-view__progress-icon--spinning":t.statusIcon.spin}),screenReaderText:e})}):s.jsx("span",{className:q("agent-view__dot",{[`agent-view__dot--${t.dotModifier}`]:t.dotModifier}),children:s.jsx(u.Dot,{colour:t.dotColour,label:e})}),Qn=({agent:t,agentName:e,column:n,isExpanded:a,isLoading:r,checklist:l,error:i,onToggle:p,onViewAgent:d})=>{const{id:g,invocation_name:m}=t,S=`agent-card-${g}-header`,x=`agent-card-${g}-progress`;return s.jsx("li",{className:q("agent-view__card",{"agent-view__card--expanded":a}),children:s.jsxs(u.Card,{spacing:"dense",children:[s.jsx("button",{type:"button",className:"agent-view__card-toggle","aria-expanded":a,"aria-controls":x,"aria-label":m,id:S,onClick:()=>p(g),children:s.jsxs("div",{className:"agent-view__card-content",children:[s.jsx(Zn,{column:n}),s.jsx("span",{className:"agent-view__card-invocation-name",children:m}),s.jsx("span",{className:"agent-view__card-agent-name",children:e}),s.jsx(u.Icon,{name:a?"chevron-up":"chevron-down",size:16,className:"agent-view__card-chevron"})]})}),a&&s.jsxs("div",{id:x,"aria-labelledby":S,className:"agent-view__card-progress",children:[r&&s.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[s.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:ve}),s.jsx("span",{children:ve})]}),!r&&i&&s.jsx("p",{className:"agent-view__progress-error",role:"alert",children:i}),!r&&!i&&l!==null&&s.jsx(Zs,{checklist:l}),!r&&!i&&l===null&&s.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[s.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:ve}),s.jsx("span",{children:ve})]}),s.jsx("div",{className:"agent-view__card-actions",children:s.jsx(u.Button,{variant:"secondary",size:"S",onClick:()=>d==null?void 0:d(t),children:"View agent"})})]})]})})},Bt=({column:t,agents:e,expandedAgentId:n,loadingAgentId:a,checklistByInvocationId:r,errorByAgentId:l,definitionNameByRef:i,onToggleAgent:p,onViewAgent:d,isSplit:g=!1})=>s.jsxs("section",{className:q("agent-view__column",{"agent-view__column--split":g}),"aria-label":t.title,children:[s.jsxs("div",{className:"agent-view__column-header",children:[s.jsx(u.Heading,{level:4,children:t.title}),s.jsx("span",{className:"agent-view__column-count",children:e.length})]}),s.jsx("ul",{className:"agent-view__card-list",children:e.map(m=>s.jsx(Qn,{agent:m,agentName:ut(m,i),column:t,isExpanded:n===m.id,isLoading:a===m.id,checklist:r[m.invocation_id]??null,error:l[m.id]??null,onToggle:p,onViewAgent:d},m.id))})]}),ut=(t,e)=>e.get(t.agent_definition_ref)??t.agent_definition_ref.replace(/_/g," "),ea=({jwt:t,headers:e,agentDefinitionsUrl:n,agentsUrl:a,agentUrl:r,agentChecklistUrl:l,agentResourcesUrl:i,agentTimelineUrl:p,agentChatUrl:d,agentConversationUrl:g,stopAgentUrl:m,enableUpload:S,showHeader:x=!1,institutions:E,usePusherToRepoll:H=!1,pusherChannelPrefix:_=gt,subscribeToPusher:O})=>{var Ue;const b=o.useMemo(()=>({agentDefinitions:n,agents:a,agent:r,agentChecklist:l,...i?{agentResources:i}:{},...p?{agentTimeline:p}:{},agentChat:d,agentConversation:g}),[n,a,r,l,i,p,d,g]),[T,y]=o.useState(null),f=T?(Ue=E==null?void 0:E.find(h=>h.applicationId===T.application_id))==null?void 0:Ue.applicationUrl:void 0,N=o.useMemo(()=>{const h={...e??{}};return f?h[ge.arborApplicationUrl]=f:delete h[ge.arborApplicationUrl],h},[e,f]),{agents:w,agentDefinitions:C,loadState:M,loadError:ke,reload:R,refresh:D,fetchAgentChecklist:F,createAgent:K}=cs({jwt:t,headers:N,urls:b}),[W,L]=o.useState(!1),[Y,B]=o.useState(null),[Se,he]=o.useState(null),[re,pe]=o.useState({}),[Te,de]=o.useState({}),[V,ye]=o.useState([]),[me,X]=o.useState([]),Ie=o.useMemo(()=>{const h=new Set(w.map(k=>k.application_id)),A=new Map((E??[]).map(k=>[k.applicationId,k.name]));return[...h].sort((k,J)=>(A.get(k)??k).localeCompare(A.get(J)??J)).map(k=>({value:k,label:A.get(k)??k}))},[w,E]),Z=o.useMemo(()=>new Map(C.map(h=>[h.ref,h.display_name])),[C]),Oe=o.useMemo(()=>[...new Set(w.map(A=>ut(A,Z)))].sort((A,k)=>A.localeCompare(k)).map(A=>({value:A,label:A})),[w,Z]),Le=o.useMemo(()=>w.filter(h=>!(V.length>0&&!V.includes(h.application_id)||me.length>0&&!me.includes(ut(h,Z)))),[w,Z,me,V]),Pe=Ie.length>1,_e=Oe.length>1,We=Pe||_e;o.useEffect(()=>{const h=window.setInterval(()=>{D()},6e4);return()=>{window.clearInterval(h)}},[D]),o.useEffect(()=>{if(w.length===0)return;let h=!1;return(async()=>{const A=await Promise.allSettled(w.map(async k=>{const J=await F(k.invocation_id);return{agentId:k.id,invocationId:k.invocation_id,checklist:J.checklist}}));h||(pe(k=>{const J={...k};let se=!1;for(const Q of A){if(Q.status!=="fulfilled")continue;const{invocationId:oe,checklist:Me}=Q.value;JSON.stringify(k[oe])!==JSON.stringify(Me)&&(J[oe]=Me,se=!0)}return se?J:k}),de(k=>{const J={...k};let se=!1;return A.forEach((Q,oe)=>{Q.status==="rejected"&&J[w[oe].id]!==ze&&(J[w[oe].id]=ze,se=!0)}),se?J:k}))})(),()=>{h=!0}},[w,F]);const Ne=o.useCallback(async h=>{if(!re[h.invocation_id]){he(h.id),de(A=>{const k={...A};return delete k[h.id],k});try{const A=await F(h.invocation_id);pe(k=>({...k,[h.invocation_id]:A.checklist}))}catch{de(A=>({...A,[h.id]:ze}))}finally{he(A=>A===h.id?null:A)}}},[F,re]),Ve=o.useCallback(h=>{if(Y===h){B(null);return}const A=w.find(({id:k})=>k===h);A&&(B(h),Ne(A))},[w,Y,Ne]),Ae=o.useMemo(()=>{const h={};for(const A of Le){const k=Xn(A,re[A.invocation_id]);(h[k]??(h[k]=[])).push(A)}return h},[Le,re]),Ye=o.useCallback(h=>{y(h)},[]),be=o.useCallback(async h=>{const A=await K(h);y(A),L(!1)},[K]),Xe=o.useCallback(()=>{y(null)},[]),je={expandedAgentId:Y,loadingAgentId:Se,checklistByInvocationId:re,errorByAgentId:Te,definitionNameByRef:Z,onToggleAgent:Ve,onViewAgent:Ye};return s.jsxs("div",{className:"agent-view-frontend agent-view",children:[x&&s.jsxs("div",{className:"agent-view__header",children:[s.jsx(u.Heading,{level:1,children:"Agents"}),s.jsx(u.Button,{variant:"primary",size:"S",iconLeftName:"sparkles",iconLeftScreenReaderText:"Start an agent",onClick:()=>L(!0),children:"Start an agent"})]}),w.length>0&&We&&s.jsxs("div",{className:"agent-view__filters",children:[Pe&&s.jsxs("div",{className:"agent-view__filter",children:[s.jsx("label",{className:"agent-view__filter-label",htmlFor:"agent-view-institution-filter",children:"Institution"}),s.jsx(u.Combobox,{id:"agent-view-institution-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All institutions",options:Ie,value:V,onValueChange:ye,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear institutions"})]}),_e&&s.jsxs("div",{className:"agent-view__filter",children:[s.jsx("label",{className:"agent-view__filter-label",htmlFor:"agent-view-agent-filter",children:"Agent"}),s.jsx(u.Combobox,{id:"agent-view-agent-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All agents",options:Oe,value:me,onValueChange:X,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear agents"})]})]}),M==="error"?s.jsxs("div",{className:"agent-view__state agent-view__state--error",role:"alert",children:[s.jsx(u.Icon,{name:"triangle-alert",size:24,color:"var(--color-semantic-destructive-600)"}),s.jsx("p",{className:"agent-view__state-message",children:ke??qt}),s.jsx(u.Button,{variant:"secondary",size:"S",onClick:R,children:"Try again"})]}):M==="loading"&&w.length===0?s.jsxs("div",{className:"agent-view__state","aria-live":"polite",children:[s.jsx(u.Icon,{name:"loader",size:24,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:Tt}),s.jsx("p",{className:"agent-view__state-message",children:Tt})]}):w.length===0?s.jsx(qs,{}):s.jsxs("div",{className:"agent-view__board",children:[Rs.map(h=>s.jsx(Bt,{column:qe[h],agents:Ae[h]??[],...je},h)),s.jsx("div",{className:"agent-view__split-column",children:Ts.map(h=>s.jsx(Bt,{column:qe[h],agents:Ae[h]??[],isSplit:!0,...je},h))})]}),T&&s.jsx(us,{agent:T,invocationId:T.invocation_id,open:!0,jwt:t,headers:N,agentUrl:r,agentChecklistUrl:l,agentResourcesUrl:i,agentTimelineUrl:p,agentChatUrl:d,agentConversationUrl:g,stopAgentUrl:m,enableUpload:S,initialChecklist:re[T.invocation_id]??null,usePusherToRepoll:H,pusherChannelPrefix:_,subscribeToPusher:O,onClose:Xe},T.id),s.jsx(hs,{open:W,onClose:()=>L(!1),onStart:be,agentDefinitions:C})]})},ta=(t,e)=>{const n=Date.now(),a=e.trim()||t.agent_intent;return{id:`agent-${n}`,invocation_id:`inv-${n}`,agent_definition_ref:t.ref,agent_intent:t.agent_intent,invocation_name:a,application_id:Is,created_by:Os,status:j["generating-a-response"],context_ref:null,checklist_ref:null}};exports.AgentMonitorKanban=ea;exports.AgentServiceClient=Je;exports.AgentServiceError=we;exports.AgentView=us;exports.DEFAULT_PUSHER_CHANNEL_PREFIX=gt;exports.HttpChatConnector=is;exports.MESSAGE_TYPE_REPOLL=ct;exports.NewAgentModal=hs;exports.PUSHER_AGENT_MESSAGE_EVENT=Vt;exports.REPOLL_TARGET=ce;exports.buildAgentFromDefinition=ta;exports.buildAgentPusherChannel=Yt;exports.createHttpChatConnectorFactory=_t;exports.formatUserFileChatCardText=rs;exports.mapApiAgent=dt;exports.mapApiAgentDefinition=ht;exports.mapApiAgentStatus=Zt;exports.mapApiAgentTimelineResponse=ss;exports.mapApiChecklistEndpointResponse=mt;exports.mapApiChecklistItem=pt;exports.mapApiChecklistResponse=ns;exports.mapApiChecklistStatus=Qt;exports.mapApiConversationMessages=os;exports.mapApiOpeningMessage=Re;exports.mapApiResource=es;exports.mapApiResourcesEndpointResponse=ts;exports.mapApiTripOption=bn;exports.parseConversationContentCaption=as;exports.parseRepollMessages=Xt;exports.useAgentService=cs;exports.useAgentWorkspace=ds;
6
+ `);l=m.pop()??"";for(const S of m)p(S)}if(l.trim()&&p(l),!i)throw new we(502,null,"Chat stream ended without any events");return i}}const Ms=e=>{let t=null;const s=[];for(const a of e.split(`
7
+ `)){const r=a.trimEnd();r.startsWith("event:")?t=r.slice(6).trim():r.startsWith("data:")&&s.push(r.slice(5).trim())}return{event:t,data:s.length>0?s.join(`
8
+ `):null}},Dt=e=>{try{return JSON.parse(e)}catch{return}};function Ds(e,t){const s=new FormData;s.append("body",JSON.stringify(e));for(const a of t)s.append("files",a,a.name);return s}const $s={id:qt,author:te.agent,text:"Type a question or upload a file. You can ask it how it's progressing, or send an instruction and it'll act on it."};let $t=0;const Hs=e=>($t+=1,`${e}-${Date.now()}-${$t}`),Fs=e=>{const t=e.destination?` to ${e.destination}`:"";return`Let's get started on ${e.tripName.trim()||e.destination.trim()||"this task"}${t}. What will you do first?`};class ln{constructor(t,s,a={}){this.seededChecklist=[],this.client=t,this.agentId=s,this.chatId=a.chatId??s,this.opening=a.openingMessage??$s,this.model=a.model}openingMessage(){return this.opening}async bootstrapConversation(){const t=await this.client.getConversation(this.chatId),s=on(t.messages);return s.length===0?[this.opening]:s}async start(t){return{...await this.exchange(Fs(t)),phase:$.running}}sendMessage(t,s){return this.exchange(t,s)}async stop(){await this.client.cancelAgent(this.agentId)}seedChecklist(t){this.seededChecklist=t}async exchange(t,s){var i;const a=[{role:As.user,content:t}],r=await this.client.chat(this.agentId,{messages:a,chat_id:this.chatId,...this.model?{model:this.model}:{},moderation_enabled:!0,meta:{feature_id:"agent_view",source:"agent_view_frontend"}},...s&&s.length>0?[{uploadFiles:s}]:[]),l={id:r.event_id||Hs("msg-agent"),author:te.agent,text:r.message.content,...(i=r.follow_up_prompts)!=null&&i.length?{followUpPrompts:r.follow_up_prompts}:{}};try{const p=await this.client.getAgent(this.agentId),{checklist:d}=rn(this.agentId,p);return this.seededChecklist=d,{message:l,checklist:d}}catch{return{message:l,...this.seededChecklist.length?{checklist:this.seededChecklist}:{}}}}}const _t=(e,t)=>s=>{var a,r;return new ln(e,s.invocation_id,{model:t==null?void 0:t.model,chatId:((a=t==null?void 0:t.resolveChatId)==null?void 0:a.call(t,s))??(t==null?void 0:t.chatId)??s.invocation_id,openingMessage:((r=t==null?void 0:t.resolveOpeningMessage)==null?void 0:r.call(t,s))??(t==null?void 0:t.openingMessage)})},cn=e=>e instanceof we?e.message:e instanceof TypeError?"Network error while contacting the agent service.":e instanceof Error&&e.message?e.message:Jt,Bs=e=>{const t={};for(const s of e){const a=Re(s);if(!a)continue;const r=s.invocation_id??s.id;t[r]=a,t[s.id]=a}return t},Gs=e=>JSON.stringify(e),it=(e,t)=>JSON.stringify(e)===JSON.stringify(t),dn=e=>{const{jwt:t,headers:s,urls:a}=e,r=JSON.stringify(s??{}),l=Gs(a),i=o.useMemo(()=>new Je({token:t,headers:s,urls:a}),[t,l]);o.useLayoutEffect(()=>{i.setHeaders(s)},[i,r]);const[p,d]=o.useState([]),[g,m]=o.useState([]),[S,x]=o.useState({}),[E,H]=o.useState("loading"),[_,O]=o.useState(null),[b,T]=o.useState(0),y=o.useCallback((R,D)=>{const F=R.map(dt),K=D.map(ht),W=Bs(R);d(L=>it(L,F)?L:F),m(L=>it(L,K)?L:K),x(L=>it(L,W)?L:W),H("idle"),O(null)},[]);o.useEffect(()=>{let R=!1;return H("loading"),O(null),(async()=>{try{const[D,F]=await Promise.all([i.listAgents(),i.listAgentDefinitions()]);if(R)return;y(D,F)}catch(D){if(R)return;d([]),m([]),x({}),H("error"),O(cn(D))}})(),()=>{R=!0}},[y,i,b]);const f=o.useCallback(()=>{T(R=>R+1)},[]),N=o.useCallback(async()=>{try{const[R,D]=await Promise.all([i.listAgents(),i.listAgentDefinitions()]);y(R,D)}catch{}},[y,i]),w=o.useCallback(async R=>{const[D,F]=await Promise.all([i.getAgentChecklist(R),i.getAgent(R).catch(()=>null)]);return mt(R,D,F??void 0)},[i]),C=o.useCallback(async R=>i.listAllAgentResources(R),[i]),M=o.useCallback(async({definition:R,invocationName:D})=>{const F=await i.createAgent(R.ref,{invocationName:D}),K=await i.getAgent(F.id),W=dt(K),L=Re(K);return d(Y=>[W,...Y]),L&&x(Y=>({...Y,[W.invocation_id]:L,[W.id]:L})),W},[i]),ke=o.useMemo(()=>_t(i,{resolveOpeningMessage:R=>S[R.invocation_id]??S[R.id]}),[i,S]);return{agents:p,agentDefinitions:g,loadState:E,loadError:_,reload:f,refresh:N,fetchAgentChecklist:w,fetchAgentResources:C,createAgent:M,chatConnector:ke}},zs=e=>JSON.stringify(e),un=e=>{const{agent:t,jwt:s,headers:a,urls:r,chatId:l}=e,i=JSON.stringify(a??{}),p=zs(r),d=o.useMemo(()=>new Je({token:s,headers:a,urls:{agent:r.agentUrl,agentChecklist:r.agentChecklistUrl,...r.agentResourcesUrl?{agentResources:r.agentResourcesUrl}:{},...r.agentTimelineUrl?{agentTimeline:r.agentTimelineUrl}:{},agentChat:r.agentChatUrl,agentConversation:r.agentConversationUrl,...r.stopAgentUrl?{stopAgent:r.stopAgentUrl}:{}}}),[s,p]);o.useLayoutEffect(()=>{d.setHeaders(a)},[d,i]);const g=o.useCallback(async _=>{const[O,b]=await Promise.all([d.getAgentChecklist(_),d.getAgent(_).catch(()=>null)]);return mt(_,O,b??void 0)},[d]),m=o.useCallback(async _=>d.listAllAgentResources(_),[d]),S=o.useCallback(async(_,O)=>d.getAgentResourceHtml(_,O),[d]),x=o.useCallback(async _=>{const O=await d.getAgentTimeline(_);return an(O)},[d]),E=o.useCallback(async(_,O)=>{await d.updateAgent(_,{invocationName:O})},[d]);return{connector:o.useMemo(()=>_t(d,{chatId:l??t.invocation_id})(t),[d,t.invocation_id,l]),fetchAgentChecklist:g,fetchAgentResources:m,fetchAgentResourceHtml:S,fetchAgentTimeline:x,updateAgentInvocationName:E}},qs=3e4,Ks=(e,t)=>{const s=e.hasRunBefore?t||"This trip":e.tripName.trim()||"A new trip",a=e.destination?` to ${e.destination}`:"",r=e.hasRunBefore?" It has run before.":"";return`${s}${a}.${r}`.trim()},Js=e=>{switch(e){case j.failed:return $.stopped;case j.complete:return $.complete;default:return $.running}},Ht=(e,t)=>{t([fe(e)])},Ws=(e,t)=>e.length===t.length&&e.every((s,a)=>{const r=t[a];return r!==void 0&&s.id===r.id&&s.text===r.text}),gn=({agent:e,invocationId:t,open:s,onClose:a,jwt:r,headers:l,agentUrl:i,agentChecklistUrl:p,agentResourcesUrl:d,agentTimelineUrl:g,agentChatUrl:m,agentConversationUrl:S,stopAgentUrl:x,chatId:E,enableUpload:H,initialBrief:_,initialPhase:O,initialChecklist:b,usePusherToRepoll:T=!1,pusherChannelPrefix:y=gt,subscribeToPusher:f})=>{const[N,w]=o.useState(E??t),[C,M]=o.useState("chat"),[ke,R]=o.useState(!1),{connector:D,fetchAgentChecklist:F,fetchAgentResources:K,fetchAgentResourceHtml:W,fetchAgentTimeline:L,updateAgentInvocationName:Y}=un({agent:{...e,invocation_id:t},jwt:r,headers:l,chatId:N,urls:{agentUrl:i,agentChecklistUrl:p,agentResourcesUrl:d,agentTimelineUrl:g,agentChatUrl:m,agentConversationUrl:S,stopAgentUrl:x}}),B=o.useRef(D),[Se,he]=o.useState(e.invocation_name),[re,pe]=o.useState(0),[Te,de]=o.useState(null),[V,ye]=o.useState(O??(_?$.running:Js(e.status))),[me,X]=o.useState([]),[Ie,Z]=o.useState(0),[Oe,Le]=o.useState(),[Pe,_e]=o.useState(null),[We,Ne]=o.useState([]),[Ve,Ae]=o.useState(!1),[Ye,be]=o.useState(null),[Xe,je]=o.useState(null),[Ue,h]=o.useState(null),[A,k]=o.useState(!1),[J,ne]=o.useState(null),[Q,oe]=o.useState(null),[Me,ft]=o.useState(!1),[mn,Ze]=o.useState(null),[Qe,De]=o.useState(b??null),[_n,vt]=o.useState(!1),[fn,et]=o.useState(null),[wt,xt]=o.useState(!1),[kt,St]=o.useState(null),[$e,tt]=o.useState(!1),[He,vn]=o.useState(!1),[Fe,wn]=o.useState(!1),yt=o.useRef($e),Nt=o.useRef(e.invocation_name),At=o.useRef(0),bt=o.useRef(0);o.useEffect(()=>{B.current=D},[D]),o.useEffect(()=>{Nt.current=e.invocation_name},[e.invocation_name]),o.useEffect(()=>{yt.current=$e},[$e]),o.useEffect(()=>{w(E??t),M("chat"),R(!1),X([]),Z(c=>c+1),de(null)},[t,E]),o.useEffect(()=>{he(e.invocation_name),pe(c=>c+1)},[e.invocation_name]),o.useEffect(()=>{if(!s||_)return;const c=B.current.bootstrapConversation;if(!c){Ht(B.current.openingMessage(),X);return}let v=!1;return tt(!0),(async()=>{try{const I=await c.call(B.current);if(v)return;X(I.map(fe))}catch{v||Ht(B.current.openingMessage(),X)}finally{v||tt(!1)}})(),()=>{v=!0}},[s,_,t,N]);const se=o.useCallback(()=>{const c=++At.current;(async()=>{var v,I;try{const z=await F(t);if(c!==At.current)return;De(ie=>JSON.stringify(ie)===JSON.stringify(z.checklist)?ie:z.checklist),et(null),(I=(v=B.current).seedChecklist)==null||I.call(v,z.checklist)}catch{}})()},[F,t]),ue=o.useCallback(()=>{d&&(async()=>{try{const c=await K(t);Ne(c),be(null)}catch{}})()},[d,K,t]),ae=o.useCallback(()=>{if(!g)return;const c=++bt.current;(async()=>{try{const v=await L(t);if(c!==bt.current)return;oe(I=>JSON.stringify(I)===JSON.stringify(v)?I:v),Ze(null)}catch{}})()},[g,L,t]),Ce=o.useCallback(c=>{const v=B.current.bootstrapConversation;v&&(async()=>{try{const I=await v.call(B.current);if(yt.current)return;const z=I.map(fe);let ie=!1;X(Et=>Ws(Et,z)?Et:(ie=!0,z)),ie&&(c!=null&&c.refreshSidePanelsOnChange)&&(se(),ae())}catch{}})()},[se,ae]),xn=o.useCallback(c=>{switch(c){case ce.checklist:se();return;case ce.resources:ue();return;case ce.chat:Ce();return;case ce.timeline:ae();return;case ce.all:default:se(),ue(),Ce(),ae()}},[se,Ce,ue,ae]),jt=Ss({enabled:s&&T,channelPrefix:y,agentId:e.id,subscribeToPusher:f,onRepoll:xn});o.useEffect(()=>{if(!s||_||jt)return;const c=window.setInterval(()=>{Ce({refreshSidePanelsOnChange:!0})},qs);return()=>{window.clearInterval(c)}},[s,_,jt,t,N,Ce]);const kn=o.useCallback(c=>{var v,I;c.checklist?(De(c.checklist),(I=(v=B.current).seedChecklist)==null||I.call(v,c.checklist)):se(),c.phase&&ye(c.phase),ue(),ae()},[se,ue,ae]);o.useEffect(()=>{var c,v;!s||_||b&&b.length>0&&((v=(c=B.current).seedChecklist)==null||v.call(c,b))},[s,_,b]),o.useEffect(()=>{if(!s||_)return;let c=!1;return vt(v=>b!=null&&b.length?!1:v||Qe===null||Qe.length===0),et(null),(async()=>{var v,I;try{const z=await F(t);if(c)return;b!=null&&b.length||(De(z.checklist),(I=(v=B.current).seedChecklist)==null||I.call(v,z.checklist))}catch{!c&&!(b!=null&&b.length)&&et(ze)}finally{c||vt(!1)}})(),()=>{c=!0}},[s,t,_,b,F]),o.useEffect(()=>{if(!s||!d)return;let c=!1;return Ae(!0),be(null),(async()=>{try{const v=await K(t);c||Ne(v)}catch{c||be(Ln)}finally{c||Ae(!1)}})(),()=>{c=!0}},[s,t,d,K]);const Sn=o.useCallback(()=>{je(null),h(null),ne(null),k(!1)},[]),yn=o.useCallback(c=>{if(c.misRecordUrl){window.open(c.misRecordUrl,"_blank","noopener,noreferrer");return}je(c),h(null),ne(null),k(!0),(async()=>{try{const v=await W(t,c.id);h(v)}catch{ne(Pn)}finally{k(!1)}})()},[W,t]);o.useEffect(()=>{if(!s||!g)return;let c=!1;return ft(v=>v||Q===null),Ze(null),(async()=>{try{const v=await L(t);c||oe(v)}catch{c||Ze(Kt)}finally{c||ft(!1)}})(),()=>{c=!0}},[s,t,g,L]),o.useEffect(()=>{if(!s||!_)return;let c=!1;const v={id:`user-brief-${Date.now()}`,author:te.user,text:Ks(_,Nt.current)};return(async()=>{var z,ie;const I=await B.current.start(_);c||(X([fe(B.current.openingMessage()),fe(v),fe(I.message)]),I.checklist?(De(I.checklist),(ie=(z=B.current).seedChecklist)==null||ie.call(z,I.checklist)):se(),ye(I.phase??$.running),ue(),ae())})(),()=>{c=!0}},[s,_,t,se,ue,ae]);const Nn=o.useCallback(c=>{_e(_s(c))},[]),nt=E??t,Be=Q==null?void 0:Q.chatSessions,Ct=Be!=null&&Be.length?Be.reduce((c,v)=>Date.parse(v.timestamp)<Date.parse(c.timestamp)?v:c).sessionId:void 0,st=o.useCallback(()=>{M("chat"),R(!1),N!==nt&&(w(nt),X([]),Z(c=>c+1))},[N,nt]),An=o.useCallback(c=>{if(c===Ct){st();return}w(c),R(!0),M("chat"),X([]),Z(v=>v+1)},[Ct,st]),bn=o.useCallback(c=>{_e(null),Le(c),Z(v=>v+1)},[]),jn=o.useCallback(async()=>{St(null),xt(!0);try{await B.current.stop(),ye($.stopped)}catch{St(Un)}finally{xt(!1)}},[]),Cn=o.useCallback(c=>{const v=c.trim(),I=Se;if(de(null),!v){pe(z=>z+1);return}v!==I&&(he(v),(async()=>{try{await Y(t,v)}catch{he(I),pe(z=>z+1),de(Mn)}})())},[Se,t,Y]),En=Qe;return n.jsxs(u.Modal,{open:s,closeHandler:a,hideCloseButton:!0,className:"agent-workspace",children:[n.jsxs(u.Modal.Header,{className:"agent-workspace__header",children:[n.jsxs("div",{className:"agent-workspace__header-title",children:[n.jsx("span",{className:"agent-workspace__header-avatar","aria-hidden":"true",children:n.jsx(u.Icon,{name:"ask-arbor",size:24})}),n.jsx(u.Modal.Title,{children:n.jsx(u.EditableText,{className:"agent-workspace__header-name",text:Se,onEditSave:Cn},re)}),n.jsx("span",{className:q("agent-workspace__phase",`agent-workspace__phase--${V}`),children:Hn[V]}),Te&&n.jsx("p",{className:"agent-workspace__error agent-workspace__name-error",role:"alert",children:Te})]}),n.jsxs("div",{className:"agent-workspace__header-actions",children:[n.jsx(u.Button,{variant:He?"secondary":"primary",size:"S",iconLeftName:"clipboard-list",iconLeftScreenReaderText:"Toggle checklist","aria-pressed":!He,onClick:()=>vn(c=>!c),children:"Checklist"}),n.jsx(u.Button,{variant:Fe?"secondary":"primary",size:"S",iconLeftName:"files",iconLeftScreenReaderText:"Toggle resources","aria-pressed":!Fe,onClick:()=>wn(c=>!c),children:"Resources"}),n.jsx(u.Button,{variant:"secondary",size:"S",iconLeftName:"x",iconLeftScreenReaderText:"Close",onClick:a,children:"Close"})]})]}),n.jsxs(u.Modal.Body,{className:q("agent-workspace__body",{"agent-workspace__body--no-checklist":He,"agent-workspace__body--no-resources":Fe}),children:[n.jsxs("section",{className:q("agent-workspace__panel","agent-workspace__panel--chat",{"agent-workspace__panel--timeline":!!g&&C==="timeline"}),"aria-label":"Agent",children:[n.jsxs("div",{className:"agent-workspace__panel-header",children:[n.jsx(u.Heading,{level:4,children:"Agent"}),x&&V===$.running&&n.jsx(u.Button,{className:"agent-workspace__panel-header-action",variant:"secondary-destructive",size:"S",iconLeftName:"circle-x",iconLeftScreenReaderText:"Stop",disabled:wt,onClick:()=>void jn(),children:wt?"Stopping…":"Stop agent"})]}),kt&&n.jsx("p",{className:"agent-workspace__error agent-workspace__stop-error",role:"alert",children:kt}),g&&n.jsxs(u.Tabs,{className:"agent-workspace__center-tabs","aria-label":"Center panel",children:[n.jsx(u.Tabs.Item,{active:C==="chat",tabElementProps:{id:"agent-center-tab-chat",onClick:()=>M("chat")},children:"Chat"}),n.jsx(u.Tabs.Item,{active:C==="timeline",tabElementProps:{id:"agent-center-tab-timeline",onClick:()=>M("timeline")},children:"Timeline"})]}),g&&C==="chat"&&ke&&n.jsx("div",{className:"agent-workspace__center-back",children:n.jsx(u.Button,{variant:"tertiary",size:"S",iconLeftName:"arrow-left",iconLeftScreenReaderText:"Back to main chat",onClick:st,children:"Back to main chat"})}),g&&C==="timeline"&&n.jsx(ps,{timeline:Q,isLoading:Me,error:mn,onOpenChatSession:An}),n.jsx("div",{className:"agent-workspace__chat-keep-alive",hidden:!!g&&C!=="chat",children:n.jsx(ts,{connector:D,phase:V,chatHistory:me,chatSessionKey:Ie,startQuery:Oe,clarificationMessage:Pe,enableUpload:H,onTurn:kn,onAwaitingChange:tt,onClarificationPrompt:bn,onDismissClarification:()=>_e(null)})})]}),!He&&n.jsx(ns,{checklist:En,isLoading:_n,error:fn,phase:V,canRequestInput:V===$.running&&!$e,onAttentionItemClick:Nn}),!Fe&&n.jsx(rs,{resources:We,isLoading:Ve,error:Ye,onOpenResource:yn}),n.jsx(ss,{resource:Xe,html:Ue,isLoading:A,error:J,onClose:Sn})]})]})},Vs="Unable to load agent definitions. Please try again.",Ys="Unable to start the agent.",Ft="Loading agents…",hn=({open:e,onClose:t,onStart:s,agentDefinitions:a,definitionsState:r="idle",definitionsError:l=null,onRetryDefinitions:i,embedded:p=!1})=>{const[d,g]=o.useState(void 0),[m,S]=o.useState(""),[x,E]=o.useState(!1),[H,_]=o.useState(null),O=[...a].sort((w,C)=>w.display_name.localeCompare(C.display_name)).map(w=>({value:w.ref,label:w.display_name}));o.useEffect(()=>{e&&(g(void 0),S(""),E(!1),_(null))},[e]);const b=d!==void 0&&m.trim().length>0,T=o.useCallback(w=>{const C=a.find(M=>M.ref===w[0]);C&&g(C)},[a]),y=o.useCallback(async()=>{if(!(!d||!b||x)){E(!0),_(null);try{await s({definition:d,invocationName:m.trim()})}catch(w){_(w instanceof Error?w.message:Ys)}finally{E(!1)}}},[b,d,m,x,s]);if(r==="idle"&&a.length===0||!e)return null;const f=n.jsxs("div",{className:"new-agent__header-title",children:[n.jsx("span",{className:"new-agent__header-avatar","aria-hidden":"true",children:n.jsx(u.Icon,{name:"ask-arbor",size:24})}),p?n.jsx("h2",{className:"new-agent__title",children:"Start an agent"}):n.jsx(u.Modal.Title,{children:"Start an agent"})]});let N;return r==="loading"?N=n.jsxs("div",{className:"new-agent__state","aria-live":"polite",children:[n.jsx(u.Icon,{name:"loader",size:24,color:"var(--color-brand-600)",className:"new-agent__spinner",screenReaderText:Ft}),n.jsx("p",{className:"new-agent__state-message",children:Ft})]}):r==="error"?N=n.jsxs("div",{className:"new-agent__state new-agent__state--error",role:"alert",children:[n.jsx(u.Icon,{name:"triangle-alert",size:24,color:"var(--color-semantic-destructive-600)"}),n.jsx("p",{className:"new-agent__state-message",children:l??Vs}),i?n.jsx(u.Button,{variant:"secondary",size:"S",onClick:i,children:"Try again"}):null]}):N=n.jsxs("form",{className:"new-agent__form","aria-label":"Start an agent",onSubmit:w=>{w.preventDefault(),b&&!x&&y()},children:[n.jsxs("div",{className:"new-agent__type-field",children:[n.jsx("label",{className:"new-agent__type-label",htmlFor:"new-agent-type",children:"What would you like your agent to do?"}),n.jsx(u.SelectDropdown,{id:"new-agent-type",placeholder:"Which agent would you like to start?",options:O,selectedValues:d?[d.ref]:[],onSelectionChange:T})]}),n.jsxs("div",{className:"new-agent__type-field",children:[n.jsx("label",{className:"new-agent__type-label",htmlFor:"new-agent-invocation-name",children:"Name"}),n.jsx(u.TextInput,{id:"new-agent-invocation-name",value:m,placeholder:"What would you like to call your agent?",onChange:w=>S(w.target.value)})]}),H?n.jsx("p",{className:"new-agent__error",role:"alert",children:H}):null,n.jsx("div",{className:"new-agent__actions",children:n.jsx(u.Button,{type:"submit",variant:"primary",className:q("new-agent__start-button",{"new-agent__start-button--starting":x}),disabled:!b||x,iconLeftName:x?"loader":"sparkles",iconLeftScreenReaderText:x?"Starting":void 0,children:x?"Starting…":"Start"})})]}),p?n.jsxs("div",{className:q("new-agent","new-agent--embedded"),children:[n.jsx("div",{className:"new-agent__header",children:f}),n.jsx("div",{className:"new-agent__body",children:N})]}):n.jsxs(u.Modal,{open:e,closeHandler:t,className:"new-agent",children:[n.jsx(u.Modal.Header,{className:"new-agent__header",children:f}),n.jsx(u.Modal.Body,{className:"new-agent__body",children:N})]})},Bt=e=>{window.location.assign(e)},Xs=({open:e,authToken:t,headers:s,agentDefinitionsUrl:a,agentsUrl:r,closeUrl:l,successUrl:i,onClose:p,onStart:d,embedded:g=!1})=>{const m=JSON.stringify(s??{}),S=o.useMemo(()=>new Je({token:t,headers:s,urls:{agentDefinitions:a,agents:r}}),[t,a,r,m]),[x,E]=o.useState([]),[H,_]=o.useState("loading"),[O,b]=o.useState(null),[T,y]=o.useState(0);o.useEffect(()=>{if(!e)return;let C=!1;return _("loading"),b(null),(async()=>{try{const M=await S.listAgentDefinitions();if(C)return;E(M.map(ht)),_("idle")}catch(M){if(C)return;E([]),b(cn(M)),_("error")}})(),()=>{C=!0}},[S,e,T]);const f=o.useCallback(()=>{p==null||p(),l&&Bt(l)},[l,p]),N=o.useCallback(async C=>{await S.createAgent(C.definition.ref,{invocationName:C.invocationName}),d==null||d(C),i&&Bt(i)},[S,d,i]),w=o.useCallback(()=>{y(C=>C+1)},[]);return n.jsx(hn,{open:e,onClose:f,onStart:N,agentDefinitions:x,definitionsState:H,definitionsError:O,onRetryDefinitions:w,embedded:g})},Zs=e=>"agentDefinitionsUrl"in e,pn=e=>Zs(e)?n.jsx(Xs,{...e}):n.jsx(hn,{...e}),Qs=e=>e!==void 0&&e.some(t=>t.status===P.hitl),ea=(e,t)=>Qs(t)?j.hitl:e.status,ta=({column:e,label:t})=>e.statusIcon?n.jsx("span",{className:"agent-view__status-indicator",children:n.jsx(u.Icon,{name:e.statusIcon.name,size:16,color:e.statusIcon.color,className:q({"agent-view__progress-icon--spinning":e.statusIcon.spin}),screenReaderText:t})}):n.jsx("span",{className:q("agent-view__dot",{[`agent-view__dot--${e.dotModifier}`]:e.dotModifier}),children:n.jsx(u.Dot,{colour:e.dotColour,label:t})}),na=({agent:e,agentName:t,column:s,isExpanded:a,isLoading:r,checklist:l,error:i,onToggle:p,onViewAgent:d})=>{const{id:g,invocation_name:m}=e,S=`agent-card-${g}-header`,x=`agent-card-${g}-progress`;return n.jsx("li",{className:q("agent-view__card",{"agent-view__card--expanded":a}),children:n.jsxs(u.Card,{spacing:"dense",children:[n.jsx("button",{type:"button",className:"agent-view__card-toggle","aria-expanded":a,"aria-controls":x,"aria-label":m,id:S,onClick:()=>p(g),children:n.jsxs("div",{className:"agent-view__card-content",children:[n.jsx(ta,{column:s}),n.jsx("span",{className:"agent-view__card-invocation-name",children:m}),n.jsx("span",{className:"agent-view__card-agent-name",children:t}),n.jsx(u.Icon,{name:a?"chevron-up":"chevron-down",size:16,className:"agent-view__card-chevron"})]})}),a&&n.jsxs("div",{id:x,"aria-labelledby":S,className:"agent-view__card-progress",children:[r&&n.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[n.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:ve}),n.jsx("span",{children:ve})]}),!r&&i&&n.jsx("p",{className:"agent-view__progress-error",role:"alert",children:i}),!r&&!i&&l!==null&&n.jsx(Zn,{checklist:l}),!r&&!i&&l===null&&n.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[n.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:ve}),n.jsx("span",{children:ve})]}),n.jsx("div",{className:"agent-view__card-actions",children:n.jsx(u.Button,{variant:"secondary",size:"S",onClick:()=>d==null?void 0:d(e),children:"View agent"})})]})]})})},Gt=({column:e,agents:t,expandedAgentId:s,loadingAgentId:a,checklistByInvocationId:r,errorByAgentId:l,definitionNameByRef:i,onToggleAgent:p,onViewAgent:d,isSplit:g=!1})=>n.jsxs("section",{className:q("agent-view__column",{"agent-view__column--split":g}),"aria-label":e.title,children:[n.jsxs("div",{className:"agent-view__column-header",children:[n.jsx(u.Heading,{level:4,children:e.title}),n.jsx("span",{className:"agent-view__column-count",children:t.length})]}),n.jsx("ul",{className:"agent-view__card-list",children:t.map(m=>n.jsx(na,{agent:m,agentName:ut(m,i),column:e,isExpanded:s===m.id,isLoading:a===m.id,checklist:r[m.invocation_id]??null,error:l[m.id]??null,onToggle:p,onViewAgent:d},m.id))})]}),ut=(e,t)=>t.get(e.agent_definition_ref)??e.agent_definition_ref.replace(/_/g," "),sa=({jwt:e,headers:t,agentDefinitionsUrl:s,agentsUrl:a,agentUrl:r,agentChecklistUrl:l,agentResourcesUrl:i,agentTimelineUrl:p,agentChatUrl:d,agentConversationUrl:g,stopAgentUrl:m,enableUpload:S,showHeader:x=!1,institutions:E,usePusherToRepoll:H=!1,pusherChannelPrefix:_=gt,subscribeToPusher:O})=>{var Ue;const b=o.useMemo(()=>({agentDefinitions:s,agents:a,agent:r,agentChecklist:l,...i?{agentResources:i}:{},...p?{agentTimeline:p}:{},agentChat:d,agentConversation:g}),[s,a,r,l,i,p,d,g]),[T,y]=o.useState(null),f=T?(Ue=E==null?void 0:E.find(h=>h.applicationId===T.application_id))==null?void 0:Ue.applicationUrl:void 0,N=o.useMemo(()=>{const h={...t??{}};return f?h[ge.arborApplicationUrl]=f:delete h[ge.arborApplicationUrl],h},[t,f]),{agents:w,agentDefinitions:C,loadState:M,loadError:ke,reload:R,refresh:D,fetchAgentChecklist:F,createAgent:K}=dn({jwt:e,headers:N,urls:b}),[W,L]=o.useState(!1),[Y,B]=o.useState(null),[Se,he]=o.useState(null),[re,pe]=o.useState({}),[Te,de]=o.useState({}),[V,ye]=o.useState([]),[me,X]=o.useState([]),Ie=o.useMemo(()=>{const h=new Set(w.map(k=>k.application_id)),A=new Map((E??[]).map(k=>[k.applicationId,k.name]));return[...h].sort((k,J)=>(A.get(k)??k).localeCompare(A.get(J)??J)).map(k=>({value:k,label:A.get(k)??k}))},[w,E]),Z=o.useMemo(()=>new Map(C.map(h=>[h.ref,h.display_name])),[C]),Oe=o.useMemo(()=>[...new Set(w.map(A=>ut(A,Z)))].sort((A,k)=>A.localeCompare(k)).map(A=>({value:A,label:A})),[w,Z]),Le=o.useMemo(()=>w.filter(h=>!(V.length>0&&!V.includes(h.application_id)||me.length>0&&!me.includes(ut(h,Z)))),[w,Z,me,V]),Pe=Ie.length>1,_e=Oe.length>1,We=Pe||_e;o.useEffect(()=>{const h=window.setInterval(()=>{D()},6e4);return()=>{window.clearInterval(h)}},[D]),o.useEffect(()=>{if(w.length===0)return;let h=!1;return(async()=>{const A=await Promise.allSettled(w.map(async k=>{const J=await F(k.invocation_id);return{agentId:k.id,invocationId:k.invocation_id,checklist:J.checklist}}));h||(pe(k=>{const J={...k};let ne=!1;for(const Q of A){if(Q.status!=="fulfilled")continue;const{invocationId:oe,checklist:Me}=Q.value;JSON.stringify(k[oe])!==JSON.stringify(Me)&&(J[oe]=Me,ne=!0)}return ne?J:k}),de(k=>{const J={...k};let ne=!1;return A.forEach((Q,oe)=>{Q.status==="rejected"&&J[w[oe].id]!==ze&&(J[w[oe].id]=ze,ne=!0)}),ne?J:k}))})(),()=>{h=!0}},[w,F]);const Ne=o.useCallback(async h=>{if(!re[h.invocation_id]){he(h.id),de(A=>{const k={...A};return delete k[h.id],k});try{const A=await F(h.invocation_id);pe(k=>({...k,[h.invocation_id]:A.checklist}))}catch{de(A=>({...A,[h.id]:ze}))}finally{he(A=>A===h.id?null:A)}}},[F,re]),Ve=o.useCallback(h=>{if(Y===h){B(null);return}const A=w.find(({id:k})=>k===h);A&&(B(h),Ne(A))},[w,Y,Ne]),Ae=o.useMemo(()=>{const h={};for(const A of Le){const k=ea(A,re[A.invocation_id]);(h[k]??(h[k]=[])).push(A)}return h},[Le,re]),Ye=o.useCallback(h=>{y(h)},[]),be=o.useCallback(async h=>{const A=await K(h);y(A),L(!1)},[K]),Xe=o.useCallback(()=>{y(null)},[]),je={expandedAgentId:Y,loadingAgentId:Se,checklistByInvocationId:re,errorByAgentId:Te,definitionNameByRef:Z,onToggleAgent:Ve,onViewAgent:Ye};return n.jsxs("div",{className:"agent-view-frontend agent-view",children:[x&&n.jsxs("div",{className:"agent-view__header",children:[n.jsx(u.Heading,{level:1,children:"Agents"}),n.jsx(u.Button,{variant:"primary",size:"S",iconLeftName:"sparkles",iconLeftScreenReaderText:"Start an agent",onClick:()=>L(!0),children:"Start an agent"})]}),w.length>0&&We&&n.jsxs("div",{className:"agent-view__filters",children:[Pe&&n.jsxs("div",{className:"agent-view__filter",children:[n.jsx("label",{className:"agent-view__filter-label",htmlFor:"agent-view-institution-filter",children:"Institution"}),n.jsx(u.Combobox,{id:"agent-view-institution-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All institutions",options:Ie,value:V,onValueChange:ye,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear institutions"})]}),_e&&n.jsxs("div",{className:"agent-view__filter",children:[n.jsx("label",{className:"agent-view__filter-label",htmlFor:"agent-view-agent-filter",children:"Agent"}),n.jsx(u.Combobox,{id:"agent-view-agent-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All agents",options:Oe,value:me,onValueChange:X,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear agents"})]})]}),M==="error"?n.jsxs("div",{className:"agent-view__state agent-view__state--error",role:"alert",children:[n.jsx(u.Icon,{name:"triangle-alert",size:24,color:"var(--color-semantic-destructive-600)"}),n.jsx("p",{className:"agent-view__state-message",children:ke??Jt}),n.jsx(u.Button,{variant:"secondary",size:"S",onClick:R,children:"Try again"})]}):M==="loading"&&w.length===0?n.jsxs("div",{className:"agent-view__state","aria-live":"polite",children:[n.jsx(u.Icon,{name:"loader",size:24,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:Tt}),n.jsx("p",{className:"agent-view__state-message",children:Tt})]}):w.length===0?n.jsx(qn,{}):n.jsxs("div",{className:"agent-view__board",children:[Rn.map(h=>n.jsx(Gt,{column:qe[h],agents:Ae[h]??[],...je},h)),n.jsx("div",{className:"agent-view__split-column",children:Tn.map(h=>n.jsx(Gt,{column:qe[h],agents:Ae[h]??[],isSplit:!0,...je},h))})]}),T&&n.jsx(gn,{agent:T,invocationId:T.invocation_id,open:!0,jwt:e,headers:N,agentUrl:r,agentChecklistUrl:l,agentResourcesUrl:i,agentTimelineUrl:p,agentChatUrl:d,agentConversationUrl:g,stopAgentUrl:m,enableUpload:S,initialChecklist:re[T.invocation_id]??null,usePusherToRepoll:H,pusherChannelPrefix:_,subscribeToPusher:O,onClose:Xe},T.id),n.jsx(pn,{open:W,onClose:()=>L(!1),onStart:be,agentDefinitions:C})]})},aa=(e,t)=>{const s=Date.now(),a=t.trim()||e.agent_intent;return{id:`agent-${s}`,invocation_id:`inv-${s}`,agent_definition_ref:e.ref,agent_intent:e.agent_intent,invocation_name:a,application_id:In,created_by:On,status:j["generating-a-response"],context_ref:null,checklist_ref:null}};exports.AgentMonitorKanban=sa;exports.AgentServiceClient=Je;exports.AgentServiceError=we;exports.AgentView=gn;exports.DEFAULT_PUSHER_CHANNEL_PREFIX=gt;exports.HttpChatConnector=ln;exports.MESSAGE_TYPE_REPOLL=ct;exports.NewAgentModal=pn;exports.PUSHER_AGENT_MESSAGE_EVENT=Xt;exports.REPOLL_TARGET=ce;exports.buildAgentFromDefinition=aa;exports.buildAgentPusherChannel=Zt;exports.createHttpChatConnectorFactory=_t;exports.formatUserFileChatCardText=Is;exports.mapApiAgent=dt;exports.mapApiAgentDefinition=ht;exports.mapApiAgentStatus=en;exports.mapApiAgentTimelineResponse=an;exports.mapApiChecklistEndpointResponse=mt;exports.mapApiChecklistItem=pt;exports.mapApiChecklistResponse=rn;exports.mapApiChecklistStatus=tn;exports.mapApiConversationMessages=on;exports.mapApiOpeningMessage=Re;exports.mapApiResource=nn;exports.mapApiResourcesEndpointResponse=sn;exports.mapApiTripOption=js;exports.parseConversationContentCaption=Ts;exports.parseRepollMessages=Qt;exports.useAgentService=dn;exports.useAgentWorkspace=un;
package/dist/index.d.ts CHANGED
@@ -383,6 +383,7 @@ export declare type ApiConversationMessage = {
383
383
  tool_call_id: string | null;
384
384
  tool_calls: ApiConversationToolCall[] | null;
385
385
  moderation_status: string | null;
386
+ filename?: string | null;
386
387
  };
387
388
 
388
389
  export declare type ApiConversationMessageRole = 'system' | 'user' | 'assistant' | 'tool';