@arbor-education/agent-view-frontend 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -128,7 +128,9 @@ const api = 'https://ai-agent-service.qa.arbor.engineering/api/v1';
128
128
  agentUrl={`${api}/agents/:invocationId`}
129
129
  agentChecklistUrl={`${api}/agents/:invocationId/checklist`}
130
130
  agentResourcesUrl={`${api}/agents/:invocationId/resources`}
131
+ agentTimelineUrl={`${api}/agents/:invocationId/agent-timeline`}
131
132
  agentChatUrl={`${api}/agents/:invocationId/chat`}
133
+ agentConversationUrl={`${api}/conversations/:invocationId`}
132
134
  />;
133
135
 
134
136
  // Or mount the workspace alone:
@@ -140,7 +142,9 @@ const api = 'https://ai-agent-service.qa.arbor.engineering/api/v1';
140
142
  agentUrl={`${api}/agents/:invocationId`}
141
143
  agentChecklistUrl={`${api}/agents/:invocationId/checklist`}
142
144
  agentResourcesUrl={`${api}/agents/:invocationId/resources`}
145
+ agentTimelineUrl={`${api}/agents/:invocationId/agent-timeline`}
143
146
  agentChatUrl={`${api}/agents/:invocationId/chat`}
147
+ agentConversationUrl={`${api}/conversations/:invocationId`}
144
148
  />;
