agent-relay-server 0.60.1 → 0.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/docs/openapi.json +361 -1
  2. package/package.json +3 -2
  3. package/public/assets/{MessageBubble-vzupFQD8.js → MessageBubble-CX63ZV4X.js} +2 -2
  4. package/public/assets/{MessageBubble-vzupFQD8.js.map → MessageBubble-CX63ZV4X.js.map} +1 -1
  5. package/public/assets/{PlanGraphPanel-DQvycBMW.js → PlanGraphPanel-Dby7wq9c.js} +2 -2
  6. package/public/assets/{PlanGraphPanel-DQvycBMW.js.map → PlanGraphPanel-Dby7wq9c.js.map} +1 -1
  7. package/public/assets/{activity-gmfkOBhQ.js → activity-2xPOScu_.js} +2 -2
  8. package/public/assets/{activity-gmfkOBhQ.js.map → activity-2xPOScu_.js.map} +1 -1
  9. package/public/assets/{agent-profiles-7X8gFuwj.js → agent-profiles-BfGTTbeY.js} +2 -2
  10. package/public/assets/{agent-profiles-7X8gFuwj.js.map → agent-profiles-BfGTTbeY.js.map} +1 -1
  11. package/public/assets/agents-Bg3WOBRV.js +2 -0
  12. package/public/assets/{agents-D201CuTR.js.map → agents-Bg3WOBRV.js.map} +1 -1
  13. package/public/assets/{analytics-CkOTrr5t.js → analytics-De0cEZGx.js} +3 -3
  14. package/public/assets/{analytics-CkOTrr5t.js.map → analytics-De0cEZGx.js.map} +1 -1
  15. package/public/assets/{automation-_5u-nVs8.js → automation-CHxhzq2t.js} +2 -2
  16. package/public/assets/{automation-_5u-nVs8.js.map → automation-CHxhzq2t.js.map} +1 -1
  17. package/public/assets/{badge-Cy6qO_Jz.js → badge-DhLyCPag.js} +2 -2
  18. package/public/assets/{badge-Cy6qO_Jz.js.map → badge-DhLyCPag.js.map} +1 -1
  19. package/public/assets/branch-state-badge-DSyWKluD.js +2 -0
  20. package/public/assets/{branch-state-badge-BPXXLpQG.js.map → branch-state-badge-DSyWKluD.js.map} +1 -1
  21. package/public/assets/{button-73wpRw65.js → button-K20wAZG1.js} +2 -2
  22. package/public/assets/{button-73wpRw65.js.map → button-K20wAZG1.js.map} +1 -1
  23. package/public/assets/card-CcZ9hLI7.js +2 -0
  24. package/public/assets/{card-BU6PvVHv.js.map → card-CcZ9hLI7.js.map} +1 -1
  25. package/public/assets/{channels-BsJu5TXR.js → channels-BG0Nib7y.js} +2 -2
  26. package/public/assets/{channels-BsJu5TXR.js.map → channels-BG0Nib7y.js.map} +1 -1
  27. package/public/assets/chat-CjP_crSl.js +2 -0
  28. package/public/assets/{chat-CHgPGHQD.js.map → chat-CjP_crSl.js.map} +1 -1
  29. package/public/assets/{connectors-arjfBQvc.js → connectors-DWh7MwV_.js} +2 -2
  30. package/public/assets/{connectors-arjfBQvc.js.map → connectors-DWh7MwV_.js.map} +1 -1
  31. package/public/assets/{copy-button-HRopUwui.js → copy-button-eF3cKp4Q.js} +2 -2
  32. package/public/assets/{copy-button-HRopUwui.js.map → copy-button-eF3cKp4Q.js.map} +1 -1
  33. package/public/assets/display-DzNvOu1j.js +3 -0
  34. package/public/assets/{display-CketawEF.js.map → display-DzNvOu1j.js.map} +1 -1
  35. package/public/assets/{dist-Kkpnjx_M.js → dist-1dhfdhm9.js} +2 -2
  36. package/public/assets/{dist-Kkpnjx_M.js.map → dist-1dhfdhm9.js.map} +1 -1
  37. package/public/assets/dist-BLBF7qqr.js +2 -0
  38. package/public/assets/{dist-De2oguBm.js.map → dist-BLBF7qqr.js.map} +1 -1
  39. package/public/assets/{dist-T7u7IZGJ.js → dist-BrQsqBbc.js} +2 -2
  40. package/public/assets/{dist-T7u7IZGJ.js.map → dist-BrQsqBbc.js.map} +1 -1
  41. package/public/assets/{dist-Cko2KPW8.js → dist-COQuunEv.js} +2 -2
  42. package/public/assets/{dist-Cko2KPW8.js.map → dist-COQuunEv.js.map} +1 -1
  43. package/public/assets/{dist-CLHMeXYi.js → dist-Ci5Y37nj.js} +2 -2
  44. package/public/assets/{dist-CLHMeXYi.js.map → dist-Ci5Y37nj.js.map} +1 -1
  45. package/public/assets/{dist-Ci1MM51P.js → dist-CoROafNg.js} +2 -2
  46. package/public/assets/{dist-Ci1MM51P.js.map → dist-CoROafNg.js.map} +1 -1
  47. package/public/assets/{dist-CC5f7oYw.js → dist-I-MFUv51.js} +2 -2
  48. package/public/assets/{dist-CC5f7oYw.js.map → dist-I-MFUv51.js.map} +1 -1
  49. package/public/assets/{dist-DFLciw0h.js → dist-UQGKwqZH.js} +2 -2
  50. package/public/assets/{dist-DFLciw0h.js.map → dist-UQGKwqZH.js.map} +1 -1
  51. package/public/assets/dist-YpHfnnIA.js +2 -0
  52. package/public/assets/{dist-DUoZnlB2.js.map → dist-YpHfnnIA.js.map} +1 -1
  53. package/public/assets/dist-qd198ib9.js +2 -0
  54. package/public/assets/{dist-D41tzJYg.js.map → dist-qd198ib9.js.map} +1 -1
  55. package/public/assets/{dist-DmN94rc8.js → dist-yGOq6sB3.js} +2 -2
  56. package/public/assets/{dist-DmN94rc8.js.map → dist-yGOq6sB3.js.map} +1 -1
  57. package/public/assets/{es2015-Df08Opjx.js → es2015-CRxz9lOj.js} +2 -2
  58. package/public/assets/{es2015-Df08Opjx.js.map → es2015-CRxz9lOj.js.map} +1 -1
  59. package/public/assets/{formatted-body-impl-DBt5tnS0.js → formatted-body-impl-u0W_hWYA.js} +2 -2
  60. package/public/assets/{formatted-body-impl-DBt5tnS0.js.map → formatted-body-impl-u0W_hWYA.js.map} +1 -1
  61. package/public/assets/index-BwfVOzUG.js +21 -0
  62. package/public/assets/{index-D7js3XlH.js.map → index-BwfVOzUG.js.map} +1 -1
  63. package/public/assets/index-Dn_GDXbi.css +2 -0
  64. package/public/assets/{input-B2EDz-BE.js → input-BHYNpXAG.js} +2 -2
  65. package/public/assets/{input-B2EDz-BE.js.map → input-BHYNpXAG.js.map} +1 -1
  66. package/public/assets/{insights-BvjkOXk9.js → insights-CAF9Hi5D.js} +2 -2
  67. package/public/assets/{insights-BvjkOXk9.js.map → insights-CAF9Hi5D.js.map} +1 -1
  68. package/public/assets/{integrations-7L1f3eIE.js → integrations-CG9qyHUf.js} +2 -2
  69. package/public/assets/{integrations-7L1f3eIE.js.map → integrations-CG9qyHUf.js.map} +1 -1
  70. package/public/assets/{lib-BZrjIp-o.js → lib-Df4aph5u.js} +2 -2
  71. package/public/assets/{lib-BZrjIp-o.js.map → lib-Df4aph5u.js.map} +1 -1
  72. package/public/assets/lucide-react-L2UxFDic.js +9 -0
  73. package/public/assets/lucide-react-L2UxFDic.js.map +1 -0
  74. package/public/assets/{maintenance-BBoL--vs.js → maintenance-DgHA35ve.js} +2 -2
  75. package/public/assets/{maintenance-BBoL--vs.js.map → maintenance-DgHA35ve.js.map} +1 -1
  76. package/public/assets/{managed-agents-BjYBzVZt.js → managed-agents-Rk6ghKR9.js} +2 -2
  77. package/public/assets/{managed-agents-BjYBzVZt.js.map → managed-agents-Rk6ghKR9.js.map} +1 -1
  78. package/public/assets/{markdown-preview-impl-BnwjZsmO.js → markdown-preview-impl-NWMtJdYz.js} +2 -2
  79. package/public/assets/{markdown-preview-impl-BnwjZsmO.js.map → markdown-preview-impl-NWMtJdYz.js.map} +1 -1
  80. package/public/assets/memory-DamwWa9A.js +2 -0
  81. package/public/assets/{memory-SLycz2gC.js.map → memory-DamwWa9A.js.map} +1 -1
  82. package/public/assets/{messages-DfSCTe6N.js → messages--NU-YIL6.js} +2 -2
  83. package/public/assets/{messages-DfSCTe6N.js.map → messages--NU-YIL6.js.map} +1 -1
  84. package/public/assets/{orchestrators-BwxdTQm_.js → orchestrators-DQnIn6qx.js} +2 -2
  85. package/public/assets/{orchestrators-BwxdTQm_.js.map → orchestrators-DQnIn6qx.js.map} +1 -1
  86. package/public/assets/{overview-Djy3qkY5.js → overview-DCmNgXDf.js} +2 -2
  87. package/public/assets/{overview-Djy3qkY5.js.map → overview-DCmNgXDf.js.map} +1 -1
  88. package/public/assets/{pairs-9KNduLnC.js → pairs-DNELeC9P.js} +2 -2
  89. package/public/assets/{pairs-9KNduLnC.js.map → pairs-DNELeC9P.js.map} +1 -1
  90. package/public/assets/{react-dom-WI6TjVe7.js → react-dom-CrP_AtcL.js} +2 -2
  91. package/public/assets/{react-dom-WI6TjVe7.js.map → react-dom-CrP_AtcL.js.map} +1 -1
  92. package/public/assets/{security-tG3q7fFW.js → security-Dd3Kh0oC.js} +2 -2
  93. package/public/assets/{security-tG3q7fFW.js.map → security-Dd3Kh0oC.js.map} +1 -1
  94. package/public/assets/{select-CGUdMNOG.js → select-DQbeJZX0.js} +2 -2
  95. package/public/assets/{select-CGUdMNOG.js.map → select-DQbeJZX0.js.map} +1 -1
  96. package/public/assets/settings-BMAJrBIH.js +4 -0
  97. package/public/assets/settings-BMAJrBIH.js.map +1 -0
  98. package/public/assets/store-B8xP6z6T.js +9 -0
  99. package/public/assets/store-B8xP6z6T.js.map +1 -0
  100. package/public/assets/tasks-BYR4L9GP.js +2 -0
  101. package/public/assets/{tasks-DWlKg218.js.map → tasks-BYR4L9GP.js.map} +1 -1
  102. package/public/assets/teams-CoTifrq_.js +2 -0
  103. package/public/assets/{teams-DRchUP_p.js.map → teams-CoTifrq_.js.map} +1 -1
  104. package/public/assets/{terminal-viewer-impl-D_Sqe-vo.js → terminal-viewer-impl-B1YzfpE6.js} +3 -3
  105. package/public/assets/{terminal-viewer-impl-D_Sqe-vo.js.map → terminal-viewer-impl-B1YzfpE6.js.map} +1 -1
  106. package/public/assets/{use-keyboard-viewport-fOL_3RHB.js → use-keyboard-viewport-DrRH_QzG.js} +2 -2
  107. package/public/assets/{use-keyboard-viewport-fOL_3RHB.js.map → use-keyboard-viewport-DrRH_QzG.js.map} +1 -1
  108. package/public/assets/{work-queue-HNcyjON9.js → work-queue-x57vlgyZ.js} +2 -2
  109. package/public/assets/{work-queue-HNcyjON9.js.map → work-queue-x57vlgyZ.js.map} +1 -1
  110. package/public/assets/{workspaces-CicYE2Ax.js → workspaces-CYm5bLg9.js} +3 -3
  111. package/public/assets/{workspaces-CicYE2Ax.js.map → workspaces-CYm5bLg9.js.map} +1 -1
  112. package/public/index.html +22 -22
  113. package/runner/src/config.ts +66 -2
  114. package/src/automations.ts +3 -4
  115. package/src/config-store.ts +5 -6
  116. package/src/connectors.ts +5 -0
  117. package/src/db/migrations.ts +6 -0
  118. package/src/db/schema.ts +1 -1
  119. package/src/index.ts +5 -2
  120. package/src/mcp-provider-catalog.ts +9 -0
  121. package/src/mcp.ts +4 -4
  122. package/src/provider-catalog-store.ts +33 -4
  123. package/src/provider-config-store.ts +216 -0
  124. package/src/recipe-runner.ts +2 -1
  125. package/src/recipe-validator.ts +4 -3
  126. package/src/routes/agents-spawn.ts +2 -2
  127. package/src/routes/index.ts +12 -2
  128. package/src/routes/insights.ts +4 -3
  129. package/src/routes/provider-config.ts +89 -41
  130. package/src/routes/settings.ts +127 -0
  131. package/src/routes/steward.ts +5 -5
  132. package/src/routes/tokens.ts +32 -1
  133. package/src/security.ts +34 -37
  134. package/src/settings/modules.ts +149 -0
  135. package/src/settings/registry.ts +397 -0
  136. package/src/spawn-command.ts +5 -1
  137. package/src/team-template-config.ts +2 -2
  138. package/src/token-db.ts +20 -0
  139. package/public/assets/agents-D201CuTR.js +0 -2
  140. package/public/assets/branch-state-badge-BPXXLpQG.js +0 -2
  141. package/public/assets/card-BU6PvVHv.js +0 -2
  142. package/public/assets/chat-CHgPGHQD.js +0 -2
  143. package/public/assets/display-CketawEF.js +0 -3
  144. package/public/assets/dist-D41tzJYg.js +0 -2
  145. package/public/assets/dist-DUoZnlB2.js +0 -2
  146. package/public/assets/dist-De2oguBm.js +0 -2
  147. package/public/assets/index-D7js3XlH.js +0 -21
  148. package/public/assets/index-DaNOQJci.css +0 -2
  149. package/public/assets/lucide-react-H_-8G79A.js +0 -9
  150. package/public/assets/lucide-react-H_-8G79A.js.map +0 -1
  151. package/public/assets/memory-SLycz2gC.js +0 -2
  152. package/public/assets/settings-CGcqyJ5L.js +0 -10
  153. package/public/assets/settings-CGcqyJ5L.js.map +0 -1
  154. package/public/assets/store-DXdfhiVf.js +0 -9
  155. package/public/assets/store-DXdfhiVf.js.map +0 -1
  156. package/public/assets/tasks-DWlKg218.js +0 -2
  157. package/public/assets/teams-DRchUP_p.js +0 -2
