@arbor-education/agent-view-frontend 0.4.10 → 0.5.0

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/README.md CHANGED
@@ -58,24 +58,26 @@ You can also configure the demo without opening the debug panel:
58
58
  # Via URL query params (token is stripped from the address bar after load)
59
59
  http://localhost:4174/?serviceUrl=http://localhost:3001&token=your-bearer-token
60
60
 
61
- # Via environment variables
62
- VITE_AGENT_SERVICE_URL=https://ai-agent-service.qa.arbor.engineering \
63
- VITE_AGENT_SERVICE_TOKEN=your-bearer-token \
61
+ # Via environment variables (or copy `demo/.env.example` → `demo/.env`)
62
+ AGENT_SERVICE_URL=https://ai-agent-service.qa.arbor.engineering \
63
+ AGENT_SERVICE_TOKEN=your-bearer-token \
64
64
  make demo
65
65
  ```
66
66
 
67
67
  | Variable | Default | Purpose |
68
68
  |---|---|---|
69
69
  | `MOCK_SERVER_PORT` | `3001` | Port for the mock agent service |
70
- | `VITE_AGENT_SERVICE_PROXY_TARGET` | `http://localhost:3001` | Where the demo proxies `/api/ai-agent-service` |
71
- | `VITE_AGENT_SERVICE_URL` | `/api/ai-agent-service` | Initial service URL for the demo (overridable in Debug options) |
72
- | `VITE_AGENT_SERVICE_TOKEN` | _(empty)_ | Initial bearer token for the demo |
73
-
74
- To hit QA instead of the local mock server:
75
-
76
- ```bash
77
- VITE_AGENT_SERVICE_PROXY_TARGET=https://ai-agent-service.qa.arbor.engineering make demo
78
- ```
70
+ | `AGENT_SERVICE_PROXY_TARGET` | `http://localhost:3001` | Where the demo proxies `/api/ai-agent-service` |
71
+ | `AGENT_SERVICE_URL` | `/api/ai-agent-service` | Initial service URL for the demo (overridable in Debug options) |
72
+ | `AGENT_SERVICE_TOKEN` | _(empty)_ | Initial bearer token for the demo |
73
+ | `PUSHER_REPOLL` | auto if key+cluster set | `true`/`false` — initial state of the **Use Pusher to repoll** Debug toggle |
74
+ | `PUSHER_KEY` | _(empty)_ | Public Pusher app key (client subscribe) |
75
+ | `PUSHER_CLUSTER` | _(empty)_ | Pusher cluster (e.g. `eu`) |
76
+ | `PUSHER_CHANNEL_PREFIX` | `arbor-agent-` | Channel prefix; full channel is `{prefix}{agent.id}` |
77
+ | `PUSHER_SECRET` | _(empty)_ | **Not** exposed to the browser — use only in local trigger scripts |
78
+ | `PUSHER_APP_ID` | _(empty)_ | Same as above; for server-side `pusher` package scripts |
79
+
80
+ Copy `demo/.env.example` to `demo/.env` and fill Pusher credentials. The Debug panel only exposes a **Use Pusher to repoll** toggle, which overrides `PUSHER_REPOLL` for the current session; the key, cluster and channel prefix are configured via env only. Vite loads env from the demo root; only an allowlisted set of prefixes is exposed to the client (`PUSHER_SECRET` is excluded).
79
81
 
80
82
  ---
81
83
 