145
149
  ```
146
150
 
@@ -173,7 +177,9 @@ function Page() {
173
177
  agentUrl={`${api}/agents/:invocationId`}
174
178
  agentChecklistUrl={`${api}/agents/:invocationId/checklist`}
175
179
  agentResourcesUrl={`${api}/agents/:invocationId/resources`}
180
+ agentTimelineUrl={`${api}/agents/:invocationId/agent-timeline`}
176
181
  agentChatUrl={`${api}/agents/:invocationId/chat`}
182
+ agentConversationUrl={`${api}/conversations/:invocationId`}
177
183
  />
178
184
  );
179
185
  }
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),i=require("react"),L=require("classnames"),u=require("@arbor-education/design-system.components"),se=require("@arbor-education/ask-arbor-chat-panel"),v={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},S={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},N={briefing:"briefing",running:"running",stopped:"stopped",complete:"complete"},B={agent:"agent",user:"user",system:"system"},Z={MIS_RECORD:"MIS_RECORD",FILE:"FILE",WORKFLOW:"WORKFLOW",LINK:"LINK"},Te={cancelled:"cancelled",archived:"archived"},ke={in_progress:"in_progress",requires_attention:"requires_attention",available:"available"},U={[S.complete]:{label:"Complete",icon:"circle-check",color:"var(--color-semantic-success-600)"},[S.failed]:{label:"Failed",icon:"circle-x",color:"var(--color-semantic-destructive-600)"},[S.hitl]:{label:"Requires attention",icon:"triangle-alert",color:"var(--color-semantic-warning-600)"},[S["generating-a-response"]]:{label:"Generating a response",icon:"loader",color:"var(--color-brand-600)"}},pe={[v["generating-a-response"]]:{status:v["generating-a-response"],title:"Active",dotColour:"green",statusIcon:{name:U["generating-a-response"].icon,color:U["generating-a-response"].color,spin:!0}},[v.hitl]:{status:v.hitl,title:"Requires attention",dotColour:"orange",statusIcon:{name:U.hitl.icon,color:U.hitl.color}},[v.complete]:{status:v.complete,title:"Complete",dotColour:"green",dotModifier:"grey-dark",statusIcon:{name:U.complete.icon,color:U.complete.color}},[v.failed]:{status:v.failed,title:"Failed",dotColour:"salmon",statusIcon:{name:U.failed.icon,color:U.failed.color}}},Xe=[v["generating-a-response"],v.hitl],Ze=[v.complete,v.failed],et="m4",tt="1",De="msg-opening",Ae="Unable to load agent tasks. Please try again.",nt="Unable to load the resources for this agent",st="Something went wrong. Please try again.",$e="Unable to load agents. Please try again.",ee="Loading tasks…",Ie="Loading agents…",at="Task",rt="What recent actions have you taken?",ot={[N.briefing]:"Briefing",[N.running]:"Working",[N.stopped]:"Stopped",[N.complete]:"Complete"},it=[v["generating-a-response"],v.hitl,v.complete,v.failed],ct={[v["generating-a-response"]]:"Agents currently working on tasks for you.",[v.hitl]:"Agents that need your input before they can continue.",[v.complete]:"Agents that have finished their work.",[v.failed]:"Agents that failed or were stopped."},lt=()=>n.jsxs("svg",{className:"agent-view__empty-illustration",viewBox:"0 0 360 240",xmlns:"http://www.w3.org/2000/svg",role:"img","aria-label":"Preview of the agents board layout",children:[n.jsx("rect",{x:"0",y:"0",width:"360",height:"240",rx:"12",fill:"var(--color-grey-100)"}),n.jsx("rect",{x:"16",y:"16",width:"100",height:"208",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"130",y:"16",width:"100",height:"208",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"244",y:"16",width:"100",height:"100",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"244",y:"124",width:"100",height:"100",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"28",y:"52",width:"76",height:"36",rx:"6",fill:"var(--color-grey-050)"}),n.jsx("rect",{x:"28",y:"96",width:"76",height:"36",rx:"6",fill:"var(--color-grey-050)"}),n.jsx("rect",{x:"142",y:"52",width:"76",height:"36",rx:"6",fill:"var(--color-semantic-warning-050)"}),n.jsx("circle",{cx:"40",cy:"70",r:"4",fill:"var(--color-brand-600)"}),n.jsx("circle",{cx:"40",cy:"114",r:"4",fill:"var(--color-brand-600)"}),n.jsx("circle",{cx:"154",cy:"70",r:"4",fill:"var(--color-semantic-warning-600)"}),n.jsx("circle",{cx:"256",cy:"52",r:"4",fill:"var(--color-grey-400)"}),n.jsx("circle",{cx:"256",cy:"160",r:"4",fill:"var(--color-semantic-destructive-500)"})]}),dt=({status:e})=>{const t=pe[e];return t.statusIcon?n.jsx(u.Icon,{name:t.statusIcon.name,size:16,color:t.statusIcon.color,screenReaderText:t.title}):n.jsx(u.Dot,{colour:t.dotColour,label:t.title})},gt=()=>n.jsxs("section",{className:"agent-view__empty","aria-label":"About the agents board",children:[n.jsxs("div",{className:"agent-view__empty-content",children:[n.jsx(u.Heading,{level:4,children:"Your agents board"}),n.jsx("p",{className:"agent-view__empty-lead",children:"When you start an agent, it appears here so you can track progress at a glance. Agents move between columns as their status changes."}),n.jsx("ul",{className:"agent-view__empty-columns",children:it.map(e=>{const t=pe[e];return n.jsxs("li",{className:"agent-view__empty-column",children:[n.jsx("span",{className:"agent-view__empty-column-indicator",children:n.jsx(dt,{status:e})}),n.jsxs("span",{className:"agent-view__empty-column-text",children:[n.jsx("span",{className:"agent-view__empty-column-title",children:t.title}),n.jsx("span",{className:"agent-view__empty-column-description",children:ct[e]})]})]},e)})}),n.jsxs("p",{className:"agent-view__empty-hint",children:["Use ",n.jsx("strong",{children:"Start an agent"})," above to begin."]})]}),n.jsx("div",{className:"agent-view__empty-visual",children:n.jsx(lt,{})})]}),ut=(e,t)=>({...e,...t.length>0?{children:t}:{}}),He=e=>{const t=[],s=[];for(const a of e){const r=a.children?He(a.children):{needsInput:[],tasks:[]};if(t.push(...r.needsInput),a.status===S.hitl){t.push({...a,children:void 0});continue}s.push(ut(a,r.tasks))}return{needsInput:t,tasks:s}},pt=e=>e.map((t,s)=>({item:t,index:s})).sort((t,s)=>{const a=t.item.status===S.hitl,r=s.item.status===S.hitl;return a!==r?a?-1:1:t.index-s.index}).map(({item:t})=>t),ht=({checklist:e})=>e.length===0?n.jsx("p",{className:"agent-view__progress-empty",children:"No tasks to display."}):n.jsx("ul",{className:"agent-view__progress-list","aria-label":"Agent tasks",children:pt(e).map(t=>{const s=U[t.status];return n.jsxs("li",{className:L("agent-view__progress-item",`agent-view__progress-item--${t.status.replace(/_/g,"-")}`),children:[n.jsx(u.Icon,{name:s.icon,size:16,color:s.color,screenReaderText:`${s.label}:`,className:L({"agent-view__progress-icon--spinning":t.status===S["generating-a-response"]})}),n.jsxs("div",{className:"agent-view__progress-item-content",children:[n.jsx("span",{className:"agent-view__progress-label",children:t.task}),t.status!==S.complete&&n.jsx("span",{className:"agent-view__progress-description",children:t.description})]})]},t.task)})}),mt=({prompts:e,classNamePrefix:t="agent-workspace",onSelect:s})=>e.length===0?null:n.jsx("div",{className:`${t}__chips`,children:e.map(a=>n.jsx("button",{type:"button",className:`${t}__chip`,onClick:()=>s(a),children:a},a))});class _t{constructor(t,s){this.connector=t,this.canSend=s.canSend,this.onTurn=s.onTurn,this.onAwaitingChange=s.onAwaitingChange}get canRate(){return!1}get canLoadHistory(){return!1}get canListInteractions(){return!1}get canSendNotification(){return!1}get ratingPopupUrls(){return{}}async sendMessage(t){var s,a;if(!this.canSend())return null;(s=this.onAwaitingChange)==null||s.call(this,!0);try{const r=await this.connector.sendMessage(t.userMessage,t.uploadFiles);return this.onTurn(r),{id:r.message.id,text:r.message.text,type:se.CHAT_RESPONSE_TYPE_AGENT,...r.message.followUpPrompts?{followUpPrompts:r.message.followUpPrompts}:{}}}catch{return{id:`error-${Date.now()}`,text:st,type:se.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 ft=({connector:e,phase:t,chatHistory:s,chatSessionKey:a,startQuery:r,clarificationMessage:c,enableUpload:l=!1,onTurn:d,onAwaitingChange:w,onClarificationPrompt:f,onDismissClarification:p})=>{const _=i.useMemo(()=>new _t(e,{canSend:()=>t===N.running,onTurn:d,onAwaitingChange:w}),[e,t,d,w]),h=t!==N.running,j=t===N.running;return n.jsxs("section",{className:"agent-workspace__panel agent-workspace__panel--chat","aria-label":"Chat",children:[c&&n.jsxs("div",{className:"agent-workspace__clarification",role:"region","aria-label":"Agent question",children:[n.jsx("p",{className:"agent-workspace__clarification-text",children:c.text}),c.followUpPrompts&&n.jsx(mt,{prompts:c.followUpPrompts,onSelect:f}),n.jsx("button",{type:"button",className:"agent-workspace__clarification-dismiss",onClick:p,children:"Dismiss"})]}),n.jsx("div",{className:"agent-workspace__ask-arbor",children:n.jsx(se.ChatPanel,{connector:_,chatHistory:s,startQuery:r,lockConversation:h,enableUpload:l,speechEnabled:j,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:j?"Message the agent, paste a link, or attach a file…":"The agent is not accepting messages."},a)}),t===N.stopped&&n.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[n.jsx(u.Icon,{name:"circle-alert",size:16,color:"var(--color-semantic-warning-600)"}),n.jsx("span",{children:"You stopped the agent. Its progress is saved in the checklist on the left."})]}),t===N.complete&&n.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[n.jsx(u.Icon,{name:"party-popper",size:16,color:"var(--color-semantic-success-600)"}),n.jsx("span",{children:"The agent has finished."})]})]})},Fe=({item:e,depth:t,canRequestInput:s,onAttentionItemClick:a})=>{const r=U[e.status],c=e.status.replace(/_/g,"-"),l=e.status===S.hitl&&s&&a,d=n.jsxs("div",{className:"agent-workspace__task-row",children:[n.jsx(u.Icon,{name:r.icon,size:16,color:r.color,screenReaderText:`${r.label}:`,className:L({"agent-workspace__task-icon--spinning":e.status===S["generating-a-response"]})}),n.jsxs("div",{className:"agent-workspace__task-content",children:[n.jsx("span",{className:"agent-workspace__task-label",children:e.task}),e.status!==S.complete&&e.description&&n.jsx("span",{className:"agent-workspace__task-description",children:e.description})]})]});return n.jsxs("li",{className:L("agent-workspace__task",`agent-workspace__task--${c}`,{"agent-workspace__task--child":t>0}),children:[l?n.jsx("button",{type:"button",className:"agent-workspace__task-button","aria-label":`Provide input for ${e.task}`,onClick:()=>a(e),children:d}):d,e.children&&e.children.length>0&&n.jsx("ul",{className:"agent-workspace__task-children",children:e.children.map(w=>n.jsx(Fe,{item:w,depth:t+1,canRequestInput:s,onAttentionItemClick:a},w.task))})]})},Re=({items:e,ariaLabel:t,canRequestInput:s,onAttentionItemClick:a})=>n.jsx("ul",{className:"agent-workspace__task-list","aria-label":t,children:e.map(r=>n.jsx(Fe,{item:r,depth:0,canRequestInput:s,onAttentionItemClick:a},r.task))}),vt=({checklist:e,isLoading:t,error:s,phase:a,canRequestInput:r,onStop:c,onAttentionItemClick:l})=>{const d=i.useMemo(()=>e?He(e):null,[e]);return n.jsxs("section",{className:"agent-workspace__panel agent-workspace__panel--checklist","aria-label":"Checklist",children:[n.jsxs("div",{className:"agent-workspace__panel-header",children:[n.jsx(u.Heading,{level:4,children:"Checklist"}),a===N.running&&n.jsx(u.Button,{variant:"secondary-destructive",size:"S",iconLeftName:"circle-x",iconLeftScreenReaderText:"Stop",onClick:c,children:"Stop agent"})]}),n.jsxs("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:[t&&n.jsxs("div",{className:"agent-workspace__loading",children:[n.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:ee}),n.jsx("span",{children:ee})]}),!t&&s&&n.jsx("p",{className:"agent-workspace__error",role:"alert",children:s}),!t&&!s&&d&&n.jsxs(n.Fragment,{children:[d.needsInput.length>0&&n.jsxs("div",{className:"agent-workspace__task-group",children:[n.jsx("p",{className:"agent-workspace__task-group-label",children:"Needs your input"}),n.jsx(Re,{items:d.needsInput,ariaLabel:"Tasks needing your input",canRequestInput:r,onAttentionItemClick:l})]}),d.tasks.length>0&&n.jsxs("div",{className:L("agent-workspace__task-group",{"agent-workspace__task-group--following":d.needsInput.length>0}),children:[d.needsInput.length>0&&n.jsx("p",{className:"agent-workspace__task-group-label",children:"Other tasks"}),n.jsx(Re,{items:d.tasks,ariaLabel:"Agent tasks",canRequestInput:r,onAttentionItemClick:l})]})]}),!t&&!s&&(!d||d.needsInput.length===0&&d.tasks.length===0)&&n.jsx("p",{className:"agent-workspace__empty",children:a===N.briefing?"Tasks will appear here once the agent starts.":"No tasks to display."})]})]})},wt={[Z.MIS_RECORD]:{icon:"table",label:"Arbor MIS",color:"var(--color-brand-600)"},[Z.FILE]:{icon:"file",label:"File",color:"var(--color-semantic-caution-800)"},[Z.WORKFLOW]:{icon:"list-tree",label:"Workflow",color:"var(--color-semantic-warning-700)"},[Z.LINK]:{icon:"link",label:"Link",color:"var(--color-semantic-info-700)"}},xt=({resources:e,isLoading:t=!1,error:s=null})=>n.jsxs("section",{className:"agent-workspace__panel agent-workspace__panel--documents","aria-label":"Resources",children:[n.jsxs("div",{className:"agent-workspace__panel-header",children:[n.jsx(u.Heading,{level:4,children:"Resources"}),n.jsx("span",{className:"agent-workspace__panel-count",children:e.length})]}),n.jsxs("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:[t&&n.jsxs("div",{className:"agent-workspace__loading",children:[n.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:"Loading resources"}),n.jsx("span",{children:"Loading resources…"})]}),!t&&s&&n.jsx("p",{className:"agent-workspace__error",role:"alert",children:s}),!t&&!s&&e.length>0&&n.jsx("ul",{className:"agent-workspace__resource-list","aria-label":"Agent resources",children:e.map(a=>{const r=wt[a.type];return n.jsx("li",{className:"agent-workspace__resource",children:n.jsxs("a",{className:"agent-workspace__resource-card",href:a.uri,target:"_blank",rel:"noreferrer",children:[n.jsx("span",{className:`agent-workspace__resource-icon agent-workspace__resource-icon--${a.type.toLowerCase()}`,children:n.jsx(u.Icon,{name:r.icon,size:16,color:r.color,screenReaderText:`${r.label}:`})}),n.jsxs("span",{className:"agent-workspace__resource-content",children:[n.jsxs("span",{className:"agent-workspace__resource-top",children:[n.jsx("span",{className:"agent-workspace__resource-name",children:a.name}),n.jsx("span",{className:`agent-workspace__resource-badge agent-workspace__resource-badge--${a.type.toLowerCase()}`,children:r.label})]}),a.description&&n.jsx("span",{className:"agent-workspace__resource-description",children:a.description})]}),n.jsx(u.Icon,{name:"external-link",size:12,color:"var(--color-grey-500)",screenReaderText:"Opens in a new tab",className:"agent-workspace__resource-open"})]})},`${a.type}-${a.uri}`)})}),!t&&!s&&e.length===0&&n.jsx("p",{className:"agent-workspace__empty",children:"No resources yet."})]})]}),kt=["I'll get the details and come back to you","Skip this for now"],At=e=>{var s;const t=(s=e.prompt)!=null&&s.trim()?e.prompt.trim():`I need a bit more from you on "${e.task}". ${e.description} What can you tell me?`;return{id:`clarification-${Date.now()}`,author:B.agent,text:t,followUpPrompts:e.clarificationPrompts??kt}},ce=e=>({id:e.id,text:e.text,type:e.author===B.user?se.CHAT_RESPONSE_TYPE_USER:e.author===B.system?se.CHAT_RESPONSE_TYPE_INFO:se.CHAT_RESPONSE_TYPE_AGENT,...e.followUpPrompts?{followUpPrompts:e.followUpPrompts}:{}});class te extends Error{constructor(t,s,a){super(a??`Agent service request failed (${t})`),this.name="AgentServiceError",this.status=t,this.detail=s}}const yt="/api/v1",E={agentDefinitions:"/agent-definitions",agents:"/agents",tripOptions:"/trip-options",demoDataset:"/demo/dataset"},T={GET:"GET",POST:"POST"},St={error:"error"},Nt={user:"user"},ne={acceptJson:"application/json",acceptEventStream:"text/event-stream",contentTypeJson:"application/json",arborApplicationUrl:"X-Arbor-Application-Url"},jt=/:invocationId\b/g,Ct=e=>e.trim().replace(/^Bearer\s+/i,""),bt=e=>e.endsWith("/")?e.slice(0,-1):e;class Ne{constructor(t){var a;this.baseUrl=bt(t.baseUrl??"");const s=(a=t.token)==null?void 0:a.trim();this.token=s?Ct(s):void 0,this.customHeaders=t.headers,this.urls=t.urls??{},this.fetchImpl=t.fetch??globalThis.fetch.bind(globalThis)}setHeaders(t){this.customHeaders=t}async listAgentDefinitions(){return(await this.request(T.GET,this.resolveUrl("agentDefinitions",E.agentDefinitions))).agent_definitions??[]}getAgentDefinition(t){return this.request(T.GET,this.apiUrl(`${E.agentDefinitions}/${encodeURIComponent(t)}`))}listTripOptions(){return this.request(T.GET,this.apiUrl(E.tripOptions))}getDataset(){return this.request(T.GET,this.apiUrl(E.demoDataset))}setDataset(t){return this.request(T.POST,this.apiUrl(E.demoDataset),{dataset:t})}listAgents(t={}){const s=new URLSearchParams;t.status&&s.set("status",t.status),t.agentDefinitionRef&&s.set("agent_definition_ref",t.agentDefinitionRef);const a=s.toString()?`?${s.toString()}`:"";return this.request(T.GET,`${this.resolveUrl("agents",E.agents)}${a}`)}createAgent(t,s={}){var l,d;const a={agent_definition_ref:t},r=(l=s.invocationName)==null?void 0:l.trim(),c=(d=s.agentIntent)==null?void 0:d.trim();return r&&(a.invocation_name=r),c&&(a.agent_intent=c),this.request(T.POST,this.resolveUrl("agents",E.agents),a)}getAgent(t){return this.request(T.GET,this.resolveUrl("agent",`${E.agents}/${encodeURIComponent(t)}`,t))}getAgentChecklist(t){return this.request(T.GET,this.resolveUrl("agentChecklist",`${E.agents}/${encodeURIComponent(t)}/checklist`,t))}getAgentResources(t){return this.request(T.GET,this.resolveUrl("agentResources",`${E.agents}/${encodeURIComponent(t)}/resources`,t))}getAgentContext(t){return this.request(T.GET,this.apiUrl(`${E.agents}/${encodeURIComponent(t)}/context`))}cancelAgent(t){return this.request(T.POST,this.apiUrl(`${E.agents}/${encodeURIComponent(t)}/cancel`))}archiveAgent(t){return this.request(T.POST,this.apiUrl(`${E.agents}/${encodeURIComponent(t)}/archive`))}async chat(t,s,a={}){const r=!!(a.uploadFiles&&a.uploadFiles.length>0),c=await this.fetchImpl(this.resolveUrl("agentChat",`${E.agents}/${encodeURIComponent(t)}/chat`,t),{method:T.POST,headers:{...this.customHeaders,...this.authHeaders(),Accept:ne.acceptEventStream,...r?{}:{"Content-Type":ne.contentTypeJson}},body:r?Tt(s,a.uploadFiles??[]):JSON.stringify(s),signal:a.signal});if(!c.ok)throw await this.toError(c);if(!c.body)throw new te(c.status,null,"Chat response contained no stream body");return this.consumeSse(c.body,a.onEvent)}authHeaders(){return this.token?{Authorization:`Bearer ${this.token}`}:{}}apiUrl(t){return`${this.baseUrl}${yt}${t}`}resolveUrl(t,s,a){const r=this.urls[t];return r?a?r.replace(jt,encodeURIComponent(a)):r:this.apiUrl(s)}async request(t,s,a){const r=await this.fetchImpl(s,{method:t,headers:{...this.customHeaders,...this.authHeaders(),Accept:ne.acceptJson,...a===void 0?{}:{"Content-Type":ne.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 toError(t){let s=null;try{s=await t.json()}catch{}return new te(t.status,s,`Agent service request failed (${t.status} ${t.statusText})`)}async consumeSse(t,s){const a=t.getReader(),r=new TextDecoder;let c="",l;const d=w=>{const{event:f,data:p}=Et(w);if(p===null)return;if(f===St.error){const h=Oe(p);throw new te(502,h,(h==null?void 0:h.message)??"Chat stream error")}const _=Oe(p);_&&(l=_,s==null||s(_))};for(;;){const{done:w,value:f}=await a.read();if(w)break;c+=r.decode(f,{stream:!0});const p=c.split(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),i=require("react"),F=require("classnames"),g=require("@arbor-education/design-system.components"),oe=require("@arbor-education/ask-arbor-chat-panel"),y={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},E={"generating-a-response":"generating-a-response",hitl:"hitl",complete:"complete",failed:"failed"},T={briefing:"briefing",running:"running",stopped:"stopped",complete:"complete"},K={agent:"agent",user:"user",system:"system"},se={MIS_RECORD:"MIS_RECORD",FILE:"FILE",WORKFLOW:"WORKFLOW",LINK:"LINK"},We={cancelled:"cancelled",archived:"archived"},Le={in_progress:"in_progress",requires_attention:"requires_attention",available:"available"},B={[E.complete]:{label:"Complete",icon:"circle-check",color:"var(--color-semantic-success-600)"},[E.failed]:{label:"Failed",icon:"circle-x",color:"var(--color-semantic-destructive-600)"},[E.hitl]:{label:"Requires attention",icon:"triangle-alert",color:"var(--color-semantic-warning-600)"},[E["generating-a-response"]]:{label:"Generating a response",icon:"sparkles",color:"var(--color-brand-600)"}},Ee={[y["generating-a-response"]]:{status:y["generating-a-response"],title:"Active",dotColour:"green",statusIcon:{name:B["generating-a-response"].icon,color:B["generating-a-response"].color}},[y.hitl]:{status:y.hitl,title:"Requires attention",dotColour:"orange",statusIcon:{name:B.hitl.icon,color:B.hitl.color}},[y.complete]:{status:y.complete,title:"Complete",dotColour:"green",dotModifier:"grey-dark",statusIcon:{name:B.complete.icon,color:B.complete.color}},[y.failed]:{status:y.failed,title:"Failed",dotColour:"salmon",statusIcon:{name:B.failed.icon,color:B.failed.color}}},At=[y["generating-a-response"],y.hitl],Nt=[y.complete,y.failed],jt="m4",St="1",et="msg-opening",Te="Unable to load agent tasks. Please try again.",Ct="Unable to load the resources for this agent",tt="Unable to load the timeline for this agent",bt="Something went wrong. Please try again.",nt="Unable to load agents. Please try again.",ae="Loading tasks…",Je="Loading agents…",Tt="Task",Et={[T.briefing]:"Briefing",[T.running]:"Working",[T.stopped]:"Stopped",[T.complete]:"Complete"},It=[y["generating-a-response"],y.hitl,y.complete,y.failed],Rt={[y["generating-a-response"]]:"Agents currently working on tasks for you.",[y.hitl]:"Agents that need your input before they can continue.",[y.complete]:"Agents that have finished their work.",[y.failed]:"Agents that failed or were stopped."},Ot=()=>n.jsxs("svg",{className:"agent-view__empty-illustration",viewBox:"0 0 360 240",xmlns:"http://www.w3.org/2000/svg",role:"img","aria-label":"Preview of the agents board layout",children:[n.jsx("rect",{x:"0",y:"0",width:"360",height:"240",rx:"12",fill:"var(--color-grey-100)"}),n.jsx("rect",{x:"16",y:"16",width:"100",height:"208",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"130",y:"16",width:"100",height:"208",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"244",y:"16",width:"100",height:"100",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"244",y:"124",width:"100",height:"100",rx:"8",fill:"var(--card-default-color-background)",stroke:"var(--card-default-color-border)"}),n.jsx("rect",{x:"28",y:"52",width:"76",height:"36",rx:"6",fill:"var(--color-grey-050)"}),n.jsx("rect",{x:"28",y:"96",width:"76",height:"36",rx:"6",fill:"var(--color-grey-050)"}),n.jsx("rect",{x:"142",y:"52",width:"76",height:"36",rx:"6",fill:"var(--color-semantic-warning-050)"}),n.jsx("circle",{cx:"40",cy:"70",r:"4",fill:"var(--color-brand-600)"}),n.jsx("circle",{cx:"40",cy:"114",r:"4",fill:"var(--color-brand-600)"}),n.jsx("circle",{cx:"154",cy:"70",r:"4",fill:"var(--color-semantic-warning-600)"}),n.jsx("circle",{cx:"256",cy:"52",r:"4",fill:"var(--color-grey-400)"}),n.jsx("circle",{cx:"256",cy:"160",r:"4",fill:"var(--color-semantic-destructive-500)"})]}),Pt=({status:t})=>{const e=Ee[t];return e.statusIcon?n.jsx(g.Icon,{name:e.statusIcon.name,size:16,color:e.statusIcon.color,screenReaderText:e.title}):n.jsx(g.Dot,{colour:e.dotColour,label:e.title})},Mt=()=>n.jsxs("section",{className:"agent-view__empty","aria-label":"About the agents board",children:[n.jsxs("div",{className:"agent-view__empty-content",children:[n.jsx(g.Heading,{level:4,children:"Your agents board"}),n.jsx("p",{className:"agent-view__empty-lead",children:"When you start an agent, it appears here so you can track progress at a glance. Agents move between columns as their status changes."}),n.jsx("ul",{className:"agent-view__empty-columns",children:It.map(t=>{const e=Ee[t];return n.jsxs("li",{className:"agent-view__empty-column",children:[n.jsx("span",{className:"agent-view__empty-column-indicator",children:n.jsx(Pt,{status:t})}),n.jsxs("span",{className:"agent-view__empty-column-text",children:[n.jsx("span",{className:"agent-view__empty-column-title",children:e.title}),n.jsx("span",{className:"agent-view__empty-column-description",children:Rt[t]})]})]},t)})}),n.jsxs("p",{className:"agent-view__empty-hint",children:["Use ",n.jsx("strong",{children:"Start an agent"})," above to begin."]})]}),n.jsx("div",{className:"agent-view__empty-visual",children:n.jsx(Ot,{})})]}),Lt=(t,e)=>({...t,...e.length>0?{children:e}:{}}),st=t=>{const e=[],s=[];for(const a of t){const r=a.children?st(a.children):{needsInput:[],tasks:[]};if(e.push(...r.needsInput),a.status===E.hitl){e.push({...a,children:void 0});continue}s.push(Lt(a,r.tasks))}return{needsInput:e,tasks:s}},Ut=t=>t.map((e,s)=>({item:e,index:s})).sort((e,s)=>{const a=e.item.status===E.hitl,r=s.item.status===E.hitl;return a!==r?a?-1:1:e.index-s.index}).map(({item:e})=>e),$t=({checklist:t})=>t.length===0?n.jsx("p",{className:"agent-view__progress-empty",children:"No tasks to display."}):n.jsx("ul",{className:"agent-view__progress-list","aria-label":"Agent tasks",children:Ut(t).map(e=>{const s=B[e.status];return n.jsxs("li",{className:F("agent-view__progress-item",`agent-view__progress-item--${e.status.replace(/_/g,"-")}`),children:[n.jsx(g.Icon,{name:s.icon,size:16,color:s.color,screenReaderText:`${s.label}:`}),n.jsxs("div",{className:"agent-view__progress-item-content",children:[n.jsx("span",{className:"agent-view__progress-label",children:e.task}),e.status!==E.complete&&n.jsx("span",{className:"agent-view__progress-description",children:e.description})]})]},e.task)})}),Dt=({prompts:t,classNamePrefix:e="agent-workspace",onSelect:s})=>t.length===0?null:n.jsx("div",{className:`${e}__chips`,children:t.map(a=>n.jsx("button",{type:"button",className:`${e}__chip`,onClick:()=>s(a),children:a},a))});class Ht{constructor(e,s){this.connector=e,this.canSend=s.canSend,this.onTurn=s.onTurn,this.onAwaitingChange=s.onAwaitingChange}get canRate(){return!1}get canLoadHistory(){return!1}get canListInteractions(){return!1}get canSendNotification(){return!1}get ratingPopupUrls(){return{}}async sendMessage(e){var s,a;if(!this.canSend())return null;(s=this.onAwaitingChange)==null||s.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:oe.CHAT_RESPONSE_TYPE_AGENT,...r.message.followUpPrompts?{followUpPrompts:r.message.followUpPrompts}:{}}}catch{return{id:`error-${Date.now()}`,text:bt,type:oe.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 Bt=({connector:t,phase:e,chatHistory:s,chatSessionKey:a,startQuery:r,clarificationMessage:c,enableUpload:o=!1,onTurn:l,onAwaitingChange:d,onClarificationPrompt:_,onDismissClarification:h})=>{const p=i.useMemo(()=>new Ht(t,{canSend:()=>e===T.running,onTurn:l,onAwaitingChange:d}),[t,e,l,d]),x=e!==T.running,k=e===T.running;return n.jsxs("section",{className:"agent-workspace__chat-body","aria-label":"Chat",children:[c&&n.jsxs("div",{className:"agent-workspace__clarification",role:"region","aria-label":"Agent question",children:[n.jsx("p",{className:"agent-workspace__clarification-text",children:c.text}),c.followUpPrompts&&n.jsx(Dt,{prompts:c.followUpPrompts,onSelect:_}),n.jsx("button",{type:"button",className:"agent-workspace__clarification-dismiss",onClick:h,children:"Dismiss"})]}),n.jsx("div",{className:"agent-workspace__ask-arbor",children:n.jsx(oe.ChatPanel,{connector:p,chatHistory:s,startQuery:r,lockConversation:x,enableUpload:o,speechEnabled:k,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:k?"Message the agent, paste a link, or attach a file…":"The agent is not accepting messages."},a)}),e===T.stopped&&n.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[n.jsx(g.Icon,{name:"circle-alert",size:16,color:"var(--color-semantic-warning-600)"}),n.jsx("span",{children:"You stopped the agent. Its progress is saved in the checklist on the left."})]}),e===T.complete&&n.jsxs("div",{className:"agent-workspace__notice",role:"status",children:[n.jsx(g.Icon,{name:"party-popper",size:16,color:"var(--color-semantic-success-600)"}),n.jsx("span",{children:"The agent has finished."})]})]})},at=({item:t,depth:e,canRequestInput:s,onAttentionItemClick:a})=>{const r=B[t.status],c=t.status.replace(/_/g,"-"),o=t.status===E.hitl&&s&&a,l=n.jsxs("div",{className:"agent-workspace__task-row",children:[n.jsx(g.Icon,{name:r.icon,size:16,color:r.color,screenReaderText:`${r.label}:`}),n.jsxs("div",{className:"agent-workspace__task-content",children:[n.jsx("span",{className:"agent-workspace__task-label",children:t.task}),t.status!==E.complete&&t.description&&n.jsx("span",{className:"agent-workspace__task-description",children:t.description})]})]});return n.jsxs("li",{className:F("agent-workspace__task",`agent-workspace__task--${c}`,{"agent-workspace__task--child":e>0}),children:[o?n.jsx("button",{type:"button",className:"agent-workspace__task-button","aria-label":`Provide input for ${t.task}`,onClick:()=>a(t),children:l}):l,t.children&&t.children.length>0&&n.jsx("ul",{className:"agent-workspace__task-children",children:t.children.map(d=>n.jsx(at,{item:d,depth:e+1,canRequestInput:s,onAttentionItemClick:a},d.task))})]})},Ve=({items:t,ariaLabel:e,canRequestInput:s,onAttentionItemClick:a})=>n.jsx("ul",{className:"agent-workspace__task-list","aria-label":e,children:t.map(r=>n.jsx(at,{item:r,depth:0,canRequestInput:s,onAttentionItemClick:a},r.task))}),Ft=({checklist:t,isLoading:e,error:s,phase:a,canRequestInput:r,onStop:c,onAttentionItemClick:o})=>{const l=i.useMemo(()=>t?st(t):null,[t]);return n.jsxs("section",{className:"agent-workspace__panel agent-workspace__panel--checklist","aria-label":"Checklist",children:[n.jsxs("div",{className:"agent-workspace__panel-header",children:[n.jsx(g.Heading,{level:4,children:"Checklist"}),a===T.running&&n.jsx(g.Button,{variant:"secondary-destructive",size:"S",iconLeftName:"circle-x",iconLeftScreenReaderText:"Stop",onClick:c,children:"Stop agent"})]}),n.jsxs("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:[e&&n.jsxs("div",{className:"agent-workspace__loading",children:[n.jsx(g.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:ae}),n.jsx("span",{children:ae})]}),!e&&s&&n.jsx("p",{className:"agent-workspace__error",role:"alert",children:s}),!e&&!s&&l&&n.jsxs(n.Fragment,{children:[l.needsInput.length>0&&n.jsxs("div",{className:"agent-workspace__task-group",children:[n.jsx("p",{className:"agent-workspace__task-group-label",children:"Needs your input"}),n.jsx(Ve,{items:l.needsInput,ariaLabel:"Tasks needing your input",canRequestInput:r,onAttentionItemClick:o})]}),l.tasks.length>0&&n.jsxs("div",{className:F("agent-workspace__task-group",{"agent-workspace__task-group--following":l.needsInput.length>0}),children:[l.needsInput.length>0&&n.jsx("p",{className:"agent-workspace__task-group-label",children:"Other tasks"}),n.jsx(Ve,{items:l.tasks,ariaLabel:"Agent tasks",canRequestInput:r,onAttentionItemClick:o})]})]}),!e&&!s&&(!l||l.needsInput.length===0&&l.tasks.length===0)&&n.jsx("p",{className:"agent-workspace__empty",children:a===T.briefing?"Tasks will appear here once the agent starts.":"No tasks to display."})]})]})},Gt={[se.MIS_RECORD]:{icon:"table",label:"Arbor MIS",color:"var(--color-brand-600)"},[se.FILE]:{icon:"file",label:"File",color:"var(--color-semantic-caution-800)"},[se.WORKFLOW]:{icon:"list-tree",label:"Workflow",color:"var(--color-semantic-warning-700)"},[se.LINK]:{icon:"link",label:"Link",color:"var(--color-semantic-info-700)"}},zt=({resources:t,isLoading:e=!1,error:s=null})=>n.jsxs("section",{className:"agent-workspace__panel agent-workspace__panel--documents","aria-label":"Resources",children:[n.jsxs("div",{className:"agent-workspace__panel-header",children:[n.jsx(g.Heading,{level:4,children:"Resources"}),n.jsx("span",{className:"agent-workspace__panel-count",children:t.length})]}),n.jsxs("div",{className:"agent-workspace__panel-body","aria-live":"polite",children:[e&&n.jsxs("div",{className:"agent-workspace__loading",children:[n.jsx(g.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-workspace__task-icon--spinning",screenReaderText:"Loading resources"}),n.jsx("span",{children:"Loading resources…"})]}),!e&&s&&n.jsx("p",{className:"agent-workspace__error",role:"alert",children:s}),!e&&!s&&t.length>0&&n.jsx("ul",{className:"agent-workspace__resource-list","aria-label":"Agent resources",children:t.map(a=>{const r=Gt[a.type];return n.jsx("li",{className:"agent-workspace__resource",children:n.jsxs("a",{className:"agent-workspace__resource-card",href:a.uri,target:"_blank",rel:"noreferrer",children:[n.jsx("span",{className:`agent-workspace__resource-icon agent-workspace__resource-icon--${a.type.toLowerCase()}`,children:n.jsx(g.Icon,{name:r.icon,size:16,color:r.color,screenReaderText:`${r.label}:`})}),n.jsxs("span",{className:"agent-workspace__resource-content",children:[n.jsxs("span",{className:"agent-workspace__resource-top",children:[n.jsx("span",{className:"agent-workspace__resource-name",children:a.name}),n.jsx("span",{className:`agent-workspace__resource-badge agent-workspace__resource-badge--${a.type.toLowerCase()}`,children:r.label})]}),a.description&&n.jsx("span",{className:"agent-workspace__resource-description",children:a.description})]}),n.jsx(g.Icon,{name:"external-link",size:12,color:"var(--color-grey-500)",screenReaderText:"Opens in a new tab",className:"agent-workspace__resource-open"})]})},`${a.type}-${a.uri}`)})}),!e&&!s&&t.length===0&&n.jsx("p",{className:"agent-workspace__empty",children:"No resources yet."})]})]}),Ie=t=>{const e=Date.parse(t);return Number.isFinite(e)?e:0},qt=new Intl.DateTimeFormat("en-GB",{day:"numeric",month:"long",year:"numeric",hour:"numeric",minute:"2-digit"}),Ue=t=>{const e=new Date(t);return Number.isFinite(e.getTime())?qt.format(e):t},Ce=t=>t.replace(/[A-Za-z0-9]+(?:[_-][A-Za-z0-9]+)+/g,e=>e.split(/[_-]/).map(s=>s.charAt(0).toUpperCase()+s.slice(1).toLowerCase()).join(" ")),he=(t,e)=>e<=1?0:t/(e-1)*100,rt=t=>Math.max(t,0)+2,Kt=t=>t+1,Wt=(t,e)=>{if(e.length===0)return 50;const s=rt(e.length),a=he(1,s),r=he(e.length,s),c=e.map(h=>Ie(h.timestamp)),o=Math.min(...c),l=Math.max(...c);if(l<=o)return a;const d=(Ie(t.timestamp)-o)/(l-o),_=Math.min(1,Math.max(0,d));return a+_*(r-a)},Jt=8,Vt=20,Yt=(t,e=Jt,s=Vt)=>{const a=new Map;if(t.length===0)return a;const r=[...t].sort((o,l)=>o.leftPercent-l.leftPercent||o.timestampMs-l.timestampMs||o.id.localeCompare(l.id)),c=[];for(const o of r){const l=c[c.length-1];l&&o.leftPercent-l[l.length-1].leftPercent<e?l.push(o):c.push([o])}for(const o of c){const l=[...o].sort((_,h)=>_.timestampMs-h.timestampMs||_.id.localeCompare(h.id)),d=(l.length-1)/2;l.forEach((_,h)=>{a.set(_.id,(h-d)*s)})}return a},be=(t,e=0)=>({left:`calc(${t/100} * (100% - var(--agent-timeline-node-size)) + (var(--agent-timeline-node-size) / 2) + ${e}px)`,transform:"translateX(-50%)"}),Xt=t=>t.type!=="message-sent",Qt=({timeline:t,isLoading:e,error:s,onOpenChatSession:a})=>{const r=((t==null?void 0:t.actionLog)??[]).filter(Xt),c=(t==null?void 0:t.chatSessions)??[],o=!e&&!s&&r.length===0&&c.length===0,l=rt(r.length),d=r.map((p,x)=>({id:`action-${p.timestamp}-${x}`,leftPercent:he(Kt(x),l),timestampMs:Ie(p.timestamp)})),_=c.map(p=>({id:p.sessionId,leftPercent:Wt(p,r),timestampMs:Ie(p.timestamp)})),h=Yt([...d,..._]);return n.jsxs("section",{className:"agent-workspace__timeline","aria-label":"Agent timeline",children:[e&&n.jsx("p",{className:"agent-workspace__timeline-status",role:"status",children:"Loading timeline…"}),s&&n.jsx("p",{className:"agent-workspace__timeline-status",role:"alert",children:s||tt}),o&&n.jsx("p",{className:"agent-workspace__timeline-status",role:"status",children:"No timeline activity yet."}),!e&&!s&&!o&&n.jsxs("div",{className:"agent-timeline",children:[n.jsx("div",{className:"agent-timeline__track","aria-hidden":"true"}),n.jsxs("div",{className:"agent-timeline__station agent-timeline__station--terminus",style:be(he(0,l)),children:[n.jsx("span",{className:"agent-timeline__station-node agent-timeline__station-node--terminus","aria-hidden":"true",children:n.jsx(g.Icon,{name:"arrow-right-from-line",size:16,color:"currentColor"})}),n.jsx("span",{className:"agent-timeline__terminus-label",children:"Start"})]}),r.map((p,x)=>{const k=`action-${p.timestamp}-${x}`,j=d[x].leftPercent,N=p.type==="checklist-updated",U=p.type==="status-transition",S=N?"checklist":U?"status":"note";return n.jsxs("div",{className:`agent-timeline__station agent-timeline__station--${S}`,style:be(j,h.get(k)??0),children:[n.jsxs("button",{type:"button",className:`agent-timeline__station-node agent-timeline__station-node--${S}`,"aria-label":`${Ce(p.type)}: ${Ce(p.entry)}`,children:[N&&n.jsx(g.Icon,{name:"check-solid",size:16,color:"currentColor"}),U&&n.jsx(g.Icon,{name:"iteration-ccw",size:16,color:"currentColor"})]}),n.jsxs("div",{className:"agent-timeline__pill",role:"tooltip",children:[n.jsx("strong",{className:"agent-timeline__pill-type",children:Ce(p.type)}),n.jsx("span",{className:"agent-timeline__pill-entry",children:Ce(p.entry)}),n.jsx("span",{className:"agent-timeline__pill-entry",children:Ue(p.timestamp)})]})]},k)}),n.jsxs("div",{className:"agent-timeline__station agent-timeline__station--terminus",style:be(he(l-1,l)),children:[n.jsx("span",{className:"agent-timeline__station-node agent-timeline__station-node--terminus","aria-hidden":"true",children:n.jsx(g.Icon,{name:"flag",size:16,color:"currentColor"})}),n.jsx("span",{className:"agent-timeline__terminus-label",children:"Finish"})]}),c.map((p,x)=>{const k=_[x].leftPercent;return n.jsxs("div",{className:"agent-timeline__chat-station",style:be(k,h.get(p.sessionId)??0),children:[n.jsx("button",{type:"button",className:"agent-timeline__chat-node","aria-label":`Open chat session from ${Ue(p.timestamp)}`,onClick:()=>a(p.sessionId),children:n.jsx(g.Icon,{name:"sparkles",size:16,color:"currentColor"})}),n.jsxs("div",{className:"agent-timeline__pill",role:"tooltip",children:[n.jsx("strong",{className:"agent-timeline__pill-type",children:"Chat session"}),n.jsx("span",{className:"agent-timeline__pill-entry",children:Ue(p.timestamp)})]})]},p.sessionId)})]})]})},Zt=["I'll get the details and come back to you","Skip this for now"],en=t=>{var s;const e=(s=t.prompt)!=null&&s.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:K.agent,text:e,followUpPrompts:t.clarificationPrompts??Zt}},pe=t=>({id:t.id,text:t.text,type:t.author===K.user?oe.CHAT_RESPONSE_TYPE_USER:t.author===K.system?oe.CHAT_RESPONSE_TYPE_INFO:oe.CHAT_RESPONSE_TYPE_AGENT,...t.followUpPrompts?{followUpPrompts:t.followUpPrompts}:{}});class re extends Error{constructor(e,s,a){super(a??`Agent service request failed (${e})`),this.name="AgentServiceError",this.status=e,this.detail=s}}const tn="/api/v1",M={agentDefinitions:"/agent-definitions",agents:"/agents",conversations:"/conversations",tripOptions:"/trip-options",demoDataset:"/demo/dataset"},L={GET:"GET",POST:"POST"},nn={error:"error"},sn={user:"user"},ie={acceptJson:"application/json",acceptEventStream:"text/event-stream",contentTypeJson:"application/json",arborApplicationUrl:"X-Arbor-Application-Url"},an=/:invocationId\b/g,rn=t=>t.trim().replace(/^Bearer\s+/i,""),on=t=>t.endsWith("/")?t.slice(0,-1):t;class Be{constructor(e){var a;this.baseUrl=on(e.baseUrl??"");const s=(a=e.token)==null?void 0:a.trim();this.token=s?rn(s):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(L.GET,this.resolveUrl("agentDefinitions",M.agentDefinitions))).agent_definitions??[]}getAgentDefinition(e){return this.request(L.GET,this.apiUrl(`${M.agentDefinitions}/${encodeURIComponent(e)}`))}listTripOptions(){return this.request(L.GET,this.apiUrl(M.tripOptions))}getDataset(){return this.request(L.GET,this.apiUrl(M.demoDataset))}setDataset(e){return this.request(L.POST,this.apiUrl(M.demoDataset),{dataset:e})}listAgents(e={}){const s=new URLSearchParams;e.status&&s.set("status",e.status),e.agentDefinitionRef&&s.set("agent_definition_ref",e.agentDefinitionRef);const a=s.toString()?`?${s.toString()}`:"";return this.request(L.GET,`${this.resolveUrl("agents",M.agents)}${a}`)}createAgent(e,s={}){var o,l;const a={agent_definition_ref:e},r=(o=s.invocationName)==null?void 0:o.trim(),c=(l=s.agentIntent)==null?void 0:l.trim();return r&&(a.invocation_name=r),c&&(a.agent_intent=c),this.request(L.POST,this.resolveUrl("agents",M.agents),a)}getAgent(e){return this.request(L.GET,this.resolveUrl("agent",`${M.agents}/${encodeURIComponent(e)}`,e))}getAgentChecklist(e){return this.request(L.GET,this.resolveUrl("agentChecklist",`${M.agents}/${encodeURIComponent(e)}/checklist`,e))}getAgentResources(e){return this.request(L.GET,this.resolveUrl("agentResources",`${M.agents}/${encodeURIComponent(e)}/resources`,e))}getAgentTimeline(e){return this.request(L.GET,this.resolveUrl("agentTimeline",`${M.agents}/${encodeURIComponent(e)}/agent-timeline`,e))}getAgentContext(e){return this.request(L.GET,this.apiUrl(`${M.agents}/${encodeURIComponent(e)}/context`))}cancelAgent(e){return this.request(L.POST,this.apiUrl(`${M.agents}/${encodeURIComponent(e)}/cancel`))}archiveAgent(e){return this.request(L.POST,this.apiUrl(`${M.agents}/${encodeURIComponent(e)}/archive`))}getConversation(e){return this.request(L.GET,this.resolveUrl("agentConversation",`${M.conversations}/${encodeURIComponent(e)}`,e))}async chat(e,s,a={}){const r=!!(a.uploadFiles&&a.uploadFiles.length>0),c=await this.fetchImpl(this.resolveUrl("agentChat",`${M.agents}/${encodeURIComponent(e)}/chat`,e),{method:L.POST,headers:{...this.customHeaders,...this.authHeaders(),Accept:ie.acceptEventStream,...r?{}:{"Content-Type":ie.contentTypeJson}},body:r?ln(s,a.uploadFiles??[]):JSON.stringify(s),signal:a.signal});if(!c.ok)throw await this.toError(c);if(!c.body)throw new re(c.status,null,"Chat response contained no stream body");return this.consumeSse(c.body,a.onEvent)}authHeaders(){return this.token?{Authorization:`Bearer ${this.token}`}:{}}apiUrl(e){return`${this.baseUrl}${tn}${e}`}resolveUrl(e,s,a){const r=this.urls[e];return r?a?r.replace(an,encodeURIComponent(a)):r:this.apiUrl(s)}async request(e,s,a){const r=await this.fetchImpl(s,{method:e,headers:{...this.customHeaders,...this.authHeaders(),Accept:ie.acceptJson,...a===void 0?{}:{"Content-Type":ie.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 toError(e){let s=null;try{s=await e.json()}catch{}return new re(e.status,s,`Agent service request failed (${e.status} ${e.statusText})`)}async consumeSse(e,s){const a=e.getReader(),r=new TextDecoder;let c="",o;const l=d=>{const{event:_,data:h}=cn(d);if(h===null)return;if(_===nn.error){const x=Ye(h);throw new re(502,x,(x==null?void 0:x.message)??"Chat stream error")}const p=Ye(h);p&&(o=p,s==null||s(p))};for(;;){const{done:d,value:_}=await a.read();if(d)break;c+=r.decode(_,{stream:!0});const h=c.split(`
2
2
 
