agent-relay-server 0.32.1 → 0.32.3

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.
Files changed (97) hide show
  1. package/docs/openapi.json +57 -127
  2. package/package.json +1 -1
  3. package/public/assets/{activity-C6nbfryG.js → activity-DT1JGHnp.js} +2 -2
  4. package/public/assets/{activity-C6nbfryG.js.map → activity-DT1JGHnp.js.map} +1 -1
  5. package/public/assets/{agent-profiles-FEITAgHs.js → agent-profiles-CrMemMkZ.js} +2 -2
  6. package/public/assets/{agent-profiles-FEITAgHs.js.map → agent-profiles-CrMemMkZ.js.map} +1 -1
  7. package/public/assets/{agents-D4S0yIbe.js → agents-Bl-rrgOy.js} +2 -2
  8. package/public/assets/{agents-D4S0yIbe.js.map → agents-Bl-rrgOy.js.map} +1 -1
  9. package/public/assets/{analytics-DM2g62T_.js → analytics-a663ak56.js} +2 -2
  10. package/public/assets/{analytics-DM2g62T_.js.map → analytics-a663ak56.js.map} +1 -1
  11. package/public/assets/{automation-3D2pQa1C.js → automation-CiaLThdO.js} +2 -2
  12. package/public/assets/{automation-3D2pQa1C.js.map → automation-CiaLThdO.js.map} +1 -1
  13. package/public/assets/{branch-state-badge-Bi4IbkOZ.js → branch-state-badge-D4ur3m3_.js} +2 -2
  14. package/public/assets/{branch-state-badge-Bi4IbkOZ.js.map → branch-state-badge-D4ur3m3_.js.map} +1 -1
  15. package/public/assets/{channels-QNp7zmA_.js → channels-o9KLTHoK.js} +2 -2
  16. package/public/assets/{channels-QNp7zmA_.js.map → channels-o9KLTHoK.js.map} +1 -1
  17. package/public/assets/{chat-jeXt_SFs.js → chat-5hvHZcAe.js} +2 -2
  18. package/public/assets/{chat-jeXt_SFs.js.map → chat-5hvHZcAe.js.map} +1 -1
  19. package/public/assets/{connectors-BGJARDui.js → connectors-CdC806mA.js} +2 -2
  20. package/public/assets/{connectors-BGJARDui.js.map → connectors-CdC806mA.js.map} +1 -1
  21. package/public/assets/{formatted-body-impl-B7FgqkYL.js → formatted-body-impl-Ca74OAEH.js} +2 -2
  22. package/public/assets/{formatted-body-impl-B7FgqkYL.js.map → formatted-body-impl-Ca74OAEH.js.map} +1 -1
  23. package/public/assets/{index-2m9mT8kV.js → index-C_33ymaw.js} +6 -6
  24. package/public/assets/{index-2m9mT8kV.js.map → index-C_33ymaw.js.map} +1 -1
  25. package/public/assets/{integrations-CJm8-FcG.js → integrations-1nxMizDY.js} +2 -2
  26. package/public/assets/{integrations-CJm8-FcG.js.map → integrations-1nxMizDY.js.map} +1 -1
  27. package/public/assets/{maintenance-CBvZrVAG.js → maintenance-DiFNzNPN.js} +2 -2
  28. package/public/assets/{maintenance-CBvZrVAG.js.map → maintenance-DiFNzNPN.js.map} +1 -1
  29. package/public/assets/{managed-agents-Dcmm8YKt.js → managed-agents-Do3dKvfj.js} +2 -2
  30. package/public/assets/{managed-agents-Dcmm8YKt.js.map → managed-agents-Do3dKvfj.js.map} +1 -1
  31. package/public/assets/{markdown-preview-impl-7xjqdiEu.js → markdown-preview-impl-CLA0J255.js} +2 -2
  32. package/public/assets/{markdown-preview-impl-7xjqdiEu.js.map → markdown-preview-impl-CLA0J255.js.map} +1 -1
  33. package/public/assets/{memory-BmGNW61h.js → memory-IjwqFzBd.js} +2 -2
  34. package/public/assets/{memory-BmGNW61h.js.map → memory-IjwqFzBd.js.map} +1 -1
  35. package/public/assets/{messages-BvMMhoy-.js → messages-DjvWqHyn.js} +2 -2
  36. package/public/assets/{messages-BvMMhoy-.js.map → messages-DjvWqHyn.js.map} +1 -1
  37. package/public/assets/{orchestrators-DsstaupT.js → orchestrators-D2IqDxDT.js} +2 -2
  38. package/public/assets/{orchestrators-DsstaupT.js.map → orchestrators-D2IqDxDT.js.map} +1 -1
  39. package/public/assets/{overview-kK6PTce3.js → overview-DKC3TbAh.js} +2 -2
  40. package/public/assets/{overview-kK6PTce3.js.map → overview-DKC3TbAh.js.map} +1 -1
  41. package/public/assets/{pairs-BEFvTW6X.js → pairs-WpKCPE1n.js} +2 -2
  42. package/public/assets/{pairs-BEFvTW6X.js.map → pairs-WpKCPE1n.js.map} +1 -1
  43. package/public/assets/{security-Dc5wZwv0.js → security-BF7ZtPQe.js} +2 -2
  44. package/public/assets/{security-Dc5wZwv0.js.map → security-BF7ZtPQe.js.map} +1 -1
  45. package/public/assets/{settings-CEtJrORa.js → settings-CQnjrTa-.js} +2 -2
  46. package/public/assets/{settings-CEtJrORa.js.map → settings-CQnjrTa-.js.map} +1 -1
  47. package/public/assets/{store-DkmReBlH.js → store-C9VcSo05.js} +2 -2
  48. package/public/assets/{store-DkmReBlH.js.map → store-C9VcSo05.js.map} +1 -1
  49. package/public/assets/{tasks-pQKtxqeV.js → tasks-CbN_GSSb.js} +2 -2
  50. package/public/assets/{tasks-pQKtxqeV.js.map → tasks-CbN_GSSb.js.map} +1 -1
  51. package/public/assets/{terminal-viewer-impl-Cc769mYy.js → terminal-viewer-impl-BJRohThT.js} +2 -2
  52. package/public/assets/{terminal-viewer-impl-Cc769mYy.js.map → terminal-viewer-impl-BJRohThT.js.map} +1 -1
  53. package/public/assets/{work-queue-DjAanr02.js → work-queue-C5xLBLmm.js} +2 -2
  54. package/public/assets/{work-queue-DjAanr02.js.map → work-queue-C5xLBLmm.js.map} +1 -1
  55. package/public/assets/{workspaces-DLBNyR4k.js → workspaces-D91H3wDX.js} +2 -2
  56. package/public/assets/{workspaces-DLBNyR4k.js.map → workspaces-D91H3wDX.js.map} +1 -1
  57. package/public/index.html +2 -2
  58. package/scripts/orchestrator-spawn-smoke.ts +2 -1
  59. package/src/automations.ts +2 -4
  60. package/src/managed-policy.ts +2 -4
  61. package/src/mcp.ts +3 -3
  62. package/src/ratchet-files.ts +37 -0
  63. package/src/routes/_shared.ts +376 -0
  64. package/src/routes/activity.ts +61 -0
  65. package/src/routes/agent-profiles.ts +47 -0
  66. package/src/routes/agent-sessions.ts +488 -0
  67. package/src/routes/agents-spawn.ts +274 -0
  68. package/src/routes/agents.ts +251 -0
  69. package/src/routes/artifacts.ts +226 -0
  70. package/src/routes/automations.ts +83 -0
  71. package/src/routes/commands.ts +317 -0
  72. package/src/routes/config.ts +66 -0
  73. package/src/routes/connectors.ts +108 -0
  74. package/src/routes/inbox.ts +142 -0
  75. package/src/routes/index.ts +293 -0
  76. package/src/routes/insights.ts +81 -0
  77. package/src/routes/integrations.ts +592 -0
  78. package/src/routes/memory.ts +337 -0
  79. package/src/routes/messages.ts +529 -0
  80. package/src/routes/orchestrator-bootstrap.ts +100 -0
  81. package/src/routes/orchestrator-proxy.ts +160 -0
  82. package/src/routes/orchestrator.ts +490 -0
  83. package/src/routes/pairs.ts +197 -0
  84. package/src/routes/provider-config.ts +112 -0
  85. package/src/routes/recipes.ts +113 -0
  86. package/src/routes/spawn-policy.ts +231 -0
  87. package/src/routes/spec.ts +54 -0
  88. package/src/routes/sse.ts +9 -0
  89. package/src/routes/stats.ts +32 -0
  90. package/src/routes/steward.ts +45 -0
  91. package/src/routes/tasks.ts +174 -0
  92. package/src/routes/tokens.ts +311 -0
  93. package/src/routes/workspaces.ts +355 -0
  94. package/src/routes.ts +3 -6892
  95. package/src/runtime-tokens.ts +17 -8
  96. package/src/security.ts +0 -2
  97. package/src/validation.ts +134 -0