package/dist/index.cjs CHANGED
@@ -1,5 +1,8 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),o=require("react"),J=require("classnames"),d=require("@arbor-education/design-system.components"),me=require("@arbor-education/ask-arbor-chat-panel"),A={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},B={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},H={briefing:"briefing",running:"running",stopped:"stopped",complete:"complete"},Z={agent:"agent",user:"user",system:"system"},re={document_html:"document_html",mis_record:"mis_record",workflow:"workflow",file:"file",link:"link"},gt={cancelled:"cancelled",archived:"archived"},Xe={in_progress:"in_progress",requires_attention:"requires_attention",available:"available"},V={[B.complete]:{label:"Complete",icon:"circle-check",color:"var(--color-semantic-success-600)"},[B.failed]:{label:"Failed",icon:"circle-x",color:"var(--color-semantic-destructive-600)"},[B.hitl]:{label:"Requires attention",icon:"triangle-alert",color:"var(--color-semantic-warning-600)"},[B["generating-a-response"]]:{label:"Generating a response",icon:"sparkles",color:"var(--color-brand-600)"}},He={[A["generating-a-response"]]:{status:A["generating-a-response"],title:"Active",dotColour:"green",statusIcon:{name:V["generating-a-response"].icon,color:V["generating-a-response"].color}},[A.hitl]:{status:A.hitl,title:"Requires attention",dotColour:"orange",statusIcon:{name:V.hitl.icon,color:V.hitl.color}},[A.complete]:{status:A.complete,title:"Complete",dotColour:"green",dotModifier:"grey-dark",statusIcon:{name:V.complete.icon,color:V.complete.color}},[A.failed]:{status:A.failed,title:"Failed",dotColour:"salmon",statusIcon:{name:V.failed.icon,color:V.failed.color}}},Zt=[A["generating-a-response"],A.hitl],es=[A.complete,A.failed],ts="m4",ss="1",yt="msg-opening",$e="Unable to load agent tasks. Please try again.",ns="Unable to load the resources for this agent",as="Unable to load this document. Please try again.",St="Unable to load the timeline for this agent",rs="Something went wrong. Please try again.",Nt="Unable to load agents. Please try again.",he="Loading tasks…",ht="Loading agents…",os="Task",is={[H.briefing]:"Briefing",[H.running]:"Working",[H.stopped]:"Stopped",[H.complete]:"Complete"},ls=[A["generating-a-response"],A.hitl,A.complete,A.failed],cs={[A["generating-a-response"]]:"Agents currently working on tasks for you.",[A.hitl]:"Agents that need your input before they can continue.",[A.complete]:"Agents that have finished their work.",[A.failed]:"Agents that failed or were stopped."},ds=()=>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)"})]}),us=({status:t})=>{const e=He[t];return e.statusIcon?s.jsx(d.Icon,{name:e.statusIcon.name,size:16,color:e.statusIcon.color,screenReaderText:e.title}):s.jsx(d.Dot,{colour:e.dotColour,label:e.title})},gs=()=>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(d.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:ls.map(t=>{const e=He[t];return s.jsxs("li",{className:"agent-view__empty-column",children:[s.jsx("span",{className:"agent-view__empty-column-indicator",children:s.jsx(us,{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:cs[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(ds,{})})]}),hs=(t,e)=>({...t,...e.length>0?{children:e}:{}}),jt=t=>{const e=[],n=[];for(const a of t){const r=a.children?jt(a.children):{needsInput:[],tasks:[]};if(e.push(...r.needsInput),a.status===B.hitl){e.push({...a,children:void 0});continue}n.push(hs(a,r.tasks))}return{needsInput:e,tasks:n}},ps=t=>t.map((e,n)=>({item:e,index:n})).sort((e,n)=>{const a=e.item.status===B.hitl,r=n.item.status===B.hitl;return a!==r?a?-1:1:e.index-n.index}).map(({item:e})=>e),Qe=2,ms=t=>{if(!t)return{canScrollUp:!1,canScrollDown:!1};const e=t.scrollHeight-t.clientHeight;return e<=Qe?{canScrollUp:!1,canScrollDown:!1}:{canScrollUp:t.scrollTop>Qe,canScrollDown:t.scrollTop<e-Qe}},_s=(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}},ze=({children:t,className:e,contentClassName:n,scrollSelector:a,style:r,"aria-label":l})=>{const i=o.useRef(null),u=o.useRef(null),[c,v]=o.useState(!1),[f,h]=o.useState(!1),[p,O]=o.useState(null),w=()=>{var y;return a?((y=i.current)==null?void 0:y.querySelector(a))??null:u.current},j=()=>{const y=w(),k=ms(y);if(v(_=>_===k.canScrollUp?_:k.canScrollUp),h(_=>_===k.canScrollDown?_:k.canScrollDown),a){const _=_s(i.current,y);O(C=>(C==null?void 0:C.top)===(_==null?void 0:_.top)&&(C==null?void 0:C.left)===(_==null?void 0:_.left)&&(C==null?void 0:C.width)===(_==null?void 0:_.width)&&(C==null?void 0:C.height)===(_==null?void 0:_.height)?C:_)}else O(_=>_===null?_:null)};o.useLayoutEffect(()=>{j()}),o.useEffect(()=>{const y=i.current;if(!y)return;let k=null,_=null;const C=()=>{k==null||k.removeEventListener("scroll",j),_==null||_.disconnect(),_=null,k=null},R=M=>{if(M===k){j();return}if(C(),k=M,!k){j();return}k.addEventListener("scroll",j,{passive:!0}),_=new ResizeObserver(()=>j()),_.observe(k),k.firstElementChild instanceof HTMLElement&&_.observe(k.firstElementChild),j()};R(w());const T=new MutationObserver(()=>{R(w())});return T.observe(y,{childList:!0,subtree:!0,characterData:!0}),window.addEventListener("resize",j),()=>{window.removeEventListener("resize",j),T.disconnect(),C()}},[a]);const N=y=>{const k=w();if(!k)return;const _=Math.max(k.clientHeight*.75,120);k.scrollBy({top:y==="up"?-_:_,behavior:"smooth"})},P=s.jsxs(s.Fragment,{children:[c&&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:()=>N("up"),children:s.jsx(d.Icon,{name:"chevron-up",size:16,color:"currentColor"})})]}),f&&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:()=>N("down"),children:s.jsx(d.Icon,{name:"chevron-down",size:16,color:"currentColor"})})]})]});return s.jsx("div",{ref:i,className:J("scrollable-region",e),style:r,"aria-label":l,children:a?s.jsxs(s.Fragment,{children:[t,p&&(c||f)&&s.jsx("div",{className:"scrollable-region__overlay",style:{top:p.top,left:p.left,width:p.width,height:p.height},children:P})]}):s.jsxs(s.Fragment,{children:[P,s.jsx("div",{ref:u,className:J("scrollable-region__viewport",n),children:t})]})})},fs=48,vs=({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<=fs)&&(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(ze,{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:ps(t).map(a=>{const r=V[a.status];return s.jsxs("li",{className:J("agent-view__progress-item",`agent-view__progress-item--${a.status.replace(/_/g,"-")}`),children:[s.jsx(d.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!==B.complete&&s.jsx("span",{className:"agent-view__progress-description",children:a.description})]})]},a.task)})})})},ws=({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 xs{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:me.CHAT_RESPONSE_TYPE_AGENT,...r.message.followUpPrompts?{followUpPrompts:r.message.followUpPrompts}:{}}}catch{return{id:`error-${Date.now()}`,text:rs,type:me.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 ks=({connector:t,phase:e,chatHistory:n,chatSessionKey:a,startQuery:r,clarificationMessage:l,enableUpload:i=!1,onTurn:u,onAwaitingChange:c,onClarificationPrompt:v,onDismissClarification:f})=>{const h=o.useMemo(()=>new xs(t,{canSend:()=>e===H.running,onTurn:u,onAwaitingChange:c}),[t,e,u,c]),p=e!==H.running,O=e===H.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(ws,{prompts:l.followUpPrompts,onSelect:v}),s.jsx("button",{type:"button",className:"agent-workspace__clarification-dismiss",onClick:f,children:"Dismiss"})]}),s.jsx("div",{className:"agent-workspace__ask-arbor",children:s.jsx(ze,{scrollSelector:".chat-panel-message-list",children:s.jsx(me.ChatPanel,{connector:h,chatHistory:n,startQuery:r,lockConversation:p,enableUpload:i,speechEnabled:O,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:O?"Message the agent, paste a link, or attach a file…":"The agent is not accepting messages."},a)})}),e===H.stopped&&s.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[s.jsx(d.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 on the left."})]}),e===H.complete&&s.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[s.jsx(d.Icon,{name:"party-popper",size:16,color:"var(--color-semantic-success-600)"}),s.jsx("span",{children:"The agent has finished."})]})]})},bt=({item:t,depth:e,canRequestInput:n,onAttentionItemClick:a})=>{const r=V[t.status],l=t.status.replace(/_/g,"-"),i=t.status===B.hitl&&n&&a,u=s.jsxs("div",{className:"agent-workspace__task-row",children:[s.jsx(d.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!==B.complete&&t.description&&s.jsx("span",{className:"agent-workspace__task-description",children:t.description})]})]});return s.jsxs("li",{className:J("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:u}):u,t.children&&t.children.length>0&&s.jsx("ul",{className:"agent-workspace__task-children",children:t.children.map(c=>s.jsx(bt,{item:c,depth:e+1,canRequestInput:n,onAttentionItemClick:a},c.task))})]})},pt=({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(bt,{item:r,depth:0,canRequestInput:n,onAttentionItemClick:a},r.task))}),ys=({checklist:t,isLoading:e,error:n,phase:a,canRequestInput:r,onAttentionItemClick:l})=>{const i=o.useMemo(()=>t?jt(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(d.Heading,{level:4,children:"Checklist"})}),s.jsx("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:s.jsxs(ze,{children:[e&&s.jsxs("div",{className:"agent-workspace__loading",children:[s.jsx(d.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:he}),s.jsx("span",{children:he})]}),!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(pt,{items:i.needsInput,ariaLabel:"Tasks needing your input",canRequestInput:r,onAttentionItemClick:l})]}),i.tasks.length>0&&s.jsxs("div",{className:J("agent-workspace__task-group",{"agent-workspace__task-group--following":i.needsInput.length>0}),children:[i.needsInput.length>0&&s.jsx("p",{className:"agent-workspace__task-group-label",children:"Other tasks"}),s.jsx(pt,{items:i.tasks,ariaLabel:"Agent tasks",canRequestInput:r,onAttentionItemClick:l})]})]}),!e&&!n&&(!i||i.needsInput.length===0&&i.tasks.length===0)&&s.jsx("p",{className:"agent-workspace__empty",children:a===H.briefing?"Tasks will appear here once the agent starts.":"No tasks to display."})]})})]})},Ss=({resource:t,html:e,isLoading:n,error:a,onClose:r})=>{o.useEffect(()=>{if(!t)return;const i=d.SlideoverUtils.removeSlideover;return d.SlideoverUtils.removeSlideover=()=>{i(),r()},()=>{d.SlideoverUtils.removeSlideover=i}},[t,r]),o.useEffect(()=>{if(!t)return;const i=u=>{u.key==="Escape"&&d.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(d.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(d.SlideoverManager,{slideovers:l})})},Ns={[re.mis_record]:{icon:"table",label:"Arbor MIS",color:"var(--color-brand-600)"},[re.document_html]:{icon:"file",label:"Document",color:"var(--color-semantic-caution-800)"},[re.file]:{icon:"file",label:"File",color:"var(--color-semantic-caution-800)"},[re.workflow]:{icon:"list-tree",label:"Workflow",color:"var(--color-semantic-warning-700)"},[re.link]:{icon:"link",label:"Link",color:"var(--color-semantic-info-700)"}},js=({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(d.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(ze,{children:[e&&s.jsxs("div",{className:"agent-workspace__loading",children:[s.jsx(d.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=Ns[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:u=>{u.preventDefault(),a(r)},children:s.jsx(mt,{resource:r,config:l,external:!0})}):s.jsx("button",{type:"button",className:"agent-workspace__resource-card",onClick:()=>a(r),children:s.jsx(mt,{resource:r,config:l})})},r.id)})}),!e&&!n&&t.length===0&&s.jsx("p",{className:"agent-workspace__empty",children:"No resources yet."})]})})]}),mt=({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(d.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(d.Icon,{name:"external-link",size:12,color:"var(--color-grey-500)",screenReaderText:"Opens in a new tab",className:"agent-workspace__resource-open"})]}),Be=t=>{const e=Date.parse(t);return Number.isFinite(e)?e:0},bs=new Intl.DateTimeFormat("en-GB",{day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"2-digit"}),Ze=t=>{const e=new Date(t);return Number.isFinite(e.getTime())?bs.format(e):t},Ue=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(" ")),Ne=(t,e)=>e<=1?0:t/(e-1)*100,At=t=>Math.max(t,0)+2,As=t=>t+1,Cs=(t,e)=>{if(e.length===0)return 50;const n=At(e.length),a=Ne(1,n),r=Ne(e.length,n),l=e.map(f=>Be(f.timestamp)),i=Math.min(...l),u=Math.max(...l);if(u<=i)return a;const c=(Be(t.timestamp)-i)/(u-i),v=Math.min(1,Math.max(0,c));return a+v*(r-a)},Es=8,Ts=20,Rs=(t,e=Es,n=Ts)=>{const a=new Map;if(t.length===0)return a;const r=[...t].sort((i,u)=>i.leftPercent-u.leftPercent||i.timestampMs-u.timestampMs||i.id.localeCompare(u.id)),l=[];for(const i of r){const u=l[l.length-1];u&&i.leftPercent-u[u.length-1].leftPercent<e?u.push(i):l.push([i])}for(const i of l){const u=[...i].sort((v,f)=>v.timestampMs-f.timestampMs||v.id.localeCompare(f.id)),c=(u.length-1)/2;u.forEach((v,f)=>{a.set(v.id,(f-c)*n)})}return a},De=(t,e=0)=>({left:`calc(${t/100} * (100% - var(--agent-timeline-node-size)) + (var(--agent-timeline-node-size) / 2) + ${e}px)`,transform:"translateX(-50%)"}),Is=t=>t.type!=="message-sent",Os=({timeline:t,isLoading:e,error:n,onOpenChatSession:a})=>{const r=((t==null?void 0:t.actionLog)??[]).filter(Is),l=(t==null?void 0:t.chatSessions)??[],i=!e&&!n&&r.length===0&&l.length===0,u=At(r.length),c=r.map((h,p)=>({id:`action-${h.timestamp}-${p}`,leftPercent:Ne(As(p),u),timestampMs:Be(h.timestamp)})),v=l.map(h=>({id:h.sessionId,leftPercent:Cs(h,r),timestampMs:Be(h.timestamp)})),f=Rs([...c,...v]);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||St}),i&&s.jsx("p",{className:"agent-workspace__timeline-status",role:"status",children:"No timeline activity yet."}),!e&&!n&&!i&&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",style:De(Ne(0,u)),children:[s.jsx("span",{className:"agent-timeline__station-node agent-timeline__station-node--terminus","aria-hidden":"true",children:s.jsx(d.Icon,{name:"arrow-right-from-line",size:16,color:"currentColor"})}),s.jsx("span",{className:"agent-timeline__terminus-label",children:"Start"})]}),r.map((h,p)=>{const O=`action-${h.timestamp}-${p}`,w=c[p].leftPercent,j=h.type==="checklist-updated",N=h.type==="status-transition",P=j?"checklist":N?"status":"note";return s.jsxs("div",{className:`agent-timeline__station agent-timeline__station--${P}`,style:De(w,f.get(O)??0),children:[s.jsxs("button",{type:"button",className:`agent-timeline__station-node agent-timeline__station-node--${P}`,"aria-label":`${Ue(h.type)}: ${Ue(h.entry)}`,children:[j&&s.jsx(d.Icon,{name:"check-solid",size:16,color:"currentColor"}),N&&s.jsx(d.Icon,{name:"iteration-ccw",size:16,color:"currentColor"})]}),s.jsxs("div",{className:"agent-timeline__pill",role:"tooltip",children:[s.jsx("strong",{className:"agent-timeline__pill-type",children:Ue(h.type)}),s.jsx("span",{className:"agent-timeline__pill-entry",children:Ue(h.entry)}),s.jsx("span",{className:"agent-timeline__pill-entry",children:Ze(h.timestamp)})]})]},O)}),s.jsxs("div",{className:"agent-timeline__station agent-timeline__station--terminus",style:De(Ne(u-1,u)),children:[s.jsx("span",{className:"agent-timeline__station-node agent-timeline__station-node--terminus","aria-hidden":"true",children:s.jsx(d.Icon,{name:"flag",size:16,color:"currentColor"})}),s.jsx("span",{className:"agent-timeline__terminus-label",children:"Finish"})]}),l.map((h,p)=>{const O=v[p].leftPercent;return s.jsxs("div",{className:"agent-timeline__chat-station",style:De(O,f.get(h.sessionId)??0),children:[s.jsx("button",{type:"button",className:"agent-timeline__chat-node","aria-label":`Open chat session from ${Ze(h.timestamp)}`,onClick:()=>a(h.sessionId),children:s.jsx(d.Icon,{name:"sparkles",size:16,color:"currentColor"})}),s.jsxs("div",{className:"agent-timeline__pill",role:"tooltip",children:[s.jsx("strong",{className:"agent-timeline__pill-type",children:"Chat session"}),s.jsx("span",{className:"agent-timeline__pill-entry",children:Ze(h.timestamp)})]})]},h.sessionId)})]})]})},Ps=["I'll get the details and come back to you","Skip this for now"],Ls=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:Z.agent,text:e,followUpPrompts:t.clarificationPrompts??Ps}},ge=t=>({id:t.id,text:t.text,type:t.author===Z.user?me.CHAT_RESPONSE_TYPE_USER:t.author===Z.system?me.CHAT_RESPONSE_TYPE_INFO:me.CHAT_RESPONSE_TYPE_AGENT,...t.followUpPrompts?{followUpPrompts:t.followUpPrompts}:{}});class pe extends Error{constructor(e,n,a){super(a??`Agent service request failed (${e})`),this.name="AgentServiceError",this.status=e,this.detail=n}}const Ms="/api/v1",$={agentDefinitions:"/agent-definitions",agents:"/agents",conversations:"/conversations",tripOptions:"/trip-options",demoDataset:"/demo/dataset"},F={GET:"GET",POST:"POST"},Us={error:"error"},Ds={user:"user"},oe={acceptJson:"application/json",acceptHtml:"text/html",acceptEventStream:"text/event-stream",contentTypeJson:"application/json",arborApplicationUrl:"X-Arbor-Application-Url"},$s=100,Ct=t=>{switch(t){case gt.cancelled:return A.failed;case gt.archived:return A.complete;case A.hitl:case A.complete:case A.failed:case A["generating-a-response"]:return t;default:return A["generating-a-response"]}},Et=t=>{switch(t){case Xe.requires_attention:return B.hitl;case Xe.in_progress:case Xe.available:return B["generating-a-response"];case B.failed:case B.complete:case B.hitl:case B["generating-a-response"]:return t;default:return B["generating-a-response"]}},nt=t=>({ref:t.name,display_name:t.display_name,agent_intent:t.agent_intent??"",description:t.description}),Hs=t=>({id:t.id,name:t.name,...t.has_run_before?{hasRunBefore:t.has_run_before}:{}}),Bs=new Set(Object.values(re)),zs=t=>Bs.has(t)?t:re.document_html,Tt=t=>({id:t.id,type:zs(t.type),title:t.title,createdDatetime:t.created_datetime,lastUpdatedDatetime:t.last_updated_datetime,misRecordUrl:t.mis_record_url}),Rt=t=>({resources:t.resources.map(Tt),pageNumber:t.page_number,pageSize:t.page_size,totalRecords:t.total_records}),It=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}))}),tt=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:Ct(t.status),context_ref:t.context_ref??null,checklist_ref:t.checklist_ref??null}},at=t=>{var e;return{task:t.item??t.task??t.name??t.label??os,status:Et(t.status),description:t.description??"",...t.prompt?{prompt:t.prompt}:{},...(e=t.follow_up_prompts)!=null&&e.length?{clarificationPrompts:t.follow_up_prompts}:{}}},Fs=t=>Array.isArray(t)?t:t.checklist_items??t.checklist??t.items??[],rt=(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?je(a):void 0;return{invocation_id:t,checklist:Fs(e).map(at),...r?{openingMessage:r}:{}}},Ot=(t,e)=>{const n=je(e);return{invocation_id:e.invocation_id??t,checklist:(e.checklist_items??[]).map(at),...n?{openingMessage:n}:{}}},je=t=>{var n,a;const e=(n=t.opening_message)==null?void 0:n.trim();if(e)return{id:yt,author:Z.agent,text:e,...(a=t.opening_follow_up_prompts)!=null&&a.length?{followUpPrompts:t.opening_follow_up_prompts}:{}}},Pt=t=>t.filter(e=>(e.role==="user"||e.role==="assistant")&&typeof e.content=="string"&&e.content.length>0&&e.message_type!=="tool_request").map(e=>({id:e.message_id,author:e.role==="user"?Z.user:Z.agent,text:e.content})),qs=/:invocationId\b/g,Gs=/:resourceId\b/g,Js=t=>t.trim().replace(/^Bearer\s+/i,""),Ks=t=>t.endsWith("/")?t.slice(0,-1):t;class Fe{constructor(e){var a;this.baseUrl=Ks(e.baseUrl??"");const n=(a=e.token)==null?void 0:a.trim();this.token=n?Js(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(F.GET,this.resolveUrl("agentDefinitions",$.agentDefinitions))).agent_definitions??[]}getAgentDefinition(e){return this.request(F.GET,this.apiUrl(`${$.agentDefinitions}/${encodeURIComponent(e)}`))}listTripOptions(){return this.request(F.GET,this.apiUrl($.tripOptions))}getDataset(){return this.request(F.GET,this.apiUrl($.demoDataset))}setDataset(e){return this.request(F.POST,this.apiUrl($.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(F.GET,`${this.resolveUrl("agents",$.agents)}${a}`)}createAgent(e,n={}){var i,u;const a={agent_definition_ref:e},r=(i=n.invocationName)==null?void 0:i.trim(),l=(u=n.agentIntent)==null?void 0:u.trim();return r&&(a.invocation_name=r),l&&(a.agent_intent=l),this.request(F.POST,this.resolveUrl("agents",$.agents),a)}getAgent(e){return this.request(F.GET,this.resolveUrl("agent",`${$.agents}/${encodeURIComponent(e)}`,e))}getAgentChecklist(e){return this.request(F.GET,this.resolveUrl("agentChecklist",`${$.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",`${$.agents}/${encodeURIComponent(e)}/resources`,e);return this.request(F.GET,r?`${l}?${r}`:l)}async listAllAgentResources(e){const n=$s;let a=1;const r=[];let l=Number.POSITIVE_INFINITY;for(;r.length<l;){const i=Rt(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(F.GET,this.resolveResourceHtmlUrl(e,n))}getAgentTimeline(e){return this.request(F.GET,this.resolveUrl("agentTimeline",`${$.agents}/${encodeURIComponent(e)}/agent-timeline`,e))}getAgentContext(e){return this.request(F.GET,this.apiUrl(`${$.agents}/${encodeURIComponent(e)}/context`))}cancelAgent(e){return this.request(F.POST,this.apiUrl(`${$.agents}/${encodeURIComponent(e)}/cancel`))}archiveAgent(e){return this.request(F.POST,this.apiUrl(`${$.agents}/${encodeURIComponent(e)}/archive`))}getConversation(e){return this.request(F.GET,this.resolveUrl("agentConversation",`${$.conversations}/${encodeURIComponent(e)}`,e))}async chat(e,n,a={}){const r=!!(a.uploadFiles&&a.uploadFiles.length>0),l=await this.fetchImpl(this.resolveUrl("agentChat",`${$.agents}/${encodeURIComponent(e)}/chat`,e),{method:F.POST,headers:{...this.customHeaders,...this.authHeaders(),Accept:oe.acceptEventStream,...r?{}:{"Content-Type":oe.contentTypeJson}},body:r?Vs(n,a.uploadFiles??[]):JSON.stringify(n),signal:a.signal});if(!l.ok)throw await this.toError(l);if(!l.body)throw new pe(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}${Ms}${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(qs,encodeURIComponent(a))),r&&(i=i.replace(Gs,encodeURIComponent(r))),i}resolveResourceHtmlUrl(e,n){return this.urls.agentResourceHtml?this.resolveUrl("agentResourceHtml",`${$.agents}/${encodeURIComponent(e)}/resources/${encodeURIComponent(n)}`,e,n):this.urls.agentResources?`${this.resolveUrl("agentResources",`${$.agents}/${encodeURIComponent(e)}/resources`,e).replace(/\/$/,"")}/${encodeURIComponent(n)}`:this.apiUrl(`${$.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:oe.acceptJson,...a===void 0?{}:{"Content-Type":oe.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:oe.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 pe(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 u=c=>{const{event:v,data:f}=Ws(c);if(f===null)return;if(v===Us.error){const p=_t(f);throw new pe(502,p,(p==null?void 0:p.message)??"Chat stream error")}const h=_t(f);h&&(i=h,n==null||n(h))};for(;;){const{done:c,value:v}=await a.read();if(c)break;l+=r.decode(v,{stream:!0});const f=l.split(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),i=require("react"),z=require("classnames"),u=require("@arbor-education/design-system.components"),ve=require("@arbor-education/ask-arbor-chat-panel"),A={"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"},H={briefing:"briefing",running:"running",stopped:"stopped",complete:"complete"},X={agent:"agent",user:"user",system:"system"},ie={document_html:"document_html",mis_record:"mis_record",workflow:"workflow",file:"file",user_file:"user_file",link:"link"},xs={user_file:"user_file"},Nt={cancelled:"cancelled",archived:"archived"},tt={in_progress:"in_progress",requires_attention:"requires_attention",available:"available"},Y={[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={[A["generating-a-response"]]:{status:A["generating-a-response"],title:"Active",dotColour:"green",statusIcon:{name:Y["generating-a-response"].icon,color:Y["generating-a-response"].color}},[A.hitl]:{status:A.hitl,title:"Requires attention",dotColour:"orange",statusIcon:{name:Y.hitl.icon,color:Y.hitl.color}},[A.complete]:{status:A.complete,title:"Complete",dotColour:"green",dotModifier:"grey-dark",statusIcon:{name:Y.complete.icon,color:Y.complete.color}},[A.failed]:{status:A.failed,title:"Failed",dotColour:"salmon",statusIcon:{name:Y.failed.icon,color:Y.failed.color}}},ks=[A["generating-a-response"],A.hitl],Ss=[A.complete,A.failed],ys="m4",Ns="1",Ut="msg-opening",ze="Unable to load agent tasks. Please try again.",bs="Unable to load the resources for this agent",As="Unable to load this document. Please try again.",Dt="Unable to load the timeline for this agent",js="Unable to stop the agent. Please try again.",Cs="Something went wrong. Please try again.",$t="Unable to load agents. Please try again.",_e="Loading tasks…",bt="Loading agents…",Es="Task",Rs={[H.briefing]:"Briefing",[H.running]:"Working",[H.stopped]:"Stopped",[H.complete]:"Complete"},Ts=[A["generating-a-response"],A.hitl,A.complete,A.failed],Is={[A["generating-a-response"]]:"Agents currently working on tasks for you.",[A.hitl]:"Agents that need your input before they can continue.",[A.complete]:"Agents that have finished their work.",[A.failed]:"Agents that failed or were stopped."},Os=()=>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)"})]}),Ls=({status:e})=>{const t=qe[e];return t.statusIcon?s.jsx(u.Icon,{name:t.statusIcon.name,size:16,color:t.statusIcon.color,screenReaderText:t.title}):s.jsx(u.Dot,{colour:t.dotColour,label:t.title})},Ms=()=>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:Ts.map(e=>{const t=qe[e];return s.jsxs("li",{className:"agent-view__empty-column",children:[s.jsx("span",{className:"agent-view__empty-column-indicator",children:s.jsx(Ls,{status:e})}),s.jsxs("span",{className:"agent-view__empty-column-text",children:[s.jsx("span",{className:"agent-view__empty-column-title",children:t.title}),s.jsx("span",{className:"agent-view__empty-column-description",children:Is[e]})]})]},e)})}),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(Os,{})})]}),Ps=()=>({needsInput:[],complete:[],failed:[],tasks:[]}),Us=(e,t)=>({...e,...t.length>0?{children:t}:{}}),Ht=e=>{const t=[],n=[],a=[],r=[];for(const l of e){const o=l.children?Ht(l.children):Ps();if(t.push(...o.needsInput),n.push(...o.complete),a.push(...o.failed),l.status===P.hitl){t.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(Us(l,o.tasks))}return{needsInput:t,complete:n,failed:a,tasks:r}},At=e=>e===P.hitl?0:e===P.complete?1:e===P.failed?2:3,Ds=e=>e.map((t,n)=>({item:t,index:n})).sort((t,n)=>{const a=At(t.item.status)-At(n.item.status);return a!==0?a:t.index-n.index}).map(({item:t})=>t),st=2,$s=e=>{if(!e)return{canScrollUp:!1,canScrollDown:!1};const t=e.scrollHeight-e.clientHeight;return t<=st?{canScrollUp:!1,canScrollDown:!1}:{canScrollUp:e.scrollTop>st,canScrollDown:e.scrollTop<t-st}},Hs=(e,t)=>{if(!e||!t)return null;const n=e.getBoundingClientRect(),a=t.getBoundingClientRect();return{top:a.top-n.top,left:a.left-n.left,width:a.width,height:a.height}},Je=({children:e,className:t,contentClassName:n,scrollSelector:a,style:r,"aria-label":l})=>{const o=i.useRef(null),p=i.useRef(null),[c,g]=i.useState(!1),[m,S]=i.useState(!1),[x,E]=i.useState(null),R=()=>{var I;return a?((I=o.current)==null?void 0:I.querySelector(a))??null:p.current},f=()=>{const I=R(),y=$s(I);if(g(_=>_===y.canScrollUp?_:y.canScrollUp),S(_=>_===y.canScrollDown?_:y.canScrollDown),a){const _=Hs(o.current,I);E(N=>(N==null?void 0:N.top)===(_==null?void 0:_.top)&&(N==null?void 0:N.left)===(_==null?void 0:_.left)&&(N==null?void 0:N.width)===(_==null?void 0:_.width)&&(N==null?void 0:N.height)===(_==null?void 0:_.height)?N:_)}else E(_=>_===null?_:null)};i.useLayoutEffect(()=>{f()}),i.useEffect(()=>{const I=o.current;if(!I)return;let y=null,_=null;const N=()=>{y==null||y.removeEventListener("scroll",f),_==null||_.disconnect(),_=null,y=null},v=U=>{if(U===y){f();return}if(N(),y=U,!y){f();return}y.addEventListener("scroll",f,{passive:!0}),_=new ResizeObserver(()=>f()),_.observe(y),y.firstElementChild instanceof HTMLElement&&_.observe(y.firstElementChild),f()};v(R());const C=new MutationObserver(()=>{v(R())});return C.observe(I,{childList:!0,subtree:!0,characterData:!0}),window.addEventListener("resize",f),()=>{window.removeEventListener("resize",f),C.disconnect(),N()}},[a]);const G=I=>{const y=R();if(!y)return;const _=Math.max(y.clientHeight*.75,120);y.scrollBy({top:I==="up"?-_:_,behavior:"smooth"})},j=s.jsxs(s.Fragment,{children:[c&&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:()=>G("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:()=>G("down"),children:s.jsx(u.Icon,{name:"chevron-down",size:16,color:"currentColor"})})]})]});return s.jsx("div",{ref:o,className:z("scrollable-region",t),style:r,"aria-label":l,children:a?s.jsxs(s.Fragment,{children:[e,x&&(c||m)&&s.jsx("div",{className:"scrollable-region__overlay",style:{top:x.top,left:x.left,width:x.width,height:x.height},children:j})]}):s.jsxs(s.Fragment,{children:[j,s.jsx("div",{ref:p,className:z("scrollable-region__viewport",n),children:e})]})})},Fs=48,Bs=({checklist:e})=>{const t=i.useRef(null),n=i.useRef(!1);return i.useLayoutEffect(()=>{const a=t.current;if(!a)return;const r=a.scrollHeight-a.scrollTop-a.clientHeight;(!n.current||r<=Fs)&&(a.scrollTop=a.scrollHeight,n.current=!0)},[e]),e.length===0?s.jsx("p",{className:"agent-view__progress-empty",children:"No tasks to display."}):s.jsx(Je,{className:"agent-view__progress-scroll",scrollSelector:".agent-view__progress-list",children:s.jsx("ul",{ref:t,className:"agent-view__progress-list","aria-label":"Agent tasks",children:Ds(e).map(a=>{const r=Y[a.status];return s.jsxs("li",{className:z("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)})})})},Gs=({prompts:e,classNamePrefix:t="agent-workspace",onSelect:n})=>e.length===0?null:s.jsx("div",{className:`${t}__chips`,children:e.map(a=>s.jsx("button",{type:"button",className:`${t}__chip`,onClick:()=>n(a),children:a},a))});class zs{constructor(t,n){this.connector=t,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(t){var n,a;if(!this.canSend())return null;(n=this.onAwaitingChange)==null||n.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:ve.CHAT_RESPONSE_TYPE_AGENT,...r.message.followUpPrompts?{followUpPrompts:r.message.followUpPrompts}:{}}}catch{return{id:`error-${Date.now()}`,text:Cs,type:ve.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 qs=({connector:e,phase:t,chatHistory:n,chatSessionKey:a,startQuery:r,clarificationMessage:l,enableUpload:o=!1,onTurn:p,onAwaitingChange:c,onClarificationPrompt:g,onDismissClarification:m})=>{const S=i.useMemo(()=>new zs(e,{canSend:()=>t===H.running,onTurn:p,onAwaitingChange:c}),[e,t,p,c]),x=t!==H.running,E=t===H.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(Gs,{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(Je,{scrollSelector:".chat-panel-message-list",children:s.jsx(ve.ChatPanel,{connector:S,chatHistory:n,startQuery:r,lockConversation:x,enableUpload:o,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===H.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."})]}),t===H.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."})]})]})},Ft=({item:e,depth:t,canRequestInput:n,onAttentionItemClick:a})=>{const r=Y[e.status],l=e.status.replace(/_/g,"-"),o=e.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:e.task}),e.status!==P.complete&&e.description&&s.jsx("span",{className:"agent-workspace__task-description",children:e.description})]})]});return s.jsxs("li",{className:z("agent-workspace__task",`agent-workspace__task--${l}`,{"agent-workspace__task--child":t>0}),children:[o?s.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&&s.jsx("ul",{className:"agent-workspace__task-children",children:e.children.map(c=>s.jsx(Ft,{item:c,depth:t+1,canRequestInput:n,onAttentionItemClick:a},c.task))})]})},Ge=({items:e,ariaLabel:t,canRequestInput:n,onAttentionItemClick:a})=>s.jsx("ul",{className:"agent-workspace__task-list","aria-label":t,children:e.map(r=>s.jsx(Ft,{item:r,depth:0,canRequestInput:n,onAttentionItemClick:a},r.task))}),Js=({checklist:e,isLoading:t,error:n,phase:a,canRequestInput:r,onAttentionItemClick:l})=>{const o=i.useMemo(()=>e?Ht(e):null,[e]);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(Je,{children:[t&&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:_e}),s.jsx("span",{children:_e})]}),!t&&n&&s.jsx("p",{className:"agent-workspace__error",role:"alert",children:n}),!t&&!n&&o&&s.jsxs(s.Fragment,{children:[o.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:o.needsInput,ariaLabel:"Tasks needing your input",canRequestInput:r,onAttentionItemClick:l})]}),o.complete.length>0&&s.jsxs("div",{className:z("agent-workspace__task-group",{"agent-workspace__task-group--following":o.needsInput.length>0}),children:[(o.needsInput.length>0||o.failed.length>0||o.tasks.length>0)&&s.jsx("p",{className:"agent-workspace__task-group-label",children:"Completed"}),s.jsx(Ge,{items:o.complete,ariaLabel:"Completed tasks",canRequestInput:r,onAttentionItemClick:l})]}),o.failed.length>0&&s.jsxs("div",{className:z("agent-workspace__task-group",{"agent-workspace__task-group--following":o.needsInput.length>0||o.complete.length>0}),children:[(o.needsInput.length>0||o.complete.length>0||o.tasks.length>0)&&s.jsx("p",{className:"agent-workspace__task-group-label",children:"Failed"}),s.jsx(Ge,{items:o.failed,ariaLabel:"Failed tasks",canRequestInput:r,onAttentionItemClick:l})]}),o.tasks.length>0&&s.jsxs("div",{className:z("agent-workspace__task-group",{"agent-workspace__task-group--following":o.needsInput.length>0||o.complete.length>0||o.failed.length>0}),children:[(o.needsInput.length>0||o.complete.length>0||o.failed.length>0)&&s.jsx("p",{className:"agent-workspace__task-group-label",children:"Working on"}),s.jsx(Ge,{items:o.tasks,ariaLabel:"Agent tasks",canRequestInput:r,onAttentionItemClick:l})]})]}),!t&&!n&&(!o||o.needsInput.length===0&&o.complete.length===0&&o.failed.length===0&&o.tasks.length===0)&&s.jsx("p",{className:"agent-workspace__empty",children:a===H.briefing?"Tasks will appear here once the agent starts.":"No tasks to display."})]})})]})},Ks=({resource:e,html:t,isLoading:n,error:a,onClose:r})=>{i.useEffect(()=>{if(!e)return;const o=u.SlideoverUtils.removeSlideover;return u.SlideoverUtils.removeSlideover=()=>{o(),r()},()=>{u.SlideoverUtils.removeSlideover=o}},[e,r]),i.useEffect(()=>{if(!e)return;const o=p=>{p.key==="Escape"&&u.SlideoverUtils.removeSlideover()};return window.addEventListener("keydown",o),()=>window.removeEventListener("keydown",o)},[e]);const l=i.useMemo(()=>e?[{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&&t!==null&&s.jsx("iframe",{className:"resource-preview-slideover__frame",title:e.title,sandbox:"",srcDoc:t})]})}]:[],[e,t,n,a]);return s.jsx("div",{className:"resource-preview-slideover",children:s.jsx(u.SlideoverManager,{slideovers:l})})},Ws={[ie.mis_record]:{icon:"table",label:"Arbor MIS",color:"var(--color-brand-600)"},[ie.document_html]:{icon:"file",label:"Document",color:"var(--color-semantic-caution-800)"},[ie.file]:{icon:"file",label:"File",color:"var(--color-semantic-caution-800)"},[ie.user_file]:{icon:"upload",label:"File upload",color:"var(--color-semantic-caution-800)"},[ie.workflow]:{icon:"list-tree",label:"Workflow",color:"var(--color-semantic-warning-700)"},[ie.link]:{icon:"link",label:"Link",color:"var(--color-semantic-info-700)"}},Vs=({resources:e,isLoading:t=!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:e.length})]}),s.jsx("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:s.jsxs(Je,{children:[t&&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…"})]}),!t&&n&&s.jsx("p",{className:"agent-workspace__error",role:"alert",children:n}),!t&&!n&&e.length>0&&s.jsx("ul",{className:"agent-workspace__resource-list","aria-label":"Agent resources",children:e.map(r=>{const l=Ws[r.type],o=r.misRecordUrl;return s.jsx("li",{className:"agent-workspace__resource",children:o?s.jsx("a",{className:"agent-workspace__resource-card",href:o,target:"_blank",rel:"noreferrer",onClick:p=>{p.preventDefault(),a(r)},children:s.jsx(jt,{resource:r,config:l,external:!0})}):s.jsx("button",{type:"button",className:"agent-workspace__resource-card",onClick:()=>a(r),children:s.jsx(jt,{resource:r,config:l})})},r.id)})}),!t&&!n&&e.length===0&&s.jsx("p",{className:"agent-workspace__empty",children:"No resources yet."})]})})]}),jt=({resource:e,config:t,external:n=!1})=>s.jsxs(s.Fragment,{children:[s.jsx("span",{className:`agent-workspace__resource-icon agent-workspace__resource-icon--${e.type}`,children:s.jsx(u.Icon,{name:t.icon,size:16,color:t.color,screenReaderText:`${t.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:e.title}),s.jsx("span",{className:`agent-workspace__resource-badge agent-workspace__resource-badge--${e.type}`,children:t.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"})]}),Ct=e=>{const t=Date.parse(e);return Number.isFinite(t)?t:0},Ys=new Intl.DateTimeFormat("en-GB",{day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"2-digit"}),nt=e=>{const t=new Date(e);return Number.isFinite(t.getTime())?Ys.format(t):e},Et=e=>e.replace(/[A-Za-z0-9]+(?:[_-][A-Za-z0-9]+)+/g,t=>t.split(/[_-]/).map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join(" ")),Rt=e=>{const n=e.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)},Xs=60*60*1e3,Bt=60*60*1e3,Re=24*Bt,rt=7*Re,Zs=e=>e.type!=="message-sent",Qs=(e,t)=>{const n=e.filter(Zs).map((r,l)=>({kind:"action",id:`action-${r.timestamp}-${l}`,timestampMs:Ct(r.timestamp),item:r})),a=t.map(r=>({kind:"chat",id:r.sessionId,timestampMs:Ct(r.timestamp),session:r}));return[...n,...a].sort((r,l)=>r.timestampMs-l.timestampMs||r.id.localeCompare(l.id))},en=e=>e>=rt?"weeks":e>=Re?"days":"hours",tn=e=>{if(e<Re){const a=Math.max(1,Math.round(e/Bt));return a===1?"1 hour later":`${a} hours later`}if(e<rt){const a=Math.max(1,Math.round(e/Re));return a===1?"1 day later":`${a} days later`}const t=Math.max(1,Math.round(e/rt));if(t<5)return t===1?"1 week later":`${t} weeks later`;const n=Math.max(1,Math.round(e/(30*Re)));return n===1?"1 month later":`${n} months later`},sn=(e,t=Xs)=>{if(e.length===0)return[];const n=[e[0]];for(let a=1;a<e.length;a+=1){const r=e[a-1],l=e[a],o=l.timestampMs-r.timestampMs;o>=t&&n.push({kind:"gap",id:`gap-${r.id}-${l.id}`,durationMs:o,label:tn(o),size:en(o)}),n.push(l)}return n},nn=e=>e.type==="checklist-updated"?"checklist":e.type==="status-transition"?"status":"note",an=({timeline:e,isLoading:t,error:n,onOpenChatSession:a})=>{const r=(e==null?void 0:e.actionLog)??[],l=(e==null?void 0:e.chatSessions)??[],o=Qs(r,l),p=sn(o),c=!t&&!n&&o.length===0;return s.jsxs("section",{className:"agent-workspace__timeline","aria-label":"Agent timeline",children:[t&&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||Dt}),c&&s.jsx("p",{className:"agent-workspace__timeline-status",role:"status",children:"No timeline activity yet."}),!t&&!n&&!c&&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 ${nt(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:nt(g.session.timestamp)})]})]},g.id);const{item:m}=g,S=nn(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":`${Et(m.type)}: ${Rt(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:Et(m.type)}),s.jsx("span",{className:"agent-timeline__label-entry",children:Rt(m.entry)}),s.jsx("span",{className:"agent-timeline__label-time",children:nt(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"})})]})]})]})},rn=["I'll get the details and come back to you","Skip this for now"],on=e=>{var n;const t=(n=e.prompt)!=null&&n.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:X.agent,text:t,followUpPrompts:e.clarificationPrompts??rn}},me=e=>({id:e.id,text:e.text,type:e.author===X.user?ve.CHAT_RESPONSE_TYPE_USER:e.author===X.system?ve.CHAT_RESPONSE_TYPE_INFO:ve.CHAT_RESPONSE_TYPE_AGENT,...e.followUpPrompts?{followUpPrompts:e.followUpPrompts}:{}}),it="MESSAGE_TYPE_REPOLL",Gt="agentUi:update",ct="arbor-agent-",oe={all:"ALL",checklist:"CHECKLIST",resources:"RESOURCES",chat:"CHAT",timeline:"TIMELINE"},ln=new Set(Object.values(oe)),zt=(e,t)=>`${e.endsWith("-")?e:`${e}-`}${t}`,cn=e=>typeof e=="string"&&ln.has(e)?e:oe.all,dn=e=>{if(!e||typeof e!="object")return null;const t=e;return t.type!==it?null:{type:it,target:cn(t.target)}},qt=e=>{const t=Array.isArray(e)?e:[e],n=[];for(const a of t){const r=dn(a);r&&n.push(r)}return n},un=({enabled:e,channelPrefix:t,agentId:n,subscribeToPusher:a,onRepoll:r})=>{const l=i.useRef(r),o=t==null?void 0:t.trim(),p=!!(e&&a&&o&&n.trim());return i.useEffect(()=>{l.current=r},[r]),i.useEffect(()=>{if(!p||!a||!o)return;const c=a(zt(o,n),Gt,g=>{for(const m of qt(g))l.current(m.target)});return()=>{c()}},[p,o,n,a]),p};class fe extends Error{constructor(t,n,a){super(a??`Agent service request failed (${t})`),this.name="AgentServiceError",this.status=t,this.detail=n}}const gn="/api/v1",$={agentDefinitions:"/agent-definitions",agents:"/agents",conversations:"/conversations",tripOptions:"/trip-options",demoDataset:"/demo/dataset"},B={GET:"GET",POST:"POST"},hn={error:"error"},pn={user:"user"},ue={acceptJson:"application/json",acceptHtml:"text/html",acceptEventStream:"text/event-stream",contentTypeJson:"application/json",arborApplicationUrl:"X-Arbor-Application-Url"},mn=100,Jt=e=>{switch(e){case Nt.cancelled:return A.failed;case Nt.archived:return A.complete;case A.hitl:case A.complete:case A.failed:case A["generating-a-response"]:return e;default:return A["generating-a-response"]}},Kt=e=>{switch(e){case tt.requires_attention:return P.hitl;case tt.in_progress:case tt.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"]}},dt=e=>({ref:e.name,display_name:e.display_name,agent_intent:e.agent_intent??"",description:e.description}),_n=e=>({id:e.id,name:e.name,...e.has_run_before?{hasRunBefore:e.has_run_before}:{}}),fn=new Set(Object.values(ie)),vn=e=>fn.has(e)?e:ie.document_html,Wt=e=>({id:e.id,type:vn(e.type),title:e.title,createdDatetime:e.created_datetime,lastUpdatedDatetime:e.last_updated_datetime,misRecordUrl:e.mis_record_url}),Vt=e=>({resources:e.resources.map(Wt),pageNumber:e.page_number,pageSize:e.page_size,totalRecords:e.total_records}),Yt=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}))}),ot=e=>{var n;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:((n=e.invocation_name)==null?void 0:n.trim())||e.agent_definition_ref,application_id:e.application_id,...e.application_name?{application_name:e.application_name}:{},created_by:e.created_by,status:Jt(e.status),context_ref:e.context_ref??null,checklist_ref:e.checklist_ref??null}},ut=e=>{var t;return{task:e.item??e.task??e.name??e.label??Es,status:Kt(e.status),description:e.description??"",...e.prompt?{prompt:e.prompt}:{},...(t=e.follow_up_prompts)!=null&&t.length?{clarificationPrompts:e.follow_up_prompts}:{}}},wn=e=>Array.isArray(e)?e:e.checklist_items??e.checklist??e.items??[],gt=(e,t,n)=>{var l;const a=!Array.isArray(t)&&(t.opening_message||(l=t.opening_follow_up_prompts)!=null&&l.length)?t:n,r=a?Te(a):void 0;return{invocation_id:e,checklist:wn(t).map(ut),...r?{openingMessage:r}:{}}},Xt=(e,t)=>{const n=Te(t);return{invocation_id:t.invocation_id??e,checklist:(t.checklist_items??[]).map(ut),...n?{openingMessage:n}:{}}},Te=e=>{var n,a;const t=(n=e.opening_message)==null?void 0:n.trim();if(t)return{id:Ut,author:X.agent,text:t,...(a=e.opening_follow_up_prompts)!=null&&a.length?{followUpPrompts:e.opening_follow_up_prompts}:{}}},Zt=e=>{try{const t=JSON.parse(e);if(Array.isArray(t)){const n=t.filter(a=>!!a&&typeof a=="object"&&typeof a.text=="string").map(a=>a.text);if(n.length>0)return n.join(`
2
+ `)}}catch{}return e},Qt=e=>{const t=e.trim();return t.length>0?`File upload
2
3
 
3
- `);l=f.pop()??"";for(const h of f)u(h)}if(l.trim()&&u(l),!i)throw new pe(502,null,"Chat stream ended without any events");return i}}const Ws=t=>{let e=null;const n=[];for(const a of t.split(`
4
- `)){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(`
5
- `):null}},_t=t=>{try{return JSON.parse(t)}catch{return}};function Vs(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 Ys={id:yt,author:Z.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 ft=0;const Xs=t=>(ft+=1,`${t}-${Date.now()}-${ft}`),Qs=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 Lt{constructor(e,n,a={}){this.seededChecklist=[],this.client=e,this.agentId=n,this.chatId=a.chatId??n,this.opening=a.openingMessage??Ys,this.model=a.model}openingMessage(){return this.opening}async bootstrapConversation(){const e=await this.client.getConversation(this.chatId),n=Pt(e.messages);return n.length===0?[this.opening]:n}async start(e){return{...await this.exchange(Qs(e)),phase:H.running}}sendMessage(e,n){return this.exchange(e,n)}async stop(){}seedChecklist(e){this.seededChecklist=e}async exchange(e,n){var i;const a=[{role:Ds.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||Xs("msg-agent"),author:Z.agent,text:r.message.content,...(i=r.follow_up_prompts)!=null&&i.length?{followUpPrompts:r.follow_up_prompts}:{}};try{const u=await this.client.getAgent(this.agentId),{checklist:c}=Ot(this.agentId,u);return this.seededChecklist=c,{message:l,checklist:c}}catch{return{message:l,...this.seededChecklist.length?{checklist:this.seededChecklist}:{}}}}}const ot=(t,e)=>n=>{var a,r;return new Lt(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)})},Mt=t=>t instanceof pe?t.message:t instanceof TypeError?"Network error while contacting the agent service.":t instanceof Error&&t.message?t.message:Nt,Zs=t=>{const e={};for(const n of t){const a=je(n);if(!a)continue;const r=n.invocation_id??n.id;e[r]=a,e[n.id]=a}return e},en=t=>JSON.stringify(t),et=(t,e)=>JSON.stringify(t)===JSON.stringify(e),Ut=t=>{const{jwt:e,headers:n,urls:a}=t,r=JSON.stringify(n??{}),l=en(a),i=o.useMemo(()=>new Fe({token:e,headers:n,urls:a}),[e,l]);o.useLayoutEffect(()=>{i.setHeaders(n)},[i,r]);const[u,c]=o.useState([]),[v,f]=o.useState([]),[h,p]=o.useState({}),[O,w]=o.useState("loading"),[j,N]=o.useState(null),[P,y]=o.useState(0),k=o.useCallback((I,U)=>{const E=I.map(tt),q=U.map(nt),K=Zs(I);c(z=>et(z,E)?z:E),f(z=>et(z,q)?z:q),p(z=>et(z,K)?z:K),w("idle"),N(null)},[]);o.useEffect(()=>{let I=!1;return w("loading"),N(null),(async()=>{try{const[U,E]=await Promise.all([i.listAgents(),i.listAgentDefinitions()]);if(I)return;k(U,E)}catch(U){if(I)return;c([]),f([]),p({}),w("error"),N(Mt(U))}})(),()=>{I=!0}},[k,i,P]);const _=o.useCallback(()=>{y(I=>I+1)},[]),C=o.useCallback(async()=>{try{const[I,U]=await Promise.all([i.listAgents(),i.listAgentDefinitions()]);k(I,U)}catch{}},[k,i]),R=o.useCallback(async I=>{const[U,E]=await Promise.all([i.getAgentChecklist(I),i.getAgent(I).catch(()=>null)]);return rt(I,U,E??void 0)},[i]),T=o.useCallback(async I=>i.listAllAgentResources(I),[i]),M=o.useCallback(async({definition:I,invocationName:U})=>{const E=await i.createAgent(I.ref,{invocationName:U}),q=await i.getAgent(E.id),K=tt(q),z=je(q);return c(D=>[K,...D]),z&&p(D=>({...D,[K.invocation_id]:z,[K.id]:z})),K},[i]),Y=o.useMemo(()=>ot(i,{resolveOpeningMessage:I=>h[I.invocation_id]??h[I.id]}),[i,h]);return{agents:u,agentDefinitions:v,loadState:O,loadError:j,reload:_,refresh:C,fetchAgentChecklist:R,fetchAgentResources:T,createAgent:M,chatConnector:Y}},tn=t=>JSON.stringify(t),Dt=t=>{const{agent:e,jwt:n,headers:a,urls:r,chatId:l}=t,i=JSON.stringify(a??{}),u=tn(r),c=o.useMemo(()=>new Fe({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}}),[n,u]);o.useLayoutEffect(()=>{c.setHeaders(a)},[c,i]);const v=o.useCallback(async w=>{const[j,N]=await Promise.all([c.getAgentChecklist(w),c.getAgent(w).catch(()=>null)]);return rt(w,j,N??void 0)},[c]),f=o.useCallback(async w=>c.listAllAgentResources(w),[c]),h=o.useCallback(async(w,j)=>c.getAgentResourceHtml(w,j),[c]),p=o.useCallback(async w=>{const j=await c.getAgentTimeline(w);return It(j)},[c]);return{connector:o.useMemo(()=>ot(c,{chatId:l??e.invocation_id})(e),[c,e.invocation_id,l]),fetchAgentChecklist:v,fetchAgentResources:f,fetchAgentResourceHtml:h,fetchAgentTimeline:p}},sn=3e4,nn=(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()},an=t=>{switch(t){case A.failed:return H.stopped;case A.complete:return H.complete;default:return H.running}},vt=(t,e)=>{e([ge(t)])},rn=(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}),$t=({agent:t,invocationId:e,open:n,onClose:a,jwt:r,headers:l,agentUrl:i,agentChecklistUrl:u,agentResourcesUrl:c,agentTimelineUrl:v,agentChatUrl:f,agentConversationUrl:h,chatId:p,enableUpload:O,initialBrief:w,initialPhase:j,initialChecklist:N})=>{const[P,y]=o.useState(p??e),[k,_]=o.useState("chat"),[C,R]=o.useState(!1),{connector:T,fetchAgentChecklist:M,fetchAgentResources:Y,fetchAgentResourceHtml:I,fetchAgentTimeline:U}=Dt({agent:{...t,invocation_id:e},jwt:r,headers:l,chatId:P,urls:{agentUrl:i,agentChecklistUrl:u,agentResourcesUrl:c,agentTimelineUrl:v,agentChatUrl:f,agentConversationUrl:h}}),E=o.useRef(T),[q,K]=o.useState(j??(w?H.running:an(t.status))),[z,D]=o.useState([]),[be,ie]=o.useState(0),[_e,le]=o.useState(),[qe,ee]=o.useState(null),[Ge,fe]=o.useState([]),[ne,ve]=o.useState(!1),[Ae,ce]=o.useState(null),[Ce,Ee]=o.useState(null),[Te,we]=o.useState(null),[Re,xe]=o.useState(!1),[Je,ke]=o.useState(null),[te,ye]=o.useState(null),[m,b]=o.useState(!1),[S,G]=o.useState(null),[X,Q]=o.useState(N??null),[ae,Se]=o.useState(!1),[zt,Ke]=o.useState(null),[Ie,We]=o.useState(!1),[Oe,Ft]=o.useState(!1),[Pe,qt]=o.useState(!1),it=o.useRef(Ie),lt=o.useRef(0),ct=o.useRef(0);o.useEffect(()=>{E.current=T},[T]),o.useEffect(()=>{it.current=Ie},[Ie]),o.useEffect(()=>{y(p??e),_("chat"),R(!1),D([]),ie(g=>g+1)},[e,p]),o.useEffect(()=>{if(!n||w)return;const g=E.current.bootstrapConversation;if(!g){vt(E.current.openingMessage(),D);return}let x=!1;return We(!0),(async()=>{try{const L=await g.call(E.current);if(x)return;D(L.map(ge))}catch{x||vt(E.current.openingMessage(),D)}finally{x||We(!1)}})(),()=>{x=!0}},[n,w,e,P]);const de=o.useCallback(()=>{const g=++lt.current;(async()=>{var x,L;try{const W=await M(e);if(g!==lt.current)return;Q(se=>JSON.stringify(se)===JSON.stringify(W.checklist)?se:W.checklist),Ke(null),(L=(x=E.current).seedChecklist)==null||L.call(x,W.checklist)}catch{}})()},[M,e]),Le=o.useCallback(()=>{c&&(async()=>{try{const g=await Y(e);fe(g),ce(null)}catch{}})()},[c,Y,e]),ue=o.useCallback(()=>{if(!v)return;const g=++ct.current;(async()=>{try{const x=await U(e);if(g!==ct.current)return;ye(L=>JSON.stringify(L)===JSON.stringify(x)?L:x),G(null)}catch{}})()},[v,U,e]);o.useEffect(()=>{if(!n||w)return;const g=window.setInterval(()=>{const x=E.current.bootstrapConversation;x&&(async()=>{try{const L=await x.call(E.current);if(it.current)return;const W=L.map(ge);let se=!1;D(ut=>rn(ut,W)?ut:(se=!0,W)),se&&(de(),ue())}catch{}})()},sn);return()=>{window.clearInterval(g)}},[n,w,e,P,de,ue]);const Gt=o.useCallback(g=>{var x,L;g.checklist?(Q(g.checklist),(L=(x=E.current).seedChecklist)==null||L.call(x,g.checklist)):de(),g.phase&&K(g.phase),Le(),ue()},[de,Le,ue]);o.useEffect(()=>{var g,x;!n||w||N&&N.length>0&&((x=(g=E.current).seedChecklist)==null||x.call(g,N))},[n,w,N]),o.useEffect(()=>{if(!n||w)return;let g=!1;return Se(x=>N!=null&&N.length?!1:x||X===null||X.length===0),Ke(null),(async()=>{var x,L;try{const W=await M(e);if(g)return;N!=null&&N.length||(Q(W.checklist),(L=(x=E.current).seedChecklist)==null||L.call(x,W.checklist))}catch{!g&&!(N!=null&&N.length)&&Ke($e)}finally{g||Se(!1)}})(),()=>{g=!0}},[n,e,w,N,M]),o.useEffect(()=>{if(!n||!c)return;let g=!1;return ve(!0),ce(null),(async()=>{try{const x=await Y(e);g||fe(x)}catch{g||ce(ns)}finally{g||ve(!1)}})(),()=>{g=!0}},[n,e,c,Y]);const Jt=o.useCallback(()=>{Ee(null),we(null),ke(null),xe(!1)},[]),Kt=o.useCallback(g=>{if(g.misRecordUrl){window.open(g.misRecordUrl,"_blank","noopener,noreferrer");return}Ee(g),we(null),ke(null),xe(!0),(async()=>{try{const x=await I(e,g.id);we(x)}catch{ke(as)}finally{xe(!1)}})()},[I,e]);o.useEffect(()=>{if(!n||!v)return;let g=!1;return b(x=>x||te===null),G(null),(async()=>{try{const x=await U(e);g||ye(x)}catch{g||G(St)}finally{g||b(!1)}})(),()=>{g=!0}},[n,e,v,U]),o.useEffect(()=>{if(!n||!w)return;let g=!1;const x={id:`user-brief-${Date.now()}`,author:Z.user,text:nn(w,t.invocation_name)};return(async()=>{var W,se;const L=await E.current.start(w);g||(D([ge(E.current.openingMessage()),ge(x),ge(L.message)]),L.checklist?(Q(L.checklist),(se=(W=E.current).seedChecklist)==null||se.call(W,L.checklist)):de(),K(L.phase??H.running),Le(),ue())})(),()=>{g=!0}},[n,w,t.invocation_name,e,de,Le,ue]);const Wt=o.useCallback(g=>{ee(Ls(g))},[]),Ve=p??e,Me=te==null?void 0:te.chatSessions,dt=Me!=null&&Me.length?Me.reduce((g,x)=>Date.parse(x.timestamp)<Date.parse(g.timestamp)?x:g).sessionId:void 0,Ye=o.useCallback(()=>{_("chat"),R(!1),P!==Ve&&(y(Ve),D([]),ie(g=>g+1))},[P,Ve]),Vt=o.useCallback(g=>{if(g===dt){Ye();return}y(g),R(!0),_("chat"),D([]),ie(x=>x+1)},[dt,Ye]),Yt=o.useCallback(g=>{ee(null),le(g),ie(x=>x+1)},[]),Xt=o.useCallback(async()=>{await E.current.stop(),K(H.stopped)},[]),Qt=X;return s.jsxs(d.Modal,{open:n,closeHandler:a,hideCloseButton:!0,className:"agent-workspace",children:[s.jsxs(d.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(d.Icon,{name:"ask-arbor",size:24})}),s.jsx(d.Modal.Title,{children:t.invocation_name}),s.jsx("span",{className:J("agent-workspace__phase",`agent-workspace__phase--${q}`),children:is[q]})]}),s.jsxs("div",{className:"agent-workspace__header-actions",children:[s.jsx(d.Button,{variant:Oe?"secondary":"primary",size:"S",iconLeftName:"clipboard-list",iconLeftScreenReaderText:"Toggle checklist","aria-pressed":!Oe,onClick:()=>Ft(g=>!g),children:"Checklist"}),s.jsx(d.Button,{variant:Pe?"secondary":"primary",size:"S",iconLeftName:"files",iconLeftScreenReaderText:"Toggle resources","aria-pressed":!Pe,onClick:()=>qt(g=>!g),children:"Resources"}),s.jsx(d.Button,{variant:"secondary",size:"S",iconLeftName:"x",iconLeftScreenReaderText:"Close",onClick:a,children:"Close"})]})]}),s.jsxs(d.Modal.Body,{className:J("agent-workspace__body",{"agent-workspace__body--no-checklist":Oe,"agent-workspace__body--no-resources":Pe}),children:[" ",s.jsxs("section",{className:J("agent-workspace__panel","agent-workspace__panel--chat",{"agent-workspace__panel--timeline":!!v&&k==="timeline"}),"aria-label":"Agent",children:[s.jsxs("div",{className:"agent-workspace__panel-header",children:[s.jsx(d.Heading,{level:4,children:"Agent"}),q===H.running&&s.jsx(d.Button,{className:"agent-workspace__panel-header-action",variant:"secondary-destructive",size:"S",iconLeftName:"circle-x",iconLeftScreenReaderText:"Stop",onClick:()=>void Xt(),children:"Stop agent"})]}),v&&s.jsxs(d.Tabs,{className:"agent-workspace__center-tabs","aria-label":"Center panel",children:[s.jsx(d.Tabs.Item,{active:k==="chat",tabElementProps:{id:"agent-center-tab-chat",onClick:()=>_("chat")},children:"Chat"}),s.jsx(d.Tabs.Item,{active:k==="timeline",tabElementProps:{id:"agent-center-tab-timeline",onClick:()=>_("timeline")},children:"Timeline"})]}),v&&k==="chat"&&C&&s.jsx("div",{className:"agent-workspace__center-back",children:s.jsx(d.Button,{variant:"tertiary",size:"S",iconLeftName:"arrow-left",iconLeftScreenReaderText:"Back to main chat",onClick:Ye,children:"Back to main chat"})}),v&&k==="timeline"&&s.jsx(Os,{timeline:te,isLoading:m,error:S,onOpenChatSession:Vt}),s.jsx("div",{className:"agent-workspace__chat-keep-alive",hidden:!!v&&k!=="chat",children:s.jsx(ks,{connector:T,phase:q,chatHistory:z,chatSessionKey:be,startQuery:_e,clarificationMessage:qe,enableUpload:O,onTurn:Gt,onAwaitingChange:We,onClarificationPrompt:Yt,onDismissClarification:()=>ee(null)})})]}),!Oe&&s.jsx(ys,{checklist:Qt,isLoading:ae,error:zt,phase:q,canRequestInput:q===H.running&&!Ie,onAttentionItemClick:Wt}),!Pe&&s.jsx(js,{resources:Ge,isLoading:ne,error:Ae,onOpenResource:Kt}),s.jsx(Ss,{resource:Ce,html:Te,isLoading:Re,error:Je,onClose:Jt})]})]})},on="Unable to load agent definitions. Please try again.",ln="Unable to start the agent.",wt="Loading agents…",Ht=({open:t,onClose:e,onStart:n,agentDefinitions:a,definitionsState:r="idle",definitionsError:l=null,onRetryDefinitions:i,embedded:u=!1})=>{const[c,v]=o.useState(void 0),[f,h]=o.useState(""),[p,O]=o.useState(!1),[w,j]=o.useState(null),N=[...a].sort((R,T)=>R.display_name.localeCompare(T.display_name)).map(R=>({value:R.ref,label:R.display_name}));o.useEffect(()=>{t&&(v(void 0),h(""),O(!1),j(null))},[t]);const P=c!==void 0&&f.trim().length>0,y=o.useCallback(R=>{const T=a.find(M=>M.ref===R[0]);T&&v(T)},[a]),k=o.useCallback(async()=>{if(!(!c||!P||p)){O(!0),j(null);try{await n({definition:c,invocationName:f.trim()})}catch(R){j(R instanceof Error?R.message:ln)}finally{O(!1)}}},[P,c,f,p,n]);if(r==="idle"&&a.length===0||!t)return null;const _=s.jsxs("div",{className:"new-agent__header-title",children:[s.jsx("span",{className:"new-agent__header-avatar","aria-hidden":"true",children:s.jsx(d.Icon,{name:"ask-arbor",size:24})}),u?s.jsx("h2",{className:"new-agent__title",children:"Start an agent"}):s.jsx(d.Modal.Title,{children:"Start an agent"})]});let C;return r==="loading"?C=s.jsxs("div",{className:"new-agent__state","aria-live":"polite",children:[s.jsx(d.Icon,{name:"loader",size:24,color:"var(--color-brand-600)",className:"new-agent__spinner",screenReaderText:wt}),s.jsx("p",{className:"new-agent__state-message",children:wt})]}):r==="error"?C=s.jsxs("div",{className:"new-agent__state new-agent__state--error",role:"alert",children:[s.jsx(d.Icon,{name:"triangle-alert",size:24,color:"var(--color-semantic-destructive-600)"}),s.jsx("p",{className:"new-agent__state-message",children:l??on}),i?s.jsx(d.Button,{variant:"secondary",size:"S",onClick:i,children:"Try again"}):null]}):C=s.jsxs("form",{className:"new-agent__form","aria-label":"Start an agent",onSubmit:R=>{R.preventDefault(),P&&!p&&k()},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(d.SelectDropdown,{id:"new-agent-type",placeholder:"Which agent would you like to start?",options:N,selectedValues:c?[c.ref]:[],onSelectionChange:y})]}),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(d.TextInput,{id:"new-agent-invocation-name",value:f,placeholder:"What would you like to call your agent?",onChange:R=>h(R.target.value)})]}),w?s.jsx("p",{className:"new-agent__error",role:"alert",children:w}):null,s.jsx("div",{className:"new-agent__actions",children:s.jsx(d.Button,{type:"submit",variant:"primary",className:J("new-agent__start-button",{"new-agent__start-button--starting":p}),disabled:!P||p,iconLeftName:p?"loader":"sparkles",iconLeftScreenReaderText:p?"Starting":void 0,children:p?"Starting…":"Start"})})]}),u?s.jsxs("div",{className:J("new-agent","new-agent--embedded"),children:[s.jsx("div",{className:"new-agent__header",children:_}),s.jsx("div",{className:"new-agent__body",children:C})]}):s.jsxs(d.Modal,{open:t,closeHandler:e,className:"new-agent",children:[s.jsx(d.Modal.Header,{className:"new-agent__header",children:_}),s.jsx(d.Modal.Body,{className:"new-agent__body",children:C})]})},xt=t=>{window.location.assign(t)},cn=({open:t,authToken:e,headers:n,agentDefinitionsUrl:a,agentsUrl:r,closeUrl:l,successUrl:i,onClose:u,onStart:c,embedded:v=!1})=>{const f=JSON.stringify(n??{}),h=o.useMemo(()=>new Fe({token:e,headers:n,urls:{agentDefinitions:a,agents:r}}),[e,a,r,f]),[p,O]=o.useState([]),[w,j]=o.useState("loading"),[N,P]=o.useState(null),[y,k]=o.useState(0);o.useEffect(()=>{if(!t)return;let T=!1;return j("loading"),P(null),(async()=>{try{const M=await h.listAgentDefinitions();if(T)return;O(M.map(nt)),j("idle")}catch(M){if(T)return;O([]),P(Mt(M)),j("error")}})(),()=>{T=!0}},[h,t,y]);const _=o.useCallback(()=>{u==null||u(),l&&xt(l)},[l,u]),C=o.useCallback(async T=>{await h.createAgent(T.definition.ref,{invocationName:T.invocationName}),c==null||c(T),i&&xt(i)},[h,c,i]),R=o.useCallback(()=>{k(T=>T+1)},[]);return s.jsx(Ht,{open:t,onClose:_,onStart:C,agentDefinitions:p,definitionsState:w,definitionsError:N,onRetryDefinitions:R,embedded:v})},dn=t=>"agentDefinitionsUrl"in t,Bt=t=>dn(t)?s.jsx(cn,{...t}):s.jsx(Ht,{...t}),un=t=>t!==void 0&&t.some(e=>e.status===B.hitl),gn=(t,e)=>un(e)?A.hitl:t.status,hn=({column:t,label:e})=>t.statusIcon?s.jsx("span",{className:"agent-view__status-indicator",children:s.jsx(d.Icon,{name:t.statusIcon.name,size:16,color:t.statusIcon.color,className:J({"agent-view__progress-icon--spinning":t.statusIcon.spin}),screenReaderText:e})}):s.jsx("span",{className:J("agent-view__dot",{[`agent-view__dot--${t.dotModifier}`]:t.dotModifier}),children:s.jsx(d.Dot,{colour:t.dotColour,label:e})}),pn=({agent:t,agentName:e,column:n,isExpanded:a,isLoading:r,checklist:l,error:i,onToggle:u,onViewAgent:c})=>{const{id:v,invocation_name:f}=t,h=`agent-card-${v}-header`,p=`agent-card-${v}-progress`;return s.jsx("li",{className:J("agent-view__card",{"agent-view__card--expanded":a}),children:s.jsxs(d.Card,{spacing:"dense",children:[s.jsx("button",{type:"button",className:"agent-view__card-toggle","aria-expanded":a,"aria-controls":p,"aria-label":f,id:h,onClick:()=>u(v),children:s.jsxs("div",{className:"agent-view__card-content",children:[s.jsx(hn,{column:n}),s.jsx("span",{className:"agent-view__card-invocation-name",children:f}),s.jsx("span",{className:"agent-view__card-agent-name",children:e}),s.jsx(d.Icon,{name:a?"chevron-up":"chevron-down",size:16,className:"agent-view__card-chevron"})]})}),a&&s.jsxs("div",{id:p,"aria-labelledby":h,className:"agent-view__card-progress",children:[r&&s.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[s.jsx(d.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:he}),s.jsx("span",{children:he})]}),!r&&i&&s.jsx("p",{className:"agent-view__progress-error",role:"alert",children:i}),!r&&!i&&l!==null&&s.jsx(vs,{checklist:l}),!r&&!i&&l===null&&s.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[s.jsx(d.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:he}),s.jsx("span",{children:he})]}),s.jsx("div",{className:"agent-view__card-actions",children:s.jsx(d.Button,{variant:"secondary",size:"S",onClick:()=>c==null?void 0:c(t),children:"View agent"})})]})]})})},kt=({column:t,agents:e,expandedAgentId:n,loadingAgentId:a,checklistByInvocationId:r,errorByAgentId:l,definitionNameByRef:i,onToggleAgent:u,onViewAgent:c,isSplit:v=!1})=>s.jsxs("section",{className:J("agent-view__column",{"agent-view__column--split":v}),"aria-label":t.title,children:[s.jsxs("div",{className:"agent-view__column-header",children:[s.jsx(d.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(f=>s.jsx(pn,{agent:f,agentName:st(f,i),column:t,isExpanded:n===f.id,isLoading:a===f.id,checklist:r[f.invocation_id]??null,error:l[f.id]??null,onToggle:u,onViewAgent:c},f.id))})]}),st=(t,e)=>e.get(t.agent_definition_ref)??t.agent_definition_ref.replace(/_/g," "),mn=({jwt:t,headers:e,agentDefinitionsUrl:n,agentsUrl:a,agentUrl:r,agentChecklistUrl:l,agentResourcesUrl:i,agentTimelineUrl:u,agentChatUrl:c,agentConversationUrl:v,enableUpload:f,showHeader:h=!1,institutions:p})=>{var ye;const O=o.useMemo(()=>({agentDefinitions:n,agents:a,agent:r,agentChecklist:l,...i?{agentResources:i}:{},...u?{agentTimeline:u}:{},agentChat:c,agentConversation:v}),[n,a,r,l,i,u,c,v]),[w,j]=o.useState(null),N=w?(ye=p==null?void 0:p.find(m=>m.applicationId===w.application_id))==null?void 0:ye.applicationUrl:void 0,P=o.useMemo(()=>{const m={...e??{}};return N?m[oe.arborApplicationUrl]=N:delete m[oe.arborApplicationUrl],m},[e,N]),{agents:y,agentDefinitions:k,loadState:_,loadError:C,reload:R,refresh:T,fetchAgentChecklist:M,createAgent:Y}=Ut({jwt:t,headers:P,urls:O}),[I,U]=o.useState(!1),[E,q]=o.useState(null),[K,z]=o.useState(null),[D,be]=o.useState({}),[ie,_e]=o.useState({}),[le,qe]=o.useState([]),[ee,Ge]=o.useState([]),fe=o.useMemo(()=>{const m=new Set(y.map(S=>S.application_id)),b=new Map((p??[]).map(S=>[S.applicationId,S.name]));return[...m].sort((S,G)=>(b.get(S)??S).localeCompare(b.get(G)??G)).map(S=>({value:S,label:b.get(S)??S}))},[y,p]),ne=o.useMemo(()=>new Map(k.map(m=>[m.ref,m.display_name])),[k]),ve=o.useMemo(()=>[...new Set(y.map(b=>st(b,ne)))].sort((b,S)=>b.localeCompare(S)).map(b=>({value:b,label:b})),[y,ne]),Ae=o.useMemo(()=>y.filter(m=>!(le.length>0&&!le.includes(m.application_id)||ee.length>0&&!ee.includes(st(m,ne)))),[y,ne,ee,le]),ce=fe.length>1,Ce=ve.length>1,Ee=ce||Ce;o.useEffect(()=>{const m=window.setInterval(()=>{T()},6e4);return()=>{window.clearInterval(m)}},[T]),o.useEffect(()=>{if(y.length===0)return;let m=!1;return(async()=>{const b=await Promise.allSettled(y.map(async S=>{const G=await M(S.invocation_id);return{agentId:S.id,invocationId:S.invocation_id,checklist:G.checklist}}));m||(be(S=>{const G={...S};let X=!1;for(const Q of b){if(Q.status!=="fulfilled")continue;const{invocationId:ae,checklist:Se}=Q.value;JSON.stringify(S[ae])!==JSON.stringify(Se)&&(G[ae]=Se,X=!0)}return X?G:S}),_e(S=>{const G={...S};let X=!1;return b.forEach((Q,ae)=>{Q.status==="rejected"&&G[y[ae].id]!==$e&&(G[y[ae].id]=$e,X=!0)}),X?G:S}))})(),()=>{m=!0}},[y,M]);const Te=o.useCallback(async m=>{if(!D[m.invocation_id]){z(m.id),_e(b=>{const S={...b};return delete S[m.id],S});try{const b=await M(m.invocation_id);be(S=>({...S,[m.invocation_id]:b.checklist}))}catch{_e(b=>({...b,[m.id]:$e}))}finally{z(b=>b===m.id?null:b)}}},[M,D]),we=o.useCallback(m=>{if(E===m){q(null);return}const b=y.find(({id:S})=>S===m);b&&(q(m),Te(b))},[y,E,Te]),Re=o.useMemo(()=>{const m={};for(const b of Ae){const S=gn(b,D[b.invocation_id]);(m[S]??(m[S]=[])).push(b)}return m},[Ae,D]),xe=o.useCallback(m=>{j(m)},[]),Je=o.useCallback(async m=>{const b=await Y(m);j(b),U(!1)},[Y]),ke=o.useCallback(()=>{j(null)},[]),te={expandedAgentId:E,loadingAgentId:K,checklistByInvocationId:D,errorByAgentId:ie,definitionNameByRef:ne,onToggleAgent:we,onViewAgent:xe};return s.jsxs("div",{className:"agent-view-frontend agent-view",children:[h&&s.jsxs("div",{className:"agent-view__header",children:[s.jsx(d.Heading,{level:1,children:"Agents"}),s.jsx(d.Button,{variant:"primary",size:"S",iconLeftName:"sparkles",iconLeftScreenReaderText:"Start an agent",onClick:()=>U(!0),children:"Start an agent"})]}),y.length>0&&Ee&&s.jsxs("div",{className:"agent-view__filters",children:[ce&&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(d.Combobox,{id:"agent-view-institution-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All institutions",options:fe,value:le,onValueChange:qe,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear institutions"})]}),Ce&&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(d.Combobox,{id:"agent-view-agent-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All agents",options:ve,value:ee,onValueChange:Ge,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear agents"})]})]}),_==="error"?s.jsxs("div",{className:"agent-view__state agent-view__state--error",role:"alert",children:[s.jsx(d.Icon,{name:"triangle-alert",size:24,color:"var(--color-semantic-destructive-600)"}),s.jsx("p",{className:"agent-view__state-message",children:C??Nt}),s.jsx(d.Button,{variant:"secondary",size:"S",onClick:R,children:"Try again"})]}):_==="loading"&&y.length===0?s.jsxs("div",{className:"agent-view__state","aria-live":"polite",children:[s.jsx(d.Icon,{name:"loader",size:24,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:ht}),s.jsx("p",{className:"agent-view__state-message",children:ht})]}):y.length===0?s.jsx(gs,{}):s.jsxs("div",{className:"agent-view__board",children:[Zt.map(m=>s.jsx(kt,{column:He[m],agents:Re[m]??[],...te},m)),s.jsx("div",{className:"agent-view__split-column",children:es.map(m=>s.jsx(kt,{column:He[m],agents:Re[m]??[],isSplit:!0,...te},m))})]}),w&&s.jsx($t,{agent:w,invocationId:w.invocation_id,open:!0,jwt:t,headers:P,agentUrl:r,agentChecklistUrl:l,agentResourcesUrl:i,agentTimelineUrl:u,agentChatUrl:c,agentConversationUrl:v,enableUpload:f,initialChecklist:D[w.invocation_id]??null,onClose:ke},w.id),s.jsx(Bt,{open:I,onClose:()=>U(!1),onStart:Je,agentDefinitions:k})]})},_n=(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:ts,created_by:ss,status:A["generating-a-response"],context_ref:null,checklist_ref:null}};exports.AgentMonitorKanban=mn;exports.AgentServiceClient=Fe;exports.AgentServiceError=pe;exports.AgentView=$t;exports.HttpChatConnector=Lt;exports.NewAgentModal=Bt;exports.buildAgentFromDefinition=_n;exports.createHttpChatConnectorFactory=ot;exports.mapApiAgent=tt;exports.mapApiAgentDefinition=nt;exports.mapApiAgentStatus=Ct;exports.mapApiAgentTimelineResponse=It;exports.mapApiChecklistEndpointResponse=rt;exports.mapApiChecklistItem=at;exports.mapApiChecklistResponse=Ot;exports.mapApiChecklistStatus=Et;exports.mapApiConversationMessages=Pt;exports.mapApiOpeningMessage=je;exports.mapApiResource=Tt;exports.mapApiResourcesEndpointResponse=Rt;exports.mapApiTripOption=Hs;exports.useAgentService=Ut;exports.useAgentWorkspace=Dt;
4
+ ${t}`:"File upload"},es=e=>e.filter(t=>t.message_type==="user_file"&&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=>{if(t.message_type==="user_file"){const n=typeof t.content=="string"?t.content:"",a=Zt(n);return{id:t.message_id,author:X.user,kind:xs.user_file,text:Qt(a)}}return{id:t.message_id,author:t.role==="user"?X.user:X.agent,text:t.content}}),xn=/:invocationId\b/g,kn=/:resourceId\b/g,Sn=e=>e.trim().replace(/^Bearer\s+/i,""),yn=e=>e.endsWith("/")?e.slice(0,-1):e;class Ke{constructor(t){var a;this.baseUrl=yn(t.baseUrl??"");const n=(a=t.token)==null?void 0:a.trim();this.token=n?Sn(n):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(B.GET,this.resolveUrl("agentDefinitions",$.agentDefinitions))).agent_definitions??[]}getAgentDefinition(t){return this.request(B.GET,this.apiUrl(`${$.agentDefinitions}/${encodeURIComponent(t)}`))}listTripOptions(){return this.request(B.GET,this.apiUrl($.tripOptions))}getDataset(){return this.request(B.GET,this.apiUrl($.demoDataset))}setDataset(t){return this.request(B.POST,this.apiUrl($.demoDataset),{dataset:t})}listAgents(t={}){const n=new URLSearchParams;t.status&&n.set("status",t.status),t.agentDefinitionRef&&n.set("agent_definition_ref",t.agentDefinitionRef);const a=n.toString()?`?${n.toString()}`:"";return this.request(B.GET,`${this.resolveUrl("agents",$.agents)}${a}`)}createAgent(t,n={}){var o,p;const a={agent_definition_ref:t},r=(o=n.invocationName)==null?void 0:o.trim(),l=(p=n.agentIntent)==null?void 0:p.trim();return r&&(a.invocation_name=r),l&&(a.agent_intent=l),this.request(B.POST,this.resolveUrl("agents",$.agents),a)}getAgent(t){return this.request(B.GET,this.resolveUrl("agent",`${$.agents}/${encodeURIComponent(t)}`,t))}getAgentChecklist(t){return this.request(B.GET,this.resolveUrl("agentChecklist",`${$.agents}/${encodeURIComponent(t)}/checklist`,t))}getAgentResources(t,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",`${$.agents}/${encodeURIComponent(t)}/resources`,t);return this.request(B.GET,r?`${l}?${r}`:l)}async listAllAgentResources(t){const n=mn;let a=1;const r=[];let l=Number.POSITIVE_INFINITY;for(;r.length<l;){const o=Vt(await this.getAgentResources(t,{pageNumber:a,pageSize:n}));if(l=o.totalRecords,o.resources.length===0||(r.push(...o.resources),r.length>=l))break;a+=1}return r}getAgentResourceHtml(t,n){return this.requestText(B.GET,this.resolveResourceHtmlUrl(t,n))}getAgentTimeline(t){return this.request(B.GET,this.resolveUrl("agentTimeline",`${$.agents}/${encodeURIComponent(t)}/agent-timeline`,t))}getAgentContext(t){return this.request(B.GET,this.apiUrl(`${$.agents}/${encodeURIComponent(t)}/context`))}cancelAgent(t){return this.request(B.POST,this.resolveUrl("stopAgent",`${$.agents}/${encodeURIComponent(t)}/cancel`,t))}archiveAgent(t){return this.request(B.POST,this.apiUrl(`${$.agents}/${encodeURIComponent(t)}/archive`))}getConversation(t){return this.request(B.GET,this.resolveUrl("agentConversation",`${$.conversations}/${encodeURIComponent(t)}`,t))}async chat(t,n,a={}){const r=!!(a.uploadFiles&&a.uploadFiles.length>0),l=await this.fetchImpl(this.resolveUrl("agentChat",`${$.agents}/${encodeURIComponent(t)}/chat`,t),{method:B.POST,headers:{...this.customHeaders,...this.authHeaders(),Accept:ue.acceptEventStream,...r?{}:{"Content-Type":ue.contentTypeJson}},body:r?bn(n,a.uploadFiles??[]):JSON.stringify(n),signal:a.signal});if(!l.ok)throw await this.toError(l);if(!l.body)throw new fe(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}${gn}${t}`}resolveUrl(t,n,a,r){const l=this.urls[t];if(!l)return this.apiUrl(n);let o=l;return a&&(o=o.replace(xn,encodeURIComponent(a))),r&&(o=o.replace(kn,encodeURIComponent(r))),o}resolveResourceHtmlUrl(t,n){return this.urls.agentResourceHtml?this.resolveUrl("agentResourceHtml",`${$.agents}/${encodeURIComponent(t)}/resources/${encodeURIComponent(n)}`,t,n):this.urls.agentResources?`${this.resolveUrl("agentResources",`${$.agents}/${encodeURIComponent(t)}/resources`,t).replace(/\/$/,"")}/${encodeURIComponent(n)}`:this.apiUrl(`${$.agents}/${encodeURIComponent(t)}/resources/${encodeURIComponent(n)}`)}async request(t,n,a){const r=await this.fetchImpl(n,{method:t,headers:{...this.customHeaders,...this.authHeaders(),Accept:ue.acceptJson,...a===void 0?{}:{"Content-Type":ue.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,n){const a=await this.fetchImpl(n,{method:t,headers:{...this.customHeaders,...this.authHeaders(),Accept:ue.acceptHtml}});if(!a.ok)throw await this.toError(a);return a.text()}async toError(t){let n=null;try{n=await t.json()}catch{}return new fe(t.status,n,`Agent service request failed (${t.status} ${t.statusText})`)}async consumeSse(t,n){const a=t.getReader(),r=new TextDecoder;let l="",o;const p=c=>{const{event:g,data:m}=Nn(c);if(m===null)return;if(g===hn.error){const x=Tt(m);throw new fe(502,x,(x==null?void 0:x.message)??"Chat stream error")}const S=Tt(m);S&&(o=S,n==null||n(S))};for(;;){const{done:c,value:g}=await a.read();if(c)break;l+=r.decode(g,{stream:!0});const m=l.split(`
5
+
6
+ `);l=m.pop()??"";for(const S of m)p(S)}if(l.trim()&&p(l),!o)throw new fe(502,null,"Chat stream ended without any events");return o}}const Nn=e=>{let t=null;const n=[];for(const a of e.split(`
7
+ `)){const r=a.trimEnd();r.startsWith("event:")?t=r.slice(6).trim():r.startsWith("data:")&&n.push(r.slice(5).trim())}return{event:t,data:n.length>0?n.join(`
8
+ `):null}},Tt=e=>{try{return JSON.parse(e)}catch{return}};function bn(e,t){const n=new FormData;n.append("body",JSON.stringify(e));for(const a of t)n.append("files",a,a.name);return n}const An={id:Ut,author:X.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 It=0;const jn=e=>(It+=1,`${e}-${Date.now()}-${It}`),Cn=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 ts{constructor(t,n,a={}){this.seededChecklist=[],this.client=t,this.agentId=n,this.chatId=a.chatId??n,this.opening=a.openingMessage??An,this.model=a.model}openingMessage(){return this.opening}async bootstrapConversation(){const t=await this.client.getConversation(this.chatId),n=es(t.messages);return n.length===0?[this.opening]:n}async start(t){return{...await this.exchange(Cn(t)),phase:H.running}}sendMessage(t,n){return this.exchange(t,n)}async stop(){await this.client.cancelAgent(this.agentId)}seedChecklist(t){this.seededChecklist=t}async exchange(t,n){var o;const a=[{role:pn.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"}},...n&&n.length>0?[{uploadFiles:n}]:[]),l={id:r.event_id||jn("msg-agent"),author:X.agent,text:r.message.content,...(o=r.follow_up_prompts)!=null&&o.length?{followUpPrompts:r.follow_up_prompts}:{}};try{const p=await this.client.getAgent(this.agentId),{checklist:c}=Xt(this.agentId,p);return this.seededChecklist=c,{message:l,checklist:c}}catch{return{message:l,...this.seededChecklist.length?{checklist:this.seededChecklist}:{}}}}}const ht=(e,t)=>n=>{var a,r;return new ts(e,n.invocation_id,{model:t==null?void 0:t.model,chatId:((a=t==null?void 0:t.resolveChatId)==null?void 0:a.call(t,n))??(t==null?void 0:t.chatId)??n.invocation_id,openingMessage:((r=t==null?void 0:t.resolveOpeningMessage)==null?void 0:r.call(t,n))??(t==null?void 0:t.openingMessage)})},ss=e=>e instanceof fe?e.message:e instanceof TypeError?"Network error while contacting the agent service.":e instanceof Error&&e.message?e.message:$t,En=e=>{const t={};for(const n of e){const a=Te(n);if(!a)continue;const r=n.invocation_id??n.id;t[r]=a,t[n.id]=a}return t},Rn=e=>JSON.stringify(e),at=(e,t)=>JSON.stringify(e)===JSON.stringify(t),ns=e=>{const{jwt:t,headers:n,urls:a}=e,r=JSON.stringify(n??{}),l=Rn(a),o=i.useMemo(()=>new Ke({token:t,headers:n,urls:a}),[t,l]);i.useLayoutEffect(()=>{o.setHeaders(n)},[o,r]);const[p,c]=i.useState([]),[g,m]=i.useState([]),[S,x]=i.useState({}),[E,R]=i.useState("loading"),[f,G]=i.useState(null),[j,I]=i.useState(0),y=i.useCallback((T,D)=>{const F=T.map(ot),K=D.map(dt),W=En(T);c(L=>at(L,F)?L:F),m(L=>at(L,K)?L:K),x(L=>at(L,W)?L:W),R("idle"),G(null)},[]);i.useEffect(()=>{let T=!1;return R("loading"),G(null),(async()=>{try{const[D,F]=await Promise.all([o.listAgents(),o.listAgentDefinitions()]);if(T)return;y(D,F)}catch(D){if(T)return;c([]),m([]),x({}),R("error"),G(ss(D))}})(),()=>{T=!0}},[y,o,j]);const _=i.useCallback(()=>{I(T=>T+1)},[]),N=i.useCallback(async()=>{try{const[T,D]=await Promise.all([o.listAgents(),o.listAgentDefinitions()]);y(T,D)}catch{}},[y,o]),v=i.useCallback(async T=>{const[D,F]=await Promise.all([o.getAgentChecklist(T),o.getAgent(T).catch(()=>null)]);return gt(T,D,F??void 0)},[o]),C=i.useCallback(async T=>o.listAllAgentResources(T),[o]),U=i.useCallback(async({definition:T,invocationName:D})=>{const F=await o.createAgent(T.ref,{invocationName:D}),K=await o.getAgent(F.id),W=ot(K),L=Te(K);return c(O=>[W,...O]),L&&x(O=>({...O,[W.invocation_id]:L,[W.id]:L})),W},[o]),we=i.useMemo(()=>ht(o,{resolveOpeningMessage:T=>S[T.invocation_id]??S[T.id]}),[o,S]);return{agents:p,agentDefinitions:g,loadState:E,loadError:f,reload:_,refresh:N,fetchAgentChecklist:v,fetchAgentResources:C,createAgent:U,chatConnector:we}},Tn=e=>JSON.stringify(e),as=e=>{const{agent:t,jwt:n,headers:a,urls:r,chatId:l}=e,o=JSON.stringify(a??{}),p=Tn(r),c=i.useMemo(()=>new Ke({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]);i.useLayoutEffect(()=>{c.setHeaders(a)},[c,o]);const g=i.useCallback(async R=>{const[f,G]=await Promise.all([c.getAgentChecklist(R),c.getAgent(R).catch(()=>null)]);return gt(R,f,G??void 0)},[c]),m=i.useCallback(async R=>c.listAllAgentResources(R),[c]),S=i.useCallback(async(R,f)=>c.getAgentResourceHtml(R,f),[c]),x=i.useCallback(async R=>{const f=await c.getAgentTimeline(R);return Yt(f)},[c]);return{connector:i.useMemo(()=>ht(c,{chatId:l??t.invocation_id})(t),[c,t.invocation_id,l]),fetchAgentChecklist:g,fetchAgentResources:m,fetchAgentResourceHtml:S,fetchAgentTimeline:x}},In=3e4,On=(e,t)=>{const n=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`${n}${a}.${r}`.trim()},Ln=e=>{switch(e){case A.failed:return H.stopped;case A.complete:return H.complete;default:return H.running}},Ot=(e,t)=>{t([me(e)])},Mn=(e,t)=>e.length===t.length&&e.every((n,a)=>{const r=t[a];return r!==void 0&&n.id===r.id&&n.text===r.text}),rs=({agent:e,invocationId:t,open:n,onClose:a,jwt:r,headers:l,agentUrl:o,agentChecklistUrl:p,agentResourcesUrl:c,agentTimelineUrl:g,agentChatUrl:m,agentConversationUrl:S,stopAgentUrl:x,chatId:E,enableUpload:R,initialBrief:f,initialPhase:G,initialChecklist:j,usePusherToRepoll:I=!1,pusherChannelPrefix:y=ct,subscribeToPusher:_})=>{const[N,v]=i.useState(E??t),[C,U]=i.useState("chat"),[we,T]=i.useState(!1),{connector:D,fetchAgentChecklist:F,fetchAgentResources:K,fetchAgentResourceHtml:W,fetchAgentTimeline:L}=as({agent:{...e,invocation_id:t},jwt:r,headers:l,chatId:N,urls:{agentUrl:o,agentChecklistUrl:p,agentResourcesUrl:c,agentTimelineUrl:g,agentChatUrl:m,agentConversationUrl:S,stopAgentUrl:x}}),O=i.useRef(D),[Z,xe]=i.useState(G??(f?H.running:Ln(e.status))),[Ie,q]=i.useState([]),[Oe,ge]=i.useState(0),[ke,he]=i.useState(),[We,ne]=i.useState(null),[Ve,Se]=i.useState([]),[le,ye]=i.useState(!1),[Le,pe]=i.useState(null),[Me,Pe]=i.useState(null),[Ue,Ne]=i.useState(null),[De,be]=i.useState(!1),[Ye,Ae]=i.useState(null),[ae,je]=i.useState(null),[h,b]=i.useState(!1),[k,J]=i.useState(null),[Q,ee]=i.useState(j??null),[ce,Ce]=i.useState(!1),[ls,Xe]=i.useState(null),[pt,mt]=i.useState(!1),[_t,ft]=i.useState(null),[$e,Ze]=i.useState(!1),[He,cs]=i.useState(!1),[Fe,ds]=i.useState(!1),vt=i.useRef($e),wt=i.useRef(0),xt=i.useRef(0);i.useEffect(()=>{O.current=D},[D]),i.useEffect(()=>{vt.current=$e},[$e]),i.useEffect(()=>{v(E??t),U("chat"),T(!1),q([]),ge(d=>d+1)},[t,E]),i.useEffect(()=>{if(!n||f)return;const d=O.current.bootstrapConversation;if(!d){Ot(O.current.openingMessage(),q);return}let w=!1;return Ze(!0),(async()=>{try{const M=await d.call(O.current);if(w)return;q(M.map(me))}catch{w||Ot(O.current.openingMessage(),q)}finally{w||Ze(!1)}})(),()=>{w=!0}},[n,f,t,N]);const te=i.useCallback(()=>{const d=++wt.current;(async()=>{var w,M;try{const V=await F(t);if(d!==wt.current)return;ee(re=>JSON.stringify(re)===JSON.stringify(V.checklist)?re:V.checklist),Xe(null),(M=(w=O.current).seedChecklist)==null||M.call(w,V.checklist)}catch{}})()},[F,t]),de=i.useCallback(()=>{c&&(async()=>{try{const d=await K(t);Se(d),pe(null)}catch{}})()},[c,K,t]),se=i.useCallback(()=>{if(!g)return;const d=++xt.current;(async()=>{try{const w=await L(t);if(d!==xt.current)return;je(M=>JSON.stringify(M)===JSON.stringify(w)?M:w),J(null)}catch{}})()},[g,L,t]),Ee=i.useCallback(d=>{const w=O.current.bootstrapConversation;w&&(async()=>{try{const M=await w.call(O.current);if(vt.current)return;const V=M.map(me);let re=!1;q(yt=>Mn(yt,V)?yt:(re=!0,V)),re&&(d!=null&&d.refreshSidePanelsOnChange)&&(te(),se())}catch{}})()},[te,se]),us=i.useCallback(d=>{switch(d){case oe.checklist:te();return;case oe.resources:de();return;case oe.chat:Ee();return;case oe.timeline:se();return;case oe.all:default:te(),de(),Ee(),se()}},[te,Ee,de,se]),kt=un({enabled:n&&I,channelPrefix:y,agentId:e.id,subscribeToPusher:_,onRepoll:us});i.useEffect(()=>{if(!n||f||kt)return;const d=window.setInterval(()=>{Ee({refreshSidePanelsOnChange:!0})},In);return()=>{window.clearInterval(d)}},[n,f,kt,t,N,Ee]);const gs=i.useCallback(d=>{var w,M;d.checklist?(ee(d.checklist),(M=(w=O.current).seedChecklist)==null||M.call(w,d.checklist)):te(),d.phase&&xe(d.phase),de(),se()},[te,de,se]);i.useEffect(()=>{var d,w;!n||f||j&&j.length>0&&((w=(d=O.current).seedChecklist)==null||w.call(d,j))},[n,f,j]),i.useEffect(()=>{if(!n||f)return;let d=!1;return Ce(w=>j!=null&&j.length?!1:w||Q===null||Q.length===0),Xe(null),(async()=>{var w,M;try{const V=await F(t);if(d)return;j!=null&&j.length||(ee(V.checklist),(M=(w=O.current).seedChecklist)==null||M.call(w,V.checklist))}catch{!d&&!(j!=null&&j.length)&&Xe(ze)}finally{d||Ce(!1)}})(),()=>{d=!0}},[n,t,f,j,F]),i.useEffect(()=>{if(!n||!c)return;let d=!1;return ye(!0),pe(null),(async()=>{try{const w=await K(t);d||Se(w)}catch{d||pe(bs)}finally{d||ye(!1)}})(),()=>{d=!0}},[n,t,c,K]);const hs=i.useCallback(()=>{Pe(null),Ne(null),Ae(null),be(!1)},[]),ps=i.useCallback(d=>{if(d.misRecordUrl){window.open(d.misRecordUrl,"_blank","noopener,noreferrer");return}Pe(d),Ne(null),Ae(null),be(!0),(async()=>{try{const w=await W(t,d.id);Ne(w)}catch{Ae(As)}finally{be(!1)}})()},[W,t]);i.useEffect(()=>{if(!n||!g)return;let d=!1;return b(w=>w||ae===null),J(null),(async()=>{try{const w=await L(t);d||je(w)}catch{d||J(Dt)}finally{d||b(!1)}})(),()=>{d=!0}},[n,t,g,L]),i.useEffect(()=>{if(!n||!f)return;let d=!1;const w={id:`user-brief-${Date.now()}`,author:X.user,text:On(f,e.invocation_name)};return(async()=>{var V,re;const M=await O.current.start(f);d||(q([me(O.current.openingMessage()),me(w),me(M.message)]),M.checklist?(ee(M.checklist),(re=(V=O.current).seedChecklist)==null||re.call(V,M.checklist)):te(),xe(M.phase??H.running),de(),se())})(),()=>{d=!0}},[n,f,e.invocation_name,t,te,de,se]);const ms=i.useCallback(d=>{ne(on(d))},[]),Qe=E??t,Be=ae==null?void 0:ae.chatSessions,St=Be!=null&&Be.length?Be.reduce((d,w)=>Date.parse(w.timestamp)<Date.parse(d.timestamp)?w:d).sessionId:void 0,et=i.useCallback(()=>{U("chat"),T(!1),N!==Qe&&(v(Qe),q([]),ge(d=>d+1))},[N,Qe]),_s=i.useCallback(d=>{if(d===St){et();return}v(d),T(!0),U("chat"),q([]),ge(w=>w+1)},[St,et]),fs=i.useCallback(d=>{ne(null),he(d),ge(w=>w+1)},[]),vs=i.useCallback(async()=>{ft(null),mt(!0);try{await O.current.stop(),xe(H.stopped)}catch{ft(js)}finally{mt(!1)}},[]),ws=Q;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:e.invocation_name}),s.jsx("span",{className:z("agent-workspace__phase",`agent-workspace__phase--${Z}`),children:Rs[Z]})]}),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:()=>cs(d=>!d),children:"Checklist"}),s.jsx(u.Button,{variant:Fe?"secondary":"primary",size:"S",iconLeftName:"files",iconLeftScreenReaderText:"Toggle resources","aria-pressed":!Fe,onClick:()=>ds(d=>!d),children:"Resources"}),s.jsx(u.Button,{variant:"secondary",size:"S",iconLeftName:"x",iconLeftScreenReaderText:"Close",onClick:a,children:"Close"})]})]}),s.jsxs(u.Modal.Body,{className:z("agent-workspace__body",{"agent-workspace__body--no-checklist":He,"agent-workspace__body--no-resources":Fe}),children:[s.jsxs("section",{className:z("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&&Z===H.running&&s.jsx(u.Button,{className:"agent-workspace__panel-header-action",variant:"secondary-destructive",size:"S",iconLeftName:"circle-x",iconLeftScreenReaderText:"Stop",disabled:pt,onClick:()=>void vs(),children:pt?"Stopping…":"Stop agent"})]}),_t&&s.jsx("p",{className:"agent-workspace__error agent-workspace__stop-error",role:"alert",children:_t}),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:()=>U("chat")},children:"Chat"}),s.jsx(u.Tabs.Item,{active:C==="timeline",tabElementProps:{id:"agent-center-tab-timeline",onClick:()=>U("timeline")},children:"Timeline"})]}),g&&C==="chat"&&we&&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:et,children:"Back to main chat"})}),g&&C==="timeline"&&s.jsx(an,{timeline:ae,isLoading:h,error:k,onOpenChatSession:_s}),s.jsx("div",{className:"agent-workspace__chat-keep-alive",hidden:!!g&&C!=="chat",children:s.jsx(qs,{connector:D,phase:Z,chatHistory:Ie,chatSessionKey:Oe,startQuery:ke,clarificationMessage:We,enableUpload:R,onTurn:gs,onAwaitingChange:Ze,onClarificationPrompt:fs,onDismissClarification:()=>ne(null)})})]}),!He&&s.jsx(Js,{checklist:ws,isLoading:ce,error:ls,phase:Z,canRequestInput:Z===H.running&&!$e,onAttentionItemClick:ms}),!Fe&&s.jsx(Vs,{resources:Ve,isLoading:le,error:Le,onOpenResource:ps}),s.jsx(Ks,{resource:Me,html:Ue,isLoading:De,error:Ye,onClose:hs})]})]})},Pn="Unable to load agent definitions. Please try again.",Un="Unable to start the agent.",Lt="Loading agents…",is=({open:e,onClose:t,onStart:n,agentDefinitions:a,definitionsState:r="idle",definitionsError:l=null,onRetryDefinitions:o,embedded:p=!1})=>{const[c,g]=i.useState(void 0),[m,S]=i.useState(""),[x,E]=i.useState(!1),[R,f]=i.useState(null),G=[...a].sort((v,C)=>v.display_name.localeCompare(C.display_name)).map(v=>({value:v.ref,label:v.display_name}));i.useEffect(()=>{e&&(g(void 0),S(""),E(!1),f(null))},[e]);const j=c!==void 0&&m.trim().length>0,I=i.useCallback(v=>{const C=a.find(U=>U.ref===v[0]);C&&g(C)},[a]),y=i.useCallback(async()=>{if(!(!c||!j||x)){E(!0),f(null);try{await n({definition:c,invocationName:m.trim()})}catch(v){f(v instanceof Error?v.message:Un)}finally{E(!1)}}},[j,c,m,x,n]);if(r==="idle"&&a.length===0||!e)return null;const _=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:Lt}),s.jsx("p",{className:"new-agent__state-message",children:Lt})]}):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??Pn}),o?s.jsx(u.Button,{variant:"secondary",size:"S",onClick:o,children:"Try again"}):null]}):N=s.jsxs("form",{className:"new-agent__form","aria-label":"Start an agent",onSubmit:v=>{v.preventDefault(),j&&!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:G,selectedValues:c?[c.ref]:[],onSelectionChange:I})]}),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:v=>S(v.target.value)})]}),R?s.jsx("p",{className:"new-agent__error",role:"alert",children:R}):null,s.jsx("div",{className:"new-agent__actions",children:s.jsx(u.Button,{type:"submit",variant:"primary",className:z("new-agent__start-button",{"new-agent__start-button--starting":x}),disabled:!j||x,iconLeftName:x?"loader":"sparkles",iconLeftScreenReaderText:x?"Starting":void 0,children:x?"Starting…":"Start"})})]}),p?s.jsxs("div",{className:z("new-agent","new-agent--embedded"),children:[s.jsx("div",{className:"new-agent__header",children:_}),s.jsx("div",{className:"new-agent__body",children:N})]}):s.jsxs(u.Modal,{open:e,closeHandler:t,className:"new-agent",children:[s.jsx(u.Modal.Header,{className:"new-agent__header",children:_}),s.jsx(u.Modal.Body,{className:"new-agent__body",children:N})]})},Mt=e=>{window.location.assign(e)},Dn=({open:e,authToken:t,headers:n,agentDefinitionsUrl:a,agentsUrl:r,closeUrl:l,successUrl:o,onClose:p,onStart:c,embedded:g=!1})=>{const m=JSON.stringify(n??{}),S=i.useMemo(()=>new Ke({token:t,headers:n,urls:{agentDefinitions:a,agents:r}}),[t,a,r,m]),[x,E]=i.useState([]),[R,f]=i.useState("loading"),[G,j]=i.useState(null),[I,y]=i.useState(0);i.useEffect(()=>{if(!e)return;let C=!1;return f("loading"),j(null),(async()=>{try{const U=await S.listAgentDefinitions();if(C)return;E(U.map(dt)),f("idle")}catch(U){if(C)return;E([]),j(ss(U)),f("error")}})(),()=>{C=!0}},[S,e,I]);const _=i.useCallback(()=>{p==null||p(),l&&Mt(l)},[l,p]),N=i.useCallback(async C=>{await S.createAgent(C.definition.ref,{invocationName:C.invocationName}),c==null||c(C),o&&Mt(o)},[S,c,o]),v=i.useCallback(()=>{y(C=>C+1)},[]);return s.jsx(is,{open:e,onClose:_,onStart:N,agentDefinitions:x,definitionsState:R,definitionsError:G,onRetryDefinitions:v,embedded:g})},$n=e=>"agentDefinitionsUrl"in e,os=e=>$n(e)?s.jsx(Dn,{...e}):s.jsx(is,{...e}),Hn=e=>e!==void 0&&e.some(t=>t.status===P.hitl),Fn=(e,t)=>Hn(t)?A.hitl:e.status,Bn=({column:e,label:t})=>e.statusIcon?s.jsx("span",{className:"agent-view__status-indicator",children:s.jsx(u.Icon,{name:e.statusIcon.name,size:16,color:e.statusIcon.color,className:z({"agent-view__progress-icon--spinning":e.statusIcon.spin}),screenReaderText:t})}):s.jsx("span",{className:z("agent-view__dot",{[`agent-view__dot--${e.dotModifier}`]:e.dotModifier}),children:s.jsx(u.Dot,{colour:e.dotColour,label:t})}),Gn=({agent:e,agentName:t,column:n,isExpanded:a,isLoading:r,checklist:l,error:o,onToggle:p,onViewAgent:c})=>{const{id:g,invocation_name:m}=e,S=`agent-card-${g}-header`,x=`agent-card-${g}-progress`;return s.jsx("li",{className:z("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(Bn,{column:n}),s.jsx("span",{className:"agent-view__card-invocation-name",children:m}),s.jsx("span",{className:"agent-view__card-agent-name",children:t}),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:_e}),s.jsx("span",{children:_e})]}),!r&&o&&s.jsx("p",{className:"agent-view__progress-error",role:"alert",children:o}),!r&&!o&&l!==null&&s.jsx(Bs,{checklist:l}),!r&&!o&&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:_e}),s.jsx("span",{children:_e})]}),s.jsx("div",{className:"agent-view__card-actions",children:s.jsx(u.Button,{variant:"secondary",size:"S",onClick:()=>c==null?void 0:c(e),children:"View agent"})})]})]})})},Pt=({column:e,agents:t,expandedAgentId:n,loadingAgentId:a,checklistByInvocationId:r,errorByAgentId:l,definitionNameByRef:o,onToggleAgent:p,onViewAgent:c,isSplit:g=!1})=>s.jsxs("section",{className:z("agent-view__column",{"agent-view__column--split":g}),"aria-label":e.title,children:[s.jsxs("div",{className:"agent-view__column-header",children:[s.jsx(u.Heading,{level:4,children:e.title}),s.jsx("span",{className:"agent-view__column-count",children:t.length})]}),s.jsx("ul",{className:"agent-view__card-list",children:t.map(m=>s.jsx(Gn,{agent:m,agentName:lt(m,o),column:e,isExpanded:n===m.id,isLoading:a===m.id,checklist:r[m.invocation_id]??null,error:l[m.id]??null,onToggle:p,onViewAgent:c},m.id))})]}),lt=(e,t)=>t.get(e.agent_definition_ref)??e.agent_definition_ref.replace(/_/g," "),zn=({jwt:e,headers:t,agentDefinitionsUrl:n,agentsUrl:a,agentUrl:r,agentChecklistUrl:l,agentResourcesUrl:o,agentTimelineUrl:p,agentChatUrl:c,agentConversationUrl:g,stopAgentUrl:m,enableUpload:S,showHeader:x=!1,institutions:E,usePusherToRepoll:R=!1,pusherChannelPrefix:f=ct,subscribeToPusher:G})=>{var je;const j=i.useMemo(()=>({agentDefinitions:n,agents:a,agent:r,agentChecklist:l,...o?{agentResources:o}:{},...p?{agentTimeline:p}:{},agentChat:c,agentConversation:g}),[n,a,r,l,o,p,c,g]),[I,y]=i.useState(null),_=I?(je=E==null?void 0:E.find(h=>h.applicationId===I.application_id))==null?void 0:je.applicationUrl:void 0,N=i.useMemo(()=>{const h={...t??{}};return _?h[ue.arborApplicationUrl]=_:delete h[ue.arborApplicationUrl],h},[t,_]),{agents:v,agentDefinitions:C,loadState:U,loadError:we,reload:T,refresh:D,fetchAgentChecklist:F,createAgent:K}=ns({jwt:e,headers:N,urls:j}),[W,L]=i.useState(!1),[O,Z]=i.useState(null),[xe,Ie]=i.useState(null),[q,Oe]=i.useState({}),[ge,ke]=i.useState({}),[he,We]=i.useState([]),[ne,Ve]=i.useState([]),Se=i.useMemo(()=>{const h=new Set(v.map(k=>k.application_id)),b=new Map((E??[]).map(k=>[k.applicationId,k.name]));return[...h].sort((k,J)=>(b.get(k)??k).localeCompare(b.get(J)??J)).map(k=>({value:k,label:b.get(k)??k}))},[v,E]),le=i.useMemo(()=>new Map(C.map(h=>[h.ref,h.display_name])),[C]),ye=i.useMemo(()=>[...new Set(v.map(b=>lt(b,le)))].sort((b,k)=>b.localeCompare(k)).map(b=>({value:b,label:b})),[v,le]),Le=i.useMemo(()=>v.filter(h=>!(he.length>0&&!he.includes(h.application_id)||ne.length>0&&!ne.includes(lt(h,le)))),[v,le,ne,he]),pe=Se.length>1,Me=ye.length>1,Pe=pe||Me;i.useEffect(()=>{const h=window.setInterval(()=>{D()},6e4);return()=>{window.clearInterval(h)}},[D]),i.useEffect(()=>{if(v.length===0)return;let h=!1;return(async()=>{const b=await Promise.allSettled(v.map(async k=>{const J=await F(k.invocation_id);return{agentId:k.id,invocationId:k.invocation_id,checklist:J.checklist}}));h||(Oe(k=>{const J={...k};let Q=!1;for(const ee of b){if(ee.status!=="fulfilled")continue;const{invocationId:ce,checklist:Ce}=ee.value;JSON.stringify(k[ce])!==JSON.stringify(Ce)&&(J[ce]=Ce,Q=!0)}return Q?J:k}),ke(k=>{const J={...k};let Q=!1;return b.forEach((ee,ce)=>{ee.status==="rejected"&&J[v[ce].id]!==ze&&(J[v[ce].id]=ze,Q=!0)}),Q?J:k}))})(),()=>{h=!0}},[v,F]);const Ue=i.useCallback(async h=>{if(!q[h.invocation_id]){Ie(h.id),ke(b=>{const k={...b};return delete k[h.id],k});try{const b=await F(h.invocation_id);Oe(k=>({...k,[h.invocation_id]:b.checklist}))}catch{ke(b=>({...b,[h.id]:ze}))}finally{Ie(b=>b===h.id?null:b)}}},[F,q]),Ne=i.useCallback(h=>{if(O===h){Z(null);return}const b=v.find(({id:k})=>k===h);b&&(Z(h),Ue(b))},[v,O,Ue]),De=i.useMemo(()=>{const h={};for(const b of Le){const k=Fn(b,q[b.invocation_id]);(h[k]??(h[k]=[])).push(b)}return h},[Le,q]),be=i.useCallback(h=>{y(h)},[]),Ye=i.useCallback(async h=>{const b=await K(h);y(b),L(!1)},[K]),Ae=i.useCallback(()=>{y(null)},[]),ae={expandedAgentId:O,loadingAgentId:xe,checklistByInvocationId:q,errorByAgentId:ge,definitionNameByRef:le,onToggleAgent:Ne,onViewAgent:be};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"})]}),v.length>0&&Pe&&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:Se,value:he,onValueChange:We,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear institutions"})]}),Me&&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:ye,value:ne,onValueChange:Ve,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear agents"})]})]}),U==="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:we??$t}),s.jsx(u.Button,{variant:"secondary",size:"S",onClick:T,children:"Try again"})]}):U==="loading"&&v.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:bt}),s.jsx("p",{className:"agent-view__state-message",children:bt})]}):v.length===0?s.jsx(Ms,{}):s.jsxs("div",{className:"agent-view__board",children:[ks.map(h=>s.jsx(Pt,{column:qe[h],agents:De[h]??[],...ae},h)),s.jsx("div",{className:"agent-view__split-column",children:Ss.map(h=>s.jsx(Pt,{column:qe[h],agents:De[h]??[],isSplit:!0,...ae},h))})]}),I&&s.jsx(rs,{agent:I,invocationId:I.invocation_id,open:!0,jwt:e,headers:N,agentUrl:r,agentChecklistUrl:l,agentResourcesUrl:o,agentTimelineUrl:p,agentChatUrl:c,agentConversationUrl:g,stopAgentUrl:m,enableUpload:S,initialChecklist:q[I.invocation_id]??null,usePusherToRepoll:R,pusherChannelPrefix:f,subscribeToPusher:G,onClose:Ae},I.id),s.jsx(os,{open:W,onClose:()=>L(!1),onStart:Ye,agentDefinitions:C})]})},qn=(e,t)=>{const n=Date.now(),a=t.trim()||e.agent_intent;return{id:`agent-${n}`,invocation_id:`inv-${n}`,agent_definition_ref:e.ref,agent_intent:e.agent_intent,invocation_name:a,application_id:ys,created_by:Ns,status:A["generating-a-response"],context_ref:null,checklist_ref:null}};exports.AgentMonitorKanban=zn;exports.AgentServiceClient=Ke;exports.AgentServiceError=fe;exports.AgentView=rs;exports.DEFAULT_PUSHER_CHANNEL_PREFIX=ct;exports.HttpChatConnector=ts;exports.MESSAGE_TYPE_REPOLL=it;exports.NewAgentModal=os;exports.PUSHER_AGENT_MESSAGE_EVENT=Gt;exports.REPOLL_TARGET=oe;exports.buildAgentFromDefinition=qn;exports.buildAgentPusherChannel=zt;exports.createHttpChatConnectorFactory=ht;exports.formatUserFileChatCardText=Qt;exports.mapApiAgent=ot;exports.mapApiAgentDefinition=dt;exports.mapApiAgentStatus=Jt;exports.mapApiAgentTimelineResponse=Yt;exports.mapApiChecklistEndpointResponse=gt;exports.mapApiChecklistItem=ut;exports.mapApiChecklistResponse=Xt;exports.mapApiChecklistStatus=Kt;exports.mapApiConversationMessages=es;exports.mapApiOpeningMessage=Te;exports.mapApiResource=Wt;exports.mapApiResourcesEndpointResponse=Vt;exports.mapApiTripOption=_n;exports.parseConversationContentCaption=Zt;exports.parseRepollMessages=qt;exports.useAgentService=ns;exports.useAgentWorkspace=as;
package/dist/index.d.ts CHANGED
@@ -62,7 +62,7 @@ export declare type AgentDefinition = {
62
62
  description: string;
63
63
  };