@@ -1,2 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{D as t,E as n,Fn as r,Ht as ee,L as te,N as ne,V as re,_n as ie,m as ae,qn as i}from"./lucide-react-H_-8G79A.js";import{o as oe,t as a}from"./store-DXdfhiVf.js";import{U as o,d as se,h as s}from"./display-CketawEF.js";import{t as c}from"./badge-Cy6qO_Jz.js";import{t as l}from"./button-73wpRw65.js";import{t as u}from"./input-B2EDz-BE.js";import{M as ce,r as le,s as d}from"./index-D7js3XlH.js";import{i as f,n as p,r as m,t as h}from"./card-BU6PvVHv.js";var g=e(i(),1),_=r(),v=[`organization`,`role`,`project`,`task`,`interaction`,`agent`],ue=[`private`,`project`,`org`,`public`],de=[`public`,`normal`,`sensitive`,`secret`],y=[`reported`,`inferred`,`verified`];function b(){return{type:`project`,scope:`default`,title:``,content:``,tags:``,visibility:`project`,sensitivity:`normal`,confidence:`reported`,relevanceScore:`0.7`}}function x(e){return{type:e.type,scope:e.scope,title:e.title,content:e.content,tags:e.tags.join(`, `),visibility:e.visibility,sensitivity:e.sensitivity,confidence:e.confidence,relevanceScore:String(e.relevanceScore)}}function S(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function fe(e){let t={limit:100};e.type&&(t.type=e.type),e.scope.trim()&&(t.scope=e.scope.trim()),e.visibility&&(t.visibility=e.visibility);let n=S(e.tags);if(n.length&&(t.tags=n),e.minRelevance.trim()){let n=Number(e.minRelevance);Number.isFinite(n)&&(t.minRelevance=Math.max(0,Math.min(1,n)))}return t}function C(e){return e===`secret`?`bg-red-500/10 text-red-400 border-red-500/30`:e===`sensitive`?`bg-yellow-500/10 text-yellow-400 border-yellow-500/30`:e===`public`?`bg-blue-500/10 text-blue-400 border-blue-500/30`:`bg-zinc-500/10 text-zinc-400 border-zinc-500/30`}function w(e){return e>=.8?`text-emerald-400`:e>=.5?`text-yellow-400`:`text-zinc-400`}function pe(e){return e?Object.entries(e).map(([e,t])=>`${e}=${Array.isArray(t)?t.join(` `):String(t)}`).join(` `):`default`}function T(e){return e.filter(e=>![`system`,`user`,`channel`].includes(e.kind||``))}function E(){let e=oe(),r=a(e=>e.agents),i=a(e=>e.memories),E=a(e=>e.memoryTotal),O=a(e=>e.memoryStats),k=a(e=>e.memoryBrokerInfo),A=a(e=>e.memoryFilters),j=a(e=>e.selectedMemoryId),he=a(e=>e.memoryLoading),M=a(e=>e.set),N=a(e=>e.fetchMemories),P=a(e=>e.refreshMemory),F=a(e=>e.saveMemory),I=a(e=>e.deleteMemory),L=a(e=>e.injectMemory),R=i.find(e=>e.id===j),[z,B]=(0,g.useState)(`create`),[V,H]=(0,g.useState)(b),[U,W]=(0,g.useState)(``),[G,ge]=(0,g.useState)(`manual`),[K,_e]=(0,g.useState)(`1600`),[q,ve]=(0,g.useState)(`8`),[J,ye]=(0,g.useState)(``),Y=(0,g.useMemo)(()=>T(r),[r]);(0,g.useEffect)(()=>{!U&&Y[0]&&W(Y[0].id)},[Y,U]),(0,g.useEffect)(()=>{R&&z===`edit`&&H(x(R))},[R?.id,z]);let X=(0,g.useMemo)(()=>{let e=A.search.trim().toLowerCase();return e?i.filter(t=>[t.id,t.type,t.scope,t.title,t.content,...t.tags].some(t=>String(t).toLowerCase().includes(e))):i},[i,A.search]);function Z(e){M({memoryFilters:{...A,...e}})}async function be(){let e=Number(V.relevanceScore),t={title:V.title.trim(),content:V.content.trim(),tags:S(V.tags),visibility:V.visibility,sensitivity:V.sensitivity,confidence:V.confidence,relevanceScore:Number.isFinite(e)?Math.max(0,Math.min(1,e)):.7};if(z===`edit`&&R){await F(t,R.id);return}await F({...t,type:V.type,scope:V.scope.trim()}),B(`create`),H(b())}async function Q(e){if(!U)return;let t=await L({agentId:U,memoryIds:e,query:e?.length?void 0:fe(A),reason:G.trim()||`manual`,budget:{maxTokens:Math.max(200,Number(K)||1600),maxMemories:Math.max(1,Number(q)||8),priorityCutoff:3}});t?.command?.id&&ye(t.command.id)}function xe(){B(`create`),H(b())}function Se(){R&&(B(`edit`),H(x(R)))}let Ce=V.title.trim()&&V.content.trim()&&(z===`edit`||V.scope.trim()),$=pe(k?.config);return(0,_.jsxs)(`div`,{className:`space-y-4`,children:[(0,_.jsxs)(`div`,{className:`flex items-center justify-between gap-3 flex-wrap`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(ie,{className:`w-5 h-5 text-muted-foreground`}),(0,_.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Memory`}),(0,_.jsx)(c,{variant:`secondary`,children:O?.total??E}),k&&(0,_.jsx)(c,{className:k.external?`bg-blue-500/15 text-blue-400 border-blue-500/30`:`bg-emerald-500/15 text-emerald-400 border-emerald-500/30`,children:k.type})]}),(0,_.jsxs)(l,{size:`sm`,variant:`outline`,className:`gap-1.5`,onClick:()=>P(),children:[(0,_.jsx)(ne,{className:`w-3.5 h-3.5 ${he?`animate-spin`:``}`}),`Refresh`]})]}),(0,_.jsxs)(`div`,{className:`grid gap-3 xl:grid-cols-[1.2fr_0.8fr]`,children:[(0,_.jsxs)(h,{children:[(0,_.jsx)(m,{className:`py-3 px-4`,children:(0,_.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,_.jsxs)(f,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,_.jsx)(ee,{className:`w-4 h-4 text-muted-foreground`}),`Broker`]}),k?.capabilities&&(0,_.jsx)(`div`,{className:`flex flex-wrap gap-1 justify-end`,children:Object.entries(k.capabilities).filter(([,e])=>!!e).map(([e])=>(0,_.jsx)(c,{variant:`outline`,className:`text-[10px] px-1.5 py-0`,children:e},e))})]})}),(0,_.jsxs)(p,{className:`px-4 pb-4 space-y-3`,children:[(0,_.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-2`,children:[(0,_.jsx)(D,{label:`total`,value:O?.total??E}),(0,_.jsx)(D,{label:`project`,value:O?.byType?.project??0}),(0,_.jsx)(D,{label:`task`,value:O?.byType?.task??0}),(0,_.jsx)(D,{label:`agent`,value:O?.byType?.agent??0}),(0,_.jsx)(D,{label:`sensitive`,value:(O?.bySensitivity?.sensitive??0)+(O?.bySensitivity?.secret??0)})]}),(0,_.jsx)(`div`,{className:`font-mono text-xs text-muted-foreground truncate`,title:$,children:$})]})]}),(0,_.jsxs)(h,{children:[(0,_.jsx)(m,{className:`py-3 px-4`,children:(0,_.jsx)(f,{className:`text-sm font-medium`,children:`Inject`})}),(0,_.jsxs)(p,{className:`px-4 pb-4 space-y-2`,children:[(0,_.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-2`,children:[(0,_.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:U,onChange:e=>W(e.target.value),children:[(0,_.jsx)(`option`,{value:``,children:`Agent`}),Y.map(e=>(0,_.jsx)(`option`,{value:e.id,children:se(e)},e.id))]}),(0,_.jsx)(u,{value:G,onChange:e=>ge(e.target.value),placeholder:`reason`}),(0,_.jsx)(u,{value:K,onChange:e=>_e(e.target.value),inputMode:`numeric`,placeholder:`tokens`}),(0,_.jsx)(u,{value:q,onChange:e=>ve(e.target.value),inputMode:`numeric`,placeholder:`memories`})]}),(0,_.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,_.jsxs)(l,{size:`sm`,className:`gap-1.5`,disabled:!U||!R,onClick:()=>R&&Q([R.id]),children:[(0,_.jsx)(n,{className:`w-3.5 h-3.5`}),`Selected`]}),(0,_.jsxs)(l,{size:`sm`,variant:`outline`,className:`gap-1.5`,disabled:!U,onClick:()=>Q(),children:[(0,_.jsx)(t,{className:`w-3.5 h-3.5`}),`Filtered`]}),J&&(0,_.jsx)(c,{variant:`outline`,className:`font-mono text-[10px]`,children:J})]})]})]})]}),(0,_.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(0,1fr)_420px]`,children:[(0,_.jsxs)(`div`,{className:`space-y-3`,children:[(0,_.jsx)(h,{children:(0,_.jsx)(p,{className:`p-3`,children:(0,_.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-6 gap-2`,children:[(0,_.jsx)(u,{className:`lg:col-span-2`,value:A.search,onChange:e=>Z({search:e.target.value}),placeholder:`Search visible memories`}),(0,_.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:A.type,onChange:e=>Z({type:e.target.value}),children:[(0,_.jsx)(`option`,{value:``,children:`All types`}),v.map(e=>(0,_.jsx)(`option`,{value:e,children:e},e))]}),(0,_.jsx)(u,{value:A.scope,onChange:e=>Z({scope:e.target.value}),placeholder:`scope`}),(0,_.jsx)(u,{value:A.tags,onChange:e=>Z({tags:e.target.value}),placeholder:`tags`}),(0,_.jsxs)(`div`,{className:`flex gap-2`,children:[(0,_.jsx)(u,{value:A.minRelevance,onChange:e=>Z({minRelevance:e.target.value}),placeholder:`score`}),(0,_.jsx)(l,{size:`sm`,variant:`outline`,className:`h-8 px-2`,onClick:()=>N(),children:(0,_.jsx)(t,{className:`w-4 h-4`})})]})]})})}),(0,_.jsx)(d,{className:`h-[calc(100dvh-24rem)] min-h-[360px]`,children:(0,_.jsxs)(`div`,{className:`space-y-2 pr-2`,children:[X.length===0&&(0,_.jsx)(`div`,{className:`text-center text-sm text-muted-foreground py-16`,children:`No memories`}),X.map(t=>(0,_.jsx)(me,{memory:t,selected:t.id===j,now:e,onSelect:()=>M({selectedMemoryId:t.id})},t.id))]})})]}),(0,_.jsxs)(h,{children:[(0,_.jsx)(m,{className:`py-3 px-4`,children:(0,_.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,_.jsx)(f,{className:`text-sm font-medium`,children:z===`edit`?`Edit Memory`:`New Memory`}),(0,_.jsxs)(`div`,{className:`flex gap-1`,children:[(0,_.jsx)(l,{size:`sm`,variant:`ghost`,className:`h-7 px-2`,onClick:xe,title:`New memory`,children:(0,_.jsx)(te,{className:`w-3.5 h-3.5`})}),(0,_.jsx)(l,{size:`sm`,variant:`ghost`,className:`h-7 px-2`,onClick:Se,disabled:!R,title:`Edit selected`,children:(0,_.jsx)(re,{className:`w-3.5 h-3.5`})}),(0,_.jsx)(l,{size:`sm`,variant:`ghost`,className:`h-7 px-2 text-red-400 hover:text-red-300`,disabled:!R,onClick:()=>R&&I(R.id),title:`Delete selected`,children:(0,_.jsx)(ae,{className:`w-3.5 h-3.5`})})]})]})}),(0,_.jsxs)(p,{className:`px-4 pb-4 space-y-3`,children:[R&&(0,_.jsxs)(_.Fragment,{children:[(0,_.jsxs)(`div`,{className:`space-y-2`,children:[(0,_.jsxs)(`div`,{className:`flex flex-wrap gap-1`,children:[(0,_.jsx)(c,{variant:`secondary`,children:R.type}),(0,_.jsx)(c,{variant:`outline`,children:R.scope}),(0,_.jsx)(c,{className:C(R.sensitivity),children:R.sensitivity}),(0,_.jsx)(c,{variant:`outline`,className:w(R.relevanceScore),children:R.relevanceScore.toFixed(2)})]}),(0,_.jsxs)(`div`,{className:`text-xs text-muted-foreground`,title:s(R.updatedAt),children:[`updated `,o(e,R.updatedAt)]}),(0,_.jsx)(`p`,{className:`text-sm font-medium`,children:R.title}),(0,_.jsx)(`p`,{className:`text-xs text-muted-foreground whitespace-pre-wrap max-h-24 overflow-auto`,children:R.content})]}),(0,_.jsx)(ce,{})]}),(0,_.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,_.jsx)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,disabled:z===`edit`,value:V.type,onChange:e=>H({...V,type:e.target.value}),children:v.map(e=>(0,_.jsx)(`option`,{value:e,children:e},e))}),(0,_.jsx)(u,{disabled:z===`edit`,value:V.scope,onChange:e=>H({...V,scope:e.target.value}),placeholder:`scope`}),(0,_.jsx)(u,{className:`col-span-2`,value:V.title,onChange:e=>H({...V,title:e.target.value}),placeholder:`title`}),(0,_.jsx)(le,{className:`col-span-2 min-h-32`,value:V.content,onChange:e=>H({...V,content:e.target.value}),placeholder:`content`}),(0,_.jsx)(u,{className:`col-span-2`,value:V.tags,onChange:e=>H({...V,tags:e.target.value}),placeholder:`tags`}),(0,_.jsx)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:V.visibility,onChange:e=>H({...V,visibility:e.target.value}),children:ue.map(e=>(0,_.jsx)(`option`,{value:e,children:e},e))}),(0,_.jsx)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:V.sensitivity,onChange:e=>H({...V,sensitivity:e.target.value}),children:de.map(e=>(0,_.jsx)(`option`,{value:e,children:e},e))}),(0,_.jsx)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:V.confidence,onChange:e=>H({...V,confidence:e.target.value}),children:y.map(e=>(0,_.jsx)(`option`,{value:e,children:e},e))}),(0,_.jsx)(u,{value:V.relevanceScore,onChange:e=>H({...V,relevanceScore:e.target.value}),inputMode:`decimal`,placeholder:`score`})]}),(0,_.jsx)(l,{size:`sm`,className:`w-full`,disabled:!Ce,onClick:be,children:z===`edit`?`Save memory`:`Create memory`})]})]})]})]})}function D({label:e,value:t}){return(0,_.jsxs)(`div`,{className:`rounded-md border border-border bg-muted/20 px-3 py-2`,children:[(0,_.jsx)(`div`,{className:`text-lg font-semibold tabular-nums`,children:t}),(0,_.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e})]})}function me({memory:e,selected:t,now:n,onSelect:r}){return(0,_.jsx)(`button`,{onClick:r,className:`w-full text-left rounded-md border p-3 transition-colors ${t?`border-primary bg-primary/5`:`border-border bg-card hover:border-zinc-600`}`,children:(0,_.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,_.jsxs)(`div`,{className:`min-w-0`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-1.5 flex-wrap`,children:[(0,_.jsx)(c,{variant:`secondary`,className:`text-[10px]`,children:e.type}),(0,_.jsx)(c,{variant:`outline`,className:`text-[10px] font-mono`,children:e.scope}),(0,_.jsx)(c,{className:`text-[10px] ${C(e.sensitivity)}`,children:e.sensitivity})]}),(0,_.jsx)(`div`,{className:`font-medium text-sm mt-2 truncate`,children:e.title}),(0,_.jsx)(`div`,{className:`text-xs text-muted-foreground line-clamp-2 mt-1`,children:e.content}),e.tags.length>0&&(0,_.jsx)(`div`,{className:`flex gap-1 flex-wrap mt-2`,children:e.tags.slice(0,8).map(e=>(0,_.jsxs)(c,{variant:`outline`,className:`text-[10px] text-zinc-400`,children:[`#`,e]},e))})]}),(0,_.jsxs)(`div`,{className:`text-right shrink-0 space-y-1`,children:[(0,_.jsx)(`div`,{className:`text-sm font-semibold tabular-nums ${w(e.relevanceScore)}`,children:e.relevanceScore.toFixed(2)}),(0,_.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,title:s(e.updatedAt),children:o(n,e.updatedAt)}),e.accessCount>0&&(0,_.jsxs)(`div`,{className:`text-[10px] text-muted-foreground`,children:[e.accessCount,` hits`]})]})]})})}export{E as MemoryView};
2
- //# sourceMappingURL=memory-SLycz2gC.js.map
@@ -1,10 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{Dt as t,Fn as n,In as r,O as i,bt as a,c as o,g as s,gn as c,h as l,qn as u,xt as d}from"./lucide-react-H_-8G79A.js";import{c as f,t as p,u as m}from"./store-DXdfhiVf.js";import{a as h,i as g,n as _,r as v,t as y}from"./select-CGUdMNOG.js";import{t as b}from"./button-73wpRw65.js";import{t as x}from"./input-B2EDz-BE.js";import{N as S,r as C}from"./index-D7js3XlH.js";var w=e(u(),1),T=n(),E=[`claude`,`codex`];function D(){let[e,t]=(0,w.useState)({}),[n,a]=(0,w.useState)(`claude`),[o,c]=(0,w.useState)(``);(0,w.useEffect)(()=>{r(`GET`,`/providers/config`).then(t).catch(e=>c(e.message))},[]);let u=e[n],d=r=>{u&&t({...e,[n]:{...u,...r}})};async function f(){if(!u)return;let i=await r(`PUT`,`/providers/${n}/config`,u);t({...e,[n]:i}),c(`${n} saved`)}async function p(){let e=await r(`POST`,`/providers/${n}/config/test`);c(e.ok?`${n} command: ${e.path||`found`}`:e.error||`command not found`)}return(0,T.jsxs)(`div`,{className:`space-y-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h1`,{className:`text-xl font-semibold`,children:`Settings`}),(0,T.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Provider runner configuration`})]}),(0,T.jsx)(`div`,{className:`flex gap-2`,children:E.map(e=>(0,T.jsxs)(b,{variant:n===e?`default`:`outline`,onClick:()=>a(e),children:[(0,T.jsx)(s,{className:`w-4 h-4`}),e]},e))})]}),u&&(0,T.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]`,children:[(0,T.jsxs)(`section`,{className:`space-y-3`,children:[(0,T.jsx)(L,{label:`Command`,children:(0,T.jsx)(x,{value:u.command,onChange:e=>d({command:e.target.value})})}),(0,T.jsx)(L,{label:`Default arguments`,children:(0,T.jsx)(C,{rows:3,value:u.defaultArgs.join(`
2
- `),onChange:e=>d({defaultArgs:R(e.target.value)})})}),(0,T.jsx)(L,{label:`Plugin directories`,children:(0,T.jsx)(C,{rows:3,value:u.pluginDirs.join(`
3
- `),onChange:e=>d({pluginDirs:R(e.target.value)})})}),(0,T.jsx)(L,{label:`Environment`,children:(0,T.jsx)(C,{rows:5,value:z(u.env),onChange:e=>d({env:B(e.target.value)})})})]}),(0,T.jsxs)(`section`,{className:`space-y-3`,children:[(0,T.jsx)(L,{label:`Capabilities`,children:(0,T.jsx)(C,{rows:3,value:u.defaultCapabilities.join(`
4
- `),onChange:e=>d({defaultCapabilities:R(e.target.value)})})}),(0,T.jsx)(L,{label:`Tags`,children:(0,T.jsx)(C,{rows:3,value:u.defaultTags.join(`
5
- `),onChange:e=>d({defaultTags:R(e.target.value)})})}),(0,T.jsx)(L,{label:`Approval mode`,children:(0,T.jsx)(x,{value:u.defaultApprovalMode,onChange:e=>d({defaultApprovalMode:e.target.value})})}),(0,T.jsx)(L,{label:`Chat capture mode`,children:(0,T.jsxs)(y,{value:u.chatCaptureMode??`final`,onValueChange:e=>d({chatCaptureMode:e}),children:[(0,T.jsx)(g,{children:(0,T.jsx)(h,{})}),(0,T.jsxs)(_,{children:[(0,T.jsx)(v,{value:`final`,children:`Final response only`}),(0,T.jsx)(v,{value:`full`,children:`Full turn (intermediate messages)`})]})]})}),(0,T.jsx)(L,{label:`tmux prefix`,children:(0,T.jsx)(x,{value:u.headless.tmuxPrefix,onChange:e=>d({headless:{...u.headless,tmuxPrefix:e.target.value}})})}),(0,T.jsx)(L,{label:`Shutdown timeout`,children:(0,T.jsx)(x,{type:`number`,value:u.headless.shutdownTimeoutMs,onChange:e=>d({headless:{...u.headless,shutdownTimeoutMs:Number(e.target.value)||1e4}})})}),(0,T.jsxs)(`div`,{className:`flex gap-2 pt-2`,children:[(0,T.jsxs)(b,{onClick:f,children:[(0,T.jsx)(i,{className:`w-4 h-4`}),`Save`]}),(0,T.jsxs)(b,{variant:`outline`,onClick:p,children:[(0,T.jsx)(l,{className:`w-4 h-4`}),`Test`]})]}),o&&(0,T.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:o})]})]}),(0,T.jsx)(M,{}),(0,T.jsx)(k,{}),(0,T.jsx)(j,{}),(0,T.jsx)(I,{}),(0,T.jsx)(N,{})]})}var O={symlinkPaths:[]};function k(){let[e,n]=(0,w.useState)(O),[a,o]=(0,w.useState)(``);(0,w.useEffect)(()=>{r(`GET`,`/workspace-config`).then(e=>n({...O,...e.value})).catch(e=>o(e.message))},[]);async function s(){try{let t=await r(`PUT`,`/workspace-config`,e);n({...O,...t.value}),o(`Workspace config saved`)}catch(e){o(e.message)}}return(0,T.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(t,{className:`w-4 h-4`}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Isolated worktree symlinks`}),(0,T.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Untracked files or filename patterns symlinked from main into each isolated worktree (the "Workspace" spawn option), one per line. Plain names like `,(0,T.jsx)(`code`,{children:`AGENTS.md`}),` or `,(0,T.jsx)(`code`,{children:`.claude-rig`}),` match files and directories; entries with `,(0,T.jsxs)(`code`,{children:[`*?[]`,`{}`]}),` are expanded as globs. A path is only linked if it exists in main.`]})]})]}),(0,T.jsx)(L,{label:`Paths / patterns`,children:(0,T.jsx)(C,{rows:5,placeholder:`AGENTS.md
6
- .claude-rig`,value:e.symlinkPaths.join(`
7
- `),onChange:t=>n({...e,symlinkPaths:R(t.target.value)})})}),(0,T.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,T.jsxs)(b,{onClick:s,children:[(0,T.jsx)(i,{className:`w-4 h-4`}),`Save`]}),a&&(0,T.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:a})]})]})}var A={strategy:`direct`};function j(){let[e,t]=(0,w.useState)(A),[n,o]=(0,w.useState)(``);(0,w.useEffect)(()=>{r(`GET`,`/config/landing/default`).then(e=>t({...A,...e.value})).catch(e=>{if(e.status===404){t(A);return}o(e.message)})},[]);async function s(){try{let n=await r(`PUT`,`/config/landing/default`,{value:e,updatedBy:`dashboard`});t({...A,...n.value}),o(`Landing config saved`)}catch(e){o(e.message)}}return(0,T.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(a,{className:`w-4 h-4`}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Branch landing`}),(0,T.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Instance default for lands without an explicit strategy. PR opens a pull request and Relay auto-completes on green; direct merges straight to main.`})]})]}),(0,T.jsx)(L,{label:`Branch landing strategy`,children:(0,T.jsxs)(y,{value:e.strategy,onValueChange:e=>t({strategy:e}),children:[(0,T.jsx)(g,{children:(0,T.jsx)(h,{})}),(0,T.jsxs)(_,{children:[(0,T.jsx)(v,{value:`direct`,children:`Direct`}),(0,T.jsx)(v,{value:`pr`,children:`Pull request`})]})]})}),(0,T.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,T.jsxs)(b,{onClick:s,children:[(0,T.jsx)(i,{className:`w-4 h-4`}),`Save`]}),n&&(0,T.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n})]})]})}function M(){let e=p(e=>e.showReasoning),t=p(e=>e.set);return(0,T.jsx)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:(0,T.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(c,{className:`w-4 h-4`}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Show reasoning details`}),(0,T.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Show the agent's internal thinking inline in chat, alongside its narration and tool steps. Off by default — narration is always shown either way.`})]})]}),(0,T.jsx)(S,{checked:e,onCheckedChange:e=>t({showReasoning:e})})]})})}function N(){let e=p(e=>e.voiceTtsEnabled),t=p(e=>e.setVoiceTtsEnabled),n=p(e=>e.voiceTtsMode),r=p(e=>e.setVoiceTtsMode),i=p(e=>e.voiceTtsKokoroVoice),a=p(e=>e.setVoiceTtsKokoroVoice),s=p(e=>e.voiceTtsBrowserVoice),c=p(e=>e.setVoiceTtsBrowserVoice),l=p(e=>e.voiceInputMode),u=p(e=>e.setVoiceInputMode),[d,b]=(0,w.useState)(()=>m());(0,w.useEffect)(()=>{if(typeof window>`u`||!(`speechSynthesis`in window))return;let e=()=>b(m());return e(),window.speechSynthesis.addEventListener?.(`voiceschanged`,e),()=>window.speechSynthesis.removeEventListener?.(`voiceschanged`,e)},[]);let x=f.some(e=>e.id===i)?f:[...f,{id:i,label:i}];return(0,T.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(o,{className:`w-4 h-4`}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Voice`}),(0,T.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Speak agent responses aloud in the active chat, and how push-to-talk behaves.`})]})]}),(0,T.jsx)(S,{checked:e,onCheckedChange:t})]}),(0,T.jsx)(L,{label:`Speech engine`,children:(0,T.jsxs)(y,{value:n,onValueChange:e=>r(e),children:[(0,T.jsx)(g,{children:(0,T.jsx)(h,{})}),(0,T.jsxs)(_,{children:[(0,T.jsx)(v,{value:`kokoro`,children:`Kokoro (server, natural — falls back to browser)`}),(0,T.jsx)(v,{value:`browser`,children:`Browser (Web Speech API)`})]})]})}),(0,T.jsx)(L,{label:`Kokoro voice`,children:(0,T.jsxs)(y,{value:i,onValueChange:a,children:[(0,T.jsx)(g,{children:(0,T.jsx)(h,{})}),(0,T.jsx)(_,{children:x.map(e=>(0,T.jsx)(v,{value:e.id,children:e.label},e.id))})]})}),(0,T.jsx)(L,{label:`Browser voice`,children:(0,T.jsxs)(y,{value:s||`__default__`,onValueChange:e=>c(e===`__default__`?``:e),children:[(0,T.jsx)(g,{children:(0,T.jsx)(h,{})}),(0,T.jsxs)(_,{children:[(0,T.jsx)(v,{value:`__default__`,children:`System default`}),d.map(e=>(0,T.jsx)(v,{value:e.uri,children:e.label},e.uri))]})]})}),(0,T.jsx)(L,{label:`Push-to-talk input`,children:(0,T.jsxs)(y,{value:l,onValueChange:e=>u(e),children:[(0,T.jsx)(g,{children:(0,T.jsx)(h,{})}),(0,T.jsxs)(_,{children:[(0,T.jsx)(v,{value:`compose`,children:`Fill the message box (review, then Enter)`}),(0,T.jsx)(v,{value:`autosend`,children:`Send immediately (speak-and-send)`})]})]})})]})}var P=[`low`,`medium`,`high`,`xhigh`,`max`],F={enabled:!1,provider:`claude`,permissionMode:`open`,keepaliveSeconds:300};function I(){let[e,t]=(0,w.useState)(F),[n,a]=(0,w.useState)(``);(0,w.useEffect)(()=>{r(`GET`,`/steward-config`).then(e=>t({...F,...e.value})).catch(e=>a(e.message))},[]);let o=e=>t(t=>({...t,...e}));async function s(){try{let n=await r(`PUT`,`/steward-config`,e);t({...F,...n.value}),a(`Steward config saved`)}catch(e){a(e.message)}}return(0,T.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(d,{className:`w-4 h-4`}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Stewards`}),(0,T.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Auto-resolve merge conflicts & diverged branches across all repos. Provider-independent — applies to every repo's steward.`})]})]}),(0,T.jsx)(S,{checked:e.enabled,onCheckedChange:e=>o({enabled:e})})]}),(0,T.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,T.jsx)(L,{label:`Provider`,children:(0,T.jsxs)(y,{value:e.provider,onValueChange:e=>o({provider:e}),children:[(0,T.jsx)(g,{children:(0,T.jsx)(h,{})}),(0,T.jsx)(_,{children:E.map(e=>(0,T.jsx)(v,{value:e,children:e},e))})]})}),(0,T.jsx)(L,{label:`Model (optional)`,children:(0,T.jsx)(x,{value:e.model??``,placeholder:`e.g. gpt-5.5`,onChange:e=>o({model:e.target.value.trim()||void 0})})}),(0,T.jsx)(L,{label:`Effort`,children:(0,T.jsxs)(y,{value:e.effort??`default`,onValueChange:e=>o({effort:e===`default`?void 0:e}),children:[(0,T.jsx)(g,{children:(0,T.jsx)(h,{})}),(0,T.jsxs)(_,{children:[(0,T.jsx)(v,{value:`default`,children:`Provider default`}),P.map(e=>(0,T.jsx)(v,{value:e,children:e},e))]})]})}),(0,T.jsx)(L,{label:`Idle timeout (seconds)`,children:(0,T.jsx)(x,{type:`number`,value:e.keepaliveSeconds,onChange:e=>o({keepaliveSeconds:Number(e.target.value)||300})})})]}),(0,T.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,T.jsxs)(b,{onClick:s,children:[(0,T.jsx)(i,{className:`w-4 h-4`}),`Save`]}),n&&(0,T.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n})]})]})}function L({label:e,children:t}){return(0,T.jsxs)(`label`,{className:`block space-y-1.5 text-sm`,children:[(0,T.jsx)(`span`,{className:`text-muted-foreground`,children:e}),t]})}function R(e){return e.split(`
8
- `).map(e=>e.trim()).filter(Boolean)}function z(e){return Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
9
- `)}function B(e){return Object.fromEntries(R(e).map(e=>{let t=e.indexOf(`=`);return t>=0?[e.slice(0,t).trim(),e.slice(t+1)]:[e,``]}))}export{D as SettingsView};
10
- //# sourceMappingURL=settings-CGcqyJ5L.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-CGcqyJ5L.js","names":[],"sources":["../../dashboard/src/components/views/settings.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport { api } from '@/lib/api'\nimport { useRelayStore } from '@/store'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Textarea } from '@/components/ui/textarea'\nimport { Switch } from '@/components/ui/switch'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { KOKORO_VOICES, availableSpeechVoices } from '@/lib/voice'\nimport { Brain, FolderSymlink, GitMerge, GitPullRequest, Save, Terminal, TestTube2, Volume2 } from 'lucide-react'\n\ntype ProviderName = 'claude' | 'codex'\n\ninterface ProviderConfig {\n command: string\n defaultArgs: string[]\n env: Record<string, string>\n pluginDirs: string[]\n defaultCapabilities: string[]\n defaultApprovalMode: string\n defaultTags: string[]\n chatCaptureMode: 'final' | 'full'\n headless: {\n tmuxPrefix: string\n shutdownTimeoutMs: number\n }\n}\n\nconst providers: ProviderName[] = ['claude', 'codex']\n\nexport function SettingsView() {\n const [configs, setConfigs] = useState<Record<string, ProviderConfig>>({})\n const [selected, setSelected] = useState<ProviderName>('claude')\n const [status, setStatus] = useState('')\n\n useEffect(() => {\n api<Record<string, ProviderConfig>>('GET', '/providers/config')\n .then(setConfigs)\n .catch((e) => setStatus((e as Error).message))\n }, [])\n\n const config = configs[selected]\n const update = (patch: Partial<ProviderConfig>) => {\n if (!config) return\n setConfigs({ ...configs, [selected]: { ...config, ...patch } })\n }\n\n async function save() {\n if (!config) return\n const saved = await api<ProviderConfig>('PUT', `/providers/${selected}/config`, config)\n setConfigs({ ...configs, [selected]: saved })\n setStatus(`${selected} saved`)\n }\n\n async function test() {\n const result = await api<{ ok: boolean; path?: string; error?: string }>('POST', `/providers/${selected}/config/test`)\n setStatus(result.ok ? `${selected} command: ${result.path || 'found'}` : result.error || 'command not found')\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-xl font-semibold\">Settings</h1>\n <p className=\"text-sm text-muted-foreground\">Provider runner configuration</p>\n </div>\n <div className=\"flex gap-2\">\n {providers.map((provider) => (\n <Button key={provider} variant={selected === provider ? 'default' : 'outline'} onClick={() => setSelected(provider)}>\n <Terminal className=\"w-4 h-4\" />{provider}\n </Button>\n ))}\n </div>\n </div>\n\n {config && (\n <div className=\"grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]\">\n <section className=\"space-y-3\">\n <Field label=\"Command\">\n <Input value={config.command} onChange={(e) => update({ command: e.target.value })} />\n </Field>\n <Field label=\"Default arguments\">\n <Textarea rows={3} value={config.defaultArgs.join('\\n')} onChange={(e) => update({ defaultArgs: lines(e.target.value) })} />\n </Field>\n <Field label=\"Plugin directories\">\n <Textarea rows={3} value={config.pluginDirs.join('\\n')} onChange={(e) => update({ pluginDirs: lines(e.target.value) })} />\n </Field>\n <Field label=\"Environment\">\n <Textarea rows={5} value={recordLines(config.env)} onChange={(e) => update({ env: parseRecordLines(e.target.value) })} />\n </Field>\n </section>\n\n <section className=\"space-y-3\">\n <Field label=\"Capabilities\">\n <Textarea rows={3} value={config.defaultCapabilities.join('\\n')} onChange={(e) => update({ defaultCapabilities: lines(e.target.value) })} />\n </Field>\n <Field label=\"Tags\">\n <Textarea rows={3} value={config.defaultTags.join('\\n')} onChange={(e) => update({ defaultTags: lines(e.target.value) })} />\n </Field>\n <Field label=\"Approval mode\">\n <Input value={config.defaultApprovalMode} onChange={(e) => update({ defaultApprovalMode: e.target.value })} />\n </Field>\n <Field label=\"Chat capture mode\">\n <Select value={config.chatCaptureMode ?? 'final'} onValueChange={(v) => update({ chatCaptureMode: v as 'final' | 'full' })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"final\">Final response only</SelectItem>\n <SelectItem value=\"full\">Full turn (intermediate messages)</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"tmux prefix\">\n <Input value={config.headless.tmuxPrefix} onChange={(e) => update({ headless: { ...config.headless, tmuxPrefix: e.target.value } })} />\n </Field>\n <Field label=\"Shutdown timeout\">\n <Input type=\"number\" value={config.headless.shutdownTimeoutMs} onChange={(e) => update({ headless: { ...config.headless, shutdownTimeoutMs: Number(e.target.value) || 10000 } })} />\n </Field>\n <div className=\"flex gap-2 pt-2\">\n <Button onClick={save}><Save className=\"w-4 h-4\" />Save</Button>\n <Button variant=\"outline\" onClick={test}><TestTube2 className=\"w-4 h-4\" />Test</Button>\n </div>\n {status && <p className=\"text-sm text-muted-foreground\">{status}</p>}\n </section>\n </div>\n )}\n\n <ChatDisplaySettings />\n\n <WorkspaceSettings />\n\n <LandingSettings />\n\n <StewardSettings />\n\n <VoiceSettings />\n </div>\n )\n}\n\ninterface WorkspaceConfig {\n symlinkPaths: string[]\n}\n\nconst DEFAULT_WORKSPACE: WorkspaceConfig = { symlinkPaths: [] }\n\n// Global isolated-worktree provisioning (#159 follow-up). A fresh git worktree only has\n// git-tracked files; node_modules are symlinked automatically and these extra untracked\n// paths are too. Only links what actually exists in main — missing entries are ignored.\nfunction WorkspaceSettings() {\n const [config, setConfig] = useState<WorkspaceConfig>(DEFAULT_WORKSPACE)\n const [status, setStatus] = useState('')\n\n useEffect(() => {\n api<{ value: WorkspaceConfig }>('GET', '/workspace-config')\n .then((entry) => setConfig({ ...DEFAULT_WORKSPACE, ...entry.value }))\n .catch((e) => setStatus((e as Error).message))\n }, [])\n\n async function save() {\n try {\n const saved = await api<{ value: WorkspaceConfig }>('PUT', '/workspace-config', config)\n setConfig({ ...DEFAULT_WORKSPACE, ...saved.value })\n setStatus('Workspace config saved')\n } catch (e) {\n setStatus((e as Error).message)\n }\n }\n\n return (\n <section className=\"space-y-3 rounded-lg border p-4\">\n <div className=\"flex items-center gap-2\">\n <FolderSymlink className=\"w-4 h-4\" />\n <div>\n <h2 className=\"text-sm font-semibold\">Isolated worktree symlinks</h2>\n <p className=\"text-xs text-muted-foreground\">\n Untracked files or filename patterns symlinked from main into each isolated worktree (the &quot;Workspace&quot; spawn option), one per line. Plain names like <code>AGENTS.md</code> or <code>.claude-rig</code> match files and directories; entries with <code>*?[]{'{}'}</code> are expanded as globs. A path is only linked if it exists in main.\n </p>\n </div>\n </div>\n <Field label=\"Paths / patterns\">\n <Textarea\n rows={5}\n placeholder={'AGENTS.md\\n.claude-rig'}\n value={config.symlinkPaths.join('\\n')}\n onChange={(e) => setConfig({ ...config, symlinkPaths: lines(e.target.value) })}\n />\n </Field>\n <div className=\"flex items-center gap-2 pt-1\">\n <Button onClick={save}><Save className=\"w-4 h-4\" />Save</Button>\n {status && <p className=\"text-sm text-muted-foreground\">{status}</p>}\n </div>\n </section>\n )\n}\n\ntype LandingStrategy = 'direct' | 'pr'\n\ninterface LandingConfig {\n strategy: LandingStrategy\n}\n\ninterface ConfigEntry<T> {\n value: T\n}\n\nconst DEFAULT_LANDING: LandingConfig = { strategy: 'direct' }\n\nfunction LandingSettings() {\n const [config, setConfig] = useState<LandingConfig>(DEFAULT_LANDING)\n const [status, setStatus] = useState('')\n\n useEffect(() => {\n api<ConfigEntry<LandingConfig>>('GET', '/config/landing/default')\n .then((entry) => setConfig({ ...DEFAULT_LANDING, ...entry.value }))\n .catch((e) => {\n if ((e as { status?: number }).status === 404) {\n setConfig(DEFAULT_LANDING)\n return\n }\n setStatus((e as Error).message)\n })\n }, [])\n\n async function save() {\n try {\n const saved = await api<ConfigEntry<LandingConfig>>('PUT', '/config/landing/default', { value: config, updatedBy: 'dashboard' })\n setConfig({ ...DEFAULT_LANDING, ...saved.value })\n setStatus('Landing config saved')\n } catch (e) {\n setStatus((e as Error).message)\n }\n }\n\n return (\n <section className=\"space-y-3 rounded-lg border p-4\">\n <div className=\"flex items-center gap-2\">\n <GitPullRequest className=\"w-4 h-4\" />\n <div>\n <h2 className=\"text-sm font-semibold\">Branch landing</h2>\n <p className=\"text-xs text-muted-foreground\">Instance default for lands without an explicit strategy. PR opens a pull request and Relay auto-completes on green; direct merges straight to main.</p>\n </div>\n </div>\n\n <Field label=\"Branch landing strategy\">\n <Select value={config.strategy} onValueChange={(v) => setConfig({ strategy: v as LandingStrategy })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"direct\">Direct</SelectItem>\n <SelectItem value=\"pr\">Pull request</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n\n <div className=\"flex items-center gap-2 pt-1\">\n <Button onClick={save}><Save className=\"w-4 h-4\" />Save</Button>\n {status && <p className=\"text-sm text-muted-foreground\">{status}</p>}\n </div>\n </section>\n )\n}\n\n// Chat display: per-viewer rendering preferences for the Chat panel. These are\n// client-side (persisted in the browser), not provider config — toggling is instant\n// and retroactive. Reasoning steps are still captured by the runner; this only\n// controls whether they're shown. The agent's narration (the terminal's `●` lines)\n// is always shown.\nfunction ChatDisplaySettings() {\n const showReasoning = useRelayStore((s) => s.showReasoning)\n const set = useRelayStore((s) => s.set)\n return (\n <section className=\"space-y-3 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <Brain className=\"w-4 h-4\" />\n <div>\n <h2 className=\"text-sm font-semibold\">Show reasoning details</h2>\n <p className=\"text-xs text-muted-foreground\">Show the agent&apos;s internal thinking inline in chat, alongside its narration and tool steps. Off by default — narration is always shown either way.</p>\n </div>\n </div>\n <Switch checked={showReasoning} onCheckedChange={(v) => set({ showReasoning: v })} />\n </div>\n </section>\n )\n}\n\n// Voice settings: TTS output (speak agent responses — engine + per-engine voice)\n// and the push-to-talk mic-input behaviour. TTS config used to live inline in the\n// chat header; it moved here to declutter the header (especially on mobile). The\n// header keeps only the speaker on/off toggle for quick muting.\nfunction VoiceSettings() {\n const voiceTtsEnabled = useRelayStore((s) => s.voiceTtsEnabled)\n const setVoiceTtsEnabled = useRelayStore((s) => s.setVoiceTtsEnabled)\n const voiceTtsMode = useRelayStore((s) => s.voiceTtsMode)\n const setVoiceTtsMode = useRelayStore((s) => s.setVoiceTtsMode)\n const voiceTtsKokoroVoice = useRelayStore((s) => s.voiceTtsKokoroVoice)\n const setVoiceTtsKokoroVoice = useRelayStore((s) => s.setVoiceTtsKokoroVoice)\n const voiceTtsBrowserVoice = useRelayStore((s) => s.voiceTtsBrowserVoice)\n const setVoiceTtsBrowserVoice = useRelayStore((s) => s.setVoiceTtsBrowserVoice)\n const voiceInputMode = useRelayStore((s) => s.voiceInputMode)\n const setVoiceInputMode = useRelayStore((s) => s.setVoiceInputMode)\n\n // External sync: the browser loads its speech voices asynchronously, so\n // re-read them when the engine signals the list changed.\n const [browserVoices, setBrowserVoices] = useState(() => availableSpeechVoices())\n useEffect(() => {\n if (typeof window === 'undefined' || !('speechSynthesis' in window)) return\n const refresh = () => setBrowserVoices(availableSpeechVoices())\n refresh()\n window.speechSynthesis.addEventListener?.('voiceschanged', refresh)\n return () => window.speechSynthesis.removeEventListener?.('voiceschanged', refresh)\n }, [])\n\n const kokoroOptions = KOKORO_VOICES.some((v) => v.id === voiceTtsKokoroVoice)\n ? KOKORO_VOICES\n : [...KOKORO_VOICES, { id: voiceTtsKokoroVoice, label: voiceTtsKokoroVoice }]\n\n return (\n <section className=\"space-y-3 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <Volume2 className=\"w-4 h-4\" />\n <div>\n <h2 className=\"text-sm font-semibold\">Voice</h2>\n <p className=\"text-xs text-muted-foreground\">Speak agent responses aloud in the active chat, and how push-to-talk behaves.</p>\n </div>\n </div>\n <Switch checked={voiceTtsEnabled} onCheckedChange={setVoiceTtsEnabled} />\n </div>\n <Field label=\"Speech engine\">\n <Select value={voiceTtsMode} onValueChange={(v) => setVoiceTtsMode(v as 'kokoro' | 'browser')}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"kokoro\">Kokoro (server, natural — falls back to browser)</SelectItem>\n <SelectItem value=\"browser\">Browser (Web Speech API)</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Kokoro voice\">\n <Select value={voiceTtsKokoroVoice} onValueChange={setVoiceTtsKokoroVoice}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {kokoroOptions.map((v) => <SelectItem key={v.id} value={v.id}>{v.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Browser voice\">\n <Select value={voiceTtsBrowserVoice || '__default__'} onValueChange={(v) => setVoiceTtsBrowserVoice(v === '__default__' ? '' : v)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__default__\">System default</SelectItem>\n {browserVoices.map((v) => <SelectItem key={v.uri} value={v.uri}>{v.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Push-to-talk input\">\n <Select value={voiceInputMode} onValueChange={(v) => setVoiceInputMode(v as 'compose' | 'autosend' | 'handsfree')}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"compose\">Fill the message box (review, then Enter)</SelectItem>\n <SelectItem value=\"autosend\">Send immediately (speak-and-send)</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n </section>\n )\n}\n\ninterface StewardConfig {\n enabled: boolean\n provider: ProviderName\n model?: string\n effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max'\n permissionMode: string\n keepaliveSeconds: number\n}\n\nconst EFFORTS = ['low', 'medium', 'high', 'xhigh', 'max'] as const\nconst DEFAULT_STEWARD: StewardConfig = { enabled: false, provider: 'claude', permissionMode: 'open', keepaliveSeconds: 300 }\n\n// Global, provider-independent steward config (issue #167). Stewards are\n// auto-provisioned per repo from these settings to resolve conflicts / diverged\n// bases that can't auto-merge. External system: the /steward-config API.\nfunction StewardSettings() {\n const [config, setConfig] = useState<StewardConfig>(DEFAULT_STEWARD)\n const [status, setStatus] = useState('')\n\n useEffect(() => {\n api<{ value: StewardConfig }>('GET', '/steward-config')\n .then((entry) => setConfig({ ...DEFAULT_STEWARD, ...entry.value }))\n .catch((e) => setStatus((e as Error).message))\n }, [])\n\n const update = (patch: Partial<StewardConfig>) => setConfig((c) => ({ ...c, ...patch }))\n\n async function save() {\n try {\n const saved = await api<{ value: StewardConfig }>('PUT', '/steward-config', config)\n setConfig({ ...DEFAULT_STEWARD, ...saved.value })\n setStatus('Steward config saved')\n } catch (e) {\n setStatus((e as Error).message)\n }\n }\n\n return (\n <section className=\"space-y-3 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <GitMerge className=\"w-4 h-4\" />\n <div>\n <h2 className=\"text-sm font-semibold\">Stewards</h2>\n <p className=\"text-xs text-muted-foreground\">Auto-resolve merge conflicts &amp; diverged branches across all repos. Provider-independent — applies to every repo&apos;s steward.</p>\n </div>\n </div>\n <Switch checked={config.enabled} onCheckedChange={(v) => update({ enabled: v })} />\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <Field label=\"Provider\">\n <Select value={config.provider} onValueChange={(v) => update({ provider: v as ProviderName })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {providers.map((p) => <SelectItem key={p} value={p}>{p}</SelectItem>)}\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Model (optional)\">\n <Input value={config.model ?? ''} placeholder=\"e.g. gpt-5.5\" onChange={(e) => update({ model: e.target.value.trim() || undefined })} />\n </Field>\n <Field label=\"Effort\">\n <Select value={config.effort ?? 'default'} onValueChange={(v) => update({ effort: v === 'default' ? undefined : v as StewardConfig['effort'] })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"default\">Provider default</SelectItem>\n {EFFORTS.map((e) => <SelectItem key={e} value={e}>{e}</SelectItem>)}\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Idle timeout (seconds)\">\n <Input type=\"number\" value={config.keepaliveSeconds} onChange={(e) => update({ keepaliveSeconds: Number(e.target.value) || 300 })} />\n </Field>\n </div>\n\n <div className=\"flex items-center gap-2 pt-1\">\n <Button onClick={save}><Save className=\"w-4 h-4\" />Save</Button>\n {status && <p className=\"text-sm text-muted-foreground\">{status}</p>}\n </div>\n </section>\n )\n}\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return <label className=\"block space-y-1.5 text-sm\"><span className=\"text-muted-foreground\">{label}</span>{children}</label>\n}\n\nfunction lines(value: string): string[] {\n return value.split('\\n').map((line) => line.trim()).filter(Boolean)\n}\n\nfunction recordLines(value: Record<string, string>): string {\n return Object.entries(value).map(([key, item]) => `${key}=${item}`).join('\\n')\n}\n\nfunction parseRecordLines(value: string): Record<string, string> {\n return Object.fromEntries(lines(value).map((line) => {\n const idx = line.indexOf('=')\n return idx >= 0 ? [line.slice(0, idx).trim(), line.slice(idx + 1)] : [line, '']\n }))\n}\n"],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{Gn as t,Hn as n,In as r,Kn as i,Rn as a,Wn as o,qn as s,zn as c}from"./lucide-react-H_-8G79A.js";import{B as l,C as u,D as d,I as f,O as p,W as m,X as h,Y as g,Z as _,_ as v,at as y,b,d as ee,et as x,it as S,j as C,nt as w,ot as T,p as E,rt as D,tt as O,w as te}from"./display-CketawEF.js";var k=e(s(),1),ne=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},re=(e=>e?ne(e):ne),ie=e=>e;function ae(e,t=ie){let n=k.useSyncExternalStore(e.subscribe,k.useCallback(()=>t(e.getState()),[e,t]),k.useCallback(()=>t(e.getInitialState()),[e,t]));return k.useDebugValue(n),n}var oe=e=>{let t=re(e),n=e=>ae(t,e);return Object.assign(n,t),n},se=(e=>e?oe(e):oe);function ce(e,t){let n;try{n=e()}catch{return}return{getItem:e=>{let r=e=>e===null?null:JSON.parse(e,t?.reviver),i=n.getItem(e)??null;return i instanceof Promise?i.then(r):r(i)},setItem:(e,r)=>n.setItem(e,JSON.stringify(r,t?.replacer)),removeItem:e=>n.removeItem(e)}}var le=e=>t=>{try{let n=e(t);return n instanceof Promise?n:{then(e){return le(e)(n)},catch(e){return this}}}catch(e){return{then(e){return this},catch(t){return le(t)(e)}}}},ue=(e,t)=>(n,r,i)=>{let a={storage:ce(()=>window.localStorage),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},o=!1,s=0,c=new Set,l=new Set,u=a.storage;if(!u)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${a.name}', the given storage is currently unavailable.`),n(...e)},r,i);let d=()=>{let e=a.partialize({...r()});return u.setItem(a.name,{state:e,version:a.version})},f=i.setState;i.setState=(e,t)=>(f(e,t),d());let p=e((...e)=>(n(...e),d()),r,i);i.getInitialState=()=>p;let m,h=()=>{if(!u)return;let e=++s;o=!1,c.forEach(e=>e(r()??p));let t=a.onRehydrateStorage?.call(a,r()??p)||void 0;return le(u.getItem.bind(u))(a.name).then(e=>{if(e)if(typeof e.version==`number`&&e.version!==a.version){if(a.migrate){let t=a.migrate(e.state,e.version);return t instanceof Promise?t.then(e=>[!0,e]):[!0,t]}console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`)}else return[!1,e.state];return[!1,void 0]}).then(t=>{if(e!==s)return;let[i,o]=t;if(m=a.merge(o,r()??p),n(m,!0),i)return d()}).then(()=>{e===s&&(t?.(r(),void 0),m=r(),o=!0,l.forEach(e=>e(m)))}).catch(n=>{e===s&&t?.(void 0,n)})};return i.persist={setOptions:e=>{a={...a,...e},e.storage&&(u=e.storage)},clearStorage:()=>{u?.removeItem(a.name)},getOptions:()=>a,rehydrate:()=>h(),hasHydrated:()=>o,onHydrate:e=>(c.add(e),()=>{c.delete(e)}),onFinishHydration:e=>(l.add(e),()=>{l.delete(e)})},a.skipHydration||h(),m||p};function de(e){if(!e)return``;let t=e.replace(/\r\n/g,`
2
- `);return t=t.replace(/```[^\n]*\n([\s\S]*?)```/g,(e,t)=>{let n=t.replace(/\n+$/,``).split(`
3
- `).length;return` code block, ${n} ${n===1?`line`:`lines`}. `}),t=t.replace(/```[^\n]*/g,` code block. `),t=he(t),t=t.replace(/^#{1,6}\s+/gm,``),t=t.replace(/^\s*[-*+]\s+/gm,`. `),t=t.replace(/^\s*\d+\.\s+/gm,`. `),t=t.replace(/`([^`]+)`/g,`$1`),t=t.replace(/\[([^\]]+)\]\([^)]+\)/g,`$1`),t=t.replace(/(\*\*|__|\*|_)(.*?)\1/g,`$2`),t=t.replace(/[ \t]+/g,` `),t=t.replace(/\n{2,}/g,`. `),t=t.replace(/\s*\.\s*\.\s*(\.\s*)+/g,`. `),t.trim()}function fe(e){return/\|/.test(e)&&e.trim().length>0}function pe(e){return/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)+\|?\s*$/.test(e)}function me(e){return e.trim().replace(/^\||\|$/g,``).split(`|`).map(e=>e.trim()).filter(e=>e.length>0)}function he(e){let t=e.split(`
4
- `),n=[],r=0;for(;r<t.length;){if(fe(t[r])&&r+1<t.length&&pe(t[r+1])){let e=me(t[r]),i=r+2,a=0;for(;i<t.length&&fe(t[i])&&!pe(t[i]);)a++,i++;let o=e.length?`with columns ${e.join(`, `)}`:``,s=`${a} ${a===1?`row`:`rows`}`;n.push(`table ${o?`${o}, `:``}${s}.`.replace(/\s+/g,` `).trim()),r=i;continue}n.push(t[r]),r++}return n.join(`
5
- `)}var A={ms:`milliseconds`,s:`seconds`,kb:`kilobytes`,mb:`megabytes`,gb:`gigabytes`,tb:`terabytes`};function ge(e){return e.split(``).join(` `)}function _e(e){return e.split(``).map(e=>/[0-9]/.test(e)?e:e.toUpperCase()).join(` `)}var ve=[{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 ${ge(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=>_e(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 ye(e){if(!e)return``;let t=e;for(let e of ve)t=t.replace(e.pattern,e.replace);return t.replace(/[ \t]{2,}/g,` `).trim()}function be(e){return ye(de(e))}var xe=[{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 Se(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 M=typeof window<`u`&&`speechSynthesis`in window,N=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 M||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=be(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=be(e);if(!n)return;this.reset(),this.manual=!0,this.speaking=!0,this.currentChat=null,this.setPlayingKey(t??null);let r=++this.gen,i=Se(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=Se(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(!M||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 c(`/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 Ce(){if(!M)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 we=typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof window<`u`&&`MediaRecorder`in window;function Te(){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 Ee=class{rec=null;chunks=[];stream=null;async start(){this.stream=await navigator.mediaDevices.getUserMedia({audio:!0}),this.chunks=[];let e=Te();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 De(e){return((await a(`/connectors/voice/call/transcribe`,e))?.text??``).trim()}var P=se((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 Oe(){return P(e=>e.now)}function ke(e=3e4){return P(t=>Math.floor(t.now/e))}var F=[`low`,`medium`,`high`,`max`],I=[`low`,`medium`,`high`,`xhigh`,`max`],L=[`low`,`medium`,`high`,`xhigh`],R={value:2e5,source:`catalog`,confidence:`declared`},z={value:1e6,source:`catalog`,confidence:`declared`},Ae={modalities:{input:{text:!0,image:!0},output:{text:!0}},tools:{code:!0,review:!0,debug:!0,refactor:!0},source:`catalog`,confidence:`declared`};function B(e){return{...e?{limits:e}:{},capabilities:Ae}}var V={claude:{provider:`claude`,label:`Claude Code`,defaultModel:`sonnet-4.6`,models:[{alias:`fable-5`,label:`Fable 5`,providerModel:`claude-fable-5`,efforts:I,defaultEffort:`medium`,...B({contextWindowTokens:z})},{alias:`opus-4.8`,label:`Opus 4.8`,providerModel:`claude-opus-4-8`,efforts:I,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`opus-4.8[1m]`,label:`Opus 4.8 1M`,providerModel:`claude-opus-4-8[1m]`,efforts:I,defaultEffort:`medium`,...B({contextWindowTokens:z})},{alias:`opus-4.7`,label:`Opus 4.7`,providerModel:`claude-opus-4-7`,efforts:I,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`opus-4.7[1m]`,label:`Opus 4.7 1M`,providerModel:`claude-opus-4-7[1m]`,efforts:I,defaultEffort:`medium`,...B({contextWindowTokens:z})},{alias:`opus-4.6`,label:`Opus 4.6`,providerModel:`claude-opus-4-6`,efforts:F,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`opus-4.6[1m]`,label:`Opus 4.6 1M`,providerModel:`claude-opus-4-6[1m]`,efforts:F,defaultEffort:`medium`,...B({contextWindowTokens:z})},{alias:`sonnet-4.6`,label:`Sonnet 4.6`,providerModel:`claude-sonnet-4-6`,efforts:F,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`sonnet-4.6[1m]`,label:`Sonnet 4.6 1M`,providerModel:`claude-sonnet-4-6[1m]`,efforts:F,defaultEffort:`medium`,...B({contextWindowTokens:z})},{alias:`haiku`,label:`Haiku`,providerModel:`haiku`,efforts:[],...B()}]},codex:{provider:`codex`,label:`Codex`,defaultModel:`gpt-5.5`,models:[{alias:`gpt-5.5`,label:`GPT-5.5`,providerModel:`gpt-5.5`,efforts:L,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`gpt-5.4`,label:`GPT-5.4`,providerModel:`gpt-5.4`,efforts:L,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`gpt-5.4-mini`,label:`GPT-5.4 Mini`,providerModel:`gpt-5.4-mini`,efforts:L,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`gpt-5.3-codex`,label:`GPT-5.3 Codex`,providerModel:`gpt-5.3-codex`,efforts:L,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`gpt-5.3-codex-spark`,label:`GPT-5.3 Codex Spark`,providerModel:`gpt-5.3-codex-spark`,efforts:L,defaultEffort:`high`,...B({contextWindowTokens:R})},{alias:`gpt-5.2`,label:`GPT-5.2`,providerModel:`gpt-5.2`,efforts:L,defaultEffort:`medium`,...B({contextWindowTokens:R})}]}};function H(e){return e?.providers[0]??`claude`}function U(e){return V[e]?.defaultModel??``}function je(e,t){return e.filter(e=>e.status===`online`&&f(t,e.baseDir)).sort((e,t)=>C(t.baseDir).length-C(e.baseDir).length)[0]}function Me(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?je(e,r):void 0}function Ne(e){let t={};for(let n of e)t[n.id]=n;return t}function W(e,t){let n=e.findIndex(e=>e.id===t.id),r=[...e];return n>=0?r[n]=t:r.push(t),r}var Pe=3e3;function G(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)<=Pe)?e:(a.push({id:o,status:n,timestamp:r}),a.length>200&&a.splice(0,a.length-200),{...e,[t]:a})}function Fe(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 Ie=new Set([`compacting`,`compacted`,`clearing-context`,`context-cleared`]);function Le(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 Re(e){let t=e.params?.agentId;return typeof t==`string`&&t?t:typeof e.target==`string`&&e.target?e.target:void 0}function ze(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 Be(e){return JSON.stringify(e)}function Ve(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&&Be(t)===Be(e)?t:(r=!0,e)});return r?i:e}function K(e,t){let n=[...new Map(t.map(e=>[e.id,e])).values()],r=new Map(e.map(e=>[e.id,e])),i=!(e.length===n.length&&e.every((e,t)=>e.id===n[t]?.id)),a=n.map(e=>{let t=r.get(e.id);return t&&JSON.stringify(t)===JSON.stringify(e)?t:(i=!0,e)});return i?a:e}function He(){return typeof document>`u`?!0:document.hidden}function Ue(e,t){return!!(e&&t.view===`chat`&&t.selectedInboxThread===e&&!He())}function We(e){return e.threadPeer||e.agentId||``}function Ge(e,t){return Ue(We(e),t)}function Ke(e){return e.filter(e=>e.to===`user`&&e.from!==`user`&&b(e)).reduce((e,t)=>Math.max(e,t.id),0)}var qe={enabled:!0,browserEnabled:!1,messages:!0,replies:!0,errors:!0};function Je(e,t){return t.enabled?e.kind===`message`?t.messages:e.kind===`reply`?t.replies:t.errors:!1}function Ye(){return typeof window<`u`&&`Notification`in window}function q(){return Ye()?window.Notification.permission:`unsupported`}function Xe(e,t){return!Je(e,t.notificationSettings)||!t.notificationSettings.browserEnabled||q()!==`granted`||Ge(e,t)?!1:He()||t.view!==`chat`}function Ze(e,t){if(q()===`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 Qe=(e,t)=>({notification:null,toastNotification:null,notifications:[],notificationUnread:0,notificationSettings:{...qe},notificationPermission:q(),confirmModal:{show:!1,title:``,message:``,action:null},errorModal:{show:!1,title:``,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(n){let r=t();if(!Je(n,r.notificationSettings)||r.notifications.some(e=>e.id===n.id))return;let i=Ge(n,r),a=`${n.title}: ${n.body}`;e({notifications:[n,...r.notifications].slice(0,100),notificationUnread:i?r.notificationUnread:Math.min(99,r.notificationUnread+1),notification:i?r.notification:a,toastNotification:i?r.toastNotification:n}),i||setTimeout(()=>{t().toastNotification?.id===n.id&&e({notification:null,toastNotification:null})},4500),Xe(n,r)&&Ze(n,()=>t().openNotification(n)),i&&n.threadPeer&&n.messageId&&t().markInboxThreadReadTo(n.threadPeer,n.messageId)},async openNotification(n){if(e({notificationUnread:0}),n.threadPeer&&(t().openInboxThread(n.threadPeer),n.messageId&&t().markInboxThreadReadTo(n.threadPeer,n.messageId)),n.view&&await t().switchView(n.view),n.agentId&&n.view===`agents`){let e=t().agentsById[n.agentId];e&&t().openAgentDetail(e)}},dismissToast(){e({notification:null,toastNotification:null})},markNotificationsRead(){e({notificationUnread:0})},clearNotifications(){e({notifications:[],notificationUnread:0})},async requestBrowserNotifications(){if(!Ye()){e({notificationPermission:`unsupported`,notificationSettings:{...t().notificationSettings,browserEnabled:!1}}),t().showNotification(`Browser notifications are not supported here`);return}let n=await window.Notification.requestPermission();e({notificationPermission:n,notificationSettings:{...t().notificationSettings,browserEnabled:n===`granted`}}),t().showNotification(n===`granted`?`Browser notifications enabled`:`Browser notifications not enabled`)}}),$e=e=>({voiceTtsEnabled:!1,voiceTtsLang:`en-US`,voiceTtsMode:`kokoro`,voiceTtsKokoroVoice:`am_michael`,voiceTtsBrowserVoice:``,voiceInputMode:`compose`,setVoiceTtsEnabled(t){N.setEnabled(t),e({voiceTtsEnabled:t})},setVoiceTtsLang(t){N.setLang(t),e({voiceTtsLang:t})},setVoiceTtsMode(t){N.setMode(t),e({voiceTtsMode:t})},setVoiceTtsKokoroVoice(t){N.setKokoroVoice(t),e({voiceTtsKokoroVoice:t})},setVoiceTtsBrowserVoice(t){N.setBrowserVoice(t),e({voiceTtsBrowserVoice:t})},setVoiceInputMode(t){e({voiceInputMode:t})}}),et=null;function tt(e){let t=e.voiceTtsEnabled&&e.view===`chat`&&e.selectedInboxThread||null;t!==et&&(et=t,N.setActiveChat(t))}var nt=(e,a)=>({theme:`dark`,view:`overview`,autoRefresh:!0,mobileMenuOpen:!1,commandPaletteOpen:!1,commandQuery:``,connected:!1,connectionError:!1,authNeeded:!1,authToken:``,stats:{},fileOrchestratorId:``,filePath:``,fileSelectedPath:``,fileSelectedLine:0,fileOverlayOpen:!1,_es:null,_refreshTimer:null,_refreshInFlight:!1,set:t=>e(t),async init(){$.persist.hasHydrated()||await new Promise(e=>{let t=$.persist.onFinishHydration(()=>{t(),e()})});let n=a().authToken;n&&o(n),i(a().view),N.setEnabled(a().voiceTtsEnabled),N.setLang(a().voiceTtsLang),N.setMode(a().voiceTtsMode),N.setKokoroVoice(a().voiceTtsKokoroVoice),N.setBrowserVoice(a().voiceTtsBrowserVoice),tt(a()),t(()=>{a().authNeeded||e({authNeeded:!0,connectionError:!1})}),e({notificationPermission:q()}),a().startClock();try{e({stats:await r(`GET`,`/stats`)})}catch(t){if(t.status===401){e({authNeeded:!0});return}}await a().refresh(),a().connectSSE(),a().startAutoRefresh()},async switchView(t){i(t),e({view:t,mobileMenuOpen:!1});let n=a();[`chat`,`messages`].includes(t)&&await Promise.all([n.fetchMessages(),n.fetchChatHistoryImports()]),t===`activity`&&await Promise.all([n.fetchMessages(),n.fetchPairs(),n.fetchTasks(),n.fetchActivityEvents()]),t===`work`&&await Promise.all([n.fetchMessages(),n.fetchTasks()]),t===`pairs`&&await n.fetchPairs(),t===`channels`&&await n.fetchChannels(),t===`connectors`&&await n.fetchConnectors(),t===`integrations`&&await n.fetchIntegrations(),t===`memory`&&await n.refreshMemory(),t===`tasks`&&await n.fetchTasks(),t===`teams`&&await Promise.all([n.fetchTeams(),n.fetchTeamOutcomeAggregates()]),t===`automation`&&await Promise.all([n.fetchAutomations(),n.fetchAutomationRuns()]),t===`maintenance`&&await n.fetchMaintenanceJobs(),t===`workspaces`&&await Promise.all([n.fetchWorkspaces(),n.fetchOrchestrators(),n.fetchAgents()]),t===`files`&&await n.fetchOrchestrators(),t===`analytics`&&await n.fetchAnalytics()},startClock(){P.getState().start()},stopClock(){P.getState().stop()},startAutoRefresh(){a().stopAutoRefresh(),a().autoRefresh&&e({_refreshTimer:setInterval(()=>a().refreshLiveData(),T)})},stopAutoRefresh(){let t=a();t._refreshTimer&&(clearInterval(t._refreshTimer),e({_refreshTimer:null}))},async apiCall(e,t,n){return r(e,t,n)},async openFilesAt(t){let n=a();e({fileOrchestratorId:t.orchestratorId||je(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 a().switchView(`files`)},async openFilesForAgent(e,t=!1){let n=typeof e.meta?.cwd==`string`?e.meta.cwd:``;if(!n){a().showNotification(`Agent has no cwd`);return}let r=Me(a().orchestrators,e);if(!r){a().showNotification(`No online orchestrator covers that cwd`);return}await a().openFilesAt({orchestratorId:r.id,path:n,overlay:t})},closeFileOverlay(){e({fileOverlayOpen:!1})},async refresh(){let e=a();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(!(a()._refreshInFlight||a().authNeeded)){e({_refreshInFlight:!0});try{try{let t=await r(`GET`,`/stats`);e(a().connectionError?{stats:t,connectionError:!1}:{stats:t})}catch(t){if(t.status===401)return;a().connectionError||e({connectionError:!0});return}let t=a(),n=[t.fetchHealth(),t.fetchAgents(),t.fetchOrchestrators(),t.fetchPairs(),t.fetchMessages(),t.fetchTasks(),t.fetchManagedPolicies(),t.fetchInboxState()],i=t.view;[`chat`,`messages`].includes(i)&&n.push(t.fetchChatHistoryImports()),i===`activity`&&n.push(t.fetchActivityEvents()),i===`memory`&&n.push(t.refreshMemory()),i===`automation`&&n.push(t.fetchAutomations(),t.fetchAutomationRuns()),i===`channels`&&n.push(t.fetchChannels()),i===`connectors`&&n.push(t.fetchConnectors()),i===`integrations`&&n.push(t.fetchIntegrations()),i===`maintenance`&&n.push(t.fetchMaintenanceJobs()),i===`profiles`&&n.push(t.fetchAgentProfiles()),i===`workspaces`&&n.push(t.fetchWorkspaces()),i===`analytics`&&n.push(t.fetchAnalytics()),i===`teams`&&n.push(t.fetchTeams(),t.fetchTeamOutcomeAggregates()),await Promise.all(n)}finally{e({_refreshInFlight:!1})}}},async fetchStats(){try{e({stats:await r(`GET`,`/stats`)})}catch{}},connectSSE(){a().disconnectSSE(),e({_es:n(a().authToken,{connected:()=>{e(a().connectionError?{connected:!0,connectionError:!1}:{connected:!0}),a().refreshLiveData();let t=Object.entries(a().agentChatByAgent).filter(([,e])=>e.loadedInitial).map(([e])=>e);Promise.all(t.map(e=>a().gapFillAgentChat(e))),a().refreshPlans()},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`&&N.onResponse(v(t),t.body)}let r=a();if(!r.messages.some(e=>e.id===t.id)){let n=[...r.messages,t];n.length>500&&n.splice(0,n.length-500),e({messages:n})}let i=v(t);for(let e of Object.keys(a().agentChatByAgent))a().appendChatTail(e,[t]);u(t)&&b(t)&&Ue(i,r)&&a().markInboxThreadReadTo(i,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:W(a().messages,t)}),a().applyChatMessageUpdate(t);return}if(t===`notification.created`){a().handleRelayNotification(JSON.parse(n));return}if(t===`plan.created`||t===`plan.changed`){let e=JSON.parse(n),t=e.plan??e.data?.plan;t&&a().upsertPlan(t);return}if(t===`plan.deleted`){let e=JSON.parse(n),t=e.plan??e.data?.plan,r=t?.id??e.planId??e.id??e.data?.planId??e.data?.id;(t||r)&&a().removePlan(t??r);return}if(t===`team.dissolved`){let e=JSON.parse(n);e.teamId&&a().markTeamDissolved({teamId:e.teamId,outcomeStatus:e.outcomeStatus,reason:e.reason}),Promise.all([a().fetchTeams(),a().fetchTeamOutcomeAggregates()]);return}if(t===`activity.created`){let t=JSON.parse(n);e({activityEvents:W(a().activityEvents,t)});return}if(t===`agent.status`){let t=JSON.parse(n),r=a(),i=r.agentsById[t.id];if(e({agents:W(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=Le(t);if(n?.status&&Ie.has(n.status)&&(n.timestamp??0)>o.ts){let n={...r.commandStalls};delete n[t.id],e({commandStalls:n})}}let s=Le(t),c=s?.status??Fe(i,t);if(c){let n=s?.timestamp??Date.now(),i=s?.id||`agent-status:${t.id}:${c}:${n}`;e({chatStatusEvents:G(r.chatStatusEvents,t.id,c,n,i)})}return}if(t===`liveness.mismatch`){let t=JSON.parse(n);t.agentId&&e({livenessMismatches:{...a().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`,i=r===`clear`?`clear-stalled`:`compaction-stalled`;e({commandStalls:{...a().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:G(a().chatStatusEvents,t.agentId,i,n,`command-stalled:${t.agentId}:${t.commandId??n}`)})}return}if(t===`agent.removed`){let t=JSON.parse(n),r=a(),i={...r.agentsById};delete i[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:i});return}if(t===`message.claimed`){let t=JSON.parse(n);e({messages:a().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:a().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:a().messages.filter(e=>e.id!==t.messageId)});return}if(t===`orchestrator.status`){let t=JSON.parse(n);e({orchestrators:W(a().orchestrators,t)});return}if(t===`orchestrator.removed`){let t=JSON.parse(n);e({orchestrators:a().orchestrators.filter(e=>e.id!==t.id)});return}if(t===`policy.state.changed`||t===`config.changed`){a().fetchManagedPolicies();return}if(t===`command.dispatched`||t===`command.succeeded`){let r=JSON.parse(n).command;if(r){let n=ze(r,t);if(n){let t=typeof r.updatedAt==`number`?r.updatedAt:typeof r.createdAt==`number`?r.createdAt:Date.now();e({chatStatusEvents:G(a().chatStatusEvents,Re(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:W(a().tasks,t)})}}}})})},disconnectSSE(){let t=a()._es;t&&(t.close(),e({_es:null}))},openCommandPalette(){e({commandQuery:``,commandPaletteOpen:!0})},closeCommandPalette(){e({commandPaletteOpen:!1,commandQuery:``})},async runCommand(t){let{action:n,payload:r}=t;if(a().closeCommandPalette(),n===`openView`)await a().switchView(r.view);else if(n===`agentPreset`)e({showOffline:!0,agentPresetFilter:r.preset||``}),await a().switchView(`agents`);else if(n===`copy`)try{await navigator.clipboard?.writeText(r.value||``)}catch{}else if(n===`messageAgent`){let e=a().agentsById[r.agentId];e&&a().openComposeToAgent(e)}else n===`pairAgent`?a().openPairInvite(r.agentId):n===`filterTag`?(e({agentTagFilter:r.tag||``,tagFilter:r.tag||``}),await a().switchView(`agents`)):n===`exportActivity`&&a().exportActivity(r.format||`markdown`)},async saveTokenAndRefresh(){let t=a().authToken;o(t);try{await r(`GET`,`/stats`)}catch(t){if(t.status===401){e({authNeeded:!0});return}}e({authNeeded:!1,connectionError:!1}),a().connectSSE(),await a().refresh(),a().startAutoRefresh()},destroy(){t(null),a().disconnectSSE(),a().stopAutoRefresh(),a().stopClock()}}),rt=(e,t)=>({agents:[],agentsById:{},showOffline:!1,showBuiltIns:!1,agentSort:`status`,agentSortDir:`asc`,agentPresetFilter:``,agentStatusFilter:``,agentTagFilter:``,agentHostFilter:``,selectedAgent:``,agentDetailOpen:!1,agentDetailId:``,livenessMismatches:{},commandStalls:{},channelDetailOpen:!1,channelDetailId:``,renameModal:{show:!1,agentId:``,label:``},tagFilter:``,async fetchAgents(){try{let n=await r(`GET`,`/agents`),i=K(t().agents,n);if(i===t().agents)return;e({agents:i,agentsById:Ne(i)})}catch{}},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=t(),i=n.renameModal.label.trim()||null;try{await r(`PATCH`,`/agents/`+n.renameModal.agentId+`/label`,{label:i}),e({renameModal:{...n.renameModal,show:!1}})}catch(e){t().showError(`Rename Failed`,e.message)}},async doDeleteAgent(n){try{await r(`DELETE`,`/agents/`+n);let i=t(),a={...i.agentsById};delete a[n],e({agents:i.agents.filter(e=>e.id!==n),agentsById:a,selectedAgent:i.selectedAgent===n?``:i.selectedAgent})}catch(e){t().showError(`Delete Failed`,e.message)}},async doAgentAction(e,n,i){try{await r(`POST`,`/agents/`+encodeURIComponent(e.id)+`/actions`,{action:n,...i?{surface:{component:i}}:{}});let a=n===`restart`?`Restart`:n===`resume`?`Resume`:n===`shutdown`?`Shutdown`:n===`compact`?`Compact`:n===`clearContext`?`Clear context`:n;t().showNotification(`${a} command sent to ${ee(e)}`),await Promise.all([t().fetchMessages(),t().fetchActivityEvents()])}catch(e){t().showError(`Action Failed`,e.message)}}}),J=300,Y={messages:[],oldestLoadedId:null,hasMore:!0,loading:!1,loadedInitial:!1};function it(e,t){let n=new URLSearchParams;for(let[e,r]of Object.entries(t))n.set(e,String(r));return`/agents/${encodeURIComponent(e)}/chat?${n.toString()}`}function at(e,t){return t.filter(t=>p(e,t)&&!te(t)).sort((e,t)=>e.id-t.id)}function ot(e,t){return K(e,[...e,...t].sort((e,t)=>e.id-t.id))}function st(e){return e[0]?.id??null}var ct=(e,t)=>({messages:[],agentChatByAgent:{},threadHistory:{},threadMessages:[],threadOpen:!1,chatHistoryImports:[],selectedInboxThread:``,replyTo:null,composeOpen:!1,showReasoning:!1,chatAgentSearch:``,chatAgentProviderFilter:``,chatAgentStatusFilter:``,chatAgentTagFilter:``,chatAgentCapFilter:``,chatAgentHostFilter:``,chatAgentSort:`status`,chatAgentSortDir:`asc`,chatAgentGroupBy:``,chatAgentFiltersCollapsed:!0,chatStatusEvents:{},chatStickToBottom:!0,chatHasNewItems:!1,inboxReadCursors:{},inboxArchivedThreads:{},inboxDrafts:{},chatSending:!1,inboxSearch:``,inboxSort:`attention`,inboxSortDir:`desc`,inboxShowArchived:!1,channelFilter:``,compose:{...x},inboxCompose:{...O},async fetchMessages(){try{let n=t(),i=`/messages?limit=100`;n.view===`messages`&&n.selectedAgent&&(i+=`&for=`+encodeURIComponent(n.selectedAgent)),n.view===`messages`&&n.channelFilter&&(i+=`&channel=`+encodeURIComponent(n.channelFilter));let a=await r(`GET`,i),o=Ve(t().messages,a);e({messages:o});let s=t(),c=s.selectedInboxThread;if(Ue(c,s)){let e=0;for(let t of o)t.id>e&&v(t)===c&&u(t)&&b(t)&&(e=t.id);e&&t().markInboxThreadReadTo(c,e)}}catch{}},async loadAgentChat(n){if(n&&!t().agentChatByAgent[n]?.loading){e(e=>({agentChatByAgent:{...e.agentChatByAgent,[n]:{...e.agentChatByAgent[n]??Y,loading:!0}}}));try{let i=await r(`GET`,it(n,{limit:J})),a=at(n,i),o=t().agentChatByAgent[n]??Y,s=o.loadedInitial?ot(o.messages,a):K([],a);e(e=>({agentChatByAgent:{...e.agentChatByAgent,[n]:{messages:s,oldestLoadedId:st(s),hasMore:i.length===J,loading:!1,loadedInitial:!0}}}))}catch(r){e(e=>({agentChatByAgent:{...e.agentChatByAgent,[n]:{...e.agentChatByAgent[n]??Y,loading:!1}}})),t().showError(`Chat Load Failed`,r.message)}}},async loadOlder(n){if(!n)return;let i=t().agentChatByAgent[n];if(!i?.loadedInitial){await t().loadAgentChat(n);return}if(!(i.loading||!i.hasMore||i.oldestLoadedId===null)){e(e=>({agentChatByAgent:{...e.agentChatByAgent,[n]:{...i,loading:!0}}}));try{let a=await r(`GET`,it(n,{before:i.oldestLoadedId,limit:J})),o=at(n,a),s=t().agentChatByAgent[n]??i,c=K(s.messages,[...o,...s.messages].sort((e,t)=>e.id-t.id));e(e=>({agentChatByAgent:{...e.agentChatByAgent,[n]:{messages:c,oldestLoadedId:st(c),hasMore:a.length===J,loading:!1,loadedInitial:!0}}}))}catch(r){e(e=>({agentChatByAgent:{...e.agentChatByAgent,[n]:{...e.agentChatByAgent[n]??i,loading:!1}}})),t().showError(`Chat Load Failed`,r.message)}}},async gapFillAgentChat(e){if(!e)return;let n=t().agentChatByAgent[e];if(!n?.loadedInitial||n.messages.length===0)return;let i=n.messages[n.messages.length-1].id;try{for(;;){let a=i,o=await r(`GET`,it(e,{since:i,limit:J}));if(o.length===0||(t().appendChatTail(e,o.filter(e=>e.id>a)),i=o[o.length-1].id,i<=a)||o.length<J)return;n=t().agentChatByAgent[e];let s=n?.messages[n.messages.length-1]?.id;s&&s>i&&(i=s)}}catch(e){t().showError(`Chat Gap Fill Failed`,e.message)}},appendChatTail(n,r){if(!n||r.length===0)return;let i=at(n,r);if(i.length===0)return;let a=t().agentChatByAgent[n]??Y,o=ot(a.messages,i);e({agentChatByAgent:{...t().agentChatByAgent,[n]:{...a,messages:o,oldestLoadedId:st(o)}}})},async fetchThreadHistory(n){if(n)try{let i=await r(`GET`,`/messages?for=`+encodeURIComponent(n)+`&limit=500`);e({threadHistory:{...t().threadHistory,[n]:i}})}catch{}},async fetchChatHistoryImports(){try{e({chatHistoryImports:await r(`GET`,`/chat/history-imports?limit=500`)})}catch{}},async fetchInboxState(){try{let n=await r(`GET`,`/inbox/state?operatorId=user`),i={},a={},o={};for(let e of n?.threads||[])e.readCursorMessageId&&(i[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=t().inboxDrafts;e({inboxReadCursors:i,inboxArchivedThreads:a,...Object.keys(s).length>0?{}:{inboxDrafts:o}})}catch{}},openCompose(){e({composeOpen:!0,compose:{...x,from:S}})},openComposeToAgent(t){e({replyTo:null,compose:{...x,from:S,to:t.id},composeOpen:!0})},async doSend(){let n=t();if(!n.compose.from||!n.compose.to||!n.compose.body){t().showError(`Validation`,`From, To, and Message are required.`);return}try{let i={from:n.compose.from,to:n.compose.to,body:n.compose.body};n.compose.channel&&(i.channel=n.compose.channel),n.compose.subject&&(i.subject=n.compose.subject),n.replyTo&&(i.replyTo=n.replyTo.id),n.compose.claimable&&(i.claimable=!0,i.kind=`task`,i.payload={title:n.compose.subject||`Claimable task`}),await r(`POST`,`/messages`,i),e({composeOpen:!1,replyTo:null,compose:{...x,from:S}}),await t().fetchMessages()}catch(e){t().showError(`Send Failed`,e.message)}},async doClaim(e){let n=t(),i=n.compose.from||n.selectedAgent;if(!i){t().showError(`Validation`,`Select an agent first.`);return}try{let n=await r(`POST`,`/messages/`+e+`/claim`,{agentId:i});n.ok||t().showError(`Claim Failed`,n.error||`unknown`),n.ok&&await Promise.all([t().fetchMessages(),t().fetchTasks()])}catch(e){t().showError(`Claim Failed`,e.message)}},async doDeliveryAction(e,n,i){try{await r(`POST`,`/messages/`+e+`/delivery/actions`,{action:n,reason:i,agentId:t().compose.from||t().selectedAgent||`user`}),await t().fetchMessages()}catch(e){t().showError(`Delivery Update Failed`,e.message)}},async doDeleteMessage(n){try{await r(`DELETE`,`/messages/`+n),e({messages:t().messages.filter(e=>e.id!==n)})}catch(e){t().showError(`Delete Failed`,e.message)}},applyChatMessageUpdate(n){let r=t().agentChatByAgent,i={};for(let[e,t]of Object.entries(r))t.messages.some(e=>e.id===n.id)&&(i[e]={...t,messages:t.messages.map(e=>e.id===n.id?n:e)});Object.keys(i).length!==0&&e({agentChatByAgent:{...r,...i}})},async reactToMessage(n,i){try{let a=(n.reactions||[]).some(e=>e.actorId===`user`&&e.emoji===i),o=await r(`POST`,`/messages/`+n.id+`/reactions`,{actorId:S,emoji:i,action:a?`remove`:`add`});e({messages:W(t().messages,o)}),t().applyChatMessageUpdate(o)}catch(e){t().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:{...x,from:S,to:n,channel:t.channel||``},composeOpen:!0})},cancelReply(){e({replyTo:null})},async openThread(n){e({threadMessages:[],threadOpen:!0});try{e({threadMessages:await r(`GET`,`/messages/`+n+`/thread`)})}catch(e){t().showError(`Thread Load Failed`,e.message)}},openInboxThread(n,r=[]){e({selectedInboxThread:n}),r.length&&t().markInboxThreadRead(n,r),t().loadAgentChat(n)},async sendChatMessage(n,i,a=[]){if(!(!n.trim()&&a.length===0||t().chatSending)){e({chatSending:!0});try{if(t().agentsById[i.peer]?.providerCapabilities?.liveSession?.inject)await r(`POST`,`/agents/`+encodeURIComponent(i.peer)+`/prompt`,{body:n.trim()||`Attachment`,...a.length?{attachments:a}:{}});else{let e={from:S,to:i.peer,body:n.trim()||`Attachment`};i.lastMessage?.channel&&(e.channel=i.lastMessage.channel),i.lastMessage?.id&&(e.replyTo=i.lastMessage.id),a.length&&(e.payload={attachments:a}),await r(`POST`,`/messages`,e)}let o={...t().inboxDrafts};delete o[i.peer],e({inboxDrafts:o}),r(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(y)+`&peerId=`+encodeURIComponent(i.peer)).catch(()=>{}),await Promise.all([t().fetchMessages(),t().loadAgentChat(i.peer)])}catch(e){t().showError(`Send Failed`,e.message)}e({chatSending:!1})}},async sendPermissionDecision(e,n,i,a){try{await r(`POST`,`/agents/`+encodeURIComponent(e)+`/permission-decision`,{approvalId:n,decision:i,...a?{answers:a}:{}});let o=i===`approve`?`Approved`:i===`approve-session`?`Approved for session`:i===`abort`?`Aborted`:i===`answer`?`Answer sent for`:`Denied`;t().showNotification(`${o} ${i===`answer`?`Claude's question`:`permission request`}`),await t().fetchAgents()}catch(e){t().showError(`Permission Failed`,e.message)}},markInboxThreadReadTo(n,i){!n||i<=(t().inboxReadCursors[n]||0)||(e({inboxReadCursors:{...t().inboxReadCursors,[n]:i}}),r(`PATCH`,`/inbox/threads`,{operatorId:y,peerId:n,readCursorMessageId:i}).catch(()=>{}))},markInboxThreadRead(e,n){!e||!n.length||t().markInboxThreadReadTo(e,Ke(n))},markInboxThreadUnread(n){let i={...t().inboxReadCursors};delete i[n],e({inboxReadCursors:i}),r(`PATCH`,`/inbox/threads`,{operatorId:y,peerId:n,readCursorMessageId:null}).catch(()=>{})},archiveInboxThread(n,i){e({inboxArchivedThreads:{...t().inboxArchivedThreads,[n]:i}}),t().selectedInboxThread===n&&e({selectedInboxThread:``}),r(`PATCH`,`/inbox/threads`,{operatorId:y,peerId:n,archivedAtMessageId:i}).catch(()=>{})},unarchiveInboxThread(n){let i={...t().inboxArchivedThreads};delete i[n],e({inboxArchivedThreads:i}),r(`PATCH`,`/inbox/threads`,{operatorId:y,peerId:n,archivedAtMessageId:null}).catch(()=>{})},setReplyDraft(n,i){let a={...t().inboxDrafts};i?a[n]=i:delete a[n],e({inboxDrafts:a}),i?r(`PUT`,`/inbox/drafts`,{operatorId:y,peerId:n,body:i}).catch(()=>{}):r(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(y)+`&peerId=`+encodeURIComponent(n)).catch(()=>{})},async sendInboxReply(n,i){let a=(t().inboxDrafts[n]||``).trim();if(!a||t().chatSending){a||t().showError(`Validation`,`Reply body is required.`);return}e({chatSending:!0});try{let o={from:S,to:n,body:a};i?.channel&&(o.channel=i.channel),i?.id&&(o.replyTo=i.id),await r(`POST`,`/messages`,o);let s={...t().inboxDrafts};delete s[n],e({inboxDrafts:s}),r(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(y)+`&peerId=`+encodeURIComponent(n)).catch(()=>{}),await t().fetchMessages()}catch(e){t().showError(`Reply Failed`,e.message)}e({chatSending:!1})},async doSendInboxCompose(){let n=t().inboxCompose,i=n.to;if(i){if(n.toMode===`tag`?i=`tag:`+i:n.toMode===`cap`&&(i=`cap:`+i),!n.body){t().showError(`Validation`,`Message is required.`);return}try{let a={from:S,to:i,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 r(`POST`,`/messages`,a),e({inboxCompose:{...O,toMode:n.toMode,to:n.to}}),await t().fetchMessages()}catch(e){t().showError(`Send Failed`,e.message)}}}});function X(e,t){return JSON.stringify([String(e),t||``])}function Z(e,t){return JSON.stringify([`team`,e,t||``])}function lt(e){return{threadId:String(e.threadId),...e.channel?{channel:e.channel}:{}}}function ut(e){return e.teamId?{teamId:e.teamId,...e.channel?{channel:e.channel}:{}}:null}function dt(e){return`teamId`in e?Z(e.teamId,e.channel):X(e.threadId,e.channel)}function ft(e){let t=new URLSearchParams(`teamId`in e?{teamId:e.teamId}:{threadId:String(e.threadId)});return e.channel&&t.set(`channel`,e.channel),`/plans?${t.toString()}`}var pt=(e,t)=>({plansById:{},plansByThread:{},plansByTeam:{},planLookups:{},planLoading:{},planCollapsed:null,setPlanCollapsed(t){e({planCollapsed:t})},async fetchPlan(n){let i=`teamId`in n?{teamId:n.teamId,...n.channel?{channel:n.channel}:{}}:{threadId:String(n.threadId),...n.channel?{channel:n.channel}:{}},a=dt(i);e({planLookups:{...t().planLookups,[a]:i},planLoading:{...t().planLoading,[a]:!0}});try{let n=await r(`GET`,ft(i)),o=lt(n),s=X(o.threadId,o.channel),c=ut(n),l=c?Z(c.teamId,c.channel):``,u=!(`teamId`in i),d=`teamId`in i;e({plansById:{...t().plansById,[n.id]:n},plansByThread:{...t().plansByThread,...u?{[a]:n}:{},[s]:n},plansByTeam:c?{...t().plansByTeam,...d?{[a]:n}:{},[l]:n}:t().plansByTeam,planLookups:{...t().planLookups,[a]:i,[s]:o,...c?{[l]:c}:{}},planLoading:{...t().planLoading,[a]:!1,[s]:!1,...c?{[l]:!1}:{}}})}catch(n){let r=typeof n.status==`number`?n.status:0;e({plansByThread:r===404&&!(`teamId`in i)?{...t().plansByThread,[a]:null}:t().plansByThread,plansByTeam:r===404&&`teamId`in i?{...t().plansByTeam,[a]:null}:t().plansByTeam,planLoading:{...t().planLoading,[a]:!1}}),r&&r!==404&&t().showError(`Plan Load Failed`,n.message)}},async refreshPlans(){let e=Object.values(t().planLookups);await Promise.all(e.map(e=>t().fetchPlan(e)))},upsertPlan(n){let r=lt(n),i=X(r.threadId,r.channel),a=ut(n),o=a?Z(a.teamId,a.channel):``;e({plansById:{...t().plansById,[n.id]:n},plansByThread:{...t().plansByThread,[i]:n},plansByTeam:a?{...t().plansByTeam,[o]:n}:t().plansByTeam,planLookups:{...t().planLookups,[i]:r,...a?{[o]:a}:{}},planLoading:{...t().planLoading,[i]:!1,...a?{[o]:!1}:{}}})},removePlan(n){let r=typeof n==`string`?n:n.id,i={...t().plansById};delete i[r],e({plansById:i,plansByThread:Object.fromEntries(Object.entries(t().plansByThread).filter(([,e])=>e?.id!==r)),plansByTeam:Object.fromEntries(Object.entries(t().plansByTeam).filter(([,e])=>e?.id!==r)),planLookups:Object.fromEntries(Object.entries(t().planLookups).filter(([e])=>t().plansByThread[e]?.id!==r&&t().plansByTeam[e]?.id!==r))})}}),mt=(e,t)=>({teams:[],teamsLoading:!1,teamsError:null,teamOutcomeAggregates:null,teamOutcomeAggregatesLoading:!1,teamOutcomeAggregatesError:null,async fetchTeams(){e({teamsLoading:!0,teamsError:null});try{let n=await r(`GET`,`/teams`),i=K(t().teams,n.teams);return e({teams:i,teamsLoading:!1,teamsError:null}),i}catch(n){return e({teamsLoading:!1,teamsError:g(n)}),t().teams}},async fetchTeamOutcomeAggregates(){e({teamOutcomeAggregatesLoading:!0,teamOutcomeAggregatesError:null});try{let t=await r(`GET`,`/teams/outcomes`);return e({teamOutcomeAggregates:t,teamOutcomeAggregatesLoading:!1,teamOutcomeAggregatesError:null}),t}catch(n){return e({teamOutcomeAggregatesLoading:!1,teamOutcomeAggregatesError:g(n)}),t().teamOutcomeAggregates}},upsertTeam(n){let r=W(t().teams,n);r!==t().teams&&e({teams:r})},markTeamDissolved(n){let r=Date.now();e({teams:t().teams.map(e=>e.id===n.teamId?{...e,status:`dissolved`,updatedAt:r,dissolvedAt:e.dissolvedAt??r,zeroMembersSince:void 0,...n.outcomeStatus?{outcomeStatus:n.outcomeStatus}:{},...n.reason?{outcomeSummary:n.reason}:{}}:e)})},async dissolveTeam(e){try{let n=await r(`POST`,`/teams/${encodeURIComponent(e)}/dissolve`,{});t().upsertTeam(n),t().showNotification(`Team dissolved`),await Promise.all([t().fetchTeams(),t().fetchTeamOutcomeAggregates(),t().fetchActivityEvents()])}catch(e){t().showError(`Dissolve Failed`,g(e))}}}),ht=(e,t)=>({pairs:[],tasks:[],taskEvents:[],taskEventCache:{},taskEventsOpen:!1,pairInviteOpen:!1,pairMessageOpen:!1,pairInvite:{...w},pairMessage:{...D},pairStatusFilter:`open`,taskStatusFilter:``,taskSourceFilter:``,async fetchPairs(){try{let n=t(),i;if(n.view===`activity`)i=await r(`GET`,`/pairs`);else if(n.pairStatusFilter===`open`){let[e,t]=await Promise.all([r(`GET`,`/pairs?status=active`),r(`GET`,`/pairs?status=pending`)]);i=[...e,...t]}else i=n.pairStatusFilter?await r(`GET`,`/pairs?status=`+encodeURIComponent(n.pairStatusFilter)):await r(`GET`,`/pairs`);let a=i.sort((e,t)=>new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime()),o=K(t().pairs,a);o!==t().pairs&&e({pairs:o})}catch{}},async fetchTasks(){try{let n=t(),i=new URLSearchParams({limit:`100`});n.taskStatusFilter&&i.set(`status`,n.taskStatusFilter),n.taskSourceFilter&&i.set(`source`,n.taskSourceFilter);let a=K(t().tasks,await r(`GET`,`/tasks?`+i.toString()));a!==t().tasks&&e({tasks:a})}catch{}},async doClaimTask(e){let n=t(),i=n.compose.from||n.selectedAgent;if(!i){t().showError(`Validation`,`Select an agent first.`);return}try{let n=await r(`POST`,`/tasks/`+e+`/claim`,{agentId:i});n.ok?await Promise.all([t().fetchTasks(),t().fetchMessages()]):t().showError(`Claim Failed`,n.error||`unknown`)}catch(e){t().showError(`Claim Failed`,e.message)}},async doUpdateTaskStatus(n,i){if(!(!n||!i||i===n.status))try{let a={status:i},o=n.claimedBy||t().compose.from||t().selectedAgent;o&&(a.agentId=o);let s=await r(`PATCH`,`/tasks/`+n.id+`/status`,a),c=s.task||s;if(e({tasks:t().tasks.map(e=>e.id===n.id?c:e)}),s.memoryEvent){let r=t().taskEventCache[n.id]||[];e({taskEventCache:{...t().taskEventCache,[n.id]:[...r,s.memoryEvent]},...t().taskEventsOpen?{taskEvents:[...t().taskEvents,s.memoryEvent]}:{}})}s.memory&&t().showNotification(`Memory captured: ${s.memory.title}`)}catch(e){t().showError(`Status Update Failed`,e.message),await t().fetchTasks()}},async openTaskEvents(n){e({taskEvents:[],taskEventsOpen:!0});try{let i=await r(`GET`,`/tasks/`+n.id+`/events`);e({taskEvents:i,taskEventCache:{...t().taskEventCache,[n.id]:i}})}catch(e){t().showError(`Task Events Failed`,e.message)}},openPairInvite(n){e({pairInvite:{...w,requesterId:n||t().selectedAgent||``},pairInviteOpen:!0})},closePairInvite(){e({pairInviteOpen:!1,pairInvite:{...w}})},async doCreatePair(){let n=t();if(!n.pairInvite.requesterId||!n.pairInvite.targetId){t().showError(`Validation`,`Requester and Target are required.`);return}if(n.pairInvite.requesterId===n.pairInvite.targetId){t().showError(`Validation`,`Requester and Target must be different.`);return}try{let i={from:n.pairInvite.requesterId,target:n.pairInvite.targetId};n.pairInvite.objective&&(i.objective=n.pairInvite.objective),await r(`POST`,`/pairs`,i),e({pairInviteOpen:!1,pairInvite:{...w}}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Pair Invite Failed`,e.message)}},openPairMessage(t,n){e({pairMessage:{...D,pairId:t.id,from:n||t.requesterId},pairMessageOpen:!0})},closePairMessage(){e({pairMessageOpen:!1,pairMessage:{...D}})},async doSendPairMessage(){let n=t();if(!n.pairMessage.pairId||!n.pairMessage.from||!n.pairMessage.body){t().showError(`Validation`,`Pair, From, and Message are required.`);return}try{let i={from:n.pairMessage.from,body:n.pairMessage.body};n.pairMessage.subject&&(i.subject=n.pairMessage.subject),await r(`POST`,`/pairs/`+encodeURIComponent(n.pairMessage.pairId)+`/messages`,i),e({pairMessageOpen:!1,pairMessage:{...D}}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Pair Message Failed`,e.message)}},async doAcceptPair(e){try{await r(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/accept`,{agentId:e.targetId}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Accept Failed`,e.message)}},async doRejectPair(e){try{await r(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/reject`,{agentId:e.targetId}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Reject Failed`,e.message)}},async doHangupPair(e,n){try{await r(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/hangup`,{agentId:n||e.requesterId}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Hang Up Failed`,e.message)}}}),gt=(e,t)=>({orchestrators:[],orchestratorSpawnOpen:!1,orchestratorInstallOpen:!1,spawnOrchId:``,spawnProvider:`claude`,spawnModel:U(`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:``},pendingForkImport:null,async fetchOrchestrators(){try{let n=K(t().orchestrators,await r(`GET`,`/orchestrators`));n!==t().orchestrators&&e({orchestrators:n})}catch{}},async refreshOrchestratorProviders(e){try{await r(`GET`,`/orchestrators/`+encodeURIComponent(e)+`/providers?refresh=1`),await t().fetchOrchestrators(),t().showNotification(`Provider status refreshed`)}catch(e){t().showError(`Provider Refresh Failed`,e.message)}},openAgentSpawn(){t().openOrchestratorSpawn()},closeAgentSpawn(){e({orchestratorSpawnOpen:!1})},async doSpawnAgent(){await t().submitOrchestratorSpawn()},openOrchestratorSpawn(){t().openOrchestratorSpawnAt()},openOrchestratorSpawnAt(n={}){let r=t().orchestrators.filter(e=>e.status===`online`);if(!r.length){t().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}let i=t(),a=n.orchestratorId?r.find(e=>e.id===n.orchestratorId):void 0;if(n.orchestratorId&&!a){t().showError(`Orchestrator Offline`,`The selected orchestrator is not online.`);return}let o=n.cwd?.trim()||i.spawnCwd,s=o?r.find(e=>f(o,e.baseDir)):void 0,c=i.spawnOrchId?r.find(e=>e.id===i.spawnOrchId):void 0,l=a?.id||s?.id||c?.id||r[0].id,u=r.find(e=>e.id===l),d=i.spawnProvider&&u.providers.includes(i.spawnProvider)?i.spawnProvider:H(u),p=i.spawnProvider===d&&i.spawnModel?i.spawnModel:U(d),m=o&&f(o,u.baseDir)?o:u.baseDir||``;e({spawnOrchId:l,spawnProvider:d,spawnModel:p,spawnEffort:i.spawnProvider===d&&i.spawnModel===p?i.spawnEffort:``,spawnProfile:i.spawnProfile||`default-relay`,spawnCwd:m,spawnLabel:``,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,pendingForkImport:null,orchestratorSpawnOpen:!0})},forkFromAgent(n,r){let i=t(),a=i.agentsById[n];if(!a){t().showError(`Fork`,`Agent not found.`);return}let o=i.orchestrators.filter(e=>e.status===`online`);if(!o.length){t().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?V[c]:void 0)?.models.find(e=>e.alias===l||e.providerModel===l)?.alias||``,p=s?.model?.effort||``,m=a.meta?.workspace,g=h(m)?m:{},v=_(g.repoRoot)||_(g.sourceCwd)||(typeof a.meta?.cwd==`string`?a.meta.cwd:``),y=_(g.mode),b=y===`isolated`?`isolated`:y===`shared`?`shared`:`inherit`,x=s?.session?.approvalMode||(typeof a.meta?.approvalMode==`string`?a.meta.approvalMode:`guarded`),S=a.label?`${a.label} (fork)`:``,C=o.find(e=>e.hostname===a.machine)||o.find(e=>f(v,e.baseDir))||o[0],w=ee(a),T=[];for(let e of r){let t=d(e).trim();if(!t)continue;let n=e.from===`user`?`user`:`agent`;T.push(`[${n}]: ${t}`)}let E=T.join(`
6
- `),D=14e3,O=`You are continuing work from a previous agent session (${w}). Below is the conversation history. Treat it as context for your work, not as your own actions.\n\n${E.length>D?`...
7
- `+E.slice(E.length-D):E}`,te=r.filter(e=>typeof e.id==`number`&&e.id>0).map(e=>e.id);e({spawnOrchId:C.id,spawnProvider:c||H(C),spawnModel:u||U(c||H(C)),spawnEffort:p,spawnProfile:i.spawnProfile||`default-relay`,spawnCwd:v||C.baseDir||``,spawnLabel:S,spawnApproval:x,spawnWorkspaceMode:b,spawnPrompt:`Continue from this previous session.`,spawnSystemPromptAppend:O,spawnCount:1,pendingForkImport:{sourcePeerId:a.id,sourceAgentId:a.id,sourceThreadId:a.id,sourceAgentLabel:w,messageIds:te},orchestratorSpawnOpen:!0})},openOrchestratorInstall(){e({orchestratorInstallOpen:!0})},openOrchestratorSpawnFor(n){let r=t(),i=r.orchestrators.find(e=>e.id===n),a=H(i),o=U(a),s=r.spawnProvider===a&&r.spawnModel===o?r.spawnEffort:``,c=r.spawnCwd&&f(r.spawnCwd,i?.baseDir)?r.spawnCwd:i?.baseDir||``;e({spawnOrchId:n,spawnProvider:a,spawnModel:o,spawnEffort:s,spawnProfile:r.spawnProfile||`default-relay`,spawnCwd:c,spawnLabel:``,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,pendingForkImport:null,orchestratorSpawnOpen:!0})},selectSpawnHistory(n,r){let i=t(),a=i.orchestrators.find(e=>e.id===n&&e.status===`online`);if(!a){t().showError(`Unavailable`,`That orchestrator is no longer online.`);return}if(n===i.spawnOrchId){e({spawnCwd:r});return}let o=i.spawnProvider&&a.providers.includes(i.spawnProvider)?i.spawnProvider:H(a),s=i.spawnProvider===o&&i.spawnModel?i.spawnModel:U(o);e({spawnOrchId:n,spawnProvider:o,spawnModel:s,spawnEffort:i.spawnProvider===o&&i.spawnModel===s?i.spawnEffort:``,spawnCwd:r})},async submitOrchestratorSpawn(){let n=t();if(n.isSpawning)return;if(!n.spawnOrchId){t().showError(`Validation`,`Select an orchestrator.`);return}let i=n.orchestrators.find(e=>e.id===n.spawnOrchId);if(!i){t().showError(`Validation`,`Selected orchestrator is not available.`);return}let a=n.spawnCwd.trim();if(!a){t().showError(`Validation`,`Select a working directory.`);return}if(!f(a,i.baseDir)){t().showError(`Validation`,`Working directory must be under ${i.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 t={provider:n.spawnProvider,orchestratorId:n.spawnOrchId,approvalMode:n.spawnApproval,workspaceMode:n.spawnWorkspaceMode||`inherit`};n.spawnModel&&(t.model=n.spawnModel),n.spawnEffort&&(t.effort=n.spawnEffort),n.spawnProfile&&(t.profile=n.spawnProfile),t.cwd=a,n.spawnLabel&&(t.label=s>1?`${n.spawnLabel} ${e+1}`:n.spawnLabel),n.spawnPrompt&&(t.prompt=n.spawnPrompt),n.spawnSystemPromptAppend&&(t.systemPromptAppend=n.spawnSystemPromptAppend);let i=(await r(`POST`,`/agents/spawn`,t)).command?.params?.spawnRequestId;o&&i&&o.messageIds.length>0&&await r(`POST`,`/chat/history-imports`,{targetSpawnRequestId:i,sourcePeerId:o.sourcePeerId,sourceAgentId:o.sourceAgentId,sourceThreadId:o.sourceThreadId,sourceAgentLabel:o.sourceAgentLabel,importedBy:y,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([t().fetchAgents(),t().fetchOrchestrators(),t().fetchActivityEvents(),t().fetchChatHistoryImports()])}catch(n){e({isSpawning:!1}),t().showError(`Spawn Failed`,n.message)}},orchestratorAction(e,n,i,a){let o=n===`restart`?`Restart`:`Shutdown`,s=i?`agent "${i}"`:`all agents`;t().openConfirm(`${o} Agent`,`${o} ${s} on orchestrator "${e}"?`,async()=>{try{await r(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:n,agentId:i,...a?{surface:{component:a}}:{}}),await Promise.all([t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`${o} Failed`,e.message)}})},upgradeOrchestrator(e,n){let i=n?` to v${n}`:` to match the relay`;t().openConfirm(`Upgrade Orchestrator`,`Upgrade "${e}"${i}? It will install the new version and restart itself.`,async()=>{try{await r(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:`upgrade`,...n?{targetVersion:n}:{}}),await Promise.all([t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`Upgrade Failed`,e.message)}})},deleteOrchestrator(e){t().openConfirm(`Remove Orchestrator`,`Remove orchestrator "${e}"?`,async()=>{try{await r(`DELETE`,`/orchestrators/`+encodeURIComponent(e)),await Promise.all([t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`Delete Failed`,e.message)}})},async browseSpawnDirectory(n){let i=t().spawnOrchId;if(!i)return;let a=t().spawnDirBrowser;e({spawnDirBrowser:{...a,loading:!0,error:``}});try{let a=n?`?path=`+encodeURIComponent(n):``,o=await r(`GET`,`/orchestrators/`+encodeURIComponent(i)+`/directories`+a);e({spawnDirBrowser:{open:!0,loading:!1,path:o.path||``,parent:o.parent||``,baseDir:o.baseDir||``,entries:o.entries||[],error:``},spawnCwd:o.path||t().spawnCwd})}catch(n){e({spawnDirBrowser:{...t().spawnDirBrowser,loading:!1,error:n.message}})}},selectSpawnDirectory(n){e({spawnCwd:n||t().spawnDirBrowser.path,spawnDirBrowser:{...t().spawnDirBrowser,open:!1}})}}),_t=(e,t)=>({managedPolicies:[],policyModal:{open:!1,editing:``,name:``,description:``,orchestratorId:``,cwd:``,enabled:void 0,provider:`claude`,rig:``,model:U(`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:``},agentProfiles:[],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:{}}},async fetchManagedPolicies(){try{e({managedPolicies:await r(`GET`,`/spawn-policies/health`)})}catch{}},async fetchAgentProfiles(){try{e({agentProfiles:(await r(`GET`,`/agent-profiles`)).map(e=>e.value)})}catch{}},openPolicyCreate(){let n=t().orchestrators.filter(e=>e.status===`online`);if(!n.length){t().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}e({policyModal:{open:!0,editing:``,name:``,description:``,orchestratorId:n[0].id,cwd:``,enabled:void 0,provider:H(n[0]),rig:``,model:U(H(n[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,enabled:t.enabled,description:t.description||``,orchestratorId:t.orchestratorId,cwd:t.cwd,provider:t.provider,rig:t.rig||``,model:t.model||U(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=t().policyModal;if(!n.name.trim()){t().showError(`Validation`,`Policy name is required.`);return}if(!n.orchestratorId){t().showError(`Validation`,`Select an orchestrator.`);return}if(!n.cwd.trim()){t().showError(`Validation`,`Working directory is required.`);return}let i=e=>e.split(/[,\s]+/).map(e=>e.trim()).filter(Boolean),a={name:n.name.trim(),...n.description.trim()?{description:n.description.trim()}:{},...n.enabled===void 0?{}:{enabled:n.enabled},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:i(n.tags),capabilities:i(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:i(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 r(`PUT`,`/spawn-policy/`+encodeURIComponent(a.name),a),e({policyModal:{...n,open:!1}}),await t().fetchManagedPolicies()}catch(e){t().showError(`Save Failed`,e.message)}},deletePolicy(e){t().openConfirm(`Delete Policy`,`Delete managed agent policy "${e}"? This will stop any running agent.`,async()=>{try{await r(`DELETE`,`/spawn-policy/`+encodeURIComponent(e)),await t().fetchManagedPolicies()}catch(e){t().showError(`Delete Failed`,e.message)}})},async browsePolicyDirectory(n){let i=t().policyModal.orchestratorId;if(!i)return;let a=t().policyDirBrowser;e({policyDirBrowser:{...a,loading:!0,error:``}});try{let a=n?`?path=`+encodeURIComponent(n):``,o=await r(`GET`,`/orchestrators/`+encodeURIComponent(i)+`/directories`+a);e({policyDirBrowser:{open:!0,loading:!1,path:o.path||``,parent:o.parent||``,baseDir:o.baseDir||``,entries:o.entries||[],error:``},policyModal:{...t().policyModal,cwd:o.path||t().policyModal.cwd}})}catch(n){e({policyDirBrowser:{...t().policyDirBrowser,loading:!1,error:n.message}})}},selectPolicyDirectory(n){e({policyModal:{...t().policyModal,cwd:n||t().policyDirBrowser.path},policyDirBrowser:{...t().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:{...t().profileModal,open:!1}})},updateProfileModal(n){let r=t().profileModal.profile;e({profileModal:{...t().profileModal,profile:{...r,...n}}})},async saveProfile(){let{mode:n,profile:i}=t().profileModal;if(!i.name.trim()){t().showError(`Validation`,`Profile name is required.`);return}if(n!==`view`)try{await r(`PUT`,`/agent-profiles/`+encodeURIComponent(i.name.trim()),i),e({profileModal:{...t().profileModal,open:!1}}),await t().fetchAgentProfiles(),t().showNotification(`Profile "${i.name}" saved`)}catch(e){t().showError(`Save Failed`,e.message)}},deleteProfile(e){t().openConfirm(`Delete Profile`,`Delete agent profile "${e}"?`,async()=>{try{await r(`DELETE`,`/agent-profiles/`+encodeURIComponent(e)),await t().fetchAgentProfiles(),t().showNotification(`Profile "${e}" deleted`)}catch(e){t().showError(`Delete Failed`,e.message)}})}}),vt=(e,t)=>({operatorActivity:[],recordOperatorActivity(n){let i={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:[i,...t().operatorActivity.slice(0,79)]}),r(`POST`,`/activity`,{operatorId:y,clientId:i.clientId,kind:i.kind,title:i.title,body:i.body,meta:i.meta,icon:i.icon,view:i.view,peer:i.peer,messageId:i.messageId,pairId:i.pairId,taskId:i.taskId,agentId:i.agentId}).catch(()=>{})},async openActivityItem(e){if(e.view&&await t().switchView(e.view===`inbox`?`chat`:e.view),e.peer&&t().openInboxThread(e.peer),e.agentId){let n=t().agentsById[e.agentId];n&&t().openAgentDetail(n)}if(e.taskId){let n=t().tasks.find(t=>t.id===e.taskId);n&&await t().openTaskEvents(n)}}});function Q(e){return m(e.createdAt??e.ts)}function yt(e,t){let n=[`# Agent Relay Timeline`,``,`Exported: ${t}`,`Events: ${e.length}`,``];for(let t of e){let e=new Date(Q(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(`
8
- `)}var bt=(e,t)=>({activityEvents:[],activityFilter:``,async fetchActivityEvents(){try{e({activityEvents:await r(`GET`,`/activity?limit=200`)})}catch{}},exportActivity(e){let n=t(),r=[...n.operatorActivity,...n.activityEvents].sort((e,t)=>Q(t)-Q(e)),i=new Date().toISOString(),a=`agent-relay-timeline-${i.slice(0,10)}.${e===`json`?`json`:`md`}`;e===`json`?E(a,JSON.stringify({title:`Agent Relay Timeline`,exportedAt:i,events:r},null,2),`application/json`):E(a,yt(r,i),`text/markdown`)},exportThread(e,t){let n=`agent-relay-thread-${l(e.peer)}.${t===`json`?`json`:`md`}`,r={title:`Thread: `+e.peer,importedHistory:e.importedHistory||[],messages:e.messages,exportedAt:new Date().toISOString()};E(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},exportPair(e,t){let n=`agent-relay-pair-${l(e.id)}.${t===`json`?`json`:`md`}`,r={title:`Pair: `+e.id,pair:e,exportedAt:new Date().toISOString()};E(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},async exportTask(n,i){let a=t().taskEventCache[n.id]||[];if(!a.length)try{a=await r(`GET`,`/tasks/`+n.id+`/events`),e({taskEventCache:{...t().taskEventCache,[n.id]:a}})}catch{}let o=`agent-relay-task-${n.id}.${i===`json`?`json`:`md`}`,s={title:`Task: `+(n.title||`#`+n.id),task:n,events:a,exportedAt:new Date().toISOString()};E(o,JSON.stringify(s,null,2),i===`json`?`application/json`:`text/markdown`)}}),xt=(e,t)=>({channels:[],connectors:[],integrations:[],automations:[],automationRuns:[],health:null,maintenanceJobs:[],analyticsPeriod:`24h`,analyticsData:null,async fetchChannels(){try{e({channels:await r(`GET`,`/channels`)})}catch{}},async fetchConnectors(){try{e({connectors:await r(`GET`,`/connectors`)})}catch{}},async fetchIntegrations(){try{e({integrations:await r(`GET`,`/integrations`)})}catch{}},async fetchAutomations(){try{e({automations:await r(`GET`,`/automations`)})}catch{}},async fetchAutomationRuns(t){try{let n=new URLSearchParams({limit:`100`});t&&n.set(`automationId`,t),e({automationRuns:await r(`GET`,`/automation-runs?`+n.toString())})}catch{}},async fetchHealth(){try{e({health:await r(`GET`,`/health`)})}catch{}},async fetchMaintenanceJobs(){try{e({maintenanceJobs:await r(`GET`,`/maintenance/jobs`)})}catch{}},async runMaintenanceJob(n){try{let i=await r(`POST`,`/maintenance/jobs/`+encodeURIComponent(n)+`/run`,{});return e({maintenanceJobs:i.jobs}),t().showNotification(i.run.status===`succeeded`?`Maintenance job completed`:`Maintenance job skipped`),i.run}catch(e){return t().showError(`Maintenance Job Failed`,e.message),await t().fetchMaintenanceJobs(),null}},async runHealthAction(n){if(n.preset&&e({agentPresetFilter:n.preset,showOffline:!0}),n.api&&n.path&&(await r(n.api,n.path),await t().refreshLiveData()),n.view&&await t().switchView(n.view),n.copy)try{await navigator.clipboard?.writeText(n.copy)}catch{}},async runConnectorAction(e,n){try{let i=await r(`POST`,`/connectors/`+encodeURIComponent(e)+`/actions`,{action:n});if(await t().fetchConnectors(),!i.ok)throw Error(i.stderr||`${n} failed`);return i}catch(e){throw t().showError(`Connector Action Failed`,e.message),e}},async fetchAnalytics(){try{e({analyticsData:await r(`GET`,`/stats/analytics?period=`+t().analyticsPeriod)})}catch{}},setAnalyticsPeriod(n){e({analyticsPeriod:n}),t().fetchAnalytics()}}),St=(e,t)=>({workspaces:[],workspaceFocusId:null,workspaceGitState:{},workspaceMergePreview:{},workspaceDiff:{},workspaceOrphans:[],async openWorkspaceFocus(n){e({workspaceFocusId:n}),await t().switchView(`workspaces`)},async fetchWorkspaces(){try{e({workspaces:await r(`GET`,`/workspaces`)})}catch{}},async fetchWorkspaceGitState(t){try{let n=await r(`GET`,`/workspaces/`+encodeURIComponent(t)+`/git-state`);e(e=>({workspaceGitState:{...e.workspaceGitState,[t]:n}}))}catch(n){e(e=>({workspaceGitState:{...e.workspaceGitState,[t]:{available:!1,reason:n.message}}}))}},async fetchWorkspaceMergePreview(t){try{let n=await r(`GET`,`/workspaces/`+encodeURIComponent(t)+`/merge-preview`);e(e=>({workspaceMergePreview:{...e.workspaceMergePreview,[t]:n}}))}catch(n){e(e=>({workspaceMergePreview:{...e.workspaceMergePreview,[t]:{available:!1,reason:n.message}}}))}},async fetchWorkspaceDiff(t){try{let n=await r(`GET`,`/workspaces/`+encodeURIComponent(t)+`/diff`);e(e=>({workspaceDiff:{...e.workspaceDiff,[t]:n}}))}catch(n){e(e=>({workspaceDiff:{...e.workspaceDiff,[t]:{available:!1,reason:n.message}}}))}},async fetchWorkspaceOrphans(){try{e({workspaceOrphans:(await r(`GET`,`/workspaces/orphans`)).orphans??[]})}catch{}},async reclaimWorkspaceOrphan(e){t().openConfirm(`Reclaim Orphan Worktree`,`Remove the orphaned worktree "${e.branch||e.worktreePath}" from disk? It has no live agent.`,async()=>{try{await r(`POST`,`/workspaces/orphans/reclaim`,{worktreePath:e.worktreePath,repoRoot:e.repoRoot,branch:e.branch}),t().showNotification(`Orphan reclaim dispatched`),await Promise.all([t().fetchWorkspaceOrphans(),t().fetchActivityEvents()])}catch(e){t().showError(`Reclaim Failed`,e.message)}})},async workspaceAction(e,n){let i=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 r(`POST`,`/workspaces/`+encodeURIComponent(e)+`/actions`,{action:n}),t().showNotification(n===`cleanup`?`Workspace cleanup requested`:n===`merge`?`Workspace merge dispatched`:`Workspace updated: ${i}`),await Promise.all([t().fetchWorkspaces(),t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`Workspace Action Failed`,e.message)}};if(n===`cleanup`||n===`abandon`||n===`merge`){let r=t().workspaces.find(t=>t.id===e),i=r?.branch||r?.worktreePath||e;if(n===`merge`){let n=t().workspaceMergePreview[e],r=n&&n.available!==!1?` — ${n.strategy===`pr`?`opens a PR`:`rebases & fast-forwards into ${n.baseRef||`base`}, then deletes the branch`}.`:` — lands the work and deletes the branch.`;t().openConfirm(`Merge Workspace`,`Merge workspace "${i}"?${r}`,a);return}if(n===`cleanup`){await t().fetchWorkspaceGitState(e);let n=t().workspaceGitState[e],r=``;if(n&&n.available!==!1&&!n.missing){let e=n.ahead??0,t=n.dirtyCount??0;(e>0||t>0)&&(r=` ⚠ This destroys ${[e>0?`${e} unmerged commit(s)`:``,t>0?`${t} uncommitted change(s)`:``].filter(Boolean).join(` and `)}.`)}t().openConfirm(`Cleanup Workspace`,`Remove the worktree for "${i}" on the host?${r}`,a);return}t().openConfirm(`Abandon Workspace`,`Abandon workspace "${i}"?`,a);return}await a()},async purgeWorkspace(e){let n=t().workspaces.find(t=>t.id===e),i=n?.branch||n?.worktreePath||e;t().openConfirm(`Purge Workspace Record`,`Permanently remove the record for "${i}"? This only clears the dashboard row — it does not touch disk.`,async()=>{try{await r(`DELETE`,`/workspaces/`+encodeURIComponent(e)),t().showNotification(`Workspace record purged`),await Promise.all([t().fetchWorkspaces(),t().fetchActivityEvents()])}catch(e){t().showError(`Purge Failed`,e.message)}})}}),Ct=(e,t)=>({memories:[],memoryTotal:0,memoryBrokerInfo:null,memoryStats:null,memoryFilters:{search:``,type:``,scope:``,tags:``,visibility:``,minRelevance:`0`},selectedMemoryId:``,memoryLoading:!1,async refreshMemory(){await Promise.all([t().fetchMemoryBroker(),t().fetchMemoryStats(),t().fetchMemories()])},async fetchMemoryBroker(){try{e({memoryBrokerInfo:await r(`GET`,`/memories/broker`)})}catch(e){t().showError(`Memory Broker Failed`,e.message)}},async fetchMemoryStats(){try{e({memoryStats:await r(`GET`,`/memories/stats`)})}catch{}},async fetchMemories(){let n=t().memoryFilters,i={limit:100};if(n.type&&(i.type=n.type),n.scope.trim()&&(i.scope=n.scope.trim()),n.visibility&&(i.visibility=n.visibility),n.tags.trim()&&(i.tags=n.tags.split(`,`).map(e=>e.trim()).filter(Boolean)),n.minRelevance.trim()!==``){let e=Number(n.minRelevance);Number.isFinite(e)&&(i.minRelevance=Math.max(0,Math.min(1,e)))}e({memoryLoading:!0});try{let n=await r(`POST`,`/memories/search`,i),a=n.memories.some(e=>e.id===t().selectedMemoryId)?t().selectedMemoryId:n.memories[0]?.id||``;e({memories:n.memories,memoryTotal:n.total,selectedMemoryId:a})}catch(e){t().showError(`Memory Search Failed`,e.message)}finally{e({memoryLoading:!1})}},async saveMemory(n,i){try{e({selectedMemoryId:(i?await r(`PATCH`,`/memories/`+encodeURIComponent(i),n):await r(`POST`,`/memories`,n)).id}),await Promise.all([t().fetchMemories(),t().fetchMemoryStats()]),t().showNotification(i?`Memory updated`:`Memory created`)}catch(e){t().showError(`Memory Save Failed`,e.message)}},deleteMemory(n){t().openConfirm(`Delete Memory`,`Delete memory "${n}"?`,async()=>{try{await r(`DELETE`,`/memories/`+encodeURIComponent(n)),e({selectedMemoryId:``}),await Promise.all([t().fetchMemories(),t().fetchMemoryStats()]),t().showNotification(`Memory deleted`)}catch(e){t().showError(`Delete Failed`,e.message)}})},async injectMemory(e){try{let n=await r(`POST`,`/memories/inject`,e);return t().showNotification(`Memory inject command sent to ${e.agentId}`),n}catch(e){return t().showError(`Memory Inject Failed`,e.message),null}}}),$=se()(ue((...e)=>({...nt(...e),...rt(...e),...ct(...e),...pt(...e),...mt(...e),...ht(...e),...gt(...e),..._t(...e),...Qe(...e),...vt(...e),...bt(...e),...$e(...e),...xt(...e),...St(...e),...Ct(...e)}),{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,planCollapsed:e.planCollapsed,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})}));$.subscribe(tt);export{P as a,xe as c,we as d,De as f,V as i,Ee as l,X as n,Oe as o,N as p,Z as r,ke as s,$ as t,Ce as u};
9
- //# sourceMappingURL=store-DXdfhiVf.js.map