3
- `);c=p.pop()??"";for(const _ of p)d(_)}if(c.trim()&&d(c),!l)throw new te(502,null,"Chat stream ended without any events");return l}}const Et=e=>{let t=null;const s=[];for(const a of e.split(`
4
- `)){const r=a.trimEnd();r.startsWith("event:")?t=r.slice(6).trim():r.startsWith("data:")&&s.push(r.slice(5).trim())}return{event:t,data:s.length>0?s.join(`
5
- `):null}},Oe=e=>{try{return JSON.parse(e)}catch{return}};function Tt(e,t){const s=new FormData;s.append("body",JSON.stringify(e));for(const a of t)s.append("files",a,a.name);return s}const It={id:De,author:B.agent,text:"I'm connected to this agent. Ask me how it's progressing, or send an instruction and I’ll act on it."};let Pe=0;const Me=e=>(Pe+=1,`${e}-${Date.now()}-${Pe}`),Rt=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 Be{constructor(t,s,a={}){this.seededChecklist=[],this.client=t,this.agentId=s,this.opening=a.openingMessage??It,this.model=a.model,this.bootstrapPrompt=a.bootstrapPrompt??rt}openingMessage(){return this.opening}async bootstrapConversation(t=this.bootstrapPrompt){const s=t.trim();if(!s)return[this.opening];const a={id:Me("msg-user"),author:B.user,text:s},r=await this.exchange(s);return[a,r.message]}async start(t){return{...await this.exchange(Rt(t)),phase:N.running}}sendMessage(t,s){return this.exchange(t,s)}async stop(){}seedChecklist(t){this.seededChecklist=t}async exchange(t,s){var l;const a=[{role:Nt.user,content:t}],r=await this.client.chat(this.agentId,{messages:a,...this.chatId?{chat_id:this.chatId}:{},...this.model?{model:this.model}:{},moderation_enabled:!0,meta:{feature_id:"agent_view",source:"agent_view_frontend"}},...s&&s.length>0?[{uploadFiles:s}]:[]);return this.chatId=r.chat_id,{message:{id:r.event_id||Me("msg-agent"),author:B.agent,text:r.message.content,...(l=r.follow_up_prompts)!=null&&l.length?{followUpPrompts:r.follow_up_prompts}:{}}}}}const je=(e,t)=>s=>{var a;return new Be(e,s.invocation_id,{model:t==null?void 0:t.model,bootstrapPrompt:t==null?void 0:t.bootstrapPrompt,openingMessage:((a=t==null?void 0:t.resolveOpeningMessage)==null?void 0:a.call(t,s))??(t==null?void 0:t.openingMessage)})},Ge=e=>{switch(e){case Te.cancelled:return v.failed;case Te.archived:return v.complete;case v.hitl:case v.complete:case v.failed:case v["generating-a-response"]:return e;default:return v["generating-a-response"]}},qe=e=>{switch(e){case ke.requires_attention:return S.hitl;case ke.in_progress:case ke.available:return S["generating-a-response"];case S.failed:case S.complete:case S.hitl:case S["generating-a-response"]:return e;default:return S["generating-a-response"]}},Ke=e=>({ref:e.name,display_name:e.display_name,agent_intent:e.agent_intent??e.display_name,description:e.description}),Ot=e=>({id:e.id,name:e.name,...e.has_run_before?{hasRunBefore:e.has_run_before}:{}}),Pt=new Set(Object.values(Z)),Mt=e=>e&&Pt.has(e)?e:Z.LINK,ze=e=>({uri:e.uri??"",type:Mt(e.type),name:e.name??"",description:e.description??""}),Ce=e=>(Array.isArray(e)?e:e.resources??[]).map(ze),ye=e=>{var s;const t=e.invocation_id??e.id;return{id:e.id,invocation_id:t,agent_definition_ref:e.agent_definition_ref,...e.agent_intent?{agent_intent:e.agent_intent}:{},invocation_name:((s=e.invocation_name)==null?void 0:s.trim())||e.agent_definition_ref,application_id:e.application_id,...e.application_name?{application_name:e.application_name}:{},created_by:e.created_by,status:Ge(e.status),context_ref:e.context_ref??null,checklist_ref:e.checklist_ref??null}},be=e=>{var t;return{task:e.task??e.name??e.label??at,status:qe(e.status),description:e.description??"",...e.prompt?{prompt:e.prompt}:{},...(t=e.follow_up_prompts)!=null&&t.length?{clarificationPrompts:e.follow_up_prompts}:{}}},Lt=e=>Array.isArray(e)?e:e.checklist_items??e.checklist??e.items??[],Ee=(e,t,s)=>{var c;const a=!Array.isArray(t)&&(t.opening_message||(c=t.opening_follow_up_prompts)!=null&&c.length)?t:s,r=a?le(a):void 0;return{invocation_id:e,checklist:Lt(t).map(be),...r?{openingMessage:r}:{}}},Ut=(e,t)=>{const s=le(t);return{invocation_id:t.invocation_id??e,checklist:(t.checklist_items??[]).map(be),...s?{openingMessage:s}:{}}},le=e=>{var s,a;const t=(s=e.opening_message)==null?void 0:s.trim();if(t)return{id:De,author:B.agent,text:t,...(a=e.opening_follow_up_prompts)!=null&&a.length?{followUpPrompts:e.opening_follow_up_prompts}:{}}},Dt=e=>e instanceof te?e.message:e instanceof TypeError?"Network error while contacting the agent service.":e instanceof Error&&e.message?e.message:$e,$t=e=>{const t={};for(const s of e){const a=le(s);if(!a)continue;const r=s.invocation_id??s.id;t[r]=a,t[s.id]=a}return t},Ht=e=>JSON.stringify(e),We=e=>{const{jwt:t,headers:s,urls:a}=e,r=JSON.stringify(s??{}),c=Ht(a),l=i.useMemo(()=>new Ne({token:t,headers:s,urls:a}),[t,c]);i.useLayoutEffect(()=>{l.setHeaders(s)},[l,r]);const[d,w]=i.useState([]),[f,p]=i.useState([]),[_,h]=i.useState({}),[j,b]=i.useState("loading"),[k,y]=i.useState(null),[x,O]=i.useState(0);i.useEffect(()=>{let A=!1;return b("loading"),y(null),(async()=>{try{const[C,M]=await Promise.all([l.listAgents(),l.listAgentDefinitions()]);if(A)return;w(C.map(ye)),p(M.map(Ke)),h($t(C)),b("idle")}catch(C){if(A)return;w([]),p([]),h({}),b("error"),y(Dt(C))}})(),()=>{A=!0}},[l,x]);const G=i.useCallback(()=>{O(A=>A+1)},[]),P=i.useCallback(async A=>{const[C,M]=await Promise.all([l.getAgentChecklist(A),l.getAgent(A).catch(()=>null)]);return Ee(A,C,M??void 0)},[l]),J=i.useCallback(async A=>{const C=await l.getAgentResources(A);return Ce(C)},[l]),V=i.useCallback(async({definition:A,invocationName:C})=>{const M=await l.createAgent(A.ref,{invocationName:C}),K=await l.getAgent(M.id),I=ye(K),D=le(K);return w($=>[I,...$]),D&&h($=>({...$,[I.invocation_id]:D,[I.id]:D})),I},[l]),q=i.useMemo(()=>je(l,{resolveOpeningMessage:A=>_[A.invocation_id]??_[A.id]}),[l,_]);return{agents:d,agentDefinitions:f,loadState:j,loadError:k,reload:G,fetchAgentChecklist:P,fetchAgentResources:J,createAgent:V,chatConnector:q}},Ft=e=>JSON.stringify(e),Je=e=>{const{agent:t,jwt:s,headers:a,urls:r}=e,c=JSON.stringify(a??{}),l=Ft(r),d=i.useMemo(()=>new Ne({token:s,headers:a,urls:{agent:r.agentUrl,agentChecklist:r.agentChecklistUrl,...r.agentResourcesUrl?{agentResources:r.agentResourcesUrl}:{},agentChat:r.agentChatUrl}}),[s,l]);i.useLayoutEffect(()=>{d.setHeaders(a)},[d,c]);const w=i.useCallback(async _=>{const[h,j]=await Promise.all([d.getAgentChecklist(_),d.getAgent(_).catch(()=>null)]);return Ee(_,h,j??void 0)},[d]),f=i.useCallback(async _=>{const h=await d.getAgentResources(_);return Ce(h)},[d]);return{connector:i.useMemo(()=>je(d)(t),[d,t]),fetchAgentChecklist:w,fetchAgentResources:f}},Bt=(e,t)=>{const s=e.hasRunBefore?t||"This trip":e.tripName.trim()||"A new trip",a=e.destination?` to ${e.destination}`:"",r=e.hasRunBefore?" It has run before.":"";return`${s}${a}.${r}`.trim()},Gt=e=>{switch(e){case v.failed:return N.stopped;case v.complete:return N.complete;default:return N.running}},Le=(e,t)=>{t([ce(e)])},Ve=({agent:e,open:t,onClose:s,jwt:a,headers:r,agentUrl:c,agentChecklistUrl:l,agentResourcesUrl:d,agentChatUrl:w,enableUpload:f,initialBrief:p,initialPhase:_,initialChecklist:h})=>{const{connector:j,fetchAgentChecklist:b,fetchAgentResources:k}=Je({agent:e,jwt:a,headers:r,urls:{agentUrl:c,agentChecklistUrl:l,agentResourcesUrl:d,agentChatUrl:w}}),y=i.useRef(j),[x,O]=i.useState(_??(p?N.running:Gt(e.status))),[G,P]=i.useState([]),[J,V]=i.useState(0),[q,A]=i.useState(),[C,M]=i.useState(null),[K,I]=i.useState([]),[D,$]=i.useState(!1),[ae,z]=i.useState(null),[he,H]=i.useState(h??null),[me,re]=i.useState(!1),[W,oe]=i.useState(null),[de,Y]=i.useState(!1),[Q,_e]=i.useState(!1),[X,fe]=i.useState(!1),F=i.useRef(!1);i.useEffect(()=>{y.current=j},[j]),i.useEffect(()=>{F.current=!1,P([]),V(o=>o+1)},[e.invocation_id]),i.useEffect(()=>{if(!t||p||F.current)return;const o=y.current.bootstrapConversation;if(!o){Le(y.current.openingMessage(),P);return}F.current=!0;let g=!1;return Y(!0),(async()=>{try{const m=await o.call(y.current);if(g)return;P(m.map(ce))}catch{g||Le(y.current.openingMessage(),P)}finally{g||Y(!1)}})(),()=>{g=!0}},[t,p,e.invocation_id,j]);const ve=i.useCallback(o=>{o.checklist&&H(o.checklist),o.phase&&O(o.phase)},[]);i.useEffect(()=>{var o,g;!t||p||h&&h.length>0&&((g=(o=y.current).seedChecklist)==null||g.call(o,h))},[t,p,h]),i.useEffect(()=>{if(!t||p)return;let o=!1;return re(!(h!=null&&h.length)),oe(null),(async()=>{var g,m;try{const R=await b(e.invocation_id);if(o)return;h!=null&&h.length||(H(R.checklist),(m=(g=y.current).seedChecklist)==null||m.call(g,R.checklist))}catch{!o&&!(h!=null&&h.length)&&oe(Ae)}finally{o||re(!1)}})(),()=>{o=!0}},[t,e.invocation_id,p,h,b]),i.useEffect(()=>{if(!t||!d)return;let o=!1;return $(!0),z(null),(async()=>{try{const g=await k(e.invocation_id);o||I(g)}catch{o||z(nt)}finally{o||$(!1)}})(),()=>{o=!0}},[t,e.invocation_id,d,k]),i.useEffect(()=>{if(!t||!p||F.current)return;F.current=!0;const o={id:`user-brief-${Date.now()}`,author:B.user,text:Bt(p,e.invocation_name)};(async()=>{const g=await y.current.start(p);P([ce(y.current.openingMessage()),ce(o),ce(g.message)]),g.checklist&&H(g.checklist),O(g.phase??N.running)})()},[t,p,e.invocation_name]);const we=i.useCallback(o=>{M(At(o))},[]),xe=i.useCallback(o=>{M(null),A(o),V(g=>g+1)},[]),ge=i.useCallback(async()=>{await y.current.stop(),O(N.stopped)},[]),ue=he;return n.jsxs(u.Modal,{open:t,closeHandler:s,hideCloseButton:!0,className:"agent-workspace",children:[n.jsxs(u.Modal.Header,{className:"agent-workspace__header",children:[n.jsxs("div",{className:"agent-workspace__header-title",children:[n.jsx("span",{className:"agent-workspace__header-avatar","aria-hidden":"true",children:n.jsx(u.Icon,{name:"ask-arbor",size:24})}),n.jsx(u.Modal.Title,{children:e.invocation_name}),n.jsx("span",{className:L("agent-workspace__phase",`agent-workspace__phase--${x}`),children:ot[x]})]}),n.jsxs("div",{className:"agent-workspace__header-actions",children:[n.jsx(u.Button,{variant:"tertiary",size:"S",iconLeftName:"clipboard-list",iconLeftScreenReaderText:"Toggle checklist","aria-pressed":!X,onClick:()=>fe(o=>!o),children:"Checklist"}),n.jsx(u.Button,{variant:"tertiary",size:"S",iconLeftName:"files",iconLeftScreenReaderText:"Toggle resources","aria-pressed":!Q,onClick:()=>_e(o=>!o),children:"Resources"}),n.jsx(u.Button,{variant:"secondary",size:"S",iconLeftName:"x",iconLeftScreenReaderText:"Close",onClick:s,children:"Close"})]})]}),n.jsxs(u.Modal.Body,{className:L("agent-workspace__body",{"agent-workspace__body--no-left":X,"agent-workspace__body--no-right":Q}),children:[!X&&n.jsx(vt,{checklist:ue,isLoading:me,error:W,phase:x,canRequestInput:x===N.running&&!de,onStop:()=>void ge(),onAttentionItemClick:we}),n.jsx(ft,{connector:y.current,phase:x,chatHistory:G,chatSessionKey:J,startQuery:q,clarificationMessage:C,enableUpload:f,onTurn:ve,onAwaitingChange:Y,onClarificationPrompt:xe,onDismissClarification:()=>M(null)}),!Q&&n.jsx(xt,{resources:K,isLoading:D,error:ae})]})]})},Ye=({open:e,onClose:t,onStart:s,agentDefinitions:a})=>{const r=a[0],[c,l]=i.useState(r),[d,w]=i.useState(""),[f,p]=i.useState(!1),[_,h]=i.useState(null),j=[...a].sort((x,O)=>x.agent_intent.localeCompare(O.agent_intent)).map(x=>({value:x.ref,label:x.agent_intent}));i.useEffect(()=>{e&&(l(r),w(""),p(!1),h(null))},[e,r]);const b=c!==void 0&&d.trim().length>0,k=i.useCallback(x=>{const O=a.find(G=>G.ref===x[0]);O&&l(O)},[a]),y=i.useCallback(async()=>{if(!(!c||!b||f)){p(!0),h(null);try{await s({definition:c,invocationName:d.trim()})}catch(x){h(x instanceof Error?x.message:"Unable to start the agent.")}finally{p(!1)}}},[b,c,d,f,s]);return!c||a.length===0?null:n.jsxs(u.Modal,{open:e,closeHandler:t,className:"new-agent",children:[n.jsx(u.Modal.Header,{className:"new-agent__header",children:n.jsxs("div",{className:"new-agent__header-title",children:[n.jsx("span",{className:"new-agent__header-avatar","aria-hidden":"true",children:n.jsx(u.Icon,{name:"ask-arbor",size:24})}),n.jsx(u.Modal.Title,{children:"Start an agent"})]})}),n.jsx(u.Modal.Body,{className:"new-agent__body",children:n.jsxs("form",{className:"new-agent__form","aria-label":"Start an agent",onSubmit:x=>{x.preventDefault(),b&&!f&&y()},children:[n.jsxs("div",{className:"new-agent__type-field",children:[n.jsx("label",{className:"new-agent__type-label",htmlFor:"new-agent-type",children:"What would you like your agent to do?"}),n.jsx(u.SelectDropdown,{id:"new-agent-type",placeholder:"Choose an intent",options:j,selectedValues:[c.ref],onSelectionChange:k}),n.jsx("p",{className:"new-agent__type-description",children:c.description})]}),n.jsxs("div",{className:"new-agent__type-field",children:[n.jsx("label",{className:"new-agent__type-label",htmlFor:"new-agent-invocation-name",children:"Name"}),n.jsx(u.TextInput,{id:"new-agent-invocation-name",value:d,placeholder:"e.g. Test with memory3",onChange:x=>w(x.target.value)})]}),_?n.jsx("p",{className:"new-agent__error",role:"alert",children:_}):null,n.jsx("div",{className:"new-agent__actions",children:n.jsx(u.Button,{type:"submit",variant:"primary",disabled:!b||f,iconLeftName:f?"loader":"sparkles",iconLeftScreenReaderText:f?"Starting":void 0,children:f?"Starting…":"Start"})})]})})]})},qt=e=>e!==void 0&&e.some(t=>t.status===S.hitl),Kt=(e,t)=>qt(t)?v.hitl:e.status,zt=({column:e,label:t})=>e.statusIcon?n.jsx("span",{className:"agent-view__status-indicator",children:n.jsx(u.Icon,{name:e.statusIcon.name,size:16,color:e.statusIcon.color,className:L({"agent-view__progress-icon--spinning":e.statusIcon.spin}),screenReaderText:t})}):n.jsx("span",{className:L("agent-view__dot",{[`agent-view__dot--${e.dotModifier}`]:e.dotModifier}),children:n.jsx(u.Dot,{colour:e.dotColour,label:t})}),Wt=({agent:e,agentName:t,column:s,isExpanded:a,isLoading:r,checklist:c,error:l,onToggle:d,onViewAgent:w})=>{const{id:f,invocation_name:p}=e,_=`agent-card-${f}-header`,h=`agent-card-${f}-progress`;return n.jsx("li",{className:L("agent-view__card",{"agent-view__card--expanded":a}),children:n.jsxs(u.Card,{spacing:"dense",children:[n.jsx("button",{type:"button",className:"agent-view__card-toggle","aria-expanded":a,"aria-controls":h,"aria-label":p,id:_,onClick:()=>d(f),children:n.jsxs("div",{className:"agent-view__card-content",children:[n.jsx(zt,{column:s}),n.jsx("span",{className:"agent-view__card-invocation-name",children:p}),n.jsx("span",{className:"agent-view__card-agent-name",children:t}),n.jsx(u.Icon,{name:a?"chevron-up":"chevron-down",size:16,className:"agent-view__card-chevron"})]})}),a&&n.jsxs("div",{id:h,"aria-labelledby":_,className:"agent-view__card-progress",children:[r&&n.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[n.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:ee}),n.jsx("span",{children:ee})]}),!r&&l&&n.jsx("p",{className:"agent-view__progress-error",role:"alert",children:l}),!r&&!l&&c!==null&&n.jsx(ht,{checklist:c}),!r&&!l&&c===null&&n.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[n.jsx(u.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:ee}),n.jsx("span",{children:ee})]}),n.jsx("div",{className:"agent-view__card-actions",children:n.jsx(u.Button,{variant:"secondary",size:"S",onClick:()=>w==null?void 0:w(e),children:"View agent"})})]})]})})},Ue=({column:e,agents:t,expandedAgentId:s,loadingAgentId:a,checklistByInvocationId:r,errorByAgentId:c,definitionNameByRef:l,onToggleAgent:d,onViewAgent:w,isSplit:f=!1})=>n.jsxs("section",{className:L("agent-view__column",{"agent-view__column--split":f}),"aria-label":e.title,children:[n.jsxs("div",{className:"agent-view__column-header",children:[n.jsx(u.Heading,{level:4,children:e.title}),n.jsx("span",{className:"agent-view__column-count",children:t.length})]}),n.jsx("ul",{className:"agent-view__card-list",children:t.map(p=>n.jsx(Wt,{agent:p,agentName:Se(p,l),column:e,isExpanded:s===p.id,isLoading:a===p.id,checklist:r[p.invocation_id]??null,error:c[p.id]??null,onToggle:d,onViewAgent:w},p.id))})]}),Se=(e,t)=>t.get(e.agent_definition_ref)??e.agent_definition_ref.replace(/_/g," "),Jt=({jwt:e,headers:t,agentDefinitionsUrl:s,agentsUrl:a,agentUrl:r,agentChecklistUrl:c,agentResourcesUrl:l,agentChatUrl:d,enableUpload:w,institutions:f})=>{var ue;const p=i.useMemo(()=>({agentDefinitions:s,agents:a,agent:r,agentChecklist:c,...l?{agentResources:l}:{},agentChat:d}),[s,a,r,c,l,d]),[_,h]=i.useState(null),j=_?(ue=f==null?void 0:f.find(o=>o.applicationId===_.application_id))==null?void 0:ue.applicationUrl:void 0,b=i.useMemo(()=>{const o={...t??{}};return j?o[ne.arborApplicationUrl]=j:delete o[ne.arborApplicationUrl],o},[t,j]),{agents:k,agentDefinitions:y,loadState:x,loadError:O,reload:G,fetchAgentChecklist:P,createAgent:J}=We({jwt:e,headers:b,urls:p}),[V,q]=i.useState(!1),[A,C]=i.useState(null),[M,K]=i.useState(null),[I,D]=i.useState({}),[$,ae]=i.useState({}),[z,he]=i.useState([]),[H,me]=i.useState([]),re=i.useMemo(()=>{const o=new Set(k.map(m=>m.application_id)),g=new Map((f??[]).map(m=>[m.applicationId,m.name]));return[...o].sort((m,R)=>(g.get(m)??m).localeCompare(g.get(R)??R)).map(m=>({value:m,label:g.get(m)??m}))},[k,f]),W=i.useMemo(()=>new Map(y.map(o=>[o.ref,o.display_name])),[y]),oe=i.useMemo(()=>[...new Set(k.map(g=>Se(g,W)))].sort((g,m)=>g.localeCompare(m)).map(g=>({value:g,label:g})),[k,W]),de=i.useMemo(()=>k.filter(o=>!(z.length>0&&!z.includes(o.application_id)||H.length>0&&!H.includes(Se(o,W)))),[k,W,H,z]),Y=re.length>1,Q=oe.length>1,_e=Y||Q;i.useEffect(()=>{if(k.length===0)return;let o=!1;return(async()=>{const g=await Promise.allSettled(k.map(async m=>{const R=await P(m.invocation_id);return{agentId:m.id,invocationId:m.invocation_id,checklist:R.checklist}}));o||(D(m=>{const R={...m};for(const ie of g)ie.status==="fulfilled"&&(R[ie.value.invocationId]=ie.value.checklist);return R}),ae(m=>{const R={...m};return g.forEach((ie,Qe)=>{ie.status==="rejected"&&(R[k[Qe].id]=Ae)}),R}))})(),()=>{o=!0}},[k,P]);const X=i.useCallback(async o=>{if(!I[o.invocation_id]){K(o.id),ae(g=>{const m={...g};return delete m[o.id],m});try{const g=await P(o.invocation_id);D(m=>({...m,[o.invocation_id]:g.checklist}))}catch{ae(g=>({...g,[o.id]:Ae}))}finally{K(g=>g===o.id?null:g)}}},[P,I]),fe=i.useCallback(o=>{if(A===o){C(null);return}const g=k.find(({id:m})=>m===o);g&&(C(o),X(g))},[k,A,X]),F=i.useMemo(()=>{const o={};for(const g of de){const m=Kt(g,I[g.invocation_id]);(o[m]??(o[m]=[])).push(g)}return o},[de,I]),ve=i.useCallback(o=>{h(o)},[]),we=i.useCallback(async o=>{const g=await J(o);h(g),q(!1)},[J]),xe=i.useCallback(()=>{h(null)},[]),ge={expandedAgentId:A,loadingAgentId:M,checklistByInvocationId:I,errorByAgentId:$,definitionNameByRef:W,onToggleAgent:fe,onViewAgent:ve};return n.jsxs("div",{className:"agent-view-frontend agent-view",children:[n.jsxs("div",{className:"agent-view__header",children:[n.jsx(u.Heading,{level:1,children:"Agents"}),n.jsx(u.Button,{variant:"primary",size:"S",iconLeftName:"sparkles",iconLeftScreenReaderText:"Start an agent",onClick:()=>q(!0),children:"Start an agent"})]}),k.length>0&&_e&&n.jsxs("div",{className:"agent-view__filters",children:[Y&&n.jsxs("div",{className:"agent-view__filter",children:[n.jsx("label",{className:"agent-view__filter-label",htmlFor:"agent-view-institution-filter",children:"Institution"}),n.jsx(u.Combobox,{id:"agent-view-institution-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All institutions",options:re,value:z,onValueChange:he,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear institutions"})]}),Q&&n.jsxs("div",{className:"agent-view__filter",children:[n.jsx("label",{className:"agent-view__filter-label",htmlFor:"agent-view-agent-filter",children:"Agent"}),n.jsx(u.Combobox,{id:"agent-view-agent-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All agents",options:oe,value:H,onValueChange:me,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear agents"})]})]}),x==="error"?n.jsxs("div",{className:"agent-view__state agent-view__state--error",role:"alert",children:[n.jsx(u.Icon,{name:"triangle-alert",size:24,color:"var(--color-semantic-destructive-600)"}),n.jsx("p",{className:"agent-view__state-message",children:O??$e}),n.jsx(u.Button,{variant:"secondary",size:"S",onClick:G,children:"Try again"})]}):x==="loading"&&k.length===0?n.jsxs("div",{className:"agent-view__state","aria-live":"polite",children:[n.jsx(u.Icon,{name:"loader",size:24,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:Ie}),n.jsx("p",{className:"agent-view__state-message",children:Ie})]}):k.length===0?n.jsx(gt,{}):n.jsxs("div",{className:"agent-view__board",children:[Xe.map(o=>n.jsx(Ue,{column:pe[o],agents:F[o]??[],...ge},o)),n.jsx("div",{className:"agent-view__split-column",children:Ze.map(o=>n.jsx(Ue,{column:pe[o],agents:F[o]??[],isSplit:!0,...ge},o))})]}),_&&n.jsx(Ve,{agent:_,open:!0,jwt:e,headers:b,agentUrl:r,agentChecklistUrl:c,agentResourcesUrl:l,agentChatUrl:d,enableUpload:w,initialChecklist:I[_.invocation_id]??null,onClose:xe},_.id),n.jsx(Ye,{open:V,onClose:()=>q(!1),onStart:we,agentDefinitions:y})]})},Vt=(e,t)=>{const s=Date.now(),a=t.trim()||e.agent_intent;return{id:`agent-${s}`,invocation_id:`inv-${s}`,agent_definition_ref:e.ref,agent_intent:e.agent_intent,invocation_name:a,application_id:et,created_by:tt,status:v["generating-a-response"],context_ref:null,checklist_ref:null}};exports.AgentMonitorKanban=Jt;exports.AgentServiceClient=Ne;exports.AgentServiceError=te;exports.AgentView=Ve;exports.HttpChatConnector=Be;exports.NewAgentModal=Ye;exports.buildAgentFromDefinition=Vt;exports.createHttpChatConnectorFactory=je;exports.mapApiAgent=ye;exports.mapApiAgentDefinition=Ke;exports.mapApiAgentStatus=Ge;exports.mapApiChecklistEndpointResponse=Ee;exports.mapApiChecklistItem=be;exports.mapApiChecklistResponse=Ut;exports.mapApiChecklistStatus=qe;exports.mapApiOpeningMessage=le;exports.mapApiResource=ze;exports.mapApiResourcesEndpointResponse=Ce;exports.mapApiTripOption=Ot;exports.useAgentService=We;exports.useAgentWorkspace=Je;
3
+ `);c=h.pop()??"";for(const p of h)l(p)}if(c.trim()&&l(c),!o)throw new re(502,null,"Chat stream ended without any events");return o}}const cn=t=>{let e=null;const s=[];for(const a of t.split(`
4
+ `)){const r=a.trimEnd();r.startsWith("event:")?e=r.slice(6).trim():r.startsWith("data:")&&s.push(r.slice(5).trim())}return{event:e,data:s.length>0?s.join(`
5
+ `):null}},Ye=t=>{try{return JSON.parse(t)}catch{return}};function ln(t,e){const s=new FormData;s.append("body",JSON.stringify(t));for(const a of e)s.append("files",a,a.name);return s}const it=t=>{switch(t){case We.cancelled:return y.failed;case We.archived:return y.complete;case y.hitl:case y.complete:case y.failed:case y["generating-a-response"]:return t;default:return y["generating-a-response"]}},ot=t=>{switch(t){case Le.requires_attention:return E.hitl;case Le.in_progress:case Le.available:return E["generating-a-response"];case E.failed:case E.complete:case E.hitl:case E["generating-a-response"]:return t;default:return E["generating-a-response"]}},ct=t=>({ref:t.name,display_name:t.display_name,agent_intent:t.agent_intent??t.display_name,description:t.description}),dn=t=>({id:t.id,name:t.name,...t.has_run_before?{hasRunBefore:t.has_run_before}:{}}),gn=new Set(Object.values(se)),un=t=>t&&gn.has(t)?t:se.LINK,lt=t=>({uri:t.uri??"",type:un(t.type),name:t.name??"",description:t.description??""}),Fe=t=>(Array.isArray(t)?t:t.resources??[]).map(lt),dt=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}))}),De=t=>{var s;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:((s=t.invocation_name)==null?void 0:s.trim())||t.agent_definition_ref,application_id:t.application_id,...t.application_name?{application_name:t.application_name}:{},created_by:t.created_by,status:it(t.status),context_ref:t.context_ref??null,checklist_ref:t.checklist_ref??null}},Ge=t=>{var e;return{task:t.task??t.name??t.label??Tt,status:ot(t.status),description:t.description??"",...t.prompt?{prompt:t.prompt}:{},...(e=t.follow_up_prompts)!=null&&e.length?{clarificationPrompts:t.follow_up_prompts}:{}}},pn=t=>Array.isArray(t)?t:t.checklist_items??t.checklist??t.items??[],ze=(t,e,s)=>{var c;const a=!Array.isArray(e)&&(e.opening_message||(c=e.opening_follow_up_prompts)!=null&&c.length)?e:s,r=a?me(a):void 0;return{invocation_id:t,checklist:pn(e).map(Ge),...r?{openingMessage:r}:{}}},gt=(t,e)=>{const s=me(e);return{invocation_id:e.invocation_id??t,checklist:(e.checklist_items??[]).map(Ge),...s?{openingMessage:s}:{}}},me=t=>{var s,a;const e=(s=t.opening_message)==null?void 0:s.trim();if(e)return{id:et,author:K.agent,text:e,...(a=t.opening_follow_up_prompts)!=null&&a.length?{followUpPrompts:t.opening_follow_up_prompts}:{}}},ut=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"?K.user:K.agent,text:e.content})),hn={id:et,author:K.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 Xe=0;const mn=t=>(Xe+=1,`${t}-${Date.now()}-${Xe}`),_n=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 pt{constructor(e,s,a={}){this.seededChecklist=[],this.client=e,this.agentId=s,this.chatId=a.chatId??s,this.opening=a.openingMessage??hn,this.model=a.model}openingMessage(){return this.opening}async bootstrapConversation(){const e=await this.client.getConversation(this.chatId),s=ut(e.messages);return s.length===0?[this.opening]:s}async start(e){return{...await this.exchange(_n(e)),phase:T.running}}sendMessage(e,s){return this.exchange(e,s)}async stop(){}seedChecklist(e){this.seededChecklist=e}async exchange(e,s){var o;const a=[{role:sn.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"}},...s&&s.length>0?[{uploadFiles:s}]:[]),c={id:r.event_id||mn("msg-agent"),author:K.agent,text:r.message.content,...(o=r.follow_up_prompts)!=null&&o.length?{followUpPrompts:r.follow_up_prompts}:{}};try{const l=await this.client.getAgent(this.agentId),{checklist:d}=gt(this.agentId,l);return this.seededChecklist=d,{message:c,checklist:d}}catch{return{message:c,...this.seededChecklist.length?{checklist:this.seededChecklist}:{}}}}}const qe=(t,e)=>s=>{var a,r;return new pt(t,s.invocation_id,{model:e==null?void 0:e.model,chatId:((a=e==null?void 0:e.resolveChatId)==null?void 0:a.call(e,s))??(e==null?void 0:e.chatId)??s.invocation_id,openingMessage:((r=e==null?void 0:e.resolveOpeningMessage)==null?void 0:r.call(e,s))??(e==null?void 0:e.openingMessage)})},fn=t=>t instanceof re?t.message:t instanceof TypeError?"Network error while contacting the agent service.":t instanceof Error&&t.message?t.message:nt,vn=t=>{const e={};for(const s of t){const a=me(s);if(!a)continue;const r=s.invocation_id??s.id;e[r]=a,e[s.id]=a}return e},xn=t=>JSON.stringify(t),$e=(t,e)=>JSON.stringify(t)===JSON.stringify(e),ht=t=>{const{jwt:e,headers:s,urls:a}=t,r=JSON.stringify(s??{}),c=xn(a),o=i.useMemo(()=>new Be({token:e,headers:s,urls:a}),[e,c]);i.useLayoutEffect(()=>{o.setHeaders(s)},[o,r]);const[l,d]=i.useState([]),[_,h]=i.useState([]),[p,x]=i.useState({}),[k,j]=i.useState("loading"),[N,U]=i.useState(null),[S,A]=i.useState(0),O=i.useCallback((w,C)=>{const P=w.map(De),H=C.map(ct),I=vn(w);d(R=>$e(R,P)?R:P),h(R=>$e(R,H)?R:H),x(R=>$e(R,I)?R:I),j("idle"),U(null)},[]);i.useEffect(()=>{let w=!1;return j("loading"),U(null),(async()=>{try{const[C,P]=await Promise.all([o.listAgents(),o.listAgentDefinitions()]);if(w)return;O(C,P)}catch(C){if(w)return;d([]),h([]),x({}),j("error"),U(fn(C))}})(),()=>{w=!0}},[O,o,S]);const ee=i.useCallback(()=>{A(w=>w+1)},[]),V=i.useCallback(async()=>{try{const[w,C]=await Promise.all([o.listAgents(),o.listAgentDefinitions()]);O(w,C)}catch{}},[O,o]),W=i.useCallback(async w=>{const[C,P]=await Promise.all([o.getAgentChecklist(w),o.getAgent(w).catch(()=>null)]);return ze(w,C,P??void 0)},[o]),Y=i.useCallback(async w=>{const C=await o.getAgentResources(w);return Fe(C)},[o]),G=i.useCallback(async({definition:w,invocationName:C})=>{const P=await o.createAgent(w.ref,{invocationName:C}),H=await o.getAgent(P.id),I=De(H),R=me(H);return d($=>[I,...$]),R&&x($=>({...$,[I.invocation_id]:R,[I.id]:R})),I},[o]),X=i.useMemo(()=>qe(o,{resolveOpeningMessage:w=>p[w.invocation_id]??p[w.id]}),[o,p]);return{agents:l,agentDefinitions:_,loadState:k,loadError:N,reload:ee,refresh:V,fetchAgentChecklist:W,fetchAgentResources:Y,createAgent:G,chatConnector:X}},wn=t=>JSON.stringify(t),mt=t=>{const{agent:e,jwt:s,headers:a,urls:r,chatId:c}=t,o=JSON.stringify(a??{}),l=wn(r),d=i.useMemo(()=>new Be({token:s,headers:a,urls:{agent:r.agentUrl,agentChecklist:r.agentChecklistUrl,...r.agentResourcesUrl?{agentResources:r.agentResourcesUrl}:{},...r.agentTimelineUrl?{agentTimeline:r.agentTimelineUrl}:{},agentChat:r.agentChatUrl,agentConversation:r.agentConversationUrl}}),[s,l]);i.useLayoutEffect(()=>{d.setHeaders(a)},[d,o]);const _=i.useCallback(async k=>{const[j,N]=await Promise.all([d.getAgentChecklist(k),d.getAgent(k).catch(()=>null)]);return ze(k,j,N??void 0)},[d]),h=i.useCallback(async k=>{const j=await d.getAgentResources(k);return Fe(j)},[d]),p=i.useCallback(async k=>{const j=await d.getAgentTimeline(k);return dt(j)},[d]);return{connector:i.useMemo(()=>qe(d,{chatId:c??e.invocation_id})(e),[d,e.invocation_id,c]),fetchAgentChecklist:_,fetchAgentResources:h,fetchAgentTimeline:p}},kn=(t,e)=>{const s=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`${s}${a}.${r}`.trim()},yn=t=>{switch(t){case y.failed:return T.stopped;case y.complete:return T.complete;default:return T.running}},Qe=(t,e)=>{e([pe(t)])},_t=({agent:t,open:e,onClose:s,jwt:a,headers:r,agentUrl:c,agentChecklistUrl:o,agentResourcesUrl:l,agentTimelineUrl:d,agentChatUrl:_,agentConversationUrl:h,chatId:p,enableUpload:x,initialBrief:k,initialPhase:j,initialChecklist:N})=>{const[U,S]=i.useState(p??t.invocation_id),[A,O]=i.useState("chat"),[ee,V]=i.useState(!1),{connector:W,fetchAgentChecklist:Y,fetchAgentResources:G,fetchAgentTimeline:X}=mt({agent:t,jwt:a,headers:r,chatId:U,urls:{agentUrl:c,agentChecklistUrl:o,agentResourcesUrl:l,agentTimelineUrl:d,agentChatUrl:_,agentConversationUrl:h}}),w=i.useRef(W),[C,P]=i.useState(j??(k?T.running:yn(t.status))),[H,I]=i.useState([]),[R,$]=i.useState(0),[_e,Re]=i.useState(),[ce,J]=i.useState(null),[Oe,te]=i.useState([]),[Pe,le]=i.useState(!1),[Q,de]=i.useState(null),[fe,ve]=i.useState(null),[xe,we]=i.useState(!1),[ke,ye]=i.useState(null),[Ae,ge]=i.useState(N??null),[Me,Ne]=i.useState(!1),[je,ue]=i.useState(null),[u,v]=i.useState(!1),[f,D]=i.useState(!1),[z,ne]=i.useState(!1);i.useEffect(()=>{w.current=W},[W]),i.useEffect(()=>{S(p??t.invocation_id),O("chat"),V(!1),I([]),$(m=>m+1)},[t.invocation_id,p]),i.useEffect(()=>{if(!e||k)return;const m=w.current.bootstrapConversation;if(!m){Qe(w.current.openingMessage(),I);return}let b=!1;return v(!0),(async()=>{try{const q=await m.call(w.current);if(b)return;I(q.map(pe))}catch{b||Qe(w.current.openingMessage(),I)}finally{b||v(!1)}})(),()=>{b=!0}},[e,k,t.invocation_id,U]);const Z=i.useCallback(m=>{m.checklist&&ge(m.checklist),m.phase&&P(m.phase)},[]);i.useEffect(()=>{var m,b;!e||k||N&&N.length>0&&((b=(m=w.current).seedChecklist)==null||b.call(m,N))},[e,k,N]),i.useEffect(()=>{if(!e||k)return;let m=!1;return Ne(!(N!=null&&N.length)),ue(null),(async()=>{var b,q;try{const Ke=await Y(t.invocation_id);if(m)return;N!=null&&N.length||(ge(Ke.checklist),(q=(b=w.current).seedChecklist)==null||q.call(b,Ke.checklist))}catch{!m&&!(N!=null&&N.length)&&ue(Te)}finally{m||Ne(!1)}})(),()=>{m=!0}},[e,t.invocation_id,k,N,Y]),i.useEffect(()=>{if(!e||!l)return;let m=!1;return le(!0),de(null),(async()=>{try{const b=await G(t.invocation_id);m||te(b)}catch{m||de(Ct)}finally{m||le(!1)}})(),()=>{m=!0}},[e,t.invocation_id,l,G]),i.useEffect(()=>{if(!e||!d)return;let m=!1;return we(!0),ye(null),(async()=>{try{const b=await X(t.invocation_id);m||ve(b)}catch{m||ye(tt)}finally{m||we(!1)}})(),()=>{m=!0}},[e,t.invocation_id,d,X]),i.useEffect(()=>{if(!e||!k)return;let m=!1;const b={id:`user-brief-${Date.now()}`,author:K.user,text:kn(k,t.invocation_name)};return(async()=>{const q=await w.current.start(k);m||(I([pe(w.current.openingMessage()),pe(b),pe(q.message)]),q.checklist&&ge(q.checklist),P(q.phase??T.running))})(),()=>{m=!0}},[e,k,t.invocation_name,t.invocation_id]);const Se=i.useCallback(m=>{J(en(m))},[]),vt=i.useCallback(m=>{S(m),V(!0),O("chat"),I([]),$(b=>b+1)},[]),xt=i.useCallback(()=>{O("timeline"),V(!1),S(p??t.invocation_id),I([]),$(m=>m+1)},[t.invocation_id,p]),wt=i.useCallback(m=>{J(null),Re(m),$(b=>b+1)},[]),kt=i.useCallback(async()=>{await w.current.stop(),P(T.stopped)},[]),yt=Ae;return n.jsxs(g.Modal,{open:e,closeHandler:s,hideCloseButton:!0,className:"agent-workspace",children:[n.jsxs(g.Modal.Header,{className:"agent-workspace__header",children:[n.jsxs("div",{className:"agent-workspace__header-title",children:[n.jsx("span",{className:"agent-workspace__header-avatar","aria-hidden":"true",children:n.jsx(g.Icon,{name:"ask-arbor",size:24})}),n.jsx(g.Modal.Title,{children:t.invocation_name}),n.jsx("span",{className:F("agent-workspace__phase",`agent-workspace__phase--${C}`),children:Et[C]})]}),n.jsxs("div",{className:"agent-workspace__header-actions",children:[n.jsx(g.Button,{variant:"tertiary",size:"S",iconLeftName:"clipboard-list",iconLeftScreenReaderText:"Toggle checklist","aria-pressed":!z,onClick:()=>ne(m=>!m),children:"Checklist"}),n.jsx(g.Button,{variant:"tertiary",size:"S",iconLeftName:"files",iconLeftScreenReaderText:"Toggle resources","aria-pressed":!f,onClick:()=>D(m=>!m),children:"Resources"}),n.jsx(g.Button,{variant:"secondary",size:"S",iconLeftName:"x",iconLeftScreenReaderText:"Close",onClick:s,children:"Close"})]})]}),n.jsxs(g.Modal.Body,{className:F("agent-workspace__body",{"agent-workspace__body--no-left":z,"agent-workspace__body--no-right":f}),children:[!z&&n.jsx(Ft,{checklist:yt,isLoading:Me,error:je,phase:C,canRequestInput:C===T.running&&!u,onStop:()=>void kt(),onAttentionItemClick:Se}),n.jsxs("section",{className:F("agent-workspace__panel","agent-workspace__panel--chat",{"agent-workspace__panel--timeline":!!d&&A==="timeline"}),"aria-label":"Agent conversation",children:[d&&n.jsxs(g.Tabs,{className:"agent-workspace__center-tabs","aria-label":"Center panel",children:[n.jsx(g.Tabs.Item,{active:A==="chat",tabElementProps:{id:"agent-center-tab-chat",onClick:()=>O("chat")},children:"Chat"}),n.jsx(g.Tabs.Item,{active:A==="timeline",tabElementProps:{id:"agent-center-tab-timeline",onClick:()=>O("timeline")},children:"Timeline"})]}),d&&A==="chat"&&ee&&n.jsx("div",{className:"agent-workspace__center-back",children:n.jsx(g.Button,{variant:"tertiary",size:"S",iconLeftName:"arrow-left",iconLeftScreenReaderText:"Back to timeline",onClick:xt,children:"Back to timeline"})}),!d||A==="chat"?n.jsx(Bt,{connector:W,phase:C,chatHistory:H,chatSessionKey:R,startQuery:_e,clarificationMessage:ce,enableUpload:x,onTurn:Z,onAwaitingChange:v,onClarificationPrompt:wt,onDismissClarification:()=>J(null)}):n.jsx(Qt,{timeline:fe,isLoading:xe,error:ke,onOpenChatSession:vt})]}),!f&&n.jsx(zt,{resources:Oe,isLoading:Pe,error:Q})]})]})},ft=({open:t,onClose:e,onStart:s,agentDefinitions:a})=>{const r=a[0],[c,o]=i.useState(r),[l,d]=i.useState(""),[_,h]=i.useState(!1),[p,x]=i.useState(null),k=[...a].sort((S,A)=>S.agent_intent.localeCompare(A.agent_intent)).map(S=>({value:S.ref,label:S.agent_intent}));i.useEffect(()=>{t&&(o(r),d(""),h(!1),x(null))},[t,r]);const j=c!==void 0&&l.trim().length>0,N=i.useCallback(S=>{const A=a.find(O=>O.ref===S[0]);A&&o(A)},[a]),U=i.useCallback(async()=>{if(!(!c||!j||_)){h(!0),x(null);try{await s({definition:c,invocationName:l.trim()})}catch(S){x(S instanceof Error?S.message:"Unable to start the agent.")}finally{h(!1)}}},[j,c,l,_,s]);return!c||a.length===0?null:n.jsxs(g.Modal,{open:t,closeHandler:e,className:"new-agent",children:[n.jsx(g.Modal.Header,{className:"new-agent__header",children:n.jsxs("div",{className:"new-agent__header-title",children:[n.jsx("span",{className:"new-agent__header-avatar","aria-hidden":"true",children:n.jsx(g.Icon,{name:"ask-arbor",size:24})}),n.jsx(g.Modal.Title,{children:"Start an agent"})]})}),n.jsx(g.Modal.Body,{className:"new-agent__body",children:n.jsxs("form",{className:"new-agent__form","aria-label":"Start an agent",onSubmit:S=>{S.preventDefault(),j&&!_&&U()},children:[n.jsxs("div",{className:"new-agent__type-field",children:[n.jsx("label",{className:"new-agent__type-label",htmlFor:"new-agent-type",children:"What would you like your agent to do?"}),n.jsx(g.SelectDropdown,{id:"new-agent-type",placeholder:"Choose an intent",options:k,selectedValues:[c.ref],onSelectionChange:N}),n.jsx("p",{className:"new-agent__type-description",children:c.description})]}),n.jsxs("div",{className:"new-agent__type-field",children:[n.jsx("label",{className:"new-agent__type-label",htmlFor:"new-agent-invocation-name",children:"Name"}),n.jsx(g.TextInput,{id:"new-agent-invocation-name",value:l,placeholder:"e.g. Test with memory3",onChange:S=>d(S.target.value)})]}),p?n.jsx("p",{className:"new-agent__error",role:"alert",children:p}):null,n.jsx("div",{className:"new-agent__actions",children:n.jsx(g.Button,{type:"submit",variant:"primary",disabled:!j||_,iconLeftName:_?"loader":"sparkles",iconLeftScreenReaderText:_?"Starting":void 0,children:_?"Starting…":"Start"})})]})})]})},An=t=>t!==void 0&&t.some(e=>e.status===E.hitl),Nn=(t,e)=>An(e)?y.hitl:t.status,jn=({column:t,label:e})=>t.statusIcon?n.jsx("span",{className:"agent-view__status-indicator",children:n.jsx(g.Icon,{name:t.statusIcon.name,size:16,color:t.statusIcon.color,className:F({"agent-view__progress-icon--spinning":t.statusIcon.spin}),screenReaderText:e})}):n.jsx("span",{className:F("agent-view__dot",{[`agent-view__dot--${t.dotModifier}`]:t.dotModifier}),children:n.jsx(g.Dot,{colour:t.dotColour,label:e})}),Sn=({agent:t,agentName:e,column:s,isExpanded:a,isLoading:r,checklist:c,error:o,onToggle:l,onViewAgent:d})=>{const{id:_,invocation_name:h}=t,p=`agent-card-${_}-header`,x=`agent-card-${_}-progress`;return n.jsx("li",{className:F("agent-view__card",{"agent-view__card--expanded":a}),children:n.jsxs(g.Card,{spacing:"dense",children:[n.jsx("button",{type:"button",className:"agent-view__card-toggle","aria-expanded":a,"aria-controls":x,"aria-label":h,id:p,onClick:()=>l(_),children:n.jsxs("div",{className:"agent-view__card-content",children:[n.jsx(jn,{column:s}),n.jsx("span",{className:"agent-view__card-invocation-name",children:h}),n.jsx("span",{className:"agent-view__card-agent-name",children:e}),n.jsx(g.Icon,{name:a?"chevron-up":"chevron-down",size:16,className:"agent-view__card-chevron"})]})}),a&&n.jsxs("div",{id:x,"aria-labelledby":p,className:"agent-view__card-progress",children:[r&&n.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[n.jsx(g.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:ae}),n.jsx("span",{children:ae})]}),!r&&o&&n.jsx("p",{className:"agent-view__progress-error",role:"alert",children:o}),!r&&!o&&c!==null&&n.jsx($t,{checklist:c}),!r&&!o&&c===null&&n.jsxs("div",{className:"agent-view__progress-loading","aria-live":"polite",children:[n.jsx(g.Icon,{name:"loader",size:16,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:ae}),n.jsx("span",{children:ae})]}),n.jsx("div",{className:"agent-view__card-actions",children:n.jsx(g.Button,{variant:"secondary",size:"S",onClick:()=>d==null?void 0:d(t),children:"View agent"})})]})]})})},Ze=({column:t,agents:e,expandedAgentId:s,loadingAgentId:a,checklistByInvocationId:r,errorByAgentId:c,definitionNameByRef:o,onToggleAgent:l,onViewAgent:d,isSplit:_=!1})=>n.jsxs("section",{className:F("agent-view__column",{"agent-view__column--split":_}),"aria-label":t.title,children:[n.jsxs("div",{className:"agent-view__column-header",children:[n.jsx(g.Heading,{level:4,children:t.title}),n.jsx("span",{className:"agent-view__column-count",children:e.length})]}),n.jsx("ul",{className:"agent-view__card-list",children:e.map(h=>n.jsx(Sn,{agent:h,agentName:He(h,o),column:t,isExpanded:s===h.id,isLoading:a===h.id,checklist:r[h.invocation_id]??null,error:c[h.id]??null,onToggle:l,onViewAgent:d},h.id))})]}),He=(t,e)=>e.get(t.agent_definition_ref)??t.agent_definition_ref.replace(/_/g," "),Cn=({jwt:t,headers:e,agentDefinitionsUrl:s,agentsUrl:a,agentUrl:r,agentChecklistUrl:c,agentResourcesUrl:o,agentTimelineUrl:l,agentChatUrl:d,agentConversationUrl:_,enableUpload:h,showHeader:p=!1,institutions:x})=>{var ue;const k=i.useMemo(()=>({agentDefinitions:s,agents:a,agent:r,agentChecklist:c,...o?{agentResources:o}:{},...l?{agentTimeline:l}:{},agentChat:d,agentConversation:_}),[s,a,r,c,o,l,d,_]),[j,N]=i.useState(null),U=j?(ue=x==null?void 0:x.find(u=>u.applicationId===j.application_id))==null?void 0:ue.applicationUrl:void 0,S=i.useMemo(()=>{const u={...e??{}};return U?u[ie.arborApplicationUrl]=U:delete u[ie.arborApplicationUrl],u},[e,U]),{agents:A,agentDefinitions:O,loadState:ee,loadError:V,reload:W,refresh:Y,fetchAgentChecklist:G,createAgent:X}=ht({jwt:t,headers:S,urls:k}),[w,C]=i.useState(!1),[P,H]=i.useState(null),[I,R]=i.useState(null),[$,_e]=i.useState({}),[Re,ce]=i.useState({}),[J,Oe]=i.useState([]),[te,Pe]=i.useState([]),le=i.useMemo(()=>{const u=new Set(A.map(f=>f.application_id)),v=new Map((x??[]).map(f=>[f.applicationId,f.name]));return[...u].sort((f,D)=>(v.get(f)??f).localeCompare(v.get(D)??D)).map(f=>({value:f,label:v.get(f)??f}))},[A,x]),Q=i.useMemo(()=>new Map(O.map(u=>[u.ref,u.display_name])),[O]),de=i.useMemo(()=>[...new Set(A.map(v=>He(v,Q)))].sort((v,f)=>v.localeCompare(f)).map(v=>({value:v,label:v})),[A,Q]),fe=i.useMemo(()=>A.filter(u=>!(J.length>0&&!J.includes(u.application_id)||te.length>0&&!te.includes(He(u,Q)))),[A,Q,te,J]),ve=le.length>1,xe=de.length>1,we=ve||xe;i.useEffect(()=>{const u=window.setInterval(()=>{Y()},6e4);return()=>{window.clearInterval(u)}},[Y]),i.useEffect(()=>{if(A.length===0)return;let u=!1;return(async()=>{const v=await Promise.allSettled(A.map(async f=>{const D=await G(f.invocation_id);return{agentId:f.id,invocationId:f.invocation_id,checklist:D.checklist}}));u||(_e(f=>{const D={...f};let z=!1;for(const ne of v){if(ne.status!=="fulfilled")continue;const{invocationId:Z,checklist:Se}=ne.value;JSON.stringify(f[Z])!==JSON.stringify(Se)&&(D[Z]=Se,z=!0)}return z?D:f}),ce(f=>{const D={...f};let z=!1;return v.forEach((ne,Z)=>{ne.status==="rejected"&&D[A[Z].id]!==Te&&(D[A[Z].id]=Te,z=!0)}),z?D:f}))})(),()=>{u=!0}},[A,G]);const ke=i.useCallback(async u=>{if(!$[u.invocation_id]){R(u.id),ce(v=>{const f={...v};return delete f[u.id],f});try{const v=await G(u.invocation_id);_e(f=>({...f,[u.invocation_id]:v.checklist}))}catch{ce(v=>({...v,[u.id]:Te}))}finally{R(v=>v===u.id?null:v)}}},[G,$]),ye=i.useCallback(u=>{if(P===u){H(null);return}const v=A.find(({id:f})=>f===u);v&&(H(u),ke(v))},[A,P,ke]),Ae=i.useMemo(()=>{const u={};for(const v of fe){const f=Nn(v,$[v.invocation_id]);(u[f]??(u[f]=[])).push(v)}return u},[fe,$]),ge=i.useCallback(u=>{N(u)},[]),Me=i.useCallback(async u=>{const v=await X(u);N(v),C(!1)},[X]),Ne=i.useCallback(()=>{N(null)},[]),je={expandedAgentId:P,loadingAgentId:I,checklistByInvocationId:$,errorByAgentId:Re,definitionNameByRef:Q,onToggleAgent:ye,onViewAgent:ge};return n.jsxs("div",{className:"agent-view-frontend agent-view",children:[p&&n.jsxs("div",{className:"agent-view__header",children:[n.jsx(g.Heading,{level:1,children:"Agents"}),n.jsx(g.Button,{variant:"primary",size:"S",iconLeftName:"sparkles",iconLeftScreenReaderText:"Start an agent",onClick:()=>C(!0),children:"Start an agent"})]}),A.length>0&&we&&n.jsxs("div",{className:"agent-view__filters",children:[ve&&n.jsxs("div",{className:"agent-view__filter",children:[n.jsx("label",{className:"agent-view__filter-label",htmlFor:"agent-view-institution-filter",children:"Institution"}),n.jsx(g.Combobox,{id:"agent-view-institution-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All institutions",options:le,value:J,onValueChange:Oe,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear institutions"})]}),xe&&n.jsxs("div",{className:"agent-view__filter",children:[n.jsx("label",{className:"agent-view__filter-label",htmlFor:"agent-view-agent-filter",children:"Agent"}),n.jsx(g.Combobox,{id:"agent-view-agent-filter",triggerVariant:"button",multiple:!0,searchType:"substring",placeholder:"All agents",options:de,value:te,onValueChange:Pe,showSelectionCountBadge:!0,showClearAll:!0,clearAllLabel:"Clear agents"})]})]}),ee==="error"?n.jsxs("div",{className:"agent-view__state agent-view__state--error",role:"alert",children:[n.jsx(g.Icon,{name:"triangle-alert",size:24,color:"var(--color-semantic-destructive-600)"}),n.jsx("p",{className:"agent-view__state-message",children:V??nt}),n.jsx(g.Button,{variant:"secondary",size:"S",onClick:W,children:"Try again"})]}):ee==="loading"&&A.length===0?n.jsxs("div",{className:"agent-view__state","aria-live":"polite",children:[n.jsx(g.Icon,{name:"loader",size:24,color:"var(--color-brand-600)",className:"agent-view__progress-icon--spinning",screenReaderText:Je}),n.jsx("p",{className:"agent-view__state-message",children:Je})]}):A.length===0?n.jsx(Mt,{}):n.jsxs("div",{className:"agent-view__board",children:[At.map(u=>n.jsx(Ze,{column:Ee[u],agents:Ae[u]??[],...je},u)),n.jsx("div",{className:"agent-view__split-column",children:Nt.map(u=>n.jsx(Ze,{column:Ee[u],agents:Ae[u]??[],isSplit:!0,...je},u))})]}),j&&n.jsx(_t,{agent:j,open:!0,jwt:t,headers:S,agentUrl:r,agentChecklistUrl:c,agentResourcesUrl:o,agentTimelineUrl:l,agentChatUrl:d,agentConversationUrl:_,enableUpload:h,initialChecklist:$[j.invocation_id]??null,onClose:Ne},j.id),n.jsx(ft,{open:w,onClose:()=>C(!1),onStart:Me,agentDefinitions:O})]})},bn=(t,e)=>{const s=Date.now(),a=e.trim()||t.agent_intent;return{id:`agent-${s}`,invocation_id:`inv-${s}`,agent_definition_ref:t.ref,agent_intent:t.agent_intent,invocation_name:a,application_id:jt,created_by:St,status:y["generating-a-response"],context_ref:null,checklist_ref:null}};exports.AgentMonitorKanban=Cn;exports.AgentServiceClient=Be;exports.AgentServiceError=re;exports.AgentView=_t;exports.HttpChatConnector=pt;exports.NewAgentModal=ft;exports.buildAgentFromDefinition=bn;exports.createHttpChatConnectorFactory=qe;exports.mapApiAgent=De;exports.mapApiAgentDefinition=ct;exports.mapApiAgentStatus=it;exports.mapApiAgentTimelineResponse=dt;exports.mapApiChecklistEndpointResponse=ze;exports.mapApiChecklistItem=Ge;exports.mapApiChecklistResponse=gt;exports.mapApiChecklistStatus=ot;exports.mapApiConversationMessages=ut;exports.mapApiOpeningMessage=me;exports.mapApiResource=lt;exports.mapApiResourcesEndpointResponse=Fe;exports.mapApiTripOption=dn;exports.useAgentService=ht;exports.useAgentWorkspace=mt;
package/dist/index.d.ts CHANGED
@@ -22,7 +22,9 @@ export declare type AgentBackendConfig = {
22
22
  agentUrl?: string;
23
23
  agentChecklistUrl?: string;
24
24
  agentResourcesUrl?: string;
25
+ agentTimelineUrl?: string;
25
26
  agentChatUrl?: string;
27
+ agentConversationUrl?: string;
26
28
  /** When true, enables chat file uploads (posted to agentChatUrl). */
27
29
  enableUpload?: boolean;
28
30
  };
@@ -60,7 +62,7 @@ export declare type AgentDefinition = {
60
62
  description: string;
61
63
  };
62
64
 
63
- export declare const AgentMonitorKanban: ({ jwt, headers, agentDefinitionsUrl, agentsUrl, agentUrl, agentChecklistUrl, agentResourcesUrl, agentChatUrl, enableUpload, institutions, }: AgentMonitorKanbanProps) => JSX_2.Element;
65
+ export declare const AgentMonitorKanban: ({ jwt, headers, agentDefinitionsUrl, agentsUrl, agentUrl, agentChecklistUrl, agentResourcesUrl, agentTimelineUrl, agentChatUrl, agentConversationUrl, enableUpload, showHeader, institutions, }: AgentMonitorKanbanProps) => JSX_2.Element;
64
66
 
65
67
  export declare type AgentMonitorKanbanProps = {
66
68
  jwt?: string;
@@ -71,8 +73,13 @@ export declare type AgentMonitorKanbanProps = {
71
73
  agentChecklistUrl: string;
72
74
  /** Optional — omit when the backend has no /resources route. */
73
75
  agentResourcesUrl?: string;
76
+ /** Optional — omit when the backend has no /agent-timeline route. */
77
+ agentTimelineUrl?: string;
74
78
  agentChatUrl: string;
79
+ agentConversationUrl: string;
75
80
  enableUpload?: boolean;
81
+ /** When true, renders the Agents heading and Start an agent button. Defaults to false. */
82
+ showHeader?: boolean;
76
83
  institutions?: InstitutionConfig[];
77
84
  };
78
85
 
@@ -110,9 +117,11 @@ export declare class AgentServiceClient {
110
117
  getAgent(agentId: string): Promise<ApiAgentInvocationDetail>;
111
118
  getAgentChecklist(agentId: string): Promise<ApiChecklistEndpointResponse>;
112
119
  getAgentResources(agentId: string): Promise<ApiResourcesEndpointResponse>;
120
+ getAgentTimeline(agentId: string): Promise<ApiAgentTimelineResponse>;
113
121
  getAgentContext(agentId: string): Promise<unknown>;
114
122
  cancelAgent(agentId: string): Promise<ApiAgentInvocation>;
115
123
  archiveAgent(agentId: string): Promise<ApiAgentInvocation>;
124
+ getConversation(agentId: string): Promise<ApiConversationResponse>;
116
125
  chat(agentId: string, request: ApiChatRequest, options?: ChatOptions): Promise<ApiChatStreamEvent>;
117
126
  private authHeaders;
118
127
  private apiUrl;
@@ -150,14 +159,33 @@ export declare type AgentServiceUrlOverrides = {
150
159
  agent?: string;
151
160
  agentChecklist?: string;
152
161
  agentResources?: string;
162
+ agentTimeline?: string;
153
163
  agentChat?: string;
164
+ agentConversation?: string;
154
165
  };
155
166
 
156
167
  export declare type AgentServiceUrls = AgentServiceUrlOverrides;
157
168
 
158
169
  export declare type AgentStatus = 'generating-a-response' | 'hitl' | 'complete' | 'failed';
159
170
 
160
- export declare const AgentView: ({ agent, open, onClose, jwt, headers, agentUrl, agentChecklistUrl, agentResourcesUrl, agentChatUrl, enableUpload, initialBrief, initialPhase, initialChecklist, }: AgentViewProps) => JSX_2.Element;
171
+ declare type AgentTimeline = {
172
+ actionLog: AgentTimelineActionLogEntry[];
173
+ chatSessions: AgentTimelineChatSession[];
174
+ };
175
+
176
+ declare type AgentTimelineActionLogEntry = {
177
+ timestamp: string;
178
+ type: string;
179
+ entry: string;
180
+ origin: string;
181
+ };
182
+
183
+ declare type AgentTimelineChatSession = {
184
+ sessionId: string;
185
+ timestamp: string;
186
+ };
187
+
188
+ export declare const AgentView: ({ agent, open, onClose, jwt, headers, agentUrl, agentChecklistUrl, agentResourcesUrl, agentTimelineUrl, agentChatUrl, agentConversationUrl, chatId, enableUpload, initialBrief, initialPhase, initialChecklist, }: AgentViewProps) => JSX_2.Element;
161
189
 
162
190
  export declare type AgentViewProps = {
163
191
  agent: Agent;
@@ -169,7 +197,12 @@ export declare type AgentViewProps = {
169
197
  agentChecklistUrl: string;
170
198
  /** Optional — omit when the backend has no /resources route. */
171
199
  agentResourcesUrl?: string;
200
+ /** Optional — omit when the backend has no /agent-timeline route. */
201
+ agentTimelineUrl?: string;
172
202
  agentChatUrl: string;
203
+ agentConversationUrl: string;
204
+ /** Timeline/conversation session id for chat turns. Defaults to agent.invocation_id. */
205
+ chatId?: string;
173
206
  /** When true, enables chat file uploads (posted to agentChatUrl). */
174
207
  enableUpload?: boolean;
175
208
  initialBrief?: AgentBrief;
@@ -181,7 +214,9 @@ export declare type AgentWorkspaceUrls = {
181
214
  agentUrl: string;
182
215
  agentChecklistUrl: string;
183
216
  agentResourcesUrl?: string;
217
+ agentTimelineUrl?: string;
184
218
  agentChatUrl: string;
219
+ agentConversationUrl: string;
185
220
  };
186
221
 
187
222
  export declare type ApiAgentDefinition = {
@@ -233,6 +268,23 @@ export declare type ApiAgentResource = {
233
268
  description?: string;
234
269
  };
235
270
 
271
+ export declare type ApiAgentTimelineActionLogEntry = {
272
+ timestamp: string;
273
+ type: string;
274
+ entry: string;
275
+ origin: string;
276
+ };
277
+
278
+ export declare type ApiAgentTimelineChatSession = {
279
+ session_id: string;
280
+ timestamp: string;
281
+ };
282
+
283
+ export declare type ApiAgentTimelineResponse = {
284
+ action_log: ApiAgentTimelineActionLogEntry[];
285
+ chat_sessions: ApiAgentTimelineChatSession[];
286
+ };
287
+
236
288
  export declare type ApiChatMessage = {
237
289
  role: ApiChatRole;
238
290
  content: string;
@@ -292,6 +344,36 @@ export declare type ApiChecklistItem = {
292
344
 
293
345
  export declare type ApiChecklistItemStatus = 'in_progress' | 'requires_attention' | 'failed' | 'complete' | 'available' | 'generating-a-response' | 'hitl';
294
346
 
347
+ export declare type ApiConversationMessage = {
348
+ message_id: string;
349
+ seq_in_session: number;
350
+ message_type: ApiConversationMessageType;
351
+ role: ApiConversationMessageRole;
352
+ content: string | null;
353
+ created_at: string;
354
+ tool_call_id: string | null;
355
+ tool_calls: ApiConversationToolCall[] | null;
356
+ moderation_status: string | null;
357
+ };
358
+
359
+ export declare type ApiConversationMessageRole = 'system' | 'user' | 'assistant' | 'tool';
360
+
361
+ export declare type ApiConversationMessageType = 'system' | 'user' | 'assistant' | 'tool_request' | 'tool_response';
362
+
363
+ export declare type ApiConversationResponse = {
364
+ session_id: string;
365
+ messages: ApiConversationMessage[];
366
+ };
367
+
368
+ export declare type ApiConversationToolCall = {
369
+ id: string;
370
+ type: string;
371
+ function: {
372
+ name: string;
373
+ arguments: string;
374
+ };
375
+ };
376
+
295
377
  export declare type ApiCreateAgentResponse = {
296
378
  id: string;
297
379
  status: ApiAgentInvocationStatus;
@@ -349,6 +431,10 @@ export declare const createHttpChatConnectorFactory: (client: AgentServiceClient
349
431
  id: string;
350
432
  invocation_id: string;
351
433
  }) => ChatMessage | undefined;
434
+ resolveChatId?: (agent: {
435
+ id: string;
436
+ invocation_id: string;
437
+ }) => string | undefined;
352
438
  }) => (agent: {
353
439
  id: string;
354
440
  invocation_id: string;
@@ -359,14 +445,13 @@ declare type FetchLike = typeof fetch;
359
445
  export declare class HttpChatConnector implements ChatConnector {
360
446
  private readonly client;
361
447
  private readonly agentId;
448
+ private readonly chatId;
362
449
  private readonly opening;
363
450
  private readonly model?;
364
- private readonly bootstrapPrompt;
365
- private chatId?;
366
451
  private seededChecklist;
367
452
  constructor(client: AgentServiceClient, agentId: string, options?: HttpChatConnectorOptions);
368
453
  openingMessage(): ChatMessage;
369
- bootstrapConversation(prompt?: string): Promise<ChatMessage[]>;
454
+ bootstrapConversation(): Promise<ChatMessage[]>;
370
455
  start(brief: AgentBrief): Promise<ChatTurn>;
371
456
  sendMessage(text: string, uploadFiles?: File[]): Promise<ChatTurn>;
372
457
  stop(): Promise<void>;
@@ -377,7 +462,7 @@ export declare class HttpChatConnector implements ChatConnector {
377
462
  export declare type HttpChatConnectorOptions = {
378
463
  openingMessage?: ChatMessage;
379
464
  model?: string;
380
- bootstrapPrompt?: string;
465
+ chatId?: string;
381
466
  };
382
467
 
383
468
  export declare type InstitutionConfig = {
@@ -397,6 +482,8 @@ export declare const mapApiAgentDefinition: (record: ApiAgentDefinition) => Agen
397
482
 
398
483
  export declare const mapApiAgentStatus: (status: string) => AgentStatus;
399
484
 
485
+ export declare const mapApiAgentTimelineResponse: (payload: ApiAgentTimelineResponse) => AgentTimeline;
486
+
400
487
  export declare const mapApiChecklistEndpointResponse: (invocationId: string, payload: ApiChecklistEndpointResponse, agent?: Pick<ApiAgentInvocation, "opening_message" | "opening_follow_up_prompts">) => AgentChecklistResponse;
401
488
 
402
489
  export declare const mapApiChecklistItem: (item: ApiChecklistItem) => AgentChecklistItem;
@@ -405,6 +492,8 @@ export declare const mapApiChecklistResponse: (invocationId: string, detail: Api
405
492
 
406
493
  export declare const mapApiChecklistStatus: (status: ApiChecklistItemStatus | string | undefined) => AgentChecklistItemStatus;
407
494
 
495
+ export declare const mapApiConversationMessages: (messages: ApiConversationMessage[]) => ChatMessage[];
496
+
408
497
  export declare const mapApiOpeningMessage: (record: Pick<ApiAgentInvocation, "opening_message" | "opening_follow_up_prompts">) => ChatMessage | undefined;
409
498
 
410
499
  export declare const mapApiResource: (record: ApiAgentResource) => AgentResource;
@@ -445,6 +534,8 @@ export declare type UseAgentServiceResult = {
445
534
  loadState: AgentServiceLoadState;
446
535
  loadError: string | null;
447
536
  reload: () => void;
537
+ /** Re-fetch agents without a loading flash; no-ops state when unchanged. */
538
+ refresh: () => Promise<void>;
448
539
  fetchAgentChecklist: (invocationId: string) => Promise<AgentChecklistResponse>;
449
540
  fetchAgentResources: (invocationId: string) => Promise<AgentResource[]>;
450
541
  createAgent: (payload: NewAgentStartPayload) => Promise<Agent>;
@@ -458,12 +549,14 @@ export declare type UseAgentWorkspaceConfig = {
458
549
  jwt?: string;
459
550
  headers?: Record<string, string>;
460
551
  urls: AgentWorkspaceUrls;
552
+ chatId?: string;
461
553
  };
462
554
 
463
555
  export declare type UseAgentWorkspaceResult = {
464
556
  connector: ChatConnector;
465
557
  fetchAgentChecklist: (invocationId: string) => Promise<AgentChecklistResponse>;
466
558
  fetchAgentResources: (invocationId: string) => Promise<AgentResource[]>;
559
+ fetchAgentTimeline: (invocationId: string) => Promise<AgentTimeline>;
467
560
  };
468
561
 
469
562
  export declare type WorkspacePhase = 'briefing' | 'running' | 'stopped' | 'complete';