64
64
 
65
- export declare const AgentMonitorKanban: ({ jwt, headers, agentDefinitionsUrl, agentsUrl, agentUrl, agentChecklistUrl, agentResourcesUrl, agentTimelineUrl, agentChatUrl, agentConversationUrl, enableUpload, showHeader, institutions, }: AgentMonitorKanbanProps) => JSX_2.Element;
65
+ export declare const AgentMonitorKanban: ({ jwt, headers, agentDefinitionsUrl, agentsUrl, agentUrl, agentChecklistUrl, agentResourcesUrl, agentTimelineUrl, agentChatUrl, agentConversationUrl, stopAgentUrl, enableUpload, showHeader, institutions, usePusherToRepoll, pusherChannelPrefix, subscribeToPusher, }: AgentMonitorKanbanProps) => JSX_2.Element;
66
66
 
67
67
  export declare type AgentMonitorKanbanProps = {
68
68
  jwt?: string;
@@ -77,10 +77,14 @@ export declare type AgentMonitorKanbanProps = {
77
77
  agentTimelineUrl?: string;
78
78
  agentChatUrl: string;
79
79
  agentConversationUrl: string;
80
+ stopAgentUrl?: string;
80
81
  enableUpload?: boolean;
81
82
  /** When true, renders the Agents heading and Start an agent button. Defaults to false. */
82
83
  showHeader?: boolean;
83
84
  institutions?: InstitutionConfig[];
85
+ usePusherToRepoll?: boolean;
86
+ pusherChannelPrefix?: string;
87
+ subscribeToPusher?: SubscribeToPusher;
84
88
  };
85
89
 
86
90
  export declare type AgentResource = {
@@ -99,7 +103,7 @@ export declare type AgentResourcesPage = {
99
103
  totalRecords: number;
100
104
  };
101
105
 
102
- export declare type AgentResourceType = 'document_html' | 'mis_record' | 'workflow' | 'file' | 'link';
106
+ export declare type AgentResourceType = 'document_html' | 'mis_record' | 'workflow' | 'file' | 'user_file' | 'link';
103
107
 
104
108
  export declare class AgentServiceClient {
105
109
  private readonly baseUrl;
@@ -176,6 +180,7 @@ export declare type AgentServiceUrlOverrides = {
176
180
  agentTimeline?: string;
177
181
  agentChat?: string;
178
182
  agentConversation?: string;
183
+ stopAgent?: string;
179
184
  };
180
185
 
181
186
  export declare type AgentServiceUrls = AgentServiceUrlOverrides;
@@ -199,7 +204,7 @@ declare type AgentTimelineChatSession = {
199
204
  timestamp: string;
200
205
  };
201
206
 
202
- export declare const AgentView: ({ agent, invocationId, open, onClose, jwt, headers, agentUrl, agentChecklistUrl, agentResourcesUrl, agentTimelineUrl, agentChatUrl, agentConversationUrl, chatId, enableUpload, initialBrief, initialPhase, initialChecklist, }: AgentViewProps) => JSX_2.Element;
207
+ export declare const AgentView: ({ agent, invocationId, open, onClose, jwt, headers, agentUrl, agentChecklistUrl, agentResourcesUrl, agentTimelineUrl, agentChatUrl, agentConversationUrl, stopAgentUrl, chatId, enableUpload, initialBrief, initialPhase, initialChecklist, usePusherToRepoll, pusherChannelPrefix, subscribeToPusher, }: AgentViewProps) => JSX_2.Element;
203
208
 
204
209
  export declare type AgentViewProps = {
205
210
  agent: Agent;
@@ -214,11 +219,15 @@ export declare type AgentViewProps = {
214
219
  agentTimelineUrl?: string;
215
220
  agentChatUrl: string;
216
221
  agentConversationUrl: string;
222
+ stopAgentUrl?: string;
217
223
  chatId?: string;
218
224
  enableUpload?: boolean;
219
225
  initialBrief?: AgentBrief;
220
226
  initialPhase?: WorkspacePhase;
221
227
  initialChecklist?: AgentChecklistItem[] | null;
228
+ usePusherToRepoll?: boolean;
229
+ pusherChannelPrefix?: string;
230
+ subscribeToPusher?: SubscribeToPusher;
222
231
  };
223
232
 
224
233
  export declare type AgentWorkspaceUrls = {
@@ -228,6 +237,7 @@ export declare type AgentWorkspaceUrls = {
228
237
  agentTimelineUrl?: string;
229
238
  agentChatUrl: string;
230
239
  agentConversationUrl: string;
240
+ stopAgentUrl?: string;
231
241
  };
232
242
 
233
243
  export declare type ApiAgentDefinition = {
@@ -281,7 +291,7 @@ export declare type ApiAgentResource = {
281
291
  last_updated_datetime: string;
282
292
  };
283
293
 
284
- export declare type ApiAgentResourceType = 'document_html' | 'mis_record' | 'workflow' | 'file' | 'link';
294
+ export declare type ApiAgentResourceType = 'document_html' | 'mis_record' | 'workflow' | 'file' | 'user_file' | 'link';
285
295
 
286
296
  export declare type ApiAgentTimelineActionLogEntry = {
287
297
  timestamp: string;
@@ -374,7 +384,7 @@ export declare type ApiConversationMessage = {
374
384
 
375
385
  export declare type ApiConversationMessageRole = 'system' | 'user' | 'assistant' | 'tool';
376
386
 
377
- export declare type ApiConversationMessageType = 'system' | 'user' | 'assistant' | 'tool_request' | 'tool_response';
387
+ export declare type ApiConversationMessageType = 'system' | 'user' | 'assistant' | 'user_file' | 'tool_request' | 'tool_response';
378
388
 
379
389
  export declare type ApiConversationResponse = {
380
390
  session_id: string;
@@ -419,6 +429,8 @@ export declare type ApiTripOption = {
419
429
 
420
430
  export declare const buildAgentFromDefinition: (definition: AgentDefinition, invocationName: string) => Agent;
421
431
 
432
+ export declare const buildAgentPusherChannel: (prefix: string, agentId: string) => string;
433
+
422
434
  export declare interface ChatConnector {
423
435
  openingMessage(): ChatMessage;
424
436
  start(brief: AgentBrief): Promise<ChatTurn>;
@@ -432,12 +444,15 @@ export declare type ChatMessage = {
432
444
  id: string;
433
445
  author: ChatMessageAuthor;
434
446
  text: string;
447
+ kind?: ChatMessageKind;
435
448
  followUpPrompts?: string[];
436
449
  pending?: boolean;
437
450
  };
438
451
 
439
452
  export declare type ChatMessageAuthor = 'agent' | 'user' | 'system';
440
453
 
454
+ export declare type ChatMessageKind = 'user_file';
455
+
441
456
  export declare type ChatOptions = {
442
457
  onEvent?: (event: ApiChatStreamEvent) => void;
443
458
  signal?: AbortSignal;
@@ -465,8 +480,12 @@ export declare const createHttpChatConnectorFactory: (client: AgentServiceClient
465
480
  invocation_id: string;
466
481
  }) => HttpChatConnector;
467
482
 
483
+ export declare const DEFAULT_PUSHER_CHANNEL_PREFIX = "arbor-agent-";
484
+
468
485
  declare type FetchLike = typeof fetch;
469
486
 
487
+ export declare const formatUserFileChatCardText: (caption: string) => string;
488
+
470
489
  export declare class HttpChatConnector implements ChatConnector {
471
490
  private readonly client;
472
491
  private readonly agentId;
@@ -531,6 +550,8 @@ export declare const mapApiTripOption: (record: ApiTripOption) => {
531
550
  name: string;
532
551
  };
533
552
 
553
+ export declare const MESSAGE_TYPE_REPOLL: "MESSAGE_TYPE_REPOLL";
554
+
534
555
  export declare const NewAgentModal: (props: NewAgentModalProps) => JSX_2.Element;
535
556
 
536
557
  export declare type NewAgentModalControlledProps = {
@@ -571,6 +592,29 @@ export declare type NewAgentStartPayload = {
571
592
  invocationName: string;
572
593
  };
573
594
 
595
+ export declare const parseConversationContentCaption: (content: string) => string;
596
+
597
+ export declare const parseRepollMessages: (payload: unknown) => RepollMessage[];
598
+
599
+ export declare const PUSHER_AGENT_MESSAGE_EVENT: "agentUi:update";
600
+
601
+ export declare const REPOLL_TARGET: {
602
+ readonly all: "ALL";
603
+ readonly checklist: "CHECKLIST";
604
+ readonly resources: "RESOURCES";
605
+ readonly chat: "CHAT";
606
+ readonly timeline: "TIMELINE";
607
+ };
608
+
609
+ export declare type RepollMessage = {
610
+ type: typeof MESSAGE_TYPE_REPOLL;
611
+ target: RepollTarget;
612
+ };
613
+
614
+ export declare type RepollTarget = (typeof REPOLL_TARGET)[keyof typeof REPOLL_TARGET];
615
+
616
+ export declare type SubscribeToPusher = (channel: string, event: string, handler: (payload: unknown) => void) => () => void;
617
+
574
618
  export declare type TripOption = {
575
619
  id: string;
576
620
  name: string;