@@ -5,5 +5,5 @@ import{r as e}from"./chunk-CilyBKbf.js";import{An as t,Bn as n,In as r,Mn as i,N
5
5
  `)}var A={ms:`milliseconds`,s:`seconds`,kb:`kilobytes`,mb:`megabytes`,gb:`gigabytes`,tb:`terabytes`};function de(e){return e.split(``).join(` `)}function fe(e){return e.split(``).map(e=>/[0-9]/.test(e)?e:e.toUpperCase()).join(` `)}var pe=[{name:`url`,pattern:/\bhttps?:\/\/\S+/gi,replace:` link `},{name:`path`,pattern:/(?:\/[A-Za-z0-9._-]+){2,}\/?/g,replace:e=>` `+e.replace(/[/._-]+/g,` `).trim()+` `},{name:`slash`,pattern:/(?<=[A-Za-z0-9])\/(?=[A-Za-z0-9])/g,replace:` `},{name:`func-call`,pattern:/\b([A-Za-z_$][\w$]*)\(\)/g,replace:`$1`},{name:`approx`,pattern:/~(?=\s*[\d.])/g,replace:`approximately `},{name:`range`,pattern:/(\d)\s*[-–—]\s*(?=\d)/g,replace:`$1 to `},{name:`version`,pattern:/\b(v?)(\d+(?:\.\d+){2,})\b/gi,replace:(e,t,n)=>`${t?`version `:``}${n.replace(/\./g,` dot `)}`},{name:`decimal`,pattern:/\b(\d+)\.(\d+)\b/g,replace:(e,t,n)=>`${t} point ${de(n)}`},{name:`hash`,pattern:/\b(?=[0-9a-f]{7,40}\b)(?=[0-9a-f]*[a-f])(?=[0-9a-f]*\d)[0-9a-f]{7,40}\b/gi,replace:e=>fe(e)},{name:`id-camel`,pattern:/([a-z])(Id|ID)(s)?\b/g,replace:(e,t,n,r)=>`${t} I D${r?`s`:``}`},{name:`id-word`,pattern:/\b(?:id|Id|ID)(s)?\b/g,replace:(e,t)=>`I D${t?`s`:``}`},{name:`byte-unit`,pattern:/\b(\d+)\s?(kb|mb|gb|tb)\b/gi,replace:(e,t,n)=>`${t} ${A[n.toLowerCase()]}`},{name:`ms-unit`,pattern:/\b(\d{1,5})\s?ms\b/g,replace:(e,t)=>`${t} ${A.ms}`},{name:`s-unit`,pattern:/\b(\d{1,3})\s?s\b/g,replace:(e,t)=>`${t} ${A.s}`},{name:`live-adjective`,pattern:/\b(is|are|was|were|be|been|being|now|and|stays?|staying|went|go|goes|going|deployed|it's|that's|here's|there's|we're|you're|they're)\s+live\b/gi,replace:(e,t)=>`${t} lyve`},{name:`interior-dot`,pattern:/\.(?=[A-Za-z0-9])/g,replace:` dot `}];function me(e){if(!e)return``;let t=e;for(let e of pe)t=t.replace(e.pattern,e.replace);return t.replace(/[ \t]{2,}/g,` `).trim()}function he(e){return me(ce(e))}var ge=[{id:`am_michael`,label:`Michael (US ♂)`},{id:`am_adam`,label:`Adam (US ♂)`},{id:`af_heart`,label:`Heart (US ♀)`},{id:`af_bella`,label:`Bella (US ♀)`},{id:`af_nicole`,label:`Nicole (US ♀)`},{id:`af_sarah`,label:`Sarah (US ♀)`},{id:`bm_george`,label:`George (UK ♂)`},{id:`bf_emma`,label:`Emma (UK ♀)`}],j=220;function M(e){let t=e.match(/[^.!?]+[.!?]*\s*/g)?.map(e=>e.trim()).filter(Boolean)??[e],n=[];for(let e of t){if(e.length<=j){n.push(e);continue}let t=e;for(;t.length>j;){let e=t.lastIndexOf(` `,j);e<=0&&(e=j),n.push(t.slice(0,e).trim()),t=t.slice(e).trim()}t&&n.push(t)}return n}var N=typeof window<`u`&&`speechSynthesis`in window,P=new class{enabled=!1;lang=`en-US`;mode=`kokoro`;kokoroVoice=`am_michael`;browserVoice=``;active=null;queue=[];currentChat=null;speaking=!1;gen=0;audioEl=null;audioUrl=null;playingKey=null;manual=!1;listeners=new Set;get available(){return N||typeof Audio<`u`}isEnabled(){return this.enabled}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}getPlayingKey(){return this.playingKey}setPlayingKey(e){if(e!==this.playingKey){this.playingKey=e;for(let e of this.listeners)e()}}setEnabled(e){e!==this.enabled&&(this.enabled=e,e||this.reset())}setLang(e){this.lang=e}setMode(e){e!==this.mode&&(this.mode=e,this.reset())}setKokoroVoice(e){this.kokoroVoice=e}setBrowserVoice(e){this.browserVoice=e}setActiveChat(e){e!==this.active&&(this.active=e,this.queue=this.queue.filter(t=>t.chatId===e))}onResponse(e,t){if(!this.enabled||!this.available||!e||e!==this.active)return;let n=he(t);n&&(this.speaking&&(this.manual||this.currentChat&&this.currentChat!==e)&&(this.queue=[],this.cancel()),this.queue.push({chatId:e,text:n}),this.pump())}speak(e,t){if(!this.available)return;let n=he(e);if(!n)return;this.reset(),this.manual=!0,this.speaking=!0,this.currentChat=null,this.setPlayingKey(t??null);let r=++this.gen,i=M(n),a=()=>{r===this.gen&&(this.speaking=!1,this.manual=!1,this.setPlayingKey(null))};this.mode===`kokoro`?this.speakKokoro(i,0,r,a):this.speakBrowser(i,0,r,a)}bargeIn(){this.reset()}reset(){this.queue=[],this.cancel()}cancel(){this.gen++,this.currentChat=null,this.speaking=!1,this.manual=!1,this.setPlayingKey(null);try{window.speechSynthesis.cancel()}catch{}this.stopAudio()}stopAudio(){if(this.audioEl)try{this.audioEl.pause(),this.audioEl.src=``}catch{}if(this.audioUrl){try{URL.revokeObjectURL(this.audioUrl)}catch{}this.audioUrl=null}}pump(){if(this.speaking)return;let e=this.queue.shift();if(!e)return;this.speaking=!0,this.manual=!1,this.currentChat=e.chatId;let t=++this.gen,n=M(e.text),r=()=>{t===this.gen&&(this.speaking=!1,this.currentChat=null,this.pump())};this.mode===`kokoro`?this.speakKokoro(n,0,t,r):this.speakBrowser(n,0,t,r)}speakBrowser(e,t,n,r){if(n!==this.gen)return;if(!N||t>=e.length)return r();let i=new SpeechSynthesisUtterance(e[t]),a=this.browserVoice?window.speechSynthesis.getVoices().find(e=>e.voiceURI===this.browserVoice):void 0;a?(i.voice=a,i.lang=a.lang):i.lang=this.lang||navigator.language||`en-US`,i.onend=()=>this.speakBrowser(e,t+1,n,r),i.onerror=()=>this.speakBrowser(e,t+1,n,r),window.speechSynthesis.speak(i)}speakKokoro(e,t,n,r,i){if(n!==this.gen)return;let a=e[t];if(a===void 0)return r();let o=i??this.fetchSpeech(a),s=e[t+1],c=s===void 0?void 0:this.fetchSpeech(s);o.then(i=>{n===this.gen&&this.playBlob(i,n,()=>this.speakKokoro(e,t+1,n,r,c),()=>{this.speakBrowser(e,t,n,r)})}).catch(()=>{n===this.gen&&this.speakBrowser(e,t,n,r)})}fetchSpeech(e){return a(`/connectors/voice/call/speak`,{text:e,voice:this.kokoroVoice})}playBlob(e,t,n,r){if(t!==this.gen)return;if(typeof Audio>`u`)return r();this.stopAudio(),this.audioEl||=new Audio;let i=URL.createObjectURL(e);this.audioUrl=i;let a=this.audioEl;a.src=i,a.onended=()=>{t===this.gen&&n()},a.onerror=()=>{t===this.gen&&r()},a.play().catch(()=>{t===this.gen&&r()})}};function _e(){if(!N)return[];try{return window.speechSynthesis.getVoices().map(e=>({uri:e.voiceURI,label:`${e.name} (${e.lang})`,lang:e.lang})).sort((e,t)=>e.lang.localeCompare(t.lang)||e.label.localeCompare(t.label))}catch{return[]}}var ve=typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof window<`u`&&`MediaRecorder`in window;function ye(){for(let e of[`audio/webm;codecs=opus`,`audio/webm`,`audio/ogg;codecs=opus`,`audio/mp4`])if(typeof MediaRecorder<`u`&&MediaRecorder.isTypeSupported?.(e))return e}var be=class{rec=null;chunks=[];stream=null;async start(){this.stream=await navigator.mediaDevices.getUserMedia({audio:!0}),this.chunks=[];let e=ye();this.rec=new MediaRecorder(this.stream,e?{mimeType:e}:void 0),this.rec.ondataavailable=e=>{e.data.size&&this.chunks.push(e.data)},this.rec.start()}async stop(){let e=this.rec;if(!e)return this.teardown(),null;let t=new Promise(t=>{e.onstop=()=>t()});try{e.stop()}catch{}await t;let n=e.mimeType||`audio/webm`,r=new Blob(this.chunks,{type:n});return this.teardown(),r.size?r:null}cancel(){try{this.rec?.stop()}catch{}this.teardown()}teardown(){this.stream?.getTracks().forEach(e=>e.stop()),this.rec=null,this.stream=null,this.chunks=[]}};async function xe(e){return((await i(`/connectors/voice/call/transcribe`,e))?.text??``).trim()}var F=E((e,t)=>({now:Date.now(),_timer:null,start(){t()._timer||e({_timer:setInterval(()=>e({now:Date.now()}),1e3)})},stop(){let n=t()._timer;n&&(clearInterval(n),e({_timer:null}))}}));function Se(){return F(e=>e.now)}function Ce(e=3e4){return F(t=>Math.floor(t.now/e))}var I=[`low`,`medium`,`high`,`max`],L=[`low`,`medium`,`high`,`xhigh`,`max`],R=[`low`,`medium`,`high`,`xhigh`],z={value:2e5,source:`catalog`,confidence:`declared`},B={value:1e6,source:`catalog`,confidence:`declared`},we={modalities:{input:{text:!0,image:!0},output:{text:!0}},tools:{code:!0,review:!0,debug:!0,refactor:!0},source:`catalog`,confidence:`declared`};function V(e){return{...e?{limits:e}:{},capabilities:we}}var H={claude:{provider:`claude`,label:`Claude Code`,defaultModel:`sonnet-4.6`,models:[{alias:`fable-5`,label:`Fable 5`,providerModel:`claude-fable-5`,efforts:L,defaultEffort:`medium`,...V({contextWindowTokens:B})},{alias:`opus-4.8`,label:`Opus 4.8`,providerModel:`claude-opus-4-8`,efforts:L,defaultEffort:`medium`,...V({contextWindowTokens:z})},{alias:`opus-4.8[1m]`,label:`Opus 4.8 1M`,providerModel:`claude-opus-4-8[1m]`,efforts:L,defaultEffort:`medium`,...V({contextWindowTokens:B})},{alias:`opus-4.7`,label:`Opus 4.7`,providerModel:`claude-opus-4-7`,efforts:L,defaultEffort:`medium`,...V({contextWindowTokens:z})},{alias:`opus-4.7[1m]`,label:`Opus 4.7 1M`,providerModel:`claude-opus-4-7[1m]`,efforts:L,defaultEffort:`medium`,...V({contextWindowTokens:B})},{alias:`opus-4.6`,label:`Opus 4.6`,providerModel:`claude-opus-4-6`,efforts:I,defaultEffort:`medium`,...V({contextWindowTokens:z})},{alias:`opus-4.6[1m]`,label:`Opus 4.6 1M`,providerModel:`claude-opus-4-6[1m]`,efforts:I,defaultEffort:`medium`,...V({contextWindowTokens:B})},{alias:`sonnet-4.6`,label:`Sonnet 4.6`,providerModel:`claude-sonnet-4-6`,efforts:I,defaultEffort:`medium`,...V({contextWindowTokens:z})},{alias:`sonnet-4.6[1m]`,label:`Sonnet 4.6 1M`,providerModel:`claude-sonnet-4-6[1m]`,efforts:I,defaultEffort:`medium`,...V({contextWindowTokens:B})},{alias:`haiku`,label:`Haiku`,providerModel:`haiku`,efforts:[],...V()}]},codex:{provider:`codex`,label:`Codex`,defaultModel:`gpt-5.5`,models:[{alias:`gpt-5.5`,label:`GPT-5.5`,providerModel:`gpt-5.5`,efforts:R,defaultEffort:`medium`,...V({contextWindowTokens:z})},{alias:`gpt-5.4`,label:`GPT-5.4`,providerModel:`gpt-5.4`,efforts:R,defaultEffort:`medium`,...V({contextWindowTokens:z})},{alias:`gpt-5.4-mini`,label:`GPT-5.4 Mini`,providerModel:`gpt-5.4-mini`,efforts:R,defaultEffort:`medium`,...V({contextWindowTokens:z})},{alias:`gpt-5.3-codex`,label:`GPT-5.3 Codex`,providerModel:`gpt-5.3-codex`,efforts:R,defaultEffort:`medium`,...V({contextWindowTokens:z})},{alias:`gpt-5.3-codex-spark`,label:`GPT-5.3 Codex Spark`,providerModel:`gpt-5.3-codex-spark`,efforts:R,defaultEffort:`high`,...V({contextWindowTokens:z})},{alias:`gpt-5.2`,label:`GPT-5.2`,providerModel:`gpt-5.2`,efforts:R,defaultEffort:`medium`,...V({contextWindowTokens:z})}]}};function U(e){return e?.providers[0]??`claude`}function W(e){return H[e]?.defaultModel??``}function Te(e){let t={};for(let n of e)t[n.id]=n;return t}function G(e,t){let n=e.findIndex(e=>e.id===t.id),r=[...e];return n>=0?r[n]=t:r.push(t),r}var Ee=3e3;function K(e,t,n,r=Date.now(),i){if(!t||!n)return e;let a=[...e[t]||[]],o=i||`s-${n}-${r}`;return a.some(e=>e.id===o)||a.some(e=>e.status===n&&Math.abs(e.timestamp-r)<=Ee)?e:(a.push({id:o,status:n,timestamp:r}),a.length>200&&a.splice(0,a.length-200),{...e,[t]:a})}function De(e,t){if(!(!e||e.status===t.status)){if((e.status===`offline`||e.status===`stale`)&&(t.status===`online`||t.status===`idle`||t.status===`busy`))return`online`;if(t.status===`offline`)return`offline`}}var Oe=new Set([`compacting`,`compacted`,`clearing-context`,`context-cleared`]);function ke(e){let t=e.meta?.timelineEvent;if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t.status;if(typeof n!=`string`||!n)return;let r=t.id,i=t.timestamp;return{status:n,...typeof r==`string`?{id:r}:{},...typeof i==`number`&&Number.isFinite(i)?{timestamp:i}:{}}}function Ae(e){let t=e.params?.agentId;return typeof t==`string`&&t?t:typeof e.target==`string`&&e.target?e.target:void 0}function je(e,t){if(t===`command.dispatched`)return e.type===`agent.compact`?`compaction-requested`:e.type===`agent.clearContext`?`clear-requested`:e.type===`agent.shutdown`?`shutting-down`:void 0;if(t===`command.succeeded`){if(e.type===`agent.shutdown`)return`shutdown`;if(e.type===`agent.restart`)return`restarted`}}function Me(e){return JSON.stringify(e)}function Ne(e,t){let n=new Map(e.map(e=>[e.id,e])),r=!(e.length===t.length&&e.every((e,n)=>e.id===t[n]?.id)),i=t.map(e=>{let t=n.get(e.id);return t&&Me(t)===Me(e)?t:(r=!0,e)});return r?i:e}function q(e,t){let n=new Map(e.map(e=>[e.id,e])),r=!(e.length===t.length&&e.every((e,n)=>e.id===t[n]?.id)),i=t.map(e=>{let t=n.get(e.id);return t&&JSON.stringify(t)===JSON.stringify(e)?t:(r=!0,e)});return r?i:e}function J(e){return ne(e.createdAt??e.ts)}function Pe(e,t){let n=[`# Agent Relay Timeline`,``,`Exported: ${t}`,`Events: ${e.length}`,``];for(let t of e){let e=new Date(J(t)).toISOString();n.push(`## ${t.title||t.kind||`Event`}`),n.push(`- When: ${e}`),t.kind&&n.push(`- Kind: ${t.kind}`),t.agentId&&n.push(`- Agent: ${t.agentId}`),t.peer&&n.push(`- Peer: ${t.peer}`),t.body&&n.push(``,t.body),n.push(``)}return n.join(`
6
6
  `)}function Y(e,t){return e.filter(e=>e.status===`online`&&p(t,e.baseDir)).sort((e,t)=>d(t.baseDir).length-d(e.baseDir).length)[0]}function Fe(e,t){let n=e.find(e=>e.managedAgents.some(e=>e.agentId===t.id));if(n)return n;let r=typeof t.meta?.cwd==`string`?t.meta.cwd:``;return r?Y(e,r):void 0}var Ie={enabled:!0,browserEnabled:!1,messages:!0,replies:!0,errors:!0};function Le(e,t){return t.enabled?e.kind===`message`?t.messages:e.kind===`reply`?t.replies:t.errors:!1}function Re(){return typeof window<`u`&&`Notification`in window}function X(){return Re()?window.Notification.permission:`unsupported`}function ze(){return typeof document>`u`?!0:document.hidden}function Be(e){return e.threadPeer||e.agentId||``}function Z(e,t){return!!(e&&t.view===`chat`&&t.selectedInboxThread===e&&!ze())}function Ve(e,t){return Z(Be(e),t)}function He(e){return e.filter(e=>e.to===`user`&&e.from!==`user`).reduce((e,t)=>Math.max(e,t.id),0)}function Ue(e,t){return!Le(e,t.notificationSettings)||!t.notificationSettings.browserEnabled||X()!==`granted`||Ve(e,t)?!1:ze()||t.view!==`chat`}function We(e,t){if(X()===`granted`)try{let n=new window.Notification(e.title,{body:e.body,tag:e.id,icon:`icons/agent-relay-192.png`,data:{view:e.view,threadPeer:e.threadPeer,agentId:e.agentId,messageId:e.messageId}});n.onclick=()=>{window.focus(),t(),n.close()}}catch{}}var Q=E()(se((e,i)=>({agents:[],agentsById:{},messages:[],threadHistory:{},pairs:[],tasks:[],orchestrators:[],channels:[],connectors:[],integrations:[],automations:[],automationRuns:[],managedPolicies:[],memories:[],memoryTotal:0,memoryBrokerInfo:null,memoryStats:null,stats:{},health:null,maintenanceJobs:[],workspaces:[],workspaceFocusId:null,workspaceGitState:{},workspaceMergePreview:{},workspaceDiff:{},workspaceOrphans:[],taskEvents:[],taskEventCache:{},activityEvents:[],operatorActivity:[],chatHistoryImports:[],theme:`dark`,view:`overview`,showOffline:!1,showBuiltIns:!1,showReasoning:!1,autoRefresh:!0,voiceTtsEnabled:!1,voiceTtsLang:`en-US`,voiceTtsMode:`kokoro`,voiceTtsKokoroVoice:`am_michael`,voiceTtsBrowserVoice:``,voiceInputMode:`compose`,agentSort:`status`,agentSortDir:`asc`,agentPresetFilter:``,agentStatusFilter:``,agentTagFilter:``,agentHostFilter:``,selectedAgent:``,agentDetailOpen:!1,agentDetailId:``,livenessMismatches:{},commandStalls:{},channelDetailOpen:!1,channelDetailId:``,selectedInboxThread:``,replyTo:null,composeOpen:!1,orchestratorSpawnOpen:!1,orchestratorInstallOpen:!1,pairInviteOpen:!1,pairMessageOpen:!1,threadOpen:!1,threadMessages:[],taskEventsOpen:!1,mobileMenuOpen:!1,commandPaletteOpen:!1,commandQuery:``,connected:!1,connectionError:!1,authNeeded:!1,authToken:``,fileOrchestratorId:``,filePath:``,fileSelectedPath:``,fileSelectedLine:0,fileOverlayOpen:!1,chatAgentSearch:``,chatAgentProviderFilter:``,chatAgentStatusFilter:``,chatAgentTagFilter:``,chatAgentCapFilter:``,chatAgentHostFilter:``,chatAgentSort:`status`,chatAgentSortDir:`asc`,chatAgentGroupBy:``,chatAgentFiltersCollapsed:!0,chatStatusEvents:{},chatStickToBottom:!0,chatHasNewItems:!1,pendingForkImport:null,analyticsPeriod:`24h`,analyticsData:null,inboxReadCursors:{},inboxArchivedThreads:{},inboxDrafts:{},chatSending:!1,inboxSearch:``,inboxSort:`attention`,inboxSortDir:`desc`,inboxShowArchived:!1,activityFilter:``,memoryFilters:{search:``,type:``,scope:``,tags:``,visibility:``,minRelevance:`0`},selectedMemoryId:``,memoryLoading:!1,channelFilter:``,tagFilter:``,pairStatusFilter:`open`,taskStatusFilter:``,taskSourceFilter:``,compose:{...g},inboxCompose:{...h},pairInvite:{..._},pairMessage:{...m},confirmModal:{show:!1,title:``,message:``,action:null},errorModal:{show:!1,title:``,message:``},notification:null,toastNotification:null,notifications:[],notificationUnread:0,notificationSettings:{...Ie},notificationPermission:X(),renameModal:{show:!1,agentId:``,label:``},agentProfiles:[],spawnOrchId:``,spawnProvider:`claude`,spawnModel:W(`claude`),spawnEffort:``,spawnProfile:`default-relay`,spawnCwd:``,spawnLabel:``,spawnApproval:`guarded`,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,spawnCwdHistory:[],isSpawning:!1,spawnDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``},policyModal:{open:!1,editing:``,name:``,description:``,orchestratorId:``,cwd:``,provider:`claude`,rig:``,model:W(`claude`),effort:``,profile:`default-relay`,providerArgs:``,prompt:``,tags:``,capabilities:``,label:``,mode:`always-on`,permissionMode:`guarded`,restartOnUpdate:!0,scheduledDailyRestart:!1,keepaliveSeconds:`300`,backoffSchedule:`5,15,60,300`,backoffResetAfterSeconds:`600`,channelId:``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``},profileModal:{open:!1,mode:`create`,profile:{name:``,description:``,provider:`any`,base:`host`,instructions:{system:``,append:[],repoInstructions:`allow`,globalInstructions:`allow`},relay:{context:!0,skills:!0,plugins:!0,statusLine:!0,mcp:!0},skills:[],plugins:[],mcp:{mode:`host`},hooks:{mode:`host`},permissions:{filesystem:`host`},env:{},providerOptions:{}}},_es:null,_refreshTimer:null,_refreshInFlight:!1,set:t=>e(t),setVoiceTtsEnabled(t){P.setEnabled(t),e({voiceTtsEnabled:t})},setVoiceTtsLang(t){P.setLang(t),e({voiceTtsLang:t})},setVoiceTtsMode(t){P.setMode(t),e({voiceTtsMode:t})},setVoiceTtsKokoroVoice(t){P.setKokoroVoice(t),e({voiceTtsKokoroVoice:t})},setVoiceTtsBrowserVoice(t){P.setBrowserVoice(t),e({voiceTtsBrowserVoice:t})},setVoiceInputMode(t){e({voiceInputMode:t})},async init(){Q.persist.hasHydrated()||await new Promise(e=>{let t=Q.persist.onFinishHydration(()=>{t(),e()})});let r=i().authToken;r&&o(r),n(i().view),P.setEnabled(i().voiceTtsEnabled),P.setLang(i().voiceTtsLang),P.setMode(i().voiceTtsMode),P.setKokoroVoice(i().voiceTtsKokoroVoice),P.setBrowserVoice(i().voiceTtsBrowserVoice),$(i()),c(()=>{i().authNeeded||e({authNeeded:!0,connectionError:!1})}),e({notificationPermission:X()}),i().startClock();try{e({stats:await t(`GET`,`/stats`)})}catch(t){if(t.status===401){e({authNeeded:!0});return}}await i().refresh(),i().connectSSE(),i().startAutoRefresh()},async switchView(t){n(t),e({view:t,mobileMenuOpen:!1});let r=i();[`chat`,`messages`].includes(t)&&await Promise.all([r.fetchMessages(),r.fetchChatHistoryImports()]),t===`activity`&&await Promise.all([r.fetchMessages(),r.fetchPairs(),r.fetchTasks(),r.fetchActivityEvents()]),t===`work`&&await Promise.all([r.fetchMessages(),r.fetchTasks()]),t===`pairs`&&await r.fetchPairs(),t===`channels`&&await r.fetchChannels(),t===`connectors`&&await r.fetchConnectors(),t===`integrations`&&await r.fetchIntegrations(),t===`memory`&&await r.refreshMemory(),t===`tasks`&&await r.fetchTasks(),t===`automation`&&await Promise.all([r.fetchAutomations(),r.fetchAutomationRuns()]),t===`maintenance`&&await r.fetchMaintenanceJobs(),t===`workspaces`&&await Promise.all([r.fetchWorkspaces(),r.fetchOrchestrators(),r.fetchAgents()]),t===`files`&&await r.fetchOrchestrators(),t===`analytics`&&await r.fetchAnalytics()},async openWorkspaceFocus(t){e({workspaceFocusId:t}),await i().switchView(`workspaces`)},startClock(){F.getState().start()},stopClock(){F.getState().stop()},startAutoRefresh(){i().stopAutoRefresh(),i().autoRefresh&&e({_refreshTimer:setInterval(()=>i().refreshLiveData(),ee)})},stopAutoRefresh(){let t=i();t._refreshTimer&&(clearInterval(t._refreshTimer),e({_refreshTimer:null}))},async apiCall(e,n,r){return t(e,n,r)},async openFilesAt(t){let n=i();e({fileOrchestratorId:t.orchestratorId||Y(n.orchestrators,t.selectedPath||t.path)?.id||n.orchestrators.find(e=>e.status===`online`)?.id||``,filePath:t.path,fileSelectedPath:t.selectedPath||``,fileSelectedLine:t.line||0,fileOverlayOpen:t.overlay===!0}),t.overlay||await i().switchView(`files`)},async openFilesForAgent(e,t=!1){let n=typeof e.meta?.cwd==`string`?e.meta.cwd:``;if(!n){i().showNotification(`Agent has no cwd`);return}let r=Fe(i().orchestrators,e);if(!r){i().showNotification(`No online orchestrator covers that cwd`);return}await i().openFilesAt({orchestratorId:r.id,path:n,overlay:t})},closeFileOverlay(){e({fileOverlayOpen:!1})},async refresh(){let e=i();await Promise.all([e.fetchStats(),e.fetchHealth(),e.fetchAgents(),e.fetchOrchestrators(),e.fetchPairs(),e.fetchMessages(),e.fetchTasks(),e.fetchChannels(),e.fetchConnectors(),e.fetchIntegrations(),e.fetchAutomations(),e.fetchAutomationRuns(),e.fetchManagedPolicies(),e.fetchAgentProfiles(),e.fetchMaintenanceJobs(),e.fetchWorkspaces(),e.fetchInboxState(),e.fetchActivityEvents(),e.fetchChatHistoryImports()])},async refreshLiveData(){if(!(i()._refreshInFlight||i().authNeeded)){e({_refreshInFlight:!0});try{try{let n=await t(`GET`,`/stats`);e(i().connectionError?{stats:n,connectionError:!1}:{stats:n})}catch(t){if(t.status===401)return;i().connectionError||e({connectionError:!0});return}let n=i(),r=[n.fetchHealth(),n.fetchAgents(),n.fetchOrchestrators(),n.fetchPairs(),n.fetchMessages(),n.fetchTasks(),n.fetchManagedPolicies(),n.fetchInboxState()],a=n.view;[`chat`,`messages`].includes(a)&&r.push(n.fetchChatHistoryImports()),a===`activity`&&r.push(n.fetchActivityEvents()),a===`memory`&&r.push(n.refreshMemory()),a===`automation`&&r.push(n.fetchAutomations(),n.fetchAutomationRuns()),a===`channels`&&r.push(n.fetchChannels()),a===`connectors`&&r.push(n.fetchConnectors()),a===`integrations`&&r.push(n.fetchIntegrations()),a===`maintenance`&&r.push(n.fetchMaintenanceJobs()),a===`profiles`&&r.push(n.fetchAgentProfiles()),a===`workspaces`&&r.push(n.fetchWorkspaces()),a===`analytics`&&r.push(n.fetchAnalytics()),await Promise.all(r)}finally{e({_refreshInFlight:!1})}}},async fetchStats(){try{e({stats:await t(`GET`,`/stats`)})}catch{}},async fetchAnalytics(){try{e({analyticsData:await t(`GET`,`/stats/analytics?period=`+i().analyticsPeriod)})}catch{}},setAnalyticsPeriod(t){e({analyticsPeriod:t}),i().fetchAnalytics()},async fetchHealth(){try{e({health:await t(`GET`,`/health`)})}catch{}},async fetchMaintenanceJobs(){try{e({maintenanceJobs:await t(`GET`,`/maintenance/jobs`)})}catch{}},async fetchWorkspaces(){try{e({workspaces:await t(`GET`,`/workspaces`)})}catch{}},async fetchWorkspaceGitState(n){try{let r=await t(`GET`,`/workspaces/`+encodeURIComponent(n)+`/git-state`);e(e=>({workspaceGitState:{...e.workspaceGitState,[n]:r}}))}catch(t){e(e=>({workspaceGitState:{...e.workspaceGitState,[n]:{available:!1,reason:t.message}}}))}},async fetchWorkspaceMergePreview(n){try{let r=await t(`GET`,`/workspaces/`+encodeURIComponent(n)+`/merge-preview`);e(e=>({workspaceMergePreview:{...e.workspaceMergePreview,[n]:r}}))}catch(t){e(e=>({workspaceMergePreview:{...e.workspaceMergePreview,[n]:{available:!1,reason:t.message}}}))}},async fetchWorkspaceDiff(n){try{let r=await t(`GET`,`/workspaces/`+encodeURIComponent(n)+`/diff`);e(e=>({workspaceDiff:{...e.workspaceDiff,[n]:r}}))}catch(t){e(e=>({workspaceDiff:{...e.workspaceDiff,[n]:{available:!1,reason:t.message}}}))}},async fetchWorkspaceOrphans(){try{e({workspaceOrphans:(await t(`GET`,`/workspaces/orphans`)).orphans??[]})}catch{}},async reclaimWorkspaceOrphan(e){i().openConfirm(`Reclaim Orphan Worktree`,`Remove the orphaned worktree "${e.branch||e.worktreePath}" from disk? It has no live agent.`,async()=>{try{await t(`POST`,`/workspaces/orphans/reclaim`,{worktreePath:e.worktreePath,repoRoot:e.repoRoot,branch:e.branch}),i().showNotification(`Orphan reclaim dispatched`),await Promise.all([i().fetchWorkspaceOrphans(),i().fetchActivityEvents()])}catch(e){i().showError(`Reclaim Failed`,e.message)}})},async workspaceAction(e,n){let r=n===`ready`?`Mark ready`:n===`request-review`?`Request review`:n===`merge-plan`?`Mark merge planned`:n===`merge`?`Merge`:n===`abandon`?`Abandon`:`Cleanup`,a=async()=>{try{await t(`POST`,`/workspaces/`+encodeURIComponent(e)+`/actions`,{action:n}),i().showNotification(n===`cleanup`?`Workspace cleanup requested`:n===`merge`?`Workspace merge dispatched`:`Workspace updated: ${r}`),await Promise.all([i().fetchWorkspaces(),i().fetchOrchestrators(),i().fetchActivityEvents()])}catch(e){i().showError(`Workspace Action Failed`,e.message)}};if(n===`cleanup`||n===`abandon`||n===`merge`){let t=i().workspaces.find(t=>t.id===e),r=t?.branch||t?.worktreePath||e;if(n===`merge`){let t=i().workspaceMergePreview[e],n=t&&t.available!==!1?` — ${t.strategy===`pr`?`opens a PR`:`rebases & fast-forwards into ${t.baseRef||`base`}, then deletes the branch`}.`:` — lands the work and deletes the branch.`;i().openConfirm(`Merge Workspace`,`Merge workspace "${r}"?${n}`,a);return}if(n===`cleanup`){await i().fetchWorkspaceGitState(e);let t=i().workspaceGitState[e],n=``;if(t&&t.available!==!1&&!t.missing){let e=t.ahead??0,r=t.dirtyCount??0;(e>0||r>0)&&(n=` ⚠ This destroys ${[e>0?`${e} unmerged commit(s)`:``,r>0?`${r} uncommitted change(s)`:``].filter(Boolean).join(` and `)}.`)}i().openConfirm(`Cleanup Workspace`,`Remove the worktree for "${r}" on the host?${n}`,a);return}i().openConfirm(`Abandon Workspace`,`Abandon workspace "${r}"?`,a);return}await a()},async purgeWorkspace(e){let n=i().workspaces.find(t=>t.id===e),r=n?.branch||n?.worktreePath||e;i().openConfirm(`Purge Workspace Record`,`Permanently remove the record for "${r}"? This only clears the dashboard row — it does not touch disk.`,async()=>{try{await t(`DELETE`,`/workspaces/`+encodeURIComponent(e)),i().showNotification(`Workspace record purged`),await Promise.all([i().fetchWorkspaces(),i().fetchActivityEvents()])}catch(e){i().showError(`Purge Failed`,e.message)}})},async fetchAgentProfiles(){try{e({agentProfiles:(await t(`GET`,`/agent-profiles`)).map(e=>e.value)})}catch{}},async runMaintenanceJob(n){try{let r=await t(`POST`,`/maintenance/jobs/`+encodeURIComponent(n)+`/run`,{});return e({maintenanceJobs:r.jobs}),i().showNotification(r.run.status===`succeeded`?`Maintenance job completed`:`Maintenance job skipped`),r.run}catch(e){return i().showError(`Maintenance Job Failed`,e.message),await i().fetchMaintenanceJobs(),null}},async fetchAgents(){try{let n=await t(`GET`,`/agents`),r=q(i().agents,n);if(r===i().agents)return;e({agents:r,agentsById:Te(r)})}catch{}},async fetchOrchestrators(){try{let n=q(i().orchestrators,await t(`GET`,`/orchestrators`));n!==i().orchestrators&&e({orchestrators:n})}catch{}},async refreshOrchestratorProviders(e){try{await t(`GET`,`/orchestrators/`+encodeURIComponent(e)+`/providers?refresh=1`),await i().fetchOrchestrators(),i().showNotification(`Provider status refreshed`)}catch(e){i().showError(`Provider Refresh Failed`,e.message)}},async fetchManagedPolicies(){try{e({managedPolicies:await t(`GET`,`/spawn-policies/health`)})}catch{}},async refreshMemory(){await Promise.all([i().fetchMemoryBroker(),i().fetchMemoryStats(),i().fetchMemories()])},async fetchMemoryBroker(){try{e({memoryBrokerInfo:await t(`GET`,`/memories/broker`)})}catch(e){i().showError(`Memory Broker Failed`,e.message)}},async fetchMemoryStats(){try{e({memoryStats:await t(`GET`,`/memories/stats`)})}catch{}},async fetchMemories(){let n=i().memoryFilters,r={limit:100};if(n.type&&(r.type=n.type),n.scope.trim()&&(r.scope=n.scope.trim()),n.visibility&&(r.visibility=n.visibility),n.tags.trim()&&(r.tags=n.tags.split(`,`).map(e=>e.trim()).filter(Boolean)),n.minRelevance.trim()!==``){let e=Number(n.minRelevance);Number.isFinite(e)&&(r.minRelevance=Math.max(0,Math.min(1,e)))}e({memoryLoading:!0});try{let n=await t(`POST`,`/memories/search`,r),a=n.memories.some(e=>e.id===i().selectedMemoryId)?i().selectedMemoryId:n.memories[0]?.id||``;e({memories:n.memories,memoryTotal:n.total,selectedMemoryId:a})}catch(e){i().showError(`Memory Search Failed`,e.message)}finally{e({memoryLoading:!1})}},async fetchPairs(){try{let n=i(),r;if(n.view===`activity`)r=await t(`GET`,`/pairs`);else if(n.pairStatusFilter===`open`){let[e,n]=await Promise.all([t(`GET`,`/pairs?status=active`),t(`GET`,`/pairs?status=pending`)]);r=[...e,...n]}else r=n.pairStatusFilter?await t(`GET`,`/pairs?status=`+encodeURIComponent(n.pairStatusFilter)):await t(`GET`,`/pairs`);let a=r.sort((e,t)=>new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime()),o=q(i().pairs,a);o!==i().pairs&&e({pairs:o})}catch{}},async fetchMessages(){try{let n=i(),r=`/messages?limit=`+(n.view===`chat`?`300`:`100`);n.view===`messages`&&n.selectedAgent&&(r+=`&for=`+encodeURIComponent(n.selectedAgent)),n.view===`messages`&&n.channelFilter&&(r+=`&channel=`+encodeURIComponent(n.channelFilter));let a=await t(`GET`,r),o=Ne(i().messages,a);e({messages:o});let s=i(),c=s.selectedInboxThread;if(Z(c,s)){let e=0;for(let t of o)t.id>e&&b(t)===c&&S(t)&&!u(t)&&(e=t.id);e&&i().markInboxThreadReadTo(c,e)}}catch{}},async fetchThreadHistory(n){if(n)try{let r=await t(`GET`,`/messages?for=`+encodeURIComponent(n)+`&limit=500`);e({threadHistory:{...i().threadHistory,[n]:r}})}catch{}},async fetchChatHistoryImports(){try{e({chatHistoryImports:await t(`GET`,`/chat/history-imports?limit=500`)})}catch{}},async fetchTasks(){try{let n=i(),r=new URLSearchParams({limit:`100`});n.taskStatusFilter&&r.set(`status`,n.taskStatusFilter),n.taskSourceFilter&&r.set(`source`,n.taskSourceFilter);let a=q(i().tasks,await t(`GET`,`/tasks?`+r.toString()));a!==i().tasks&&e({tasks:a})}catch{}},async fetchChannels(){try{e({channels:await t(`GET`,`/channels`)})}catch{}},async fetchConnectors(){try{e({connectors:await t(`GET`,`/connectors`)})}catch{}},async fetchIntegrations(){try{e({integrations:await t(`GET`,`/integrations`)})}catch{}},async fetchAutomations(){try{e({automations:await t(`GET`,`/automations`)})}catch{}},async fetchAutomationRuns(n){try{let r=new URLSearchParams({limit:`100`});n&&r.set(`automationId`,n),e({automationRuns:await t(`GET`,`/automation-runs?`+r.toString())})}catch{}},async fetchInboxState(){try{let n=await t(`GET`,`/inbox/state?operatorId=user`),r={},a={},o={};for(let e of n?.threads||[])e.readCursorMessageId&&(r[e.peerId]=e.readCursorMessageId),e.archivedAtMessageId&&(a[e.peerId]=e.archivedAtMessageId);for(let e of n?.drafts||[])e.body&&(o[e.peerId]=e.body);let s=i().inboxDrafts;e({inboxReadCursors:r,inboxArchivedThreads:a,...Object.keys(s).length>0?{}:{inboxDrafts:o}})}catch{}},async fetchActivityEvents(){try{e({activityEvents:await t(`GET`,`/activity?limit=200`)})}catch{}},connectSSE(){i().disconnectSSE(),e({_es:r(i().authToken,{connected:()=>{e(i().connectionError?{connected:!0,connectionError:!1}:{connected:!0}),i().refreshLiveData()},disconnected:()=>e({connected:!1}),message:(t,n)=>{if(t!==`connected`){if(t===`message.new`){let t=JSON.parse(n);if(t.kind===`session`&&t.from!==`user`){let e=t.payload?.session;e?.type===`response`&&e?.origin===`provider`&&P.onResponse(b(t),t.body)}let r=i();if(r.messages.some(e=>e.id===t.id))return;let a=[...r.messages,t];a.length>500&&a.splice(0,a.length-500),e({messages:a});let o=b(t);S(t)&&Z(o,r)&&i().markInboxThreadReadTo(o,t.id);return}if(t===`message.queued`||t===`message.expired`||t===`message.delivery_updated`||t===`message.reaction_updated`){let t=JSON.parse(n);e({messages:G(i().messages,t)});return}if(t===`notification.created`){i().handleRelayNotification(JSON.parse(n));return}if(t===`activity.created`){let t=JSON.parse(n);e({activityEvents:G(i().activityEvents,t)});return}if(t===`agent.status`){let t=JSON.parse(n),r=i(),a=r.agentsById[t.id];if(e({agents:G(r.agents,t),agentsById:{...r.agentsById,[t.id]:t}}),r.livenessMismatches[t.id]&&t.status!==`offline`){let n={...r.livenessMismatches};delete n[t.id],e({livenessMismatches:n})}let o=r.commandStalls[t.id];if(o){let n=ke(t);if(n?.status&&Oe.has(n.status)&&(n.timestamp??0)>o.ts){let n={...r.commandStalls};delete n[t.id],e({commandStalls:n})}}let s=ke(t),c=s?.status??De(a,t);if(c){let n=s?.timestamp??Date.now(),i=s?.id||`agent-status:${t.id}:${c}:${n}`;e({chatStatusEvents:K(r.chatStatusEvents,t.id,c,n,i)})}return}if(t===`liveness.mismatch`){let t=JSON.parse(n);t.agentId&&e({livenessMismatches:{...i().livenessMismatches,[t.agentId]:{agentId:t.agentId,detail:t.detail??`Process reported running but relay marked it offline`,ts:Date.now(),policyName:t.policyName,spawnRequestId:t.spawnRequestId}}});return}if(t===`command.stalled`){let t=JSON.parse(n);if(t.agentId){let n=Date.now(),r=t.kind??`compact`,a=r===`clear`?`clear-stalled`:`compaction-stalled`;e({commandStalls:{...i().commandStalls,[t.agentId]:{agentId:t.agentId,kind:r,detail:t.detail??`A context command was requested but never started — the session may need manual intervention.`,ts:n,commandId:t.commandId}},chatStatusEvents:K(i().chatStatusEvents,t.agentId,a,n,`command-stalled:${t.agentId}:${t.commandId??n}`)})}return}if(t===`agent.removed`){let t=JSON.parse(n),r=i(),a={...r.agentsById};delete a[t.id];let o={...r.livenessMismatches};delete o[t.id];let s={...r.commandStalls};delete s[t.id],e({livenessMismatches:o,commandStalls:s}),e({agents:r.agents.filter(e=>e.id!==t.id),agentsById:a});return}if(t===`message.claimed`){let t=JSON.parse(n);e({messages:i().messages.map(e=>e.id===t.messageId?{...e,claimedBy:t.claimedBy,claimExpiresAt:t.claimExpiresAt}:e)});return}if(t===`message.claim_released`){let t=JSON.parse(n);e({messages:i().messages.map(e=>e.id===t.messageId?{...e,claimedBy:void 0,claimedAt:void 0,claimExpiresAt:void 0}:e)});return}if(t===`message.deleted`){let t=JSON.parse(n);e({messages:i().messages.filter(e=>e.id!==t.messageId)});return}if(t===`orchestrator.status`){let t=JSON.parse(n);e({orchestrators:G(i().orchestrators,t)});return}if(t===`orchestrator.removed`){let t=JSON.parse(n);e({orchestrators:i().orchestrators.filter(e=>e.id!==t.id)});return}if(t===`policy.state.changed`||t===`config.changed`){i().fetchManagedPolicies();return}if(t===`command.dispatched`||t===`command.succeeded`){let r=JSON.parse(n).command;if(r){let n=je(r,t);if(n){let t=typeof r.updatedAt==`number`?r.updatedAt:typeof r.createdAt==`number`?r.createdAt:Date.now();e({chatStatusEvents:K(i().chatStatusEvents,Ae(r),n,t,r.id?`command:${r.id}:${n}`:void 0)})}}return}if([`task.created`,`task.updated`,`task.claimed`,`task.status`].includes(t)){let t=JSON.parse(n);e({tasks:G(i().tasks,t)})}}}})})},disconnectSSE(){let t=i()._es;t&&(t.close(),e({_es:null}))},openAgentDetail(t){e({agentDetailId:t.id,agentDetailOpen:!0})},closeAgentDetail(){e({agentDetailOpen:!1})},openChannelDetail(t){e({channelDetailId:t.id,channelDetailOpen:!0})},closeChannelDetail(){e({channelDetailOpen:!1})},openRename(t){e({renameModal:{show:!0,agentId:t.id,label:t.label||``}})},async doRename(){let n=i(),r=n.renameModal.label.trim()||null;try{await t(`PATCH`,`/agents/`+n.renameModal.agentId+`/label`,{label:r}),e({renameModal:{...n.renameModal,show:!1}})}catch(e){i().showError(`Rename Failed`,e.message)}},async doDeleteAgent(n){try{await t(`DELETE`,`/agents/`+n);let r=i(),a={...r.agentsById};delete a[n],e({agents:r.agents.filter(e=>e.id!==n),agentsById:a,selectedAgent:r.selectedAgent===n?``:r.selectedAgent})}catch(e){i().showError(`Delete Failed`,e.message)}},async doAgentAction(e,n,r){try{await t(`POST`,`/agents/`+encodeURIComponent(e.id)+`/actions`,{action:n,...r?{surface:{component:r}}:{}});let a=n===`restart`?`Restart`:n===`resume`?`Resume`:n===`shutdown`?`Shutdown`:n===`compact`?`Compact`:n===`clearContext`?`Clear context`:n;i().showNotification(`${a} command sent to ${x(e)}`),await Promise.all([i().fetchMessages(),i().fetchActivityEvents()])}catch(e){i().showError(`Action Failed`,e.message)}},openConfirm(t,n,r){e({confirmModal:{show:!0,title:t,message:n,action:r}})},showError(t,n){e({errorModal:{show:!0,title:t,message:n}})},showNotification(t){e({notification:t,toastNotification:null}),setTimeout(()=>e({notification:null}),3e3)},handleRelayNotification(t){let n=i();if(!Le(t,n.notificationSettings)||n.notifications.some(e=>e.id===t.id))return;let r=Ve(t,n),a=`${t.title}: ${t.body}`;e({notifications:[t,...n.notifications].slice(0,100),notificationUnread:r?n.notificationUnread:Math.min(99,n.notificationUnread+1),notification:r?n.notification:a,toastNotification:r?n.toastNotification:t}),r||setTimeout(()=>{i().toastNotification?.id===t.id&&e({notification:null,toastNotification:null})},4500),Ue(t,n)&&We(t,()=>i().openNotification(t)),r&&t.threadPeer&&t.messageId&&i().markInboxThreadReadTo(t.threadPeer,t.messageId)},async openNotification(t){if(e({notificationUnread:0}),t.threadPeer&&(i().openInboxThread(t.threadPeer),t.messageId&&i().markInboxThreadReadTo(t.threadPeer,t.messageId)),t.view&&await i().switchView(t.view),t.agentId&&t.view===`agents`){let e=i().agentsById[t.agentId];e&&i().openAgentDetail(e)}},dismissToast(){e({notification:null,toastNotification:null})},markNotificationsRead(){e({notificationUnread:0})},clearNotifications(){e({notifications:[],notificationUnread:0})},async requestBrowserNotifications(){if(!Re()){e({notificationPermission:`unsupported`,notificationSettings:{...i().notificationSettings,browserEnabled:!1}}),i().showNotification(`Browser notifications are not supported here`);return}let t=await window.Notification.requestPermission();e({notificationPermission:t,notificationSettings:{...i().notificationSettings,browserEnabled:t===`granted`}}),i().showNotification(t===`granted`?`Browser notifications enabled`:`Browser notifications not enabled`)},openCompose(){e({composeOpen:!0,compose:{...g,from:l}})},openComposeToAgent(t){e({replyTo:null,compose:{...g,from:l,to:t.id},composeOpen:!0})},async doSend(){let n=i();if(!n.compose.from||!n.compose.to||!n.compose.body){i().showError(`Validation`,`From, To, and Message are required.`);return}try{let r={from:n.compose.from,to:n.compose.to,body:n.compose.body};n.compose.channel&&(r.channel=n.compose.channel),n.compose.subject&&(r.subject=n.compose.subject),n.replyTo&&(r.replyTo=n.replyTo.id),n.compose.claimable&&(r.claimable=!0,r.kind=`task`,r.payload={title:n.compose.subject||`Claimable task`}),await t(`POST`,`/messages`,r),e({composeOpen:!1,replyTo:null,compose:{...g,from:l}}),await i().fetchMessages()}catch(e){i().showError(`Send Failed`,e.message)}},async doClaim(e){let n=i(),r=n.compose.from||n.selectedAgent;if(!r){i().showError(`Validation`,`Select an agent first.`);return}try{let n=await t(`POST`,`/messages/`+e+`/claim`,{agentId:r});n.ok||i().showError(`Claim Failed`,n.error||`unknown`),n.ok&&await Promise.all([i().fetchMessages(),i().fetchTasks()])}catch(e){i().showError(`Claim Failed`,e.message)}},async doDeliveryAction(e,n,r){try{await t(`POST`,`/messages/`+e+`/delivery/actions`,{action:n,reason:r,agentId:i().compose.from||i().selectedAgent||`user`}),await i().fetchMessages()}catch(e){i().showError(`Delivery Update Failed`,e.message)}},async doClaimTask(e){let n=i(),r=n.compose.from||n.selectedAgent;if(!r){i().showError(`Validation`,`Select an agent first.`);return}try{let n=await t(`POST`,`/tasks/`+e+`/claim`,{agentId:r});n.ok?await Promise.all([i().fetchTasks(),i().fetchMessages()]):i().showError(`Claim Failed`,n.error||`unknown`)}catch(e){i().showError(`Claim Failed`,e.message)}},async doUpdateTaskStatus(n,r){if(!(!n||!r||r===n.status))try{let a={status:r},o=n.claimedBy||i().compose.from||i().selectedAgent;o&&(a.agentId=o);let s=await t(`PATCH`,`/tasks/`+n.id+`/status`,a),c=s.task||s;if(e({tasks:i().tasks.map(e=>e.id===n.id?c:e)}),s.memoryEvent){let t=i().taskEventCache[n.id]||[];e({taskEventCache:{...i().taskEventCache,[n.id]:[...t,s.memoryEvent]},...i().taskEventsOpen?{taskEvents:[...i().taskEvents,s.memoryEvent]}:{}})}s.memory&&i().showNotification(`Memory captured: ${s.memory.title}`)}catch(e){i().showError(`Status Update Failed`,e.message),await i().fetchTasks()}},async doDeleteMessage(n){try{await t(`DELETE`,`/messages/`+n),e({messages:i().messages.filter(e=>e.id!==n)})}catch(e){i().showError(`Delete Failed`,e.message)}},async reactToMessage(n,r){try{let a=(n.reactions||[]).some(e=>e.actorId===`user`&&e.emoji===r),o=await t(`POST`,`/messages/`+n.id+`/reactions`,{actorId:l,emoji:r,action:a?`remove`:`add`});e({messages:G(i().messages,o)})}catch(e){i().showError(`Reaction Failed`,e.message)}},startReply(t){let n=t.from===`user`?t.to:t.from;e({replyTo:{id:t.id,from:t.from},compose:{...g,from:l,to:n,channel:t.channel||``},composeOpen:!0})},cancelReply(){e({replyTo:null})},async openThread(n){e({threadMessages:[],threadOpen:!0});try{e({threadMessages:await t(`GET`,`/messages/`+n+`/thread`)})}catch(e){i().showError(`Thread Load Failed`,e.message)}},async openTaskEvents(n){e({taskEvents:[],taskEventsOpen:!0});try{let r=await t(`GET`,`/tasks/`+n.id+`/events`);e({taskEvents:r,taskEventCache:{...i().taskEventCache,[n.id]:r}})}catch(e){i().showError(`Task Events Failed`,e.message)}},openInboxThread(t,n=[]){e({selectedInboxThread:t}),n.length&&i().markInboxThreadRead(t,n),i().fetchThreadHistory(t)},async sendChatMessage(n,r,a=[]){if(!(!n.trim()&&a.length===0||i().chatSending)){e({chatSending:!0});try{if(i().agentsById[r.peer]?.providerCapabilities?.liveSession?.inject&&a.length===0)await t(`POST`,`/agents/`+encodeURIComponent(r.peer)+`/prompt`,{body:n.trim()});else{let e={from:l,to:r.peer,body:n.trim()||`Attachment`};r.lastMessage?.channel&&(e.channel=r.lastMessage.channel),r.lastMessage?.id&&(e.replyTo=r.lastMessage.id),a.length&&(e.payload={attachments:a}),await t(`POST`,`/messages`,e)}let o={...i().inboxDrafts};delete o[r.peer],e({inboxDrafts:o}),t(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(v)+`&peerId=`+encodeURIComponent(r.peer)).catch(()=>{}),await i().fetchMessages()}catch(e){i().showError(`Send Failed`,e.message)}e({chatSending:!1})}},async sendPermissionDecision(e,n,r,a){try{await t(`POST`,`/agents/`+encodeURIComponent(e)+`/permission-decision`,{approvalId:n,decision:r,...a?{answers:a}:{}});let o=r===`approve`?`Approved`:r===`approve-session`?`Approved for session`:r===`abort`?`Aborted`:r===`answer`?`Answer sent for`:`Denied`;i().showNotification(`${o} ${r===`answer`?`Claude's question`:`permission request`}`),await i().fetchAgents()}catch(e){i().showError(`Permission Failed`,e.message)}},markInboxThreadReadTo(n,r){!n||r<=(i().inboxReadCursors[n]||0)||(e({inboxReadCursors:{...i().inboxReadCursors,[n]:r}}),t(`PATCH`,`/inbox/threads`,{operatorId:v,peerId:n,readCursorMessageId:r}).catch(()=>{}))},markInboxThreadRead(e,t){!e||!t.length||i().markInboxThreadReadTo(e,He(t))},markInboxThreadUnread(n){let r={...i().inboxReadCursors};delete r[n],e({inboxReadCursors:r}),t(`PATCH`,`/inbox/threads`,{operatorId:v,peerId:n,readCursorMessageId:null}).catch(()=>{})},archiveInboxThread(n,r){e({inboxArchivedThreads:{...i().inboxArchivedThreads,[n]:r}}),i().selectedInboxThread===n&&e({selectedInboxThread:``}),t(`PATCH`,`/inbox/threads`,{operatorId:v,peerId:n,archivedAtMessageId:r}).catch(()=>{})},unarchiveInboxThread(n){let r={...i().inboxArchivedThreads};delete r[n],e({inboxArchivedThreads:r}),t(`PATCH`,`/inbox/threads`,{operatorId:v,peerId:n,archivedAtMessageId:null}).catch(()=>{})},setReplyDraft(n,r){let a={...i().inboxDrafts};r?a[n]=r:delete a[n],e({inboxDrafts:a}),r?t(`PUT`,`/inbox/drafts`,{operatorId:v,peerId:n,body:r}).catch(()=>{}):t(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(v)+`&peerId=`+encodeURIComponent(n)).catch(()=>{})},async sendInboxReply(n,r){let a=(i().inboxDrafts[n]||``).trim();if(!a||i().chatSending){a||i().showError(`Validation`,`Reply body is required.`);return}e({chatSending:!0});try{let o={from:l,to:n,body:a};r?.channel&&(o.channel=r.channel),r?.id&&(o.replyTo=r.id),await t(`POST`,`/messages`,o);let s={...i().inboxDrafts};delete s[n],e({inboxDrafts:s}),t(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(v)+`&peerId=`+encodeURIComponent(n)).catch(()=>{}),await i().fetchMessages()}catch(e){i().showError(`Reply Failed`,e.message)}e({chatSending:!1})},async doSendInboxCompose(){let n=i().inboxCompose,r=n.to;if(r){if(n.toMode===`tag`?r=`tag:`+r:n.toMode===`cap`&&(r=`cap:`+r),!n.body){i().showError(`Validation`,`Message is required.`);return}try{let a={from:l,to:r,body:n.body};n.channel&&(a.channel=n.channel),n.subject&&(a.subject=n.subject),n.claimable&&(a.claimable=!0,a.kind=`task`,a.payload={title:n.subject||`Claimable task`}),await t(`POST`,`/messages`,a),e({inboxCompose:{...h,toMode:n.toMode,to:n.to}}),await i().fetchMessages()}catch(e){i().showError(`Send Failed`,e.message)}}},openPairInvite(t){e({pairInvite:{..._,requesterId:t||i().selectedAgent||``},pairInviteOpen:!0})},closePairInvite(){e({pairInviteOpen:!1,pairInvite:{..._}})},async doCreatePair(){let n=i();if(!n.pairInvite.requesterId||!n.pairInvite.targetId){i().showError(`Validation`,`Requester and Target are required.`);return}if(n.pairInvite.requesterId===n.pairInvite.targetId){i().showError(`Validation`,`Requester and Target must be different.`);return}try{let r={from:n.pairInvite.requesterId,target:n.pairInvite.targetId};n.pairInvite.objective&&(r.objective=n.pairInvite.objective),await t(`POST`,`/pairs`,r),e({pairInviteOpen:!1,pairInvite:{..._}}),await Promise.all([i().fetchPairs(),i().fetchMessages()])}catch(e){i().showError(`Pair Invite Failed`,e.message)}},openPairMessage(t,n){e({pairMessage:{...m,pairId:t.id,from:n||t.requesterId},pairMessageOpen:!0})},closePairMessage(){e({pairMessageOpen:!1,pairMessage:{...m}})},async doSendPairMessage(){let n=i();if(!n.pairMessage.pairId||!n.pairMessage.from||!n.pairMessage.body){i().showError(`Validation`,`Pair, From, and Message are required.`);return}try{let r={from:n.pairMessage.from,body:n.pairMessage.body};n.pairMessage.subject&&(r.subject=n.pairMessage.subject),await t(`POST`,`/pairs/`+encodeURIComponent(n.pairMessage.pairId)+`/messages`,r),e({pairMessageOpen:!1,pairMessage:{...m}}),await Promise.all([i().fetchPairs(),i().fetchMessages()])}catch(e){i().showError(`Pair Message Failed`,e.message)}},async doAcceptPair(e){try{await t(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/accept`,{agentId:e.targetId}),await Promise.all([i().fetchPairs(),i().fetchMessages()])}catch(e){i().showError(`Accept Failed`,e.message)}},async doRejectPair(e){try{await t(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/reject`,{agentId:e.targetId}),await Promise.all([i().fetchPairs(),i().fetchMessages()])}catch(e){i().showError(`Reject Failed`,e.message)}},async doHangupPair(e,n){try{await t(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/hangup`,{agentId:n||e.requesterId}),await Promise.all([i().fetchPairs(),i().fetchMessages()])}catch(e){i().showError(`Hang Up Failed`,e.message)}},openAgentSpawn(){i().openOrchestratorSpawn()},closeAgentSpawn(){e({orchestratorSpawnOpen:!1})},async doSpawnAgent(){await i().submitOrchestratorSpawn()},openOrchestratorSpawn(){i().openOrchestratorSpawnAt()},openOrchestratorSpawnAt(t={}){let n=i().orchestrators.filter(e=>e.status===`online`);if(!n.length){i().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}let r=i(),a=t.orchestratorId?n.find(e=>e.id===t.orchestratorId):void 0;if(t.orchestratorId&&!a){i().showError(`Orchestrator Offline`,`The selected orchestrator is not online.`);return}let o=t.cwd?.trim()||r.spawnCwd,s=o?n.find(e=>p(o,e.baseDir)):void 0,c=r.spawnOrchId?n.find(e=>e.id===r.spawnOrchId):void 0,l=a?.id||s?.id||c?.id||n[0].id,u=n.find(e=>e.id===l),d=r.spawnProvider&&u.providers.includes(r.spawnProvider)?r.spawnProvider:U(u),f=r.spawnProvider===d&&r.spawnModel?r.spawnModel:W(d),m=o&&p(o,u.baseDir)?o:u.baseDir||``;e({spawnOrchId:l,spawnProvider:d,spawnModel:f,spawnEffort:r.spawnProvider===d&&r.spawnModel===f?r.spawnEffort:``,spawnProfile:r.spawnProfile||`default-relay`,spawnCwd:m,spawnLabel:``,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,pendingForkImport:null,orchestratorSpawnOpen:!0})},forkFromAgent(t,n){let r=i(),a=r.agentsById[t];if(!a){i().showError(`Fork`,`Agent not found.`);return}let o=r.orchestrators.filter(e=>e.status===`online`);if(!o.length){i().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}let s=a.providerCapabilities,c=s?.model?.provider||(typeof a.meta?.provider==`string`?a.meta.provider:``),l=s?.model?.alias||s?.model?.id||``,u=(c?H[c]:void 0)?.models.find(e=>e.alias===l||e.providerModel===l)?.alias||``,d=s?.model?.effort||``,f=typeof a.meta?.cwd==`string`?a.meta.cwd:``,m=s?.session?.approvalMode||(typeof a.meta?.approvalMode==`string`?a.meta.approvalMode:`guarded`),h=a.label?`${a.label} (fork)`:``,g=o.find(e=>e.hostname===a.machine)||o.find(e=>p(f,e.baseDir))||o[0],_=x(a),v=[];for(let e of n){let t=te(e).trim();if(!t)continue;let n=e.from===`user`?`user`:`agent`;v.push(`[${n}]: ${t}`)}let y=v.join(`
7
7
  `),b=14e3,ee=`You are continuing work from a previous agent session (${_}). Below is the conversation history. Treat it as context for your work, not as your own actions.\n\n${y.length>b?`...
8
- `+y.slice(y.length-b):y}`,S=n.filter(e=>typeof e.id==`number`&&e.id>0).map(e=>e.id);e({spawnOrchId:g.id,spawnProvider:c||U(g),spawnModel:u||W(c||U(g)),spawnEffort:d,spawnProfile:r.spawnProfile||`default-relay`,spawnCwd:f||g.baseDir||``,spawnLabel:h,spawnApproval:m,spawnWorkspaceMode:`inherit`,spawnPrompt:`Continue from this previous session.`,spawnSystemPromptAppend:ee,spawnCount:1,pendingForkImport:{sourcePeerId:a.id,sourceAgentId:a.id,sourceThreadId:a.id,sourceAgentLabel:_,messageIds:S},orchestratorSpawnOpen:!0})},openOrchestratorInstall(){e({orchestratorInstallOpen:!0})},openOrchestratorSpawnFor(t){let n=i(),r=n.orchestrators.find(e=>e.id===t),a=U(r),o=W(a),s=n.spawnProvider===a&&n.spawnModel===o?n.spawnEffort:``,c=n.spawnCwd&&p(n.spawnCwd,r?.baseDir)?n.spawnCwd:r?.baseDir||``;e({spawnOrchId:t,spawnProvider:a,spawnModel:o,spawnEffort:s,spawnProfile:n.spawnProfile||`default-relay`,spawnCwd:c,spawnLabel:``,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,pendingForkImport:null,orchestratorSpawnOpen:!0})},selectSpawnHistory(t,n){let r=i(),a=r.orchestrators.find(e=>e.id===t&&e.status===`online`);if(!a){i().showError(`Unavailable`,`That orchestrator is no longer online.`);return}if(t===r.spawnOrchId){e({spawnCwd:n});return}let o=r.spawnProvider&&a.providers.includes(r.spawnProvider)?r.spawnProvider:U(a),s=r.spawnProvider===o&&r.spawnModel?r.spawnModel:W(o);e({spawnOrchId:t,spawnProvider:o,spawnModel:s,spawnEffort:r.spawnProvider===o&&r.spawnModel===s?r.spawnEffort:``,spawnCwd:n})},async submitOrchestratorSpawn(){let n=i();if(n.isSpawning)return;if(!n.spawnOrchId){i().showError(`Validation`,`Select an orchestrator.`);return}let r=n.orchestrators.find(e=>e.id===n.spawnOrchId);if(!r){i().showError(`Validation`,`Selected orchestrator is not available.`);return}let a=n.spawnCwd.trim();if(!a){i().showError(`Validation`,`Select a working directory.`);return}if(!p(a,r.baseDir)){i().showError(`Validation`,`Working directory must be under ${r.baseDir}.`);return}let o=n.pendingForkImport,s=o?1:Math.max(1,Math.min(10,Math.round(n.spawnCount)||1));e({isSpawning:!0});try{for(let e=0;e<s;e++){let r={provider:n.spawnProvider,approvalMode:n.spawnApproval,workspaceMode:n.spawnWorkspaceMode||`inherit`};n.spawnModel&&(r.model=n.spawnModel),n.spawnEffort&&(r.effort=n.spawnEffort),n.spawnProfile&&(r.profile=n.spawnProfile),r.cwd=a,n.spawnLabel&&(r.label=s>1?`${n.spawnLabel} ${e+1}`:n.spawnLabel),n.spawnPrompt&&(r.prompt=n.spawnPrompt),n.spawnSystemPromptAppend&&(r.systemPromptAppend=n.spawnSystemPromptAppend);let i=(await t(`POST`,`/orchestrators/`+encodeURIComponent(n.spawnOrchId)+`/spawn`,r)).command?.params?.spawnRequestId;o&&i&&o.messageIds.length>0&&await t(`POST`,`/chat/history-imports`,{targetSpawnRequestId:i,sourcePeerId:o.sourcePeerId,sourceAgentId:o.sourceAgentId,sourceThreadId:o.sourceThreadId,sourceAgentLabel:o.sourceAgentLabel,importedBy:v,messageIds:o.messageIds})}e({orchestratorSpawnOpen:!1,pendingForkImport:null,isSpawning:!1,spawnCwdHistory:[{orchId:n.spawnOrchId,cwd:a},...n.spawnCwdHistory.filter(e=>!(e.orchId===n.spawnOrchId&&e.cwd===a))].slice(0,5)}),await Promise.all([i().fetchAgents(),i().fetchOrchestrators(),i().fetchActivityEvents(),i().fetchChatHistoryImports()])}catch(t){e({isSpawning:!1}),i().showError(`Spawn Failed`,t.message)}},orchestratorAction(e,n,r,a){let o=n===`restart`?`Restart`:`Shutdown`,s=r?`agent "${r}"`:`all agents`;i().openConfirm(`${o} Agent`,`${o} ${s} on orchestrator "${e}"?`,async()=>{try{await t(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:n,agentId:r,...a?{surface:{component:a}}:{}}),await Promise.all([i().fetchOrchestrators(),i().fetchActivityEvents()])}catch(e){i().showError(`${o} Failed`,e.message)}})},upgradeOrchestrator(e,n){let r=n?` to v${n}`:` to match the relay`;i().openConfirm(`Upgrade Orchestrator`,`Upgrade "${e}"${r}? It will install the new version and restart itself.`,async()=>{try{await t(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:`upgrade`,...n?{targetVersion:n}:{}}),await Promise.all([i().fetchOrchestrators(),i().fetchActivityEvents()])}catch(e){i().showError(`Upgrade Failed`,e.message)}})},deleteOrchestrator(e){i().openConfirm(`Remove Orchestrator`,`Remove orchestrator "${e}"?`,async()=>{try{await t(`DELETE`,`/orchestrators/`+encodeURIComponent(e)),await Promise.all([i().fetchOrchestrators(),i().fetchActivityEvents()])}catch(e){i().showError(`Delete Failed`,e.message)}})},async browseSpawnDirectory(n){let r=i().spawnOrchId;if(!r)return;let a=i().spawnDirBrowser;e({spawnDirBrowser:{...a,loading:!0,error:``}});try{let a=n?`?path=`+encodeURIComponent(n):``,o=await t(`GET`,`/orchestrators/`+encodeURIComponent(r)+`/directories`+a);e({spawnDirBrowser:{open:!0,loading:!1,path:o.path||``,parent:o.parent||``,baseDir:o.baseDir||``,entries:o.entries||[],error:``},spawnCwd:o.path||i().spawnCwd})}catch(t){e({spawnDirBrowser:{...i().spawnDirBrowser,loading:!1,error:t.message}})}},selectSpawnDirectory(t){e({spawnCwd:t||i().spawnDirBrowser.path,spawnDirBrowser:{...i().spawnDirBrowser,open:!1}})},openPolicyCreate(){let t=i().orchestrators.filter(e=>e.status===`online`);if(!t.length){i().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}e({policyModal:{open:!0,editing:``,name:``,description:``,orchestratorId:t[0].id,cwd:``,provider:U(t[0]),rig:``,model:W(U(t[0])),effort:``,profile:`default-relay`,providerArgs:``,prompt:``,tags:``,capabilities:``,label:``,mode:`always-on`,permissionMode:`guarded`,restartOnUpdate:!0,scheduledDailyRestart:!1,keepaliveSeconds:`300`,backoffSchedule:`5,15,60,300`,backoffResetAfterSeconds:`600`,channelId:``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``}})},openPolicyEdit(t){e({policyModal:{open:!0,editing:t.name,name:t.name,description:t.description||``,orchestratorId:t.orchestratorId,cwd:t.cwd,provider:t.provider,rig:t.rig||``,model:t.model||W(t.provider),effort:t.effort||``,profile:t.profile||`default-relay`,providerArgs:(t.providerArgs||[]).join(` `),prompt:t.prompt||``,tags:(t.tags||[]).join(`, `),capabilities:(t.capabilities||[]).join(`, `),label:t.label||``,mode:t.mode,permissionMode:t.permissionMode,restartOnUpdate:t.restartOnUpdate,scheduledDailyRestart:t.scheduledDailyRestart,keepaliveSeconds:String(t.onDemand?.keepaliveSeconds??300),backoffSchedule:(t.backoff?.schedule||[5,15,60,300]).join(`, `),backoffResetAfterSeconds:String(t.backoff?.resetAfterSeconds??600),channelId:t.binding?.channelId||``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``}})},async submitPolicy(){let n=i().policyModal;if(!n.name.trim()){i().showError(`Validation`,`Policy name is required.`);return}if(!n.orchestratorId){i().showError(`Validation`,`Select an orchestrator.`);return}if(!n.cwd.trim()){i().showError(`Validation`,`Working directory is required.`);return}let r=e=>e.split(/[,\s]+/).map(e=>e.trim()).filter(Boolean),a={name:n.name.trim(),...n.description.trim()?{description:n.description.trim()}:{},orchestratorId:n.orchestratorId,cwd:n.cwd.trim(),provider:n.provider,...n.rig.trim()?{rig:n.rig.trim()}:{},...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{},...n.profile?{profile:n.profile}:{},providerArgs:n.providerArgs.trim()?n.providerArgs.trim().split(/\s+/):[],...n.prompt.trim()?{prompt:n.prompt.trim()}:{},tags:r(n.tags),capabilities:r(n.capabilities),...n.label.trim()?{label:n.label.trim()}:{},mode:n.mode,permissionMode:n.permissionMode,restartOnUpdate:n.restartOnUpdate,scheduledDailyRestart:n.scheduledDailyRestart,...n.mode===`on-demand`?{onDemand:{keepaliveSeconds:Number(n.keepaliveSeconds)||300,idleDefinition:`no-activity`}}:{},backoff:{schedule:r(n.backoffSchedule).map(Number).filter(e=>e>0),resetAfterSeconds:Number(n.backoffResetAfterSeconds)||600},...n.channelId.trim()?{binding:{type:`channel`,channelId:n.channelId.trim()}}:{}};a.backoff.schedule.length||(a.backoff.schedule=[5,15,60,300]);try{await t(`PUT`,`/spawn-policy/`+encodeURIComponent(a.name),a),e({policyModal:{...n,open:!1}}),await i().fetchManagedPolicies()}catch(e){i().showError(`Save Failed`,e.message)}},deletePolicy(e){i().openConfirm(`Delete Policy`,`Delete managed agent policy "${e}"? This will stop any running agent.`,async()=>{try{await t(`DELETE`,`/spawn-policy/`+encodeURIComponent(e)),await i().fetchManagedPolicies()}catch(e){i().showError(`Delete Failed`,e.message)}})},async browsePolicyDirectory(n){let r=i().policyModal.orchestratorId;if(!r)return;let a=i().policyDirBrowser;e({policyDirBrowser:{...a,loading:!0,error:``}});try{let a=n?`?path=`+encodeURIComponent(n):``,o=await t(`GET`,`/orchestrators/`+encodeURIComponent(r)+`/directories`+a);e({policyDirBrowser:{open:!0,loading:!1,path:o.path||``,parent:o.parent||``,baseDir:o.baseDir||``,entries:o.entries||[],error:``},policyModal:{...i().policyModal,cwd:o.path||i().policyModal.cwd}})}catch(t){e({policyDirBrowser:{...i().policyDirBrowser,loading:!1,error:t.message}})}},selectPolicyDirectory(t){e({policyModal:{...i().policyModal,cwd:t||i().policyDirBrowser.path},policyDirBrowser:{...i().policyDirBrowser,open:!1}})},openProfileModal(t,n){let r={name:``,description:``,provider:`any`,base:`host`,instructions:{system:``,append:[],repoInstructions:`allow`,globalInstructions:`allow`},relay:{context:!0,skills:!0,plugins:!0,statusLine:!0,mcp:!0},skills:[],plugins:[],mcp:{mode:`host`},hooks:{mode:`host`},permissions:{filesystem:`host`},env:{},providerOptions:{}},i;n&&t===`duplicate`?(i=JSON.parse(JSON.stringify(n)),i.name=n.name+`-copy`,delete i.builtIn):i=n&&(t===`edit`||t===`view`)?JSON.parse(JSON.stringify(n)):r,e({profileModal:{open:!0,mode:t,profile:i}})},closeProfileModal(){e({profileModal:{...i().profileModal,open:!1}})},updateProfileModal(t){let n=i().profileModal.profile;e({profileModal:{...i().profileModal,profile:{...n,...t}}})},async saveProfile(){let{mode:n,profile:r}=i().profileModal;if(!r.name.trim()){i().showError(`Validation`,`Profile name is required.`);return}if(n!==`view`)try{await t(`PUT`,`/agent-profiles/`+encodeURIComponent(r.name.trim()),r),e({profileModal:{...i().profileModal,open:!1}}),await i().fetchAgentProfiles(),i().showNotification(`Profile "${r.name}" saved`)}catch(e){i().showError(`Save Failed`,e.message)}},deleteProfile(e){i().openConfirm(`Delete Profile`,`Delete agent profile "${e}"?`,async()=>{try{await t(`DELETE`,`/agent-profiles/`+encodeURIComponent(e)),await i().fetchAgentProfiles(),i().showNotification(`Profile "${e}" deleted`)}catch(e){i().showError(`Delete Failed`,e.message)}})},recordOperatorActivity(n){let r={id:Date.now(),kind:`operator`,title:n.title||`Activity`,body:n.body,meta:n.meta,icon:n.icon,view:n.view,peer:n.peer,messageId:n.messageId,pairId:n.pairId,taskId:n.taskId,agentId:n.agentId,ts:Date.now(),clientId:`op-`+Date.now(),createdAt:Date.now()};e({operatorActivity:[r,...i().operatorActivity.slice(0,79)]}),t(`POST`,`/activity`,{operatorId:v,clientId:r.clientId,kind:r.kind,title:r.title,body:r.body,meta:r.meta,icon:r.icon,view:r.view,peer:r.peer,messageId:r.messageId,pairId:r.pairId,taskId:r.taskId,agentId:r.agentId}).catch(()=>{})},async openActivityItem(e){if(e.view&&await i().switchView(e.view===`inbox`?`chat`:e.view),e.peer&&i().openInboxThread(e.peer),e.agentId){let t=i().agentsById[e.agentId];t&&i().openAgentDetail(t)}if(e.taskId){let t=i().tasks.find(t=>t.id===e.taskId);t&&await i().openTaskEvents(t)}},async runHealthAction(n){if(n.preset&&e({agentPresetFilter:n.preset,showOffline:!0}),n.api&&n.path&&(await t(n.api,n.path),await i().refreshLiveData()),n.view&&await i().switchView(n.view),n.copy)try{await navigator.clipboard?.writeText(n.copy)}catch{}},async runConnectorAction(e,n){try{let r=await t(`POST`,`/connectors/`+encodeURIComponent(e)+`/actions`,{action:n});if(await i().fetchConnectors(),!r.ok)throw Error(r.stderr||`${n} failed`);return r}catch(e){throw i().showError(`Connector Action Failed`,e.message),e}},async saveMemory(n,r){try{e({selectedMemoryId:(r?await t(`PATCH`,`/memories/`+encodeURIComponent(r),n):await t(`POST`,`/memories`,n)).id}),await Promise.all([i().fetchMemories(),i().fetchMemoryStats()]),i().showNotification(r?`Memory updated`:`Memory created`)}catch(e){i().showError(`Memory Save Failed`,e.message)}},deleteMemory(n){i().openConfirm(`Delete Memory`,`Delete memory "${n}"?`,async()=>{try{await t(`DELETE`,`/memories/`+encodeURIComponent(n)),e({selectedMemoryId:``}),await Promise.all([i().fetchMemories(),i().fetchMemoryStats()]),i().showNotification(`Memory deleted`)}catch(e){i().showError(`Delete Failed`,e.message)}})},async injectMemory(e){try{let n=await t(`POST`,`/memories/inject`,e);return i().showNotification(`Memory inject command sent to ${e.agentId}`),n}catch(e){return i().showError(`Memory Inject Failed`,e.message),null}},openCommandPalette(){e({commandQuery:``,commandPaletteOpen:!0})},closeCommandPalette(){e({commandPaletteOpen:!1,commandQuery:``})},async runCommand(t){let{action:n,payload:r}=t;if(i().closeCommandPalette(),n===`openView`)await i().switchView(r.view);else if(n===`agentPreset`)e({showOffline:!0,agentPresetFilter:r.preset||``}),await i().switchView(`agents`);else if(n===`copy`)try{await navigator.clipboard?.writeText(r.value||``)}catch{}else if(n===`messageAgent`){let e=i().agentsById[r.agentId];e&&i().openComposeToAgent(e)}else n===`pairAgent`?i().openPairInvite(r.agentId):n===`filterTag`?(e({agentTagFilter:r.tag||``,tagFilter:r.tag||``}),await i().switchView(`agents`)):n===`exportActivity`&&i().exportActivity(r.format||`markdown`)},async saveTokenAndRefresh(){let n=i().authToken;o(n);try{await t(`GET`,`/stats`)}catch(t){if(t.status===401){e({authNeeded:!0});return}}e({authNeeded:!1,connectionError:!1}),i().connectSSE(),await i().refresh(),i().startAutoRefresh()},exportActivity(e){let t=i(),n=[...t.operatorActivity,...t.activityEvents].sort((e,t)=>J(t)-J(e)),r=new Date().toISOString(),a=`agent-relay-timeline-${r.slice(0,10)}.${e===`json`?`json`:`md`}`;e===`json`?y(a,JSON.stringify({title:`Agent Relay Timeline`,exportedAt:r,events:n},null,2),`application/json`):y(a,Pe(n,r),`text/markdown`)},exportThread(e,t){let n=`agent-relay-thread-${f(e.peer)}.${t===`json`?`json`:`md`}`,r={title:`Thread: `+e.peer,importedHistory:e.importedHistory||[],messages:e.messages,exportedAt:new Date().toISOString()};y(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},exportPair(e,t){let n=`agent-relay-pair-${f(e.id)}.${t===`json`?`json`:`md`}`,r={title:`Pair: `+e.id,pair:e,exportedAt:new Date().toISOString()};y(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},async exportTask(n,r){let a=i().taskEventCache[n.id]||[];if(!a.length)try{a=await t(`GET`,`/tasks/`+n.id+`/events`),e({taskEventCache:{...i().taskEventCache,[n.id]:a}})}catch{}let o=`agent-relay-task-${n.id}.${r===`json`?`json`:`md`}`,s={title:`Task: `+(n.title||`#`+n.id),task:n,events:a,exportedAt:new Date().toISOString()};y(o,JSON.stringify(s,null,2),r===`json`?`application/json`:`text/markdown`)},destroy(){c(null),i().disconnectSSE(),i().stopAutoRefresh(),i().stopClock()}}),{name:`agent-relay-dashboard`,partialize:e=>({theme:e.theme,view:e.view,showOffline:e.showOffline,showBuiltIns:e.showBuiltIns,showReasoning:e.showReasoning,autoRefresh:e.autoRefresh,voiceTtsEnabled:e.voiceTtsEnabled,voiceTtsLang:e.voiceTtsLang,voiceTtsMode:e.voiceTtsMode,voiceTtsKokoroVoice:e.voiceTtsKokoroVoice,voiceTtsBrowserVoice:e.voiceTtsBrowserVoice,voiceInputMode:e.voiceInputMode,agentSort:e.agentSort,agentSortDir:e.agentSortDir,agentPresetFilter:e.agentPresetFilter,agentStatusFilter:e.agentStatusFilter,agentTagFilter:e.agentTagFilter,agentHostFilter:e.agentHostFilter,pairStatusFilter:e.pairStatusFilter,inboxSort:e.inboxSort,inboxSortDir:e.inboxSortDir,inboxShowArchived:e.inboxShowArchived,chatAgentProviderFilter:e.chatAgentProviderFilter,chatAgentStatusFilter:e.chatAgentStatusFilter,chatAgentTagFilter:e.chatAgentTagFilter,chatAgentCapFilter:e.chatAgentCapFilter,chatAgentHostFilter:e.chatAgentHostFilter,chatAgentSort:e.chatAgentSort,chatAgentSortDir:e.chatAgentSortDir,chatAgentGroupBy:e.chatAgentGroupBy,chatAgentFiltersCollapsed:e.chatAgentFiltersCollapsed,activityFilter:e.activityFilter,analyticsPeriod:e.analyticsPeriod,memoryFilters:e.memoryFilters,authToken:e.authToken,inboxReadCursors:e.inboxReadCursors,inboxArchivedThreads:e.inboxArchivedThreads,inboxDrafts:e.inboxDrafts,chatStatusEvents:e.chatStatusEvents,operatorActivity:e.operatorActivity,notifications:e.notifications,notificationUnread:e.notificationUnread,notificationSettings:e.notificationSettings,spawnOrchId:e.spawnOrchId,spawnProvider:e.spawnProvider,spawnModel:e.spawnModel,spawnEffort:e.spawnEffort,spawnProfile:e.spawnProfile,spawnCwd:e.spawnCwd,spawnApproval:e.spawnApproval,spawnWorkspaceMode:e.spawnWorkspaceMode,spawnCwdHistory:e.spawnCwdHistory})})),Ge=null;function $(e){let t=e.voiceTtsEnabled&&e.view===`chat`&&e.selectedInboxThread||null;t!==Ge&&(Ge=t,P.setActiveChat(t))}Q.subscribe($);export{Ce as a,_e as c,P as d,Se as i,ve as l,H as n,ge as o,F as r,be as s,Q as t,xe as u};
9
- //# sourceMappingURL=store-DkmReBlH.js.map
8
+ `+y.slice(y.length-b):y}`,S=n.filter(e=>typeof e.id==`number`&&e.id>0).map(e=>e.id);e({spawnOrchId:g.id,spawnProvider:c||U(g),spawnModel:u||W(c||U(g)),spawnEffort:d,spawnProfile:r.spawnProfile||`default-relay`,spawnCwd:f||g.baseDir||``,spawnLabel:h,spawnApproval:m,spawnWorkspaceMode:`inherit`,spawnPrompt:`Continue from this previous session.`,spawnSystemPromptAppend:ee,spawnCount:1,pendingForkImport:{sourcePeerId:a.id,sourceAgentId:a.id,sourceThreadId:a.id,sourceAgentLabel:_,messageIds:S},orchestratorSpawnOpen:!0})},openOrchestratorInstall(){e({orchestratorInstallOpen:!0})},openOrchestratorSpawnFor(t){let n=i(),r=n.orchestrators.find(e=>e.id===t),a=U(r),o=W(a),s=n.spawnProvider===a&&n.spawnModel===o?n.spawnEffort:``,c=n.spawnCwd&&p(n.spawnCwd,r?.baseDir)?n.spawnCwd:r?.baseDir||``;e({spawnOrchId:t,spawnProvider:a,spawnModel:o,spawnEffort:s,spawnProfile:n.spawnProfile||`default-relay`,spawnCwd:c,spawnLabel:``,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,pendingForkImport:null,orchestratorSpawnOpen:!0})},selectSpawnHistory(t,n){let r=i(),a=r.orchestrators.find(e=>e.id===t&&e.status===`online`);if(!a){i().showError(`Unavailable`,`That orchestrator is no longer online.`);return}if(t===r.spawnOrchId){e({spawnCwd:n});return}let o=r.spawnProvider&&a.providers.includes(r.spawnProvider)?r.spawnProvider:U(a),s=r.spawnProvider===o&&r.spawnModel?r.spawnModel:W(o);e({spawnOrchId:t,spawnProvider:o,spawnModel:s,spawnEffort:r.spawnProvider===o&&r.spawnModel===s?r.spawnEffort:``,spawnCwd:n})},async submitOrchestratorSpawn(){let n=i();if(n.isSpawning)return;if(!n.spawnOrchId){i().showError(`Validation`,`Select an orchestrator.`);return}let r=n.orchestrators.find(e=>e.id===n.spawnOrchId);if(!r){i().showError(`Validation`,`Selected orchestrator is not available.`);return}let a=n.spawnCwd.trim();if(!a){i().showError(`Validation`,`Select a working directory.`);return}if(!p(a,r.baseDir)){i().showError(`Validation`,`Working directory must be under ${r.baseDir}.`);return}let o=n.pendingForkImport,s=o?1:Math.max(1,Math.min(10,Math.round(n.spawnCount)||1));e({isSpawning:!0});try{for(let e=0;e<s;e++){let r={provider:n.spawnProvider,orchestratorId:n.spawnOrchId,approvalMode:n.spawnApproval,workspaceMode:n.spawnWorkspaceMode||`inherit`};n.spawnModel&&(r.model=n.spawnModel),n.spawnEffort&&(r.effort=n.spawnEffort),n.spawnProfile&&(r.profile=n.spawnProfile),r.cwd=a,n.spawnLabel&&(r.label=s>1?`${n.spawnLabel} ${e+1}`:n.spawnLabel),n.spawnPrompt&&(r.prompt=n.spawnPrompt),n.spawnSystemPromptAppend&&(r.systemPromptAppend=n.spawnSystemPromptAppend);let i=(await t(`POST`,`/agents/spawn`,r)).command?.params?.spawnRequestId;o&&i&&o.messageIds.length>0&&await t(`POST`,`/chat/history-imports`,{targetSpawnRequestId:i,sourcePeerId:o.sourcePeerId,sourceAgentId:o.sourceAgentId,sourceThreadId:o.sourceThreadId,sourceAgentLabel:o.sourceAgentLabel,importedBy:v,messageIds:o.messageIds})}e({orchestratorSpawnOpen:!1,pendingForkImport:null,isSpawning:!1,spawnCwdHistory:[{orchId:n.spawnOrchId,cwd:a},...n.spawnCwdHistory.filter(e=>!(e.orchId===n.spawnOrchId&&e.cwd===a))].slice(0,5)}),await Promise.all([i().fetchAgents(),i().fetchOrchestrators(),i().fetchActivityEvents(),i().fetchChatHistoryImports()])}catch(t){e({isSpawning:!1}),i().showError(`Spawn Failed`,t.message)}},orchestratorAction(e,n,r,a){let o=n===`restart`?`Restart`:`Shutdown`,s=r?`agent "${r}"`:`all agents`;i().openConfirm(`${o} Agent`,`${o} ${s} on orchestrator "${e}"?`,async()=>{try{await t(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:n,agentId:r,...a?{surface:{component:a}}:{}}),await Promise.all([i().fetchOrchestrators(),i().fetchActivityEvents()])}catch(e){i().showError(`${o} Failed`,e.message)}})},upgradeOrchestrator(e,n){let r=n?` to v${n}`:` to match the relay`;i().openConfirm(`Upgrade Orchestrator`,`Upgrade "${e}"${r}? It will install the new version and restart itself.`,async()=>{try{await t(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:`upgrade`,...n?{targetVersion:n}:{}}),await Promise.all([i().fetchOrchestrators(),i().fetchActivityEvents()])}catch(e){i().showError(`Upgrade Failed`,e.message)}})},deleteOrchestrator(e){i().openConfirm(`Remove Orchestrator`,`Remove orchestrator "${e}"?`,async()=>{try{await t(`DELETE`,`/orchestrators/`+encodeURIComponent(e)),await Promise.all([i().fetchOrchestrators(),i().fetchActivityEvents()])}catch(e){i().showError(`Delete Failed`,e.message)}})},async browseSpawnDirectory(n){let r=i().spawnOrchId;if(!r)return;let a=i().spawnDirBrowser;e({spawnDirBrowser:{...a,loading:!0,error:``}});try{let a=n?`?path=`+encodeURIComponent(n):``,o=await t(`GET`,`/orchestrators/`+encodeURIComponent(r)+`/directories`+a);e({spawnDirBrowser:{open:!0,loading:!1,path:o.path||``,parent:o.parent||``,baseDir:o.baseDir||``,entries:o.entries||[],error:``},spawnCwd:o.path||i().spawnCwd})}catch(t){e({spawnDirBrowser:{...i().spawnDirBrowser,loading:!1,error:t.message}})}},selectSpawnDirectory(t){e({spawnCwd:t||i().spawnDirBrowser.path,spawnDirBrowser:{...i().spawnDirBrowser,open:!1}})},openPolicyCreate(){let t=i().orchestrators.filter(e=>e.status===`online`);if(!t.length){i().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}e({policyModal:{open:!0,editing:``,name:``,description:``,orchestratorId:t[0].id,cwd:``,provider:U(t[0]),rig:``,model:W(U(t[0])),effort:``,profile:`default-relay`,providerArgs:``,prompt:``,tags:``,capabilities:``,label:``,mode:`always-on`,permissionMode:`guarded`,restartOnUpdate:!0,scheduledDailyRestart:!1,keepaliveSeconds:`300`,backoffSchedule:`5,15,60,300`,backoffResetAfterSeconds:`600`,channelId:``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``}})},openPolicyEdit(t){e({policyModal:{open:!0,editing:t.name,name:t.name,description:t.description||``,orchestratorId:t.orchestratorId,cwd:t.cwd,provider:t.provider,rig:t.rig||``,model:t.model||W(t.provider),effort:t.effort||``,profile:t.profile||`default-relay`,providerArgs:(t.providerArgs||[]).join(` `),prompt:t.prompt||``,tags:(t.tags||[]).join(`, `),capabilities:(t.capabilities||[]).join(`, `),label:t.label||``,mode:t.mode,permissionMode:t.permissionMode,restartOnUpdate:t.restartOnUpdate,scheduledDailyRestart:t.scheduledDailyRestart,keepaliveSeconds:String(t.onDemand?.keepaliveSeconds??300),backoffSchedule:(t.backoff?.schedule||[5,15,60,300]).join(`, `),backoffResetAfterSeconds:String(t.backoff?.resetAfterSeconds??600),channelId:t.binding?.channelId||``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``}})},async submitPolicy(){let n=i().policyModal;if(!n.name.trim()){i().showError(`Validation`,`Policy name is required.`);return}if(!n.orchestratorId){i().showError(`Validation`,`Select an orchestrator.`);return}if(!n.cwd.trim()){i().showError(`Validation`,`Working directory is required.`);return}let r=e=>e.split(/[,\s]+/).map(e=>e.trim()).filter(Boolean),a={name:n.name.trim(),...n.description.trim()?{description:n.description.trim()}:{},orchestratorId:n.orchestratorId,cwd:n.cwd.trim(),provider:n.provider,...n.rig.trim()?{rig:n.rig.trim()}:{},...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{},...n.profile?{profile:n.profile}:{},providerArgs:n.providerArgs.trim()?n.providerArgs.trim().split(/\s+/):[],...n.prompt.trim()?{prompt:n.prompt.trim()}:{},tags:r(n.tags),capabilities:r(n.capabilities),...n.label.trim()?{label:n.label.trim()}:{},mode:n.mode,permissionMode:n.permissionMode,restartOnUpdate:n.restartOnUpdate,scheduledDailyRestart:n.scheduledDailyRestart,...n.mode===`on-demand`?{onDemand:{keepaliveSeconds:Number(n.keepaliveSeconds)||300,idleDefinition:`no-activity`}}:{},backoff:{schedule:r(n.backoffSchedule).map(Number).filter(e=>e>0),resetAfterSeconds:Number(n.backoffResetAfterSeconds)||600},...n.channelId.trim()?{binding:{type:`channel`,channelId:n.channelId.trim()}}:{}};a.backoff.schedule.length||(a.backoff.schedule=[5,15,60,300]);try{await t(`PUT`,`/spawn-policy/`+encodeURIComponent(a.name),a),e({policyModal:{...n,open:!1}}),await i().fetchManagedPolicies()}catch(e){i().showError(`Save Failed`,e.message)}},deletePolicy(e){i().openConfirm(`Delete Policy`,`Delete managed agent policy "${e}"? This will stop any running agent.`,async()=>{try{await t(`DELETE`,`/spawn-policy/`+encodeURIComponent(e)),await i().fetchManagedPolicies()}catch(e){i().showError(`Delete Failed`,e.message)}})},async browsePolicyDirectory(n){let r=i().policyModal.orchestratorId;if(!r)return;let a=i().policyDirBrowser;e({policyDirBrowser:{...a,loading:!0,error:``}});try{let a=n?`?path=`+encodeURIComponent(n):``,o=await t(`GET`,`/orchestrators/`+encodeURIComponent(r)+`/directories`+a);e({policyDirBrowser:{open:!0,loading:!1,path:o.path||``,parent:o.parent||``,baseDir:o.baseDir||``,entries:o.entries||[],error:``},policyModal:{...i().policyModal,cwd:o.path||i().policyModal.cwd}})}catch(t){e({policyDirBrowser:{...i().policyDirBrowser,loading:!1,error:t.message}})}},selectPolicyDirectory(t){e({policyModal:{...i().policyModal,cwd:t||i().policyDirBrowser.path},policyDirBrowser:{...i().policyDirBrowser,open:!1}})},openProfileModal(t,n){let r={name:``,description:``,provider:`any`,base:`host`,instructions:{system:``,append:[],repoInstructions:`allow`,globalInstructions:`allow`},relay:{context:!0,skills:!0,plugins:!0,statusLine:!0,mcp:!0},skills:[],plugins:[],mcp:{mode:`host`},hooks:{mode:`host`},permissions:{filesystem:`host`},env:{},providerOptions:{}},i;n&&t===`duplicate`?(i=JSON.parse(JSON.stringify(n)),i.name=n.name+`-copy`,delete i.builtIn):i=n&&(t===`edit`||t===`view`)?JSON.parse(JSON.stringify(n)):r,e({profileModal:{open:!0,mode:t,profile:i}})},closeProfileModal(){e({profileModal:{...i().profileModal,open:!1}})},updateProfileModal(t){let n=i().profileModal.profile;e({profileModal:{...i().profileModal,profile:{...n,...t}}})},async saveProfile(){let{mode:n,profile:r}=i().profileModal;if(!r.name.trim()){i().showError(`Validation`,`Profile name is required.`);return}if(n!==`view`)try{await t(`PUT`,`/agent-profiles/`+encodeURIComponent(r.name.trim()),r),e({profileModal:{...i().profileModal,open:!1}}),await i().fetchAgentProfiles(),i().showNotification(`Profile "${r.name}" saved`)}catch(e){i().showError(`Save Failed`,e.message)}},deleteProfile(e){i().openConfirm(`Delete Profile`,`Delete agent profile "${e}"?`,async()=>{try{await t(`DELETE`,`/agent-profiles/`+encodeURIComponent(e)),await i().fetchAgentProfiles(),i().showNotification(`Profile "${e}" deleted`)}catch(e){i().showError(`Delete Failed`,e.message)}})},recordOperatorActivity(n){let r={id:Date.now(),kind:`operator`,title:n.title||`Activity`,body:n.body,meta:n.meta,icon:n.icon,view:n.view,peer:n.peer,messageId:n.messageId,pairId:n.pairId,taskId:n.taskId,agentId:n.agentId,ts:Date.now(),clientId:`op-`+Date.now(),createdAt:Date.now()};e({operatorActivity:[r,...i().operatorActivity.slice(0,79)]}),t(`POST`,`/activity`,{operatorId:v,clientId:r.clientId,kind:r.kind,title:r.title,body:r.body,meta:r.meta,icon:r.icon,view:r.view,peer:r.peer,messageId:r.messageId,pairId:r.pairId,taskId:r.taskId,agentId:r.agentId}).catch(()=>{})},async openActivityItem(e){if(e.view&&await i().switchView(e.view===`inbox`?`chat`:e.view),e.peer&&i().openInboxThread(e.peer),e.agentId){let t=i().agentsById[e.agentId];t&&i().openAgentDetail(t)}if(e.taskId){let t=i().tasks.find(t=>t.id===e.taskId);t&&await i().openTaskEvents(t)}},async runHealthAction(n){if(n.preset&&e({agentPresetFilter:n.preset,showOffline:!0}),n.api&&n.path&&(await t(n.api,n.path),await i().refreshLiveData()),n.view&&await i().switchView(n.view),n.copy)try{await navigator.clipboard?.writeText(n.copy)}catch{}},async runConnectorAction(e,n){try{let r=await t(`POST`,`/connectors/`+encodeURIComponent(e)+`/actions`,{action:n});if(await i().fetchConnectors(),!r.ok)throw Error(r.stderr||`${n} failed`);return r}catch(e){throw i().showError(`Connector Action Failed`,e.message),e}},async saveMemory(n,r){try{e({selectedMemoryId:(r?await t(`PATCH`,`/memories/`+encodeURIComponent(r),n):await t(`POST`,`/memories`,n)).id}),await Promise.all([i().fetchMemories(),i().fetchMemoryStats()]),i().showNotification(r?`Memory updated`:`Memory created`)}catch(e){i().showError(`Memory Save Failed`,e.message)}},deleteMemory(n){i().openConfirm(`Delete Memory`,`Delete memory "${n}"?`,async()=>{try{await t(`DELETE`,`/memories/`+encodeURIComponent(n)),e({selectedMemoryId:``}),await Promise.all([i().fetchMemories(),i().fetchMemoryStats()]),i().showNotification(`Memory deleted`)}catch(e){i().showError(`Delete Failed`,e.message)}})},async injectMemory(e){try{let n=await t(`POST`,`/memories/inject`,e);return i().showNotification(`Memory inject command sent to ${e.agentId}`),n}catch(e){return i().showError(`Memory Inject Failed`,e.message),null}},openCommandPalette(){e({commandQuery:``,commandPaletteOpen:!0})},closeCommandPalette(){e({commandPaletteOpen:!1,commandQuery:``})},async runCommand(t){let{action:n,payload:r}=t;if(i().closeCommandPalette(),n===`openView`)await i().switchView(r.view);else if(n===`agentPreset`)e({showOffline:!0,agentPresetFilter:r.preset||``}),await i().switchView(`agents`);else if(n===`copy`)try{await navigator.clipboard?.writeText(r.value||``)}catch{}else if(n===`messageAgent`){let e=i().agentsById[r.agentId];e&&i().openComposeToAgent(e)}else n===`pairAgent`?i().openPairInvite(r.agentId):n===`filterTag`?(e({agentTagFilter:r.tag||``,tagFilter:r.tag||``}),await i().switchView(`agents`)):n===`exportActivity`&&i().exportActivity(r.format||`markdown`)},async saveTokenAndRefresh(){let n=i().authToken;o(n);try{await t(`GET`,`/stats`)}catch(t){if(t.status===401){e({authNeeded:!0});return}}e({authNeeded:!1,connectionError:!1}),i().connectSSE(),await i().refresh(),i().startAutoRefresh()},exportActivity(e){let t=i(),n=[...t.operatorActivity,...t.activityEvents].sort((e,t)=>J(t)-J(e)),r=new Date().toISOString(),a=`agent-relay-timeline-${r.slice(0,10)}.${e===`json`?`json`:`md`}`;e===`json`?y(a,JSON.stringify({title:`Agent Relay Timeline`,exportedAt:r,events:n},null,2),`application/json`):y(a,Pe(n,r),`text/markdown`)},exportThread(e,t){let n=`agent-relay-thread-${f(e.peer)}.${t===`json`?`json`:`md`}`,r={title:`Thread: `+e.peer,importedHistory:e.importedHistory||[],messages:e.messages,exportedAt:new Date().toISOString()};y(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},exportPair(e,t){let n=`agent-relay-pair-${f(e.id)}.${t===`json`?`json`:`md`}`,r={title:`Pair: `+e.id,pair:e,exportedAt:new Date().toISOString()};y(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},async exportTask(n,r){let a=i().taskEventCache[n.id]||[];if(!a.length)try{a=await t(`GET`,`/tasks/`+n.id+`/events`),e({taskEventCache:{...i().taskEventCache,[n.id]:a}})}catch{}let o=`agent-relay-task-${n.id}.${r===`json`?`json`:`md`}`,s={title:`Task: `+(n.title||`#`+n.id),task:n,events:a,exportedAt:new Date().toISOString()};y(o,JSON.stringify(s,null,2),r===`json`?`application/json`:`text/markdown`)},destroy(){c(null),i().disconnectSSE(),i().stopAutoRefresh(),i().stopClock()}}),{name:`agent-relay-dashboard`,partialize:e=>({theme:e.theme,view:e.view,showOffline:e.showOffline,showBuiltIns:e.showBuiltIns,showReasoning:e.showReasoning,autoRefresh:e.autoRefresh,voiceTtsEnabled:e.voiceTtsEnabled,voiceTtsLang:e.voiceTtsLang,voiceTtsMode:e.voiceTtsMode,voiceTtsKokoroVoice:e.voiceTtsKokoroVoice,voiceTtsBrowserVoice:e.voiceTtsBrowserVoice,voiceInputMode:e.voiceInputMode,agentSort:e.agentSort,agentSortDir:e.agentSortDir,agentPresetFilter:e.agentPresetFilter,agentStatusFilter:e.agentStatusFilter,agentTagFilter:e.agentTagFilter,agentHostFilter:e.agentHostFilter,pairStatusFilter:e.pairStatusFilter,inboxSort:e.inboxSort,inboxSortDir:e.inboxSortDir,inboxShowArchived:e.inboxShowArchived,chatAgentProviderFilter:e.chatAgentProviderFilter,chatAgentStatusFilter:e.chatAgentStatusFilter,chatAgentTagFilter:e.chatAgentTagFilter,chatAgentCapFilter:e.chatAgentCapFilter,chatAgentHostFilter:e.chatAgentHostFilter,chatAgentSort:e.chatAgentSort,chatAgentSortDir:e.chatAgentSortDir,chatAgentGroupBy:e.chatAgentGroupBy,chatAgentFiltersCollapsed:e.chatAgentFiltersCollapsed,activityFilter:e.activityFilter,analyticsPeriod:e.analyticsPeriod,memoryFilters:e.memoryFilters,authToken:e.authToken,inboxReadCursors:e.inboxReadCursors,inboxArchivedThreads:e.inboxArchivedThreads,inboxDrafts:e.inboxDrafts,chatStatusEvents:e.chatStatusEvents,operatorActivity:e.operatorActivity,notifications:e.notifications,notificationUnread:e.notificationUnread,notificationSettings:e.notificationSettings,spawnOrchId:e.spawnOrchId,spawnProvider:e.spawnProvider,spawnModel:e.spawnModel,spawnEffort:e.spawnEffort,spawnProfile:e.spawnProfile,spawnCwd:e.spawnCwd,spawnApproval:e.spawnApproval,spawnWorkspaceMode:e.spawnWorkspaceMode,spawnCwdHistory:e.spawnCwdHistory})})),Ge=null;function $(e){let t=e.voiceTtsEnabled&&e.view===`chat`&&e.selectedInboxThread||null;t!==Ge&&(Ge=t,P.setActiveChat(t))}Q.subscribe($);export{Ce as a,_e as c,P as d,Se as i,ve as l,H as n,ge as o,F as r,be as s,Q as t,xe as u};
9
+ //# sourceMappingURL=store-C9VcSo05.js.map