agent-relay-server 0.71.0 → 0.72.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 (132) hide show
  1. package/docs/openapi.json +1 -1
  2. package/package.json +2 -2
  3. package/public/assets/MessageBubble-ak21YMQE.js +3 -0
  4. package/public/assets/{MessageBubble-DPcJxTJj.js.map → MessageBubble-ak21YMQE.js.map} +1 -1
  5. package/public/assets/{PlanGraphPanel-BYmE8ldg.js → PlanGraphPanel-CubzRNGK.js} +2 -2
  6. package/public/assets/{PlanGraphPanel-BYmE8ldg.js.map → PlanGraphPanel-CubzRNGK.js.map} +1 -1
  7. package/public/assets/{activity-BzU196gP.js → activity-83lDNDEp.js} +2 -2
  8. package/public/assets/{activity-BzU196gP.js.map → activity-83lDNDEp.js.map} +1 -1
  9. package/public/assets/{agent-profiles-CQuoP8Nr.js → agent-profiles-BzjoH-NX.js} +2 -2
  10. package/public/assets/{agent-profiles-CQuoP8Nr.js.map → agent-profiles-BzjoH-NX.js.map} +1 -1
  11. package/public/assets/{agents-qH6q44nK.js → agents-BQhoABy8.js} +2 -2
  12. package/public/assets/{agents-qH6q44nK.js.map → agents-BQhoABy8.js.map} +1 -1
  13. package/public/assets/{analytics-EJH9GFID.js → analytics-BrsfrNFw.js} +3 -3
  14. package/public/assets/{analytics-EJH9GFID.js.map → analytics-BrsfrNFw.js.map} +1 -1
  15. package/public/assets/{automation-Dahmxg07.js → automation-VYuix2Iu.js} +2 -2
  16. package/public/assets/{automation-Dahmxg07.js.map → automation-VYuix2Iu.js.map} +1 -1
  17. package/public/assets/{badge-C6NJQ60B.js → badge-lljplQxm.js} +2 -2
  18. package/public/assets/{badge-C6NJQ60B.js.map → badge-lljplQxm.js.map} +1 -1
  19. package/public/assets/{branch-state-badge-C7H8HY22.js → branch-state-badge-DjdzycOv.js} +2 -2
  20. package/public/assets/{branch-state-badge-C7H8HY22.js.map → branch-state-badge-DjdzycOv.js.map} +1 -1
  21. package/public/assets/{button-DD2CCM3t.js → button-BwkKot02.js} +2 -2
  22. package/public/assets/{button-DD2CCM3t.js.map → button-BwkKot02.js.map} +1 -1
  23. package/public/assets/card-ByAPej7n.js +2 -0
  24. package/public/assets/{card-GZqj3rMm.js.map → card-ByAPej7n.js.map} +1 -1
  25. package/public/assets/{channels-VhlwES_A.js → channels-n4vJBF5t.js} +2 -2
  26. package/public/assets/{channels-VhlwES_A.js.map → channels-n4vJBF5t.js.map} +1 -1
  27. package/public/assets/chat-Dh-3tqyP.js +2 -0
  28. package/public/assets/{chat-DJqvtoFT.js.map → chat-Dh-3tqyP.js.map} +1 -1
  29. package/public/assets/{connectors-C03pRoXx.js → connectors-B8cKMHKY.js} +2 -2
  30. package/public/assets/{connectors-C03pRoXx.js.map → connectors-B8cKMHKY.js.map} +1 -1
  31. package/public/assets/copy-button-Pha61-a_.js +2 -0
  32. package/public/assets/{copy-button-DqAoeiPC.js.map → copy-button-Pha61-a_.js.map} +1 -1
  33. package/public/assets/display-LAWaAboe.js.map +1 -1
  34. package/public/assets/{dist-CePvvSwo.js → dist-0mCQ5WMT.js} +2 -2
  35. package/public/assets/{dist-CePvvSwo.js.map → dist-0mCQ5WMT.js.map} +1 -1
  36. package/public/assets/{dist-DByqf8W0.js → dist-B2WRWI7O.js} +2 -2
  37. package/public/assets/{dist-DByqf8W0.js.map → dist-B2WRWI7O.js.map} +1 -1
  38. package/public/assets/{dist-CROpCfON.js → dist-BBMeJabC.js} +2 -2
  39. package/public/assets/{dist-CROpCfON.js.map → dist-BBMeJabC.js.map} +1 -1
  40. package/public/assets/{dist-C_XTOHbv.js → dist-BXI214fV.js} +2 -2
  41. package/public/assets/{dist-C_XTOHbv.js.map → dist-BXI214fV.js.map} +1 -1
  42. package/public/assets/{dist-CpugiXtB.js → dist-BowDWFij.js} +2 -2
  43. package/public/assets/{dist-CpugiXtB.js.map → dist-BowDWFij.js.map} +1 -1
  44. package/public/assets/{dist-BauUE17c.js → dist-CT_Zr-w5.js} +2 -2
  45. package/public/assets/{dist-BauUE17c.js.map → dist-CT_Zr-w5.js.map} +1 -1
  46. package/public/assets/{dist-Djf_WfhW.js → dist-CXLRXIMd.js} +2 -2
  47. package/public/assets/{dist-Djf_WfhW.js.map → dist-CXLRXIMd.js.map} +1 -1
  48. package/public/assets/dist-CXzYZzCR.js +2 -0
  49. package/public/assets/{dist-DMD9fD99.js.map → dist-CXzYZzCR.js.map} +1 -1
  50. package/public/assets/{dist-otKoCUDq.js → dist-CcBB6z4x.js} +2 -2
  51. package/public/assets/{dist-otKoCUDq.js.map → dist-CcBB6z4x.js.map} +1 -1
  52. package/public/assets/dist-CgbWbsmS.js +2 -0
  53. package/public/assets/{dist-CW_EpVCQ.js.map → dist-CgbWbsmS.js.map} +1 -1
  54. package/public/assets/dist-DTgYq8HB.js +2 -0
  55. package/public/assets/{dist-DJ6ZVqRl.js.map → dist-DTgYq8HB.js.map} +1 -1
  56. package/public/assets/{es2015-t3pwjvKi.js → es2015-CkzQKfKp.js} +2 -2
  57. package/public/assets/{es2015-t3pwjvKi.js.map → es2015-CkzQKfKp.js.map} +1 -1
  58. package/public/assets/{formatted-body-impl-DhvR8Z-A.js → formatted-body-impl-Drko1nzi.js} +2 -2
  59. package/public/assets/{formatted-body-impl-DhvR8Z-A.js.map → formatted-body-impl-Drko1nzi.js.map} +1 -1
  60. package/public/assets/{index-Dh7NjR-l.css → index-Cczea_lj.css} +1 -1
  61. package/public/assets/index-ChQVgQyf.js +22 -0
  62. package/public/assets/{index-VGRP16ua.js.map → index-ChQVgQyf.js.map} +1 -1
  63. package/public/assets/{input-08ItMIki.js → input-sp_EWS3J.js} +2 -2
  64. package/public/assets/{input-08ItMIki.js.map → input-sp_EWS3J.js.map} +1 -1
  65. package/public/assets/{insights-v9noub5E.js → insights-BRclOzwJ.js} +2 -2
  66. package/public/assets/{insights-v9noub5E.js.map → insights-BRclOzwJ.js.map} +1 -1
  67. package/public/assets/{integrations-BEa3ArUw.js → integrations-CfaOLw9i.js} +2 -2
  68. package/public/assets/{integrations-BEa3ArUw.js.map → integrations-CfaOLw9i.js.map} +1 -1
  69. package/public/assets/{lib-CMqRPJG-.js → lib-DNMJa4Hh.js} +3 -3
  70. package/public/assets/{lib-CMqRPJG-.js.map → lib-DNMJa4Hh.js.map} +1 -1
  71. package/public/assets/{lucide-react-BbMYCUlW.js → lucide-react--HSX8ykl.js} +2 -2
  72. package/public/assets/{lucide-react-BbMYCUlW.js.map → lucide-react--HSX8ykl.js.map} +1 -1
  73. package/public/assets/{maintenance-DyRfVkhp.js → maintenance-BWbsnscm.js} +2 -2
  74. package/public/assets/{maintenance-DyRfVkhp.js.map → maintenance-BWbsnscm.js.map} +1 -1
  75. package/public/assets/{managed-agents-BSdMoBgG.js → managed-agents-D6yncoFy.js} +2 -2
  76. package/public/assets/{managed-agents-BSdMoBgG.js.map → managed-agents-D6yncoFy.js.map} +1 -1
  77. package/public/assets/{markdown-preview-impl-DidsrMmn.js → markdown-preview-impl-o59KaM_T.js} +2 -2
  78. package/public/assets/{markdown-preview-impl-DidsrMmn.js.map → markdown-preview-impl-o59KaM_T.js.map} +1 -1
  79. package/public/assets/{memory-DM8muGVW.js → memory-CXoJ1LvP.js} +2 -2
  80. package/public/assets/{memory-DM8muGVW.js.map → memory-CXoJ1LvP.js.map} +1 -1
  81. package/public/assets/{messages-BqjAkcBF.js → messages-EqiGQvcb.js} +2 -2
  82. package/public/assets/{messages-BqjAkcBF.js.map → messages-EqiGQvcb.js.map} +1 -1
  83. package/public/assets/{orchestrators-C_mjUDZg.js → orchestrators-Ds_vwaEy.js} +2 -2
  84. package/public/assets/{orchestrators-C_mjUDZg.js.map → orchestrators-Ds_vwaEy.js.map} +1 -1
  85. package/public/assets/{overview-Cpu2plX-.js → overview-DSe3b-6K.js} +2 -2
  86. package/public/assets/{overview-Cpu2plX-.js.map → overview-DSe3b-6K.js.map} +1 -1
  87. package/public/assets/{pairs--8_0A0lq.js → pairs-C6RT1uqI.js} +2 -2
  88. package/public/assets/{pairs--8_0A0lq.js.map → pairs-C6RT1uqI.js.map} +1 -1
  89. package/public/assets/{projects-nCww9PG1.js → projects-QriMCcqU.js} +2 -2
  90. package/public/assets/{projects-nCww9PG1.js.map → projects-QriMCcqU.js.map} +1 -1
  91. package/public/assets/{react-dom-HJwa4sZ-.js → react-dom-c3AoN3Om.js} +2 -2
  92. package/public/assets/{react-dom-HJwa4sZ-.js.map → react-dom-c3AoN3Om.js.map} +1 -1
  93. package/public/assets/{security-CwgoEvJT.js → security-CbpLH77r.js} +2 -2
  94. package/public/assets/{security-CwgoEvJT.js.map → security-CbpLH77r.js.map} +1 -1
  95. package/public/assets/{select-Bhx6zSZr.js → select-B50dx5dg.js} +2 -2
  96. package/public/assets/{select-Bhx6zSZr.js.map → select-B50dx5dg.js.map} +1 -1
  97. package/public/assets/settings-mBwuRyo3.js +4 -0
  98. package/public/assets/{settings-BNQBnKXg.js.map → settings-mBwuRyo3.js.map} +1 -1
  99. package/public/assets/store-C_mEOgkp.js +9 -0
  100. package/public/assets/{store-BB-YW24l.js.map → store-C_mEOgkp.js.map} +1 -1
  101. package/public/assets/{tasks-C5Kv18N7.js → tasks-XzhOn6rE.js} +2 -2
  102. package/public/assets/{tasks-C5Kv18N7.js.map → tasks-XzhOn6rE.js.map} +1 -1
  103. package/public/assets/teams-Dm6ToSMX.js +2 -0
  104. package/public/assets/{teams-D_Ttv7qD.js.map → teams-Dm6ToSMX.js.map} +1 -1
  105. package/public/assets/{terminal-viewer-impl-5y8v9jNx.js → terminal-viewer-impl-BRu1_SEu.js} +3 -3
  106. package/public/assets/{terminal-viewer-impl-5y8v9jNx.js.map → terminal-viewer-impl-BRu1_SEu.js.map} +1 -1
  107. package/public/assets/{use-keyboard-viewport-CEmOxaNm.js → use-keyboard-viewport-NLJzBfhI.js} +2 -2
  108. package/public/assets/{use-keyboard-viewport-CEmOxaNm.js.map → use-keyboard-viewport-NLJzBfhI.js.map} +1 -1
  109. package/public/assets/{work-queue-BB7bYLIK.js → work-queue-CjnV15xQ.js} +2 -2
  110. package/public/assets/{work-queue-BB7bYLIK.js.map → work-queue-CjnV15xQ.js.map} +1 -1
  111. package/public/assets/workspaces-DgeUNiwv.js +3 -0
  112. package/public/assets/{workspaces-CrtAeVnv.js.map → workspaces-DgeUNiwv.js.map} +1 -1
  113. package/public/index.html +21 -21
  114. package/runner/src/adapter.ts +7 -1
  115. package/src/db/message-reads.ts +8 -46
  116. package/src/db/messages.ts +176 -0
  117. package/src/mcp/tools-spawn.ts +1 -1
  118. package/src/project-instructions.ts +12 -1
  119. package/src/services/send-message.ts +3 -0
  120. package/src/services/spawn-agent.ts +8 -10
  121. package/public/assets/MessageBubble-DPcJxTJj.js +0 -3
  122. package/public/assets/card-GZqj3rMm.js +0 -2
  123. package/public/assets/chat-DJqvtoFT.js +0 -2
  124. package/public/assets/copy-button-DqAoeiPC.js +0 -2
  125. package/public/assets/dist-CW_EpVCQ.js +0 -2
  126. package/public/assets/dist-DJ6ZVqRl.js +0 -2
  127. package/public/assets/dist-DMD9fD99.js +0 -2
  128. package/public/assets/index-VGRP16ua.js +0 -22
  129. package/public/assets/settings-BNQBnKXg.js +0 -4
  130. package/public/assets/store-BB-YW24l.js +0 -9
  131. package/public/assets/teams-D_Ttv7qD.js +0 -2
  132. package/public/assets/workspaces-CrtAeVnv.js +0 -3
@@ -1,4 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{Bn as t,E as n,P as r,Qn as i,R as a,Rn as o,Rt as s,Ut as c,V as l,Vn as u,bn as d,c as f,cn as p,k as m,m as h,on as g,q as _,x as v,zt as y}from"./lucide-react-BbMYCUlW.js";import{d as b,p as x,s as S,t as C}from"./store-BB-YW24l.js";import{J as ee,Z as w}from"./display-LAWaAboe.js";import{t as T}from"./themes-mW9zZP4O.js";import{a as E,i as D,n as O,r as k,t as A}from"./select-Bhx6zSZr.js";import{t as j}from"./badge-C6NJQ60B.js";import{t as M}from"./button-DD2CCM3t.js";import{t as N}from"./input-08ItMIki.js";import{F as P,r as F}from"./index-VGRP16ua.js";import{a as I,i as L,n as R,o as z,r as B,t as V}from"./card-GZqj3rMm.js";var H=e(i(),1);function U(e){return`${e.namespace}/${e.key}`}function te(e){return`/settings/${encodeURIComponent(e.namespace)}/${encodeURIComponent(e.key)}`}function ne(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)||`settings`}function re(e){let t=new Map;for(let n of e.filter(e=>e.readable)){let e=n.display?.group?.trim()||n.namespace;t.set(e,[...t.get(e)??[],n])}return[...t.entries()].map(([e,t])=>({group:e,slug:ne(e),settings:t.sort(ie)})).sort((e,t)=>ae(e.settings)-ae(t.settings)||e.group.localeCompare(t.group))}function ie(e,t){return(e.display?.order??2**53-1)-(t.display?.order??2**53-1)||e.display?.label?.localeCompare(t.display?.label??``)||U(e).localeCompare(U(t))}function ae(e){return Math.min(...e.map(e=>e.display?.order??2**53-1))}function W(e){return Array.isArray(e.type)?e.type.find(e=>e!==`null`):e.type}function G(e,t,n){if(!t.length)return n;let[r,...i]=t;if(r===void 0)return n;if(typeof r==`number`){let t=Array.isArray(e)?[...e]:[];return t[r]=G(t[r],i,n),t}let a=w(e)?{...e}:{},o=G(a[r],i,n);return o===void 0?delete a[r]:a[r]=o,a}function K(e){if(e.default!==void 0)return e.default;if(e.const!==void 0)return e.const;if(e.enum?.length)return e.enum[0];switch(W(e)){case`boolean`:return!1;case`integer`:case`number`:return 0;case`array`:return[];case`object`:return{};case`string`:return``;default:return}}function q(e){return e.split(/\r?\n|,/).map(e=>e.trim()).filter(Boolean)}function oe(e){return Array.isArray(e)?e.map(e=>String(e)).join(`
2
- `):``}function se(e){return w(e)?Object.entries(e).map(([e,t])=>`${e}=${String(t??``)}`).join(`
3
- `):``}function ce(e){return Object.fromEntries(e.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf(`=`);return t>=0?[e.slice(0,t).trim(),e.slice(t+1)]:[e,``]}))}var J=t(),le=`__unset__`;function ue(e){return e===`server-runtime`?`Server runtime`:e===`bootstrap`?`Bootstrap`:`Browser`}function de(e){return e===`server-runtime`?`Stored by Relay and mutable while the server is running.`:e===`bootstrap`?`Read from startup configuration; restart or host config changes are required.`:`Stored only in this browser profile.`}function fe(e){return e===`browser`?(0,J.jsx)(_,{className:`size-3.5`}):(0,J.jsx)(n,{className:`size-3.5`})}function Y(e){return e.details??[]}function pe({group:e,settings:t,onSaved:n}){let r=[...new Set(t.map(e=>e.tier))];return(0,J.jsxs)(`section`,{className:`space-y-3`,children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,J.jsx)(`h2`,{className:`text-base font-semibold`,children:e}),(0,J.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:r.map(e=>(0,J.jsxs)(j,{variant:`outline`,className:`gap-1`,title:de(e),children:[fe(e),ue(e)]},e))})]}),t.length===0?(0,J.jsx)(V,{size:`sm`,children:(0,J.jsx)(B,{className:`text-sm text-muted-foreground`,children:`No settings in this group.`})}):(0,J.jsx)(`div`,{className:`space-y-3`,children:t.map(e=>(0,J.jsx)(me,{setting:e,onSaved:n},U(e)))})]})}function me({setting:e,onSaved:t}){let[n,r]=(0,H.useState)(()=>e.value??e.defaults??K(e.schema)),[i,a]=(0,H.useState)(!1),[o,s]=(0,H.useState)(``),[c,l]=(0,H.useState)([]),d=e.writable&&e.tier===`server-runtime`;function f(e,t){r(n=>G(n,e,t)),l([]),s(``)}async function h(){if(d){a(!0),l([]),s(``);try{let i=await u(`PUT`,te(e),{value:n,updatedBy:`dashboard`});r(i.value),t(i),s(`Saved`)}catch(e){let t=Y(e);l(t.length?t:[e.message])}finally{a(!1)}}}return(0,J.jsxs)(V,{size:`sm`,children:[(0,J.jsxs)(I,{children:[(0,J.jsxs)(z,{className:`flex flex-wrap items-center gap-2 text-sm`,children:[e.display.label,(0,J.jsxs)(j,{variant:`outline`,className:`gap-1`,title:de(e.tier),children:[fe(e.tier),ue(e.tier)]}),!e.writable&&(0,J.jsx)(j,{variant:`secondary`,children:`Read only`})]}),e.display.description&&(0,J.jsx)(L,{children:e.display.description}),(0,J.jsx)(R,{children:(0,J.jsxs)(M,{size:`sm`,onClick:h,disabled:!d||i,children:[(0,J.jsx)(m,{className:`size-4`}),i?`Saving`:`Save`]})})]}),(0,J.jsxs)(B,{className:`space-y-3`,children:[(0,J.jsx)(he,{schema:e.schema,value:n,path:[],label:e.display.label,required:!0,disabled:!d||i,onChange:f}),(0,J.jsxs)(`p`,{className:`flex flex-wrap items-center gap-x-2 text-[11px] text-muted-foreground`,children:[(0,J.jsxs)(`code`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono`,children:[e.namespace,`/`,e.key]}),(0,J.jsxs)(`span`,{children:[`read `,(0,J.jsx)(`span`,{className:`text-foreground/70`,children:e.scope.read})]}),(0,J.jsx)(`span`,{"aria-hidden":!0,children:`·`}),(0,J.jsxs)(`span`,{children:[`write `,(0,J.jsx)(`span`,{className:`text-foreground/70`,children:e.scope.write})]})]}),c.length>0&&(0,J.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,J.jsxs)(`div`,{className:`mb-1 flex items-center gap-2 font-medium`,children:[(0,J.jsx)(p,{className:`size-4`}),`Save failed`]}),(0,J.jsx)(`ul`,{className:`list-disc space-y-1 pl-5`,children:c.map(e=>(0,J.jsx)(`li`,{children:e},e))})]}),o&&(0,J.jsxs)(`p`,{className:`flex items-center gap-1 text-sm text-emerald-500`,children:[(0,J.jsx)(g,{className:`size-4`}),o]})]})]})}function he(e){let{schema:t,value:n,path:r,label:i,required:a,disabled:o,onChange:s}=e,c=W(t);if(t.enum?.length){let e=n==null||n===``?le:String(n);return(0,J.jsx)(X,{label:i,description:t.description,children:(0,J.jsxs)(A,{value:e,onValueChange:e=>s(r,e===`__unset__`?void 0:e),disabled:o,children:[(0,J.jsx)(D,{children:(0,J.jsx)(E,{})}),(0,J.jsxs)(O,{children:[!a&&(0,J.jsx)(k,{value:`__unset__`,children:`Not set`}),t.enum.map(e=>(0,J.jsx)(k,{value:String(e),children:String(e)},String(e)))]})]})})}if(c===`boolean`)return(0,J.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border bg-muted/20 p-3`,children:[(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`div`,{className:`text-sm font-medium`,children:i}),t.description&&(0,J.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:t.description})]}),(0,J.jsx)(P,{checked:!!n,onCheckedChange:e=>s(r,e),disabled:o})]});if(c===`integer`||c===`number`)return(0,J.jsx)(X,{label:i,description:t.description,children:(0,J.jsx)(N,{type:`number`,min:typeof t.minimum==`number`?t.minimum:void 0,max:typeof t.maximum==`number`?t.maximum:void 0,step:c===`integer`?1:`any`,value:typeof n==`number`?n:``,disabled:o,onChange:e=>s(r,e.target.value===``&&!a?void 0:Number(e.target.value))})});if(c===`array`)return(0,J.jsx)(X,{label:i,description:t.description??`One item per line.`,children:(0,J.jsx)(F,{rows:Math.min(8,Math.max(3,Array.isArray(n)?n.length+1:3)),value:oe(n),disabled:o,onChange:e=>s(r,q(e.target.value))})});if(c===`object`){let e=t.properties??{},a=new Set(t.required??[]);return Object.keys(e).length===0&&t.additionalProperties?(0,J.jsx)(X,{label:i,description:t.description??`KEY=value, one entry per line.`,children:(0,J.jsx)(F,{rows:5,value:se(n),disabled:o,onChange:e=>s(r,ce(e.target.value))})}):(0,J.jsxs)(`div`,{className:`space-y-3`,children:[r.length>0&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`div`,{className:`text-sm font-medium`,children:i}),t.description&&(0,J.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:t.description})]}),(0,J.jsx)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:Object.entries(e).map(([e,t])=>{let i=w(n)?n[e]:void 0;return(0,J.jsx)(he,{schema:t,value:i===void 0&&a.has(e)?K(t):i,path:[...r,e],label:t.title||ge(e),required:a.has(e),disabled:o,onChange:s},e)})})]})}return(0,J.jsx)(X,{label:i,description:t.description,children:(0,J.jsx)(N,{value:typeof n==`string`?n:n==null?``:String(n),disabled:o,onChange:e=>s(r,e.target.value===``&&!a?void 0:e.target.value)})})}function X({label:e,description:t,children:n}){return(0,J.jsxs)(`label`,{className:`block space-y-1.5 text-sm`,children:[(0,J.jsx)(`span`,{className:`text-muted-foreground`,children:e}),n,t&&(0,J.jsx)(`span`,{className:`block text-xs text-muted-foreground`,children:t})]})}function ge(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/[-_]+/g,` `).replace(/^\w/,e=>e.toUpperCase())}function _e(){let e=C(e=>e.theme),t=C(e=>e.showReasoning),n=C(e=>e.set);return(0,J.jsxs)(`section`,{className:`space-y-4`,children:[(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`h2`,{className:`text-base font-semibold`,children:`Browser preferences`}),(0,J.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`These are stored in local dashboard state, not in Relay server config.`})]}),(0,J.jsxs)(V,{size:`sm`,children:[(0,J.jsxs)(I,{children:[(0,J.jsx)(z,{className:`text-sm`,children:`Dashboard display`}),(0,J.jsx)(L,{className:`text-xs`,children:`Browser tier · persisted in this browser profile.`}),(0,J.jsx)(R,{children:(0,J.jsxs)(j,{variant:`outline`,className:`gap-1`,children:[(0,J.jsx)(_,{className:`size-3.5`}),`Browser`]})})]}),(0,J.jsxs)(B,{className:`grid gap-3 md:grid-cols-2`,children:[(0,J.jsx)(X,{label:`Theme`,children:(0,J.jsxs)(A,{value:e,onValueChange:e=>n({theme:e}),children:[(0,J.jsx)(D,{children:(0,J.jsx)(E,{})}),(0,J.jsx)(O,{children:T.map(e=>(0,J.jsx)(k,{value:e.id,children:e.label},e.id))})]})}),(0,J.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border bg-muted/20 p-3`,children:[(0,J.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,J.jsx)(d,{className:`size-4`}),(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`div`,{className:`text-sm font-medium`,children:`Show reasoning details`}),(0,J.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Display captured reasoning/tool steps in chat. Server capture is controlled separately by provider reasoningCapture.`})]})]}),(0,J.jsx)(P,{checked:t,onCheckedChange:e=>n({showReasoning:e})})]})]})]}),(0,J.jsx)(ve,{})]})}function ve(){let e=C(e=>e.voiceTtsEnabled),t=C(e=>e.setVoiceTtsEnabled),n=C(e=>e.voiceTtsMode),r=C(e=>e.setVoiceTtsMode),i=C(e=>e.voiceTtsKokoroVoice),a=C(e=>e.setVoiceTtsKokoroVoice),o=C(e=>e.voiceTtsBrowserVoice),s=C(e=>e.setVoiceTtsBrowserVoice),c=C(e=>e.voiceInputMode),l=C(e=>e.setVoiceInputMode),[u,d]=(0,H.useState)(()=>x());(0,H.useEffect)(()=>{if(typeof window>`u`||!(`speechSynthesis`in window))return;let e=()=>d(x());return e(),window.speechSynthesis.addEventListener?.(`voiceschanged`,e),()=>window.speechSynthesis.removeEventListener?.(`voiceschanged`,e)},[]);let p=b.some(e=>e.id===i)?b:[...b,{id:i,label:i}];return(0,J.jsxs)(V,{size:`sm`,children:[(0,J.jsxs)(I,{children:[(0,J.jsxs)(z,{className:`flex items-center gap-2 text-sm`,children:[(0,J.jsx)(f,{className:`size-4`}),`Voice`]}),(0,J.jsx)(L,{className:`text-xs`,children:`Browser tier TTS and push-to-talk behavior.`}),(0,J.jsx)(R,{children:(0,J.jsx)(P,{checked:e,onCheckedChange:t})})]}),(0,J.jsxs)(B,{className:`grid gap-3 md:grid-cols-2`,children:[(0,J.jsx)(X,{label:`Speech engine`,children:(0,J.jsxs)(A,{value:n,onValueChange:e=>r(e),children:[(0,J.jsx)(D,{children:(0,J.jsx)(E,{})}),(0,J.jsxs)(O,{children:[(0,J.jsx)(k,{value:`kokoro`,children:`Kokoro (server, fallback to browser)`}),(0,J.jsx)(k,{value:`browser`,children:`Browser Web Speech API`})]})]})}),(0,J.jsx)(X,{label:`Kokoro voice`,children:(0,J.jsxs)(A,{value:i,onValueChange:a,children:[(0,J.jsx)(D,{children:(0,J.jsx)(E,{})}),(0,J.jsx)(O,{children:p.map(e=>(0,J.jsx)(k,{value:e.id,children:e.label},e.id))})]})}),(0,J.jsx)(X,{label:`Browser voice`,children:(0,J.jsxs)(A,{value:o||`__unset__`,onValueChange:e=>s(e===`__unset__`?``:e),children:[(0,J.jsx)(D,{children:(0,J.jsx)(E,{})}),(0,J.jsxs)(O,{children:[(0,J.jsx)(k,{value:le,children:`System default`}),u.map(e=>(0,J.jsx)(k,{value:e.uri,children:e.label},e.uri))]})]})}),(0,J.jsx)(X,{label:`Push-to-talk input`,children:(0,J.jsxs)(A,{value:c,onValueChange:e=>l(e),children:[(0,J.jsx)(D,{children:(0,J.jsx)(E,{})}),(0,J.jsxs)(O,{children:[(0,J.jsx)(k,{value:`compose`,children:`Fill message box`}),(0,J.jsx)(k,{value:`autosend`,children:`Send immediately`})]})]})})]})]})}function ye({catalog:e,error:t,canWrite:r,onCatalog:i}){let o=e[0]?.provider??`codex`,[c,d]=(0,H.useState)(o),[f,p]=(0,H.useState)(()=>Z(o)),[m,_]=(0,H.useState)(``),[b,x]=(0,H.useState)([]),S=e.some(e=>e.provider===c)?c:o,C=e.find(e=>e.provider===S)??e[0],ee=e.map(e=>e.provider);function w(e){p(t=>({...t,...e})),x([]),_(``)}function T(e){d(e),p(Z(e)),x([]),_(``)}async function E(){i((await u(`GET`,`/providers`)).catalog)}async function D(){if(r){x([]),_(``);try{await u(`PUT`,`/providers/${encodeURIComponent(f.provider)}/models/${encodeURIComponent(f.alias)}`,{label:f.label,providerModel:f.providerModel,efforts:q(f.efforts),defaultEffort:f.defaultEffort.trim()||void 0,limits:f.limits,capabilities:f.capabilities,contextThreshold:be(f),disabled:f.disabled,updatedBy:`dashboard`}),await E(),_(`${f.alias} saved`),p(Z(f.provider))}catch(e){let t=Y(e);x(t.length?t:[e.message])}}}async function O(e,t){if(r){x([]),_(``);try{await u(`PATCH`,`/providers/${encodeURIComponent(S)}/models/${encodeURIComponent(e.alias)}`,{disabled:t,updatedBy:`dashboard`}),await E(),_(`${e.alias} ${t?`disabled`:`enabled`}`)}catch(e){let t=Y(e);x(t.length?t:[e.message])}}}async function k(e){if(r){x([]),_(``);try{await u(`DELETE`,`/providers/${encodeURIComponent(S)}/models/${encodeURIComponent(e.alias)}`),await E(),_(`${e.alias} removed`)}catch(e){let t=Y(e);x(t.length?t:[e.message])}}}function A(e){p({provider:S,alias:e.alias,label:e.label,providerModel:e.providerModel,efforts:e.efforts.join(`, `),defaultEffort:e.defaultEffort??``,selfCompactUtilization:e.contextThreshold?.selfCompactUtilization?.toString()??``,warnUtilization:e.contextThreshold?.warnUtilization?.toString()??``,hardBackstopUtilization:e.contextThreshold?.hardBackstopUtilization?.toString()??``,disabled:!!e.disabled,limits:e.limits,capabilities:e.capabilities}),x([]),_(``)}return t?(0,J.jsx)(V,{size:`sm`,children:(0,J.jsxs)(B,{className:`text-sm text-muted-foreground`,children:[(0,J.jsxs)(`div`,{className:`mb-1 flex items-center gap-2 font-medium text-foreground`,children:[(0,J.jsx)(v,{className:`size-4`}),`Model catalog`]}),t]})}):(0,J.jsxs)(`section`,{className:`space-y-4`,children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`h2`,{className:`text-base font-semibold`,children:`Model catalog`}),(0,J.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Add override models, disable unavailable models, or remove custom entries from the provider catalog.`})]}),!r&&(0,J.jsx)(j,{variant:`secondary`,children:`Read only: needs settings:write:provider`})]}),(0,J.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:ee.map(e=>(0,J.jsx)(M,{variant:e===S?`default`:`outline`,size:`sm`,onClick:()=>T(e),children:e},e))}),(0,J.jsxs)(V,{size:`sm`,children:[(0,J.jsxs)(I,{children:[(0,J.jsx)(z,{className:`text-sm`,children:`Add or edit model`}),(0,J.jsx)(R,{children:(0,J.jsxs)(j,{variant:`outline`,className:`gap-1`,children:[(0,J.jsx)(n,{className:`size-3.5`}),`Server runtime`]})})]}),(0,J.jsxs)(B,{className:`space-y-3`,children:[(0,J.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[(0,J.jsx)(X,{label:`Alias`,children:(0,J.jsx)(N,{value:f.alias,disabled:!r,placeholder:`nightly`,onChange:e=>w({alias:e.target.value.trim()})})}),(0,J.jsx)(X,{label:`Label`,children:(0,J.jsx)(N,{value:f.label,disabled:!r,placeholder:`Nightly Codex`,onChange:e=>w({label:e.target.value})})}),(0,J.jsx)(X,{label:`Provider model`,children:(0,J.jsx)(N,{value:f.providerModel,disabled:!r,placeholder:`codex-nightly`,onChange:e=>w({providerModel:e.target.value})})}),(0,J.jsx)(X,{label:`Efforts`,children:(0,J.jsx)(N,{value:f.efforts,disabled:!r,placeholder:`low, medium, high`,onChange:e=>w({efforts:e.target.value})})}),(0,J.jsx)(X,{label:`Default effort`,children:(0,J.jsx)(N,{value:f.defaultEffort,disabled:!r,placeholder:`medium`,onChange:e=>w({defaultEffort:e.target.value})})}),(0,J.jsx)(X,{label:`Self compact utilization`,children:(0,J.jsx)(N,{value:f.selfCompactUtilization,disabled:!r,placeholder:`0.80`,inputMode:`decimal`,onChange:e=>w({selfCompactUtilization:e.target.value})})}),(0,J.jsx)(X,{label:`Warn utilization`,children:(0,J.jsx)(N,{value:f.warnUtilization,disabled:!r,placeholder:`default: self - 0.10`,inputMode:`decimal`,onChange:e=>w({warnUtilization:e.target.value})})}),(0,J.jsx)(X,{label:`Hard backstop utilization`,children:(0,J.jsx)(N,{value:f.hardBackstopUtilization,disabled:!r,placeholder:`0.90`,inputMode:`decimal`,onChange:e=>w({hardBackstopUtilization:e.target.value})})}),(0,J.jsxs)(`div`,{className:`flex items-center justify-between gap-3 rounded-md border bg-muted/20 p-3`,children:[(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`div`,{className:`text-sm font-medium`,children:`Disabled`}),(0,J.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`Keep visible but unavailable for new launches.`})]}),(0,J.jsx)(P,{checked:f.disabled,disabled:!r,onCheckedChange:e=>w({disabled:e})})]})]}),(0,J.jsxs)(M,{onClick:D,disabled:!r||!f.alias||!f.label||!f.providerModel,children:[(0,J.jsx)(a,{className:`size-4`}),`Save model`]})]})]}),(0,J.jsxs)(`div`,{className:`space-y-2`,children:[C&&C.models.length===0&&(0,J.jsx)(V,{size:`sm`,children:(0,J.jsx)(B,{className:`text-sm text-muted-foreground`,children:`No models in this provider catalog yet.`})}),C?.models.map(e=>(0,J.jsx)(V,{size:`sm`,children:(0,J.jsxs)(B,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,J.jsxs)(`div`,{className:`min-w-0`,children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,J.jsx)(`span`,{className:`font-medium`,children:e.label}),(0,J.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-xs`,children:e.alias}),e.disabled&&(0,J.jsx)(j,{variant:`secondary`,children:`Disabled`})]}),(0,J.jsxs)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:[e.providerModel,e.efforts.length>0?` · efforts ${e.efforts.join(`, `)}`:` · no effort levels`,e.defaultEffort?` · default ${e.defaultEffort}`:``,` · context ${xe(e)}`]})]}),(0,J.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,J.jsxs)(M,{variant:`outline`,size:`sm`,onClick:()=>A(e),children:[(0,J.jsx)(l,{className:`size-4`}),`Edit`]}),(0,J.jsxs)(M,{variant:`outline`,size:`sm`,disabled:!r,onClick:()=>void O(e,!e.disabled),children:[e.disabled?(0,J.jsx)(s,{className:`size-4`}):(0,J.jsx)(y,{className:`size-4`}),e.disabled?`Enable`:`Disable`]}),(0,J.jsxs)(M,{variant:`outline`,size:`sm`,disabled:!r,onClick:()=>void k(e),children:[(0,J.jsx)(h,{className:`size-4`}),`Remove`]})]})]})},e.alias))]}),b.length>0&&(0,J.jsx)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:(0,J.jsx)(`ul`,{className:`list-disc space-y-1 pl-5`,children:b.map(e=>(0,J.jsx)(`li`,{children:e},e))})}),m&&(0,J.jsxs)(`p`,{className:`flex items-center gap-1 text-sm text-emerald-500`,children:[(0,J.jsx)(g,{className:`size-4`}),m]})]})}function Z(e){return{provider:e,alias:``,label:``,providerModel:``,efforts:``,defaultEffort:``,selfCompactUtilization:``,warnUtilization:``,hardBackstopUtilization:``,disabled:!1}}function be(e){let t=Q(e.selfCompactUtilization,`Self compact utilization`),n=Q(e.warnUtilization,`Warn utilization`),r=Q(e.hardBackstopUtilization,`Hard backstop utilization`);if(!(t===void 0&&n===void 0&&r===void 0)){if(t===void 0)throw Error(`Self compact utilization is required when setting context thresholds`);return{selfCompactUtilization:t,...n===void 0?{}:{warnUtilization:n},...r===void 0?{}:{hardBackstopUtilization:r}}}}function Q(e,t){let n=e.trim();if(!n)return;let r=Number(n);if(!Number.isFinite(r))throw Error(`${t} must be a number`);return r}function xe(e){if(e.contextThreshold)return`self ${$(e.contextThreshold.selfCompactUtilization)}, warn ${$(e.contextThreshold.warnUtilization??Math.max(0,e.contextThreshold.selfCompactUtilization-.1))}`;let t=S(e.limits?.contextWindowTokens?.value);return`derived self ${$(t.selfCompactUtilization)}, warn ${$(t.warnUtilization)}`}function $(e){return`${Math.round(e*100)}%`}var Se=`browser`,Ce=`models`;function we(){if(typeof window>`u`)return``;let e=window.location.hash.replace(/^#/,``);return e.startsWith(`settings/`)?decodeURIComponent(e.slice(9)):``}function Te(e){if(typeof window>`u`)return;let t=new URL(window.location.href);t.hash=`settings/${encodeURIComponent(e)}`,window.history.pushState({},``,t)}function Ee(){let[e,t]=(0,H.useState)([]),[n,i]=(0,H.useState)(null),[a,s]=(0,H.useState)([]),[l,d]=(0,H.useState)(()=>we()),[f,m]=(0,H.useState)(!0),[h,g]=(0,H.useState)(``),[_,v]=(0,H.useState)(``);async function y(){m(!0),g(``),v(``);try{let[e,n,r]=await Promise.all([u(`GET`,`/settings`),u(`GET`,`/tokens/me`),u(`GET`,`/providers`).catch(e=>(v(e.message),{catalog:[]}))]);t(e.settings),i(n),s(r.catalog)}catch(e){g(e.message)}finally{m(!1)}}(0,H.useEffect)(()=>{y()},[]),(0,H.useEffect)(()=>{let e=()=>d(we());return window.addEventListener(`hashchange`,e),window.addEventListener(`popstate`,e),()=>{window.removeEventListener(`hashchange`,e),window.removeEventListener(`popstate`,e)}},[]);let b=(0,H.useMemo)(()=>re(e),[e]),x=(0,H.useMemo)(()=>[...b.map(e=>({slug:e.slug,label:e.group,description:`${e.settings.length} schema setting${e.settings.length===1?``:`s`}`,kind:`descriptors`,settings:e.settings})),{slug:Se,label:`Browser`,description:`Local dashboard preferences`,kind:`browser`,settings:[]},{slug:Ce,label:`Models`,description:`Provider model catalog`,kind:`models`,settings:[]}],[b]),S=x.find(e=>e.slug===l)??x[0];function C(e){d(e),Te(e)}function w(e){t(t=>t.map(t=>U(t)===U(e)?e:t))}return(0,J.jsxs)(`div`,{className:`space-y-4`,children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Settings`}),(0,J.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Schema-driven Relay settings, browser preferences, and model catalog controls.`})]}),(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[n&&(0,J.jsxs)(j,{variant:`outline`,className:`gap-1`,children:[(0,J.jsx)(c,{className:`size-3`}),n.kind,`:`,n.actor]}),(0,J.jsxs)(M,{variant:`outline`,size:`sm`,onClick:()=>void y(),disabled:f,children:[(0,J.jsx)(r,{className:o(`size-4`,f&&`animate-spin`)}),`Refresh`]})]})]}),h&&(0,J.jsxs)(`div`,{className:`flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:[(0,J.jsx)(p,{className:`mt-0.5 size-4`}),(0,J.jsx)(`span`,{children:h})]}),(0,J.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[230px_minmax(0,1fr)]`,children:[(0,J.jsx)(`nav`,{className:`space-y-1 lg:sticky lg:top-4 lg:self-start`,children:x.map(e=>(0,J.jsxs)(`button`,{type:`button`,className:o(`w-full rounded-md border px-3 py-2 text-left text-sm transition-colors`,S?.slug===e.slug?`border-primary/50 bg-primary/10 text-foreground`:`border-transparent hover:border-border hover:bg-accent`),onClick:()=>C(e.slug),children:[(0,J.jsx)(`span`,{className:`block font-medium`,children:e.label}),(0,J.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:e.description})]},e.slug))}),(0,J.jsx)(`div`,{className:`min-w-0 space-y-4`,children:f&&!e.length?(0,J.jsx)(V,{size:`sm`,children:(0,J.jsx)(B,{className:`text-sm text-muted-foreground`,children:`Loading settings…`})}):S?.kind===`descriptors`?(0,J.jsx)(pe,{group:S.label,settings:S.settings,onSaved:w}):S?.kind===`browser`?(0,J.jsx)(_e,{}):(0,J.jsx)(ye,{catalog:a,error:_,canWrite:ee(n?.scopes,`settings:write:provider`),onCatalog:s})})]})]})}export{Ee as SettingsView};
4
- //# sourceMappingURL=settings-BNQBnKXg.js.map
@@ -1,9 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{Qn as t,Un as n,Vn as r,Wn as i,Xn as a,Yn as o,Zn as s,qn as c}from"./lucide-react-BbMYCUlW.js";import{B as l,C as u,D as d,I as f,O as p,Q as m,W as h,X as g,Z as ee,_,at as v,b as y,d as te,it as b,j as x,nt as S,ot as C,p as w,rt as T,st as E,tt as D,w as ne}from"./display-LAWaAboe.js";var O=e(t(),1),re=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},ie=(e=>e?re(e):re),ae=e=>e;function oe(e,t=ae){let n=O.useSyncExternalStore(e.subscribe,O.useCallback(()=>t(e.getState()),[e,t]),O.useCallback(()=>t(e.getInitialState()),[e,t]));return O.useDebugValue(n),n}var se=e=>{let t=ie(e),n=e=>oe(t,e);return Object.assign(n,t),n},ce=(e=>e?se(e):se);function le(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 ue=e=>t=>{try{let n=e(t);return n instanceof Promise?n:{then(e){return ue(e)(n)},catch(e){return this}}}catch(e){return{then(e){return this},catch(t){return ue(t)(e)}}}},de=(e,t)=>(n,r,i)=>{let a={storage:le(()=>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 ue(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 fe(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=ge(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 pe(e){return/\|/.test(e)&&e.trim().length>0}function me(e){return/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)+\|?\s*$/.test(e)}function he(e){return e.trim().replace(/^\||\|$/g,``).split(`|`).map(e=>e.trim()).filter(e=>e.length>0)}function ge(e){let t=e.split(`
4
- `),n=[],r=0;for(;r<t.length;){if(pe(t[r])&&r+1<t.length&&me(t[r+1])){let e=he(t[r]),i=r+2,a=0;for(;i<t.length&&pe(t[i])&&!me(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 k={ms:`milliseconds`,s:`seconds`,kb:`kilobytes`,mb:`megabytes`,gb:`gigabytes`,tb:`terabytes`};function _e(e){return e.split(``).join(` `)}function ve(e){return e.split(``).map(e=>/[0-9]/.test(e)?e:e.toUpperCase()).join(` `)}var ye=[{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 ${_e(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=>ve(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} ${k[n.toLowerCase()]}`},{name:`ms-unit`,pattern:/\b(\d{1,5})\s?ms\b/g,replace:(e,t)=>`${t} ${k.ms}`},{name:`s-unit`,pattern:/\b(\d{1,3})\s?s\b/g,replace:(e,t)=>`${t} ${k.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 be(e){if(!e)return``;let t=e;for(let e of ye)t=t.replace(e.pattern,e.replace);return t.replace(/[ \t]{2,}/g,` `).trim()}function xe(e){return be(fe(e))}var Se=[{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 ♀)`}],A=220;function Ce(e){let t=e.match(/[^.!?]+[.!?]*\s*/g)?.map(e=>e.trim()).filter(Boolean)??[e],n=[];for(let e of t){if(e.length<=A){n.push(e);continue}let t=e;for(;t.length>A;){let e=t.lastIndexOf(` `,A);e<=0&&(e=A),n.push(t.slice(0,e).trim()),t=t.slice(e).trim()}t&&n.push(t)}return n}var j=typeof window<`u`&&`speechSynthesis`in window,M=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 j||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=xe(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=xe(e);if(!n)return;this.reset(),this.manual=!0,this.speaking=!0,this.currentChat=null,this.setPlayingKey(t??null);let r=++this.gen,i=Ce(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=Ce(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(!j||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 i(`/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 we(){if(!j)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 Te=typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof window<`u`&&`MediaRecorder`in window;function Ee(){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 De=class{rec=null;chunks=[];stream=null;async start(){this.stream=await navigator.mediaDevices.getUserMedia({audio:!0}),this.chunks=[];let e=Ee();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 Oe(e){return((await n(`/connectors/voice/call/transcribe`,e))?.text??``).trim()}var N=ce((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 ke(){return N(e=>e.now)}function Ae(e=3e4){return N(t=>Math.floor(t.now/e))}var P=[`low`,`medium`,`high`,`max`],F=[`low`,`medium`,`high`,`xhigh`,`max`],I=[`low`,`medium`,`high`,`xhigh`],L={value:2e5,source:`catalog`,confidence:`declared`},R={value:1e6,source:`catalog`,confidence:`declared`},je=.1,Me=.9,z=.8,Ne=.4,Pe=256e3,Fe=1e6,Ie={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:Ie}}var Le={claude:{provider:`claude`,label:`Claude Code`,defaultModel:`sonnet-4.6`,models:[{alias:`fable-5`,label:`Fable 5`,providerModel:`claude-fable-5`,efforts:F,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`opus-4.8`,label:`Opus 4.8`,providerModel:`claude-opus-4-8`,efforts:F,defaultEffort:`medium`,...B({contextWindowTokens:L})},{alias:`opus-4.8[1m]`,label:`Opus 4.8 1M`,providerModel:`claude-opus-4-8[1m]`,efforts:F,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`opus-4.7`,label:`Opus 4.7`,providerModel:`claude-opus-4-7`,efforts:F,defaultEffort:`medium`,...B({contextWindowTokens:L})},{alias:`opus-4.7[1m]`,label:`Opus 4.7 1M`,providerModel:`claude-opus-4-7[1m]`,efforts:F,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`opus-4.6`,label:`Opus 4.6`,providerModel:`claude-opus-4-6`,efforts:P,defaultEffort:`medium`,...B({contextWindowTokens:L})},{alias:`opus-4.6[1m]`,label:`Opus 4.6 1M`,providerModel:`claude-opus-4-6[1m]`,efforts:P,defaultEffort:`medium`,...B({contextWindowTokens:R})},{alias:`sonnet-4.6`,label:`Sonnet 4.6`,providerModel:`claude-sonnet-4-6`,efforts:P,defaultEffort:`medium`,...B({contextWindowTokens:L})},{alias:`sonnet-4.6[1m]`,label:`Sonnet 4.6 1M`,providerModel:`claude-sonnet-4-6[1m]`,efforts:P,defaultEffort:`medium`,...B({contextWindowTokens:R})},{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:I,defaultEffort:`medium`,...B({contextWindowTokens:L})},{alias:`gpt-5.4`,label:`GPT-5.4`,providerModel:`gpt-5.4`,efforts:I,defaultEffort:`medium`,...B({contextWindowTokens:L})},{alias:`gpt-5.4-mini`,label:`GPT-5.4 Mini`,providerModel:`gpt-5.4-mini`,efforts:I,defaultEffort:`medium`,...B({contextWindowTokens:L})},{alias:`gpt-5.3-codex`,label:`GPT-5.3 Codex`,providerModel:`gpt-5.3-codex`,efforts:I,defaultEffort:`medium`,...B({contextWindowTokens:L})},{alias:`gpt-5.3-codex-spark`,label:`GPT-5.3 Codex Spark`,providerModel:`gpt-5.3-codex-spark`,efforts:I,defaultEffort:`high`,...B({contextWindowTokens:L})},{alias:`gpt-5.2`,label:`GPT-5.2`,providerModel:`gpt-5.2`,efforts:I,defaultEffort:`medium`,...B({contextWindowTokens:L})}]}};function Re(e){let t=ze(e);return{selfCompactUtilization:t,warnUtilization:Be(t),hardBackstopUtilization:Math.max(Me,t)}}function ze(e){return!Number.isFinite(e)||!e||e<=Pe?z:e>=Fe?Ne:Ve(z-(e-Pe)/(Fe-Pe)*(z-Ne))}function Be(e){return Ve(Math.max(0,e-je))}function Ve(e){return Math.round(e*1e3)/1e3}function He(e,t){return t?.find(t=>t.provider===e)??Le[e]}function V(e){return e?.providers[0]??`claude`}function Ue(e,t){return He(e,t).models.filter(e=>!e.disabled)}function H(e,t){let n=He(e,t),r=n.models.filter(e=>!e.disabled);return n.defaultModel&&r.some(e=>e.alias===n.defaultModel)?n.defaultModel:r[0]?.alias??``}function We(e,t){return e.filter(e=>e.status===`online`&&f(t,e.baseDir)).sort((e,t)=>x(t.baseDir).length-x(e.baseDir).length)[0]}function Ge(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?We(e,r):void 0}function Ke(e,t){return t.issueRepo||!e?.issueRepo?t:{...t,issueRepo:e.issueRepo}}function qe(e){let t={};for(let n of e)t[n.id]=n;return t}function U(e,t){let n=e.findIndex(e=>e.id===t.id),r=[...e];return n>=0?r[n]=t:r.push(t),r}var Je=3e3;function Ye(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)<=Je)?e:(a.push({id:o,status:n,timestamp:r}),a.length>200&&a.splice(0,a.length-200),{...e,[t]:a})}function Xe(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 Ze=new Set([`compacting`,`compacted`,`clearing-context`,`context-cleared`]);function Qe(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 $e(e){let t=e.params?.agentId;return typeof t==`string`&&t?t:typeof e.target==`string`&&e.target?e.target:void 0}function et(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 tt(e){return JSON.stringify(e)}function nt(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&&tt(t)===tt(e)?t:(r=!0,e)});return r?i:e}function W(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 rt(){return typeof document>`u`?!0:document.hidden}function it(e,t){return!!(e&&t.view===`chat`&&t.selectedInboxThread===e&&!rt())}function at(e){return e.threadPeer||e.agentId||``}function ot(e,t){return it(at(e),t)}function st(e){return e.filter(e=>e.to===`user`&&e.from!==`user`&&y(e)).reduce((e,t)=>Math.max(e,t.id),0)}function ct(e){if(e.from===`user`||e.to===`user`)return!0;let t=typeof e.payload?.direction==`string`?e.payload.direction:void 0;return e.kind===`channel.event`&&t===`inbound`}var lt={enabled:!0,browserEnabled:!1,messages:!0,replies:!0,errors:!0};function ut(e,t){return t.enabled?e.kind===`message`?t.messages:e.kind===`reply`?t.replies:t.errors:!1}function dt(){return typeof window<`u`&&`Notification`in window}function G(){return dt()?window.Notification.permission:`unsupported`}function ft(e,t){return!ut(e,t.notificationSettings)||!t.notificationSettings.browserEnabled||G()!==`granted`||ot(e,t)?!1:rt()||t.view!==`chat`}function pt(e,t){if(G()===`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 mt=(e,t)=>({notification:null,toastNotification:null,notifications:[],notificationUnread:0,notificationSettings:{...lt},notificationPermission:G(),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(!ut(n,r.notificationSettings)||r.notifications.some(e=>e.id===n.id))return;if(n.messageId&&(n.kind===`message`||n.kind===`reply`)){let e=r.messages.find(e=>e.id===n.messageId);if(e&&!ct(e))return}let i=ot(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),ft(n,r)&&pt(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(!dt()){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`)}}),ht=e=>({voiceTtsEnabled:!1,voiceTtsLang:`en-US`,voiceTtsMode:`kokoro`,voiceTtsKokoroVoice:`am_michael`,voiceTtsBrowserVoice:``,voiceInputMode:`compose`,setVoiceTtsEnabled(t){M.setEnabled(t),e({voiceTtsEnabled:t})},setVoiceTtsLang(t){M.setLang(t),e({voiceTtsLang:t})},setVoiceTtsMode(t){M.setMode(t),e({voiceTtsMode:t})},setVoiceTtsKokoroVoice(t){M.setKokoroVoice(t),e({voiceTtsKokoroVoice:t})},setVoiceTtsBrowserVoice(t){M.setBrowserVoice(t),e({voiceTtsBrowserVoice:t})},setVoiceInputMode(t){e({voiceInputMode:t})}}),gt=null;function _t(e){let t=e.voiceTtsEnabled&&e.view===`chat`&&e.selectedInboxThread||null;t!==gt&&(gt=t,M.setActiveChat(t))}var vt=e=>(t,n)=>({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:e=>t(e),async init(){await e.waitForHydration();let i=n().authToken;i&&o(i),s(n().view),M.setEnabled(n().voiceTtsEnabled),M.setLang(n().voiceTtsLang),M.setMode(n().voiceTtsMode),M.setKokoroVoice(n().voiceTtsKokoroVoice),M.setBrowserVoice(n().voiceTtsBrowserVoice),_t(n()),a(()=>{n().authNeeded||t({authNeeded:!0,connectionError:!1})}),t({notificationPermission:G()}),n().startClock();try{t({stats:await r(`GET`,`/stats`)})}catch(e){if(e.status===401){t({authNeeded:!0});return}}await n().refresh(),n().connectSSE(),n().startAutoRefresh()},async switchView(e){s(e),t({view:e,mobileMenuOpen:!1});let r=n();[`chat`,`messages`].includes(e)&&await Promise.all([r.fetchMessages(),r.fetchChatHistoryImports()]),e===`activity`&&await Promise.all([r.fetchMessages(),r.fetchPairs(),r.fetchTasks(),r.fetchActivityEvents()]),e===`work`&&await Promise.all([r.fetchMessages(),r.fetchTasks()]),e===`pairs`&&await r.fetchPairs(),e===`channels`&&await r.fetchChannels(),e===`connectors`&&await r.fetchConnectors(),e===`integrations`&&await r.fetchIntegrations(),e===`memory`&&await r.refreshMemory(),e===`tasks`&&await r.fetchTasks(),e===`teams`&&await Promise.all([r.fetchTeams(),r.fetchTeamOutcomeAggregates(),r.refreshIssueRefs()]),e===`automation`&&await Promise.all([r.fetchAutomations(),r.fetchAutomationRuns()]),e===`maintenance`&&await r.fetchMaintenanceJobs(),e===`workspaces`&&await Promise.all([r.fetchWorkspaces(),r.fetchOrchestrators(),r.fetchAgents()]),e===`files`&&await r.fetchOrchestrators(),e===`analytics`&&await r.fetchAnalytics()},startClock(){N.getState().start()},stopClock(){N.getState().stop()},startAutoRefresh(){n().stopAutoRefresh(),n().autoRefresh&&t({_refreshTimer:setInterval(()=>n().refreshLiveData(),E)})},stopAutoRefresh(){let e=n();e._refreshTimer&&(clearInterval(e._refreshTimer),t({_refreshTimer:null}))},async apiCall(e,t,n){return r(e,t,n)},async openFilesAt(e){let r=n();t({fileOrchestratorId:e.orchestratorId||We(r.orchestrators,e.selectedPath||e.path)?.id||r.orchestrators.find(e=>e.status===`online`)?.id||``,filePath:e.path,fileSelectedPath:e.selectedPath||``,fileSelectedLine:e.line||0,fileOverlayOpen:e.overlay===!0}),e.overlay||await n().switchView(`files`)},async openFilesForAgent(e,t=!1){let r=typeof e.meta?.cwd==`string`?e.meta.cwd:``;if(!r){n().showNotification(`Agent has no cwd`);return}let i=Ge(n().orchestrators,e);if(!i){n().showNotification(`No online orchestrator covers that cwd`);return}await n().openFilesAt({orchestratorId:i.id,path:r,overlay:t})},closeFileOverlay(){t({fileOverlayOpen:!1})},async refresh(){let e=n();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(),e.fetchProviderCatalog()])},async refreshLiveData(){if(!(n()._refreshInFlight||n().authNeeded)){t({_refreshInFlight:!0});try{try{let e=await r(`GET`,`/stats`);t(n().connectionError?{stats:e,connectionError:!1}:{stats:e})}catch(e){if(e.status===401)return;n().connectionError||t({connectionError:!0});return}let e=n(),i=[e.fetchHealth(),e.fetchAgents(),e.fetchOrchestrators(),e.fetchPairs(),e.fetchMessages(),e.fetchTasks(),e.fetchManagedPolicies(),e.fetchInboxState()],a=e.view;[`chat`,`messages`].includes(a)&&i.push(e.fetchChatHistoryImports()),a===`activity`&&i.push(e.fetchActivityEvents()),a===`memory`&&i.push(e.refreshMemory()),a===`automation`&&i.push(e.fetchAutomations(),e.fetchAutomationRuns()),a===`channels`&&i.push(e.fetchChannels()),a===`connectors`&&i.push(e.fetchConnectors()),a===`integrations`&&i.push(e.fetchIntegrations()),a===`maintenance`&&i.push(e.fetchMaintenanceJobs()),a===`profiles`&&i.push(e.fetchAgentProfiles()),a===`workspaces`&&i.push(e.fetchWorkspaces()),a===`analytics`&&i.push(e.fetchAnalytics()),a===`teams`&&i.push(e.fetchTeams(),e.fetchTeamOutcomeAggregates(),e.refreshIssueRefs()),e.agentDetailOpen&&e.agentDetailId&&i.push(e.fetchAgentIssueActivity(e.agentDetailId)),await Promise.all(i)}finally{t({_refreshInFlight:!1})}}},async fetchStats(){try{t({stats:await r(`GET`,`/stats`)})}catch{}},connectSSE(){n().disconnectSSE(),t({_es:c(n().authToken,{connected:()=>{t(n().connectionError?{connected:!0,connectionError:!1}:{connected:!0}),n().refreshLiveData();let e=Object.entries(n().agentChatByAgent).filter(([,e])=>e.loadedInitial).map(([e])=>e);Promise.all(e.map(e=>n().gapFillAgentChat(e))),n().refreshPlans(),n().refreshIssueRefs()},disconnected:()=>t({connected:!1}),message:(e,r)=>{if(e!==`connected`){if(e===`message.new`){let e=JSON.parse(r);if(e.kind===`session`&&e.from!==`user`){let t=e.payload?.session;t?.type===`response`&&t?.origin===`provider`&&M.onResponse(_(e),e.body)}let i=n();if(!i.messages.some(t=>t.id===e.id)){let n=[...i.messages,e];n.length>500&&n.splice(0,n.length-500),t({messages:n})}let a=_(e);for(let t of Object.keys(n().agentChatByAgent))n().appendChatTail(t,[e]);u(e)&&y(e)&&it(a,i)&&n().markInboxThreadReadTo(a,e.id);return}if(e===`message.queued`||e===`message.expired`||e===`message.delivery_updated`||e===`message.reaction_updated`){let e=JSON.parse(r);t({messages:U(n().messages,e)}),n().applyChatMessageUpdate(e);return}if(e===`notification.created`){n().handleRelayNotification(JSON.parse(r));return}if(e===`plan.created`||e===`plan.changed`){let e=JSON.parse(r),t=e.plan??e.data?.plan;t&&n().upsertPlan(t);return}if(e===`plan.deleted`){let e=JSON.parse(r),t=e.plan??e.data?.plan,i=t?.id??e.planId??e.id??e.data?.planId??e.data?.id;(t||i)&&n().removePlan(t??i);return}if(e===`team.dissolved`){let e=JSON.parse(r);e.teamId&&n().markTeamDissolved({teamId:e.teamId,outcomeStatus:e.outcomeStatus,reason:e.reason}),Promise.all([n().fetchTeams(),n().fetchTeamOutcomeAggregates()]);return}if(e===`activity.created`){let e=JSON.parse(r);t({activityEvents:U(n().activityEvents,e)}),e.issueRefId&&n().fetchIssueRef(e.issueRefId),e.agentId&&n().agentDetailOpen&&n().agentDetailId===e.agentId&&n().fetchAgentIssueActivity(e.agentId);return}if(e===`agent.status`){let e=JSON.parse(r),i=n(),a=i.agentsById[e.id],o=Ke(a,e);if(t({agents:U(i.agents,o),agentsById:{...i.agentsById,[o.id]:o}}),i.livenessMismatches[o.id]&&o.status!==`offline`){let e={...i.livenessMismatches};delete e[o.id],t({livenessMismatches:e})}let s=i.commandStalls[o.id];if(s){let e=Qe(o);if(e?.status&&Ze.has(e.status)&&(e.timestamp??0)>s.ts){let e={...i.commandStalls};delete e[o.id],t({commandStalls:e})}}let c=Qe(o),l=c?.status??Xe(a,o);if(l){let e=c?.timestamp??Date.now(),n=c?.id||`agent-status:${o.id}:${l}:${e}`;t({chatStatusEvents:Ye(i.chatStatusEvents,o.id,l,e,n)})}return}if(e===`liveness.mismatch`){let e=JSON.parse(r);e.agentId&&t({livenessMismatches:{...n().livenessMismatches,[e.agentId]:{agentId:e.agentId,detail:e.detail??`Process reported running but relay marked it offline`,ts:Date.now(),policyName:e.policyName,spawnRequestId:e.spawnRequestId}}});return}if(e===`command.stalled`){let e=JSON.parse(r);if(e.agentId){let r=Date.now(),i=e.kind??`compact`,a=i===`clear`?`clear-stalled`:`compaction-stalled`;t({commandStalls:{...n().commandStalls,[e.agentId]:{agentId:e.agentId,kind:i,detail:e.detail??`A context command was requested but never started — the session may need manual intervention.`,ts:r,commandId:e.commandId}},chatStatusEvents:Ye(n().chatStatusEvents,e.agentId,a,r,`command-stalled:${e.agentId}:${e.commandId??r}`)})}return}if(e===`agent.removed`){let e=JSON.parse(r),i=n(),a={...i.agentsById};delete a[e.id];let o={...i.livenessMismatches};delete o[e.id];let s={...i.commandStalls};delete s[e.id],t({livenessMismatches:o,commandStalls:s}),t({agents:i.agents.filter(t=>t.id!==e.id),agentsById:a});return}if(e===`message.claimed`){let e=JSON.parse(r);t({messages:n().messages.map(t=>t.id===e.messageId?{...t,claimedBy:e.claimedBy,claimExpiresAt:e.claimExpiresAt}:t)});return}if(e===`message.claim_released`){let e=JSON.parse(r);t({messages:n().messages.map(t=>t.id===e.messageId?{...t,claimedBy:void 0,claimedAt:void 0,claimExpiresAt:void 0}:t)});return}if(e===`message.deleted`){let e=JSON.parse(r);t({messages:n().messages.filter(t=>t.id!==e.messageId)});return}if(e===`orchestrator.status`){let e=JSON.parse(r);t({orchestrators:U(n().orchestrators,e)});return}if(e===`orchestrator.removed`){let e=JSON.parse(r);t({orchestrators:n().orchestrators.filter(t=>t.id!==e.id)});return}if(e===`policy.state.changed`||e===`config.changed`){n().fetchManagedPolicies();return}if(e===`command.dispatched`||e===`command.succeeded`){let i=JSON.parse(r).command;if(i){let r=et(i,e);if(r){let e=typeof i.updatedAt==`number`?i.updatedAt:typeof i.createdAt==`number`?i.createdAt:Date.now();t({chatStatusEvents:Ye(n().chatStatusEvents,$e(i),r,e,i.id?`command:${i.id}:${r}`:void 0)})}}return}if([`task.created`,`task.updated`,`task.claimed`,`task.status`].includes(e)){let e=JSON.parse(r);t({tasks:U(n().tasks,e)})}}}})})},disconnectSSE(){let e=n()._es;e&&(e.close(),t({_es:null}))},openCommandPalette(){t({commandQuery:``,commandPaletteOpen:!0})},closeCommandPalette(){t({commandPaletteOpen:!1,commandQuery:``})},async runCommand(e){let{action:r,payload:i}=e;if(n().closeCommandPalette(),r===`openView`)await n().switchView(i.view);else if(r===`agentPreset`)t({showOffline:!0,agentPresetFilter:i.preset||``}),await n().switchView(`agents`);else if(r===`copy`)try{await navigator.clipboard?.writeText(i.value||``)}catch{}else if(r===`messageAgent`){let e=n().agentsById[i.agentId];e&&n().openComposeToAgent(e)}else r===`pairAgent`?n().openPairInvite(i.agentId):r===`filterTag`?(t({agentTagFilter:i.tag||``,tagFilter:i.tag||``}),await n().switchView(`agents`)):r===`exportActivity`&&n().exportActivity(i.format||`markdown`)},async saveTokenAndRefresh(){let e=n().authToken;o(e);try{await r(`GET`,`/stats`)}catch(e){if(e.status===401){t({authNeeded:!0});return}}t({authNeeded:!1,connectionError:!1}),n().connectSSE(),await n().refresh(),n().startAutoRefresh()},destroy(){a(null),n().disconnectSSE(),n().stopAutoRefresh(),n().stopClock()}}),yt=(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=W(t().agents,n);if(i===t().agents)return;e({agents:i,agentsById:qe(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 ${te(e)}`),await Promise.all([t().fetchMessages(),t().fetchActivityEvents()])}catch(e){t().showError(`Action Failed`,e.message)}}}),K=300,q={messages:[],oldestLoadedId:null,hasMore:!0,loading:!1,loadedInitial:!1};function bt(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 xt(e,t){return t.filter(t=>p(e,t)&&!ne(t)).sort((e,t)=>e.id-t.id)}function St(e,t){return W(e,[...e,...t].sort((e,t)=>e.id-t.id))}function Ct(e){return e[0]?.id??null}var wt=12,J=[];function Tt(e){let t=J.indexOf(e);t!==-1&&J.splice(t,1),J.unshift(e)}function Et(e,t){let n=new Set(t.filter(Boolean)),r=0;for(let t of J){if(r>=wt)break;e[t]?.loadedInitial&&(n.add(t),r++)}let i={};for(let[t,r]of Object.entries(e))(!r.loadedInitial||n.has(t))&&(i[t]=r);return i}var Dt=(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:{...D},inboxCompose:{...S},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=nt(t().messages,a);e({messages:o});let s=t(),c=s.selectedInboxThread;if(it(c,s)){let e=0;for(let t of o)t.id>e&&_(t)===c&&u(t)&&y(t)&&(e=t.id);e&&t().markInboxThreadReadTo(c,e)}}catch{}},async loadAgentChat(n){if(!n)return;Tt(n);let i=t().agentChatByAgent[n];if(!i?.loading){i?.loadedInitial&&i.messages.length>0||e(e=>({agentChatByAgent:{...e.agentChatByAgent,[n]:{...e.agentChatByAgent[n]??q,loading:!0}}}));try{let i=await r(`GET`,bt(n,{limit:K})),a=xt(n,i),o=t().agentChatByAgent[n]??q,s=o.loadedInitial?St(o.messages,a):W([],a),c=o.loadedInitial?o.hasMore:i.length===K;e(e=>({agentChatByAgent:Et({...e.agentChatByAgent,[n]:{messages:s,oldestLoadedId:Ct(s),hasMore:c,loading:!1,loadedInitial:!0}},[n,t().selectedAgent,t().selectedInboxThread])}))}catch(r){e(e=>({agentChatByAgent:{...e.agentChatByAgent,[n]:{...e.agentChatByAgent[n]??q,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`,bt(n,{before:i.oldestLoadedId,limit:K})),o=xt(n,a),s=t().agentChatByAgent[n]??i,c=W(s.messages,[...o,...s.messages].sort((e,t)=>e.id-t.id));e(e=>({agentChatByAgent:{...e.agentChatByAgent,[n]:{messages:c,oldestLoadedId:Ct(c),hasMore:a.length===K,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`,bt(e,{since:i,limit:K}));if(o.length===0||(t().appendChatTail(e,o.filter(e=>e.id>a)),i=o[o.length-1].id,i<=a)||o.length<K)return;n=t().agentChatByAgent[e];let s=n?.messages[n.messages.length-1]?.id;s&&s>i&&(i=s)}}catch(t){console.warn(`[chat] gap-fill skipped for ${e}: ${t.message}`)}},appendChatTail(n,r){if(!n||r.length===0)return;let i=xt(n,r);if(i.length===0)return;let a=t().agentChatByAgent[n]??q,o=St(a.messages,i);e({agentChatByAgent:{...t().agentChatByAgent,[n]:{...a,messages:o,oldestLoadedId:Ct(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:{...D,from:v}})},openComposeToAgent(t){e({replyTo:null,compose:{...D,from:v,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:{...D,from:v}}),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:v,emoji:i,action:a?`remove`:`add`});e({messages:U(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:{...D,from:v,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:v,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(C)+`&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:C,peerId:n,readCursorMessageId:i}).catch(()=>{}))},markInboxThreadRead(e,n){!e||!n.length||t().markInboxThreadReadTo(e,st(n))},markInboxThreadUnread(n){let i={...t().inboxReadCursors};delete i[n],e({inboxReadCursors:i}),r(`PATCH`,`/inbox/threads`,{operatorId:C,peerId:n,readCursorMessageId:null}).catch(()=>{})},archiveInboxThread(n,i){e({inboxArchivedThreads:{...t().inboxArchivedThreads,[n]:i}}),t().selectedInboxThread===n&&e({selectedInboxThread:``}),r(`PATCH`,`/inbox/threads`,{operatorId:C,peerId:n,archivedAtMessageId:i}).catch(()=>{})},unarchiveInboxThread(n){let i={...t().inboxArchivedThreads};delete i[n],e({inboxArchivedThreads:i}),r(`PATCH`,`/inbox/threads`,{operatorId:C,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:C,peerId:n,body:i}).catch(()=>{}):r(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(C)+`&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:v,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(C)+`&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:v,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:{...S,toMode:n.toMode,to:n.to}}),await t().fetchMessages()}catch(e){t().showError(`Send Failed`,e.message)}}}});function Y(e,t){return JSON.stringify([String(e),t||``])}function X(e,t){return JSON.stringify([`team`,e,t||``])}function Ot(e){return{threadId:String(e.threadId),...e.channel?{channel:e.channel}:{}}}function kt(e){return e.teamId?{teamId:e.teamId,...e.channel?{channel:e.channel}:{}}:null}function At(e){return`teamId`in e?X(e.teamId,e.channel):Y(e.threadId,e.channel)}function jt(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 Mt=(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=At(i);e({planLookups:{...t().planLookups,[a]:i},planLoading:{...t().planLoading,[a]:!0}});try{let n=await r(`GET`,jt(i)),o=Ot(n),s=Y(o.threadId,o.channel),c=kt(n),l=c?X(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}:{}}}),t().hydrateIssueRefsForPlan(n)}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=Ot(n),i=Y(r.threadId,r.channel),a=kt(n),o=a?X(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}:{}}}),t().hydrateIssueRefsForPlan(n)},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))})}}),Nt=(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=W(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=U(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))}}});function Pt(e,t){return JSON.stringify([e,t])}function Ft(e){return[...new Set(e.nodes.map(e=>e.refs?.issueId).filter(e=>!!e))]}function Z(e,t){let n=!1,r={...e};for(let i of t){let t=e[i.id];(!t||JSON.stringify(t)!==JSON.stringify(i))&&(r[i.id]=i,n=!0)}return n?r:e}var It=(e,t)=>({issueRefsById:{},issuesByEntity:{},issueActivityByAgent:{},issueLoading:{},issueErrors:{},async fetchIssueRef(n){let i=`ref:${n}`;e({issueLoading:{...t().issueLoading,[i]:!0},issueErrors:{...t().issueErrors,[i]:null}});try{let a=await r(`GET`,`/issue-refs/${encodeURIComponent(n)}`);return e({issueRefsById:Z(t().issueRefsById,[a.issueRef]),issueLoading:{...t().issueLoading,[i]:!1}}),a.issueRef}catch(r){return e({issueLoading:{...t().issueLoading,[i]:!1},issueErrors:{...t().issueErrors,[i]:g(r)}}),t().issueRefsById[n]??null}},async fetchIssuesForEntity(n,i){let a=Pt(n,i);e({issueLoading:{...t().issueLoading,[a]:!0},issueErrors:{...t().issueErrors,[a]:null}});try{let o=await r(`GET`,`/issue-associations/entities/${encodeURIComponent(n)}/${encodeURIComponent(i)}/issues`);return e({issuesByEntity:{...t().issuesByEntity,[a]:o.issues},issueRefsById:Z(t().issueRefsById,o.issues.map(e=>e.issueRef)),issueLoading:{...t().issueLoading,[a]:!1}}),o.issues}catch(n){return e({issueLoading:{...t().issueLoading,[a]:!1},issueErrors:{...t().issueErrors,[a]:g(n)}}),t().issuesByEntity[a]??[]}},async fetchAgentIssueActivity(n){let i=`agent:${n}`;e({issueLoading:{...t().issueLoading,[i]:!0},issueErrors:{...t().issueErrors,[i]:null}});try{let a=await r(`GET`,`/issue-activity/agents/${encodeURIComponent(n)}`);return e({issueActivityByAgent:{...t().issueActivityByAgent,[n]:a.issues},issueRefsById:Z(t().issueRefsById,a.issues.map(e=>e.issueRef)),issueLoading:{...t().issueLoading,[i]:!1}}),a.issues}catch(r){return e({issueLoading:{...t().issueLoading,[i]:!1},issueErrors:{...t().issueErrors,[i]:g(r)}}),t().issueActivityByAgent[n]??[]}},async hydrateIssueRefsForPlan(e){let n=Ft(e).filter(e=>!t().issueRefsById[e]);await Promise.all(n.map(e=>t().fetchIssueRef(e)))},async refreshIssueRefs(){let e=Object.keys(t().issueRefsById).map(e=>t().fetchIssueRef(e)),n=Object.keys(t().issuesByEntity).map(e=>{try{let[n,r]=JSON.parse(e);return t().fetchIssuesForEntity(n,r)}catch{return Promise.resolve([])}});await Promise.all([...e,...n])},upsertIssueRef(n){let r=Z(t().issueRefsById,[n]);r!==t().issueRefsById&&e({issueRefsById:r})}}),Lt=(e,t)=>({pairs:[],tasks:[],taskEvents:[],taskEventCache:{},taskEventsOpen:!1,pairInviteOpen:!1,pairMessageOpen:!1,pairInvite:{...T},pairMessage:{...b},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=W(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=W(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:{...T,requesterId:n||t().selectedAgent||``},pairInviteOpen:!0})},closePairInvite(){e({pairInviteOpen:!1,pairInvite:{...T}})},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:{...T}}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Pair Invite Failed`,e.message)}},openPairMessage(t,n){e({pairMessage:{...b,pairId:t.id,from:n||t.requesterId},pairMessageOpen:!0})},closePairMessage(){e({pairMessageOpen:!1,pairMessage:{...b}})},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:{...b}}),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)}}}),Rt=(e,t)=>({orchestrators:[],providerCatalog:[],orchestratorSpawnOpen:!1,orchestratorInstallOpen:!1,spawnOrchId:``,spawnProvider:`claude`,spawnModel:H(`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=W(t().orchestrators,await r(`GET`,`/orchestrators`));n!==t().orchestrators&&e({orchestrators:n})}catch{}},async fetchProviderCatalog(){try{e({providerCatalog:(await r(`GET`,`/providers`)).catalog})}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}t().fetchProviderCatalog();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:V(u),p=i.spawnProvider===d&&i.spawnModel&&Ue(d,i.providerCatalog).some(e=>e.alias===i.spawnModel)?i.spawnModel:H(d,i.providerCatalog),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}t().fetchProviderCatalog();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?He(c,i.providerCatalog):void 0)?.models.find(e=>e.alias===l||e.providerModel===l)?.alias||``,p=s?.model?.effort||``,h=a.meta?.workspace,g=ee(h)?h:{},_=m(g.repoRoot)||m(g.sourceCwd)||(typeof a.meta?.cwd==`string`?a.meta.cwd:``),v=m(g.mode),y=v===`isolated`?`isolated`:v===`shared`?`shared`:`inherit`,b=s?.session?.approvalMode||(typeof a.meta?.approvalMode==`string`?a.meta.approvalMode:`guarded`),x=a.label?`${a.label} (fork)`:``,S=o.find(e=>e.hostname===a.machine)||o.find(e=>f(_,e.baseDir))||o[0],C=te(a),w=[];for(let e of r){let t=d(e).trim();if(!t)continue;let n=e.from===`user`?`user`:`agent`;w.push(`[${n}]: ${t}`)}let T=w.join(`
6
- `),E=14e3,D=`You are continuing work from a previous agent session (${C}). Below is the conversation history. Treat it as context for your work, not as your own actions.\n\n${T.length>E?`...
7
- `+T.slice(T.length-E):T}`,ne=r.filter(e=>typeof e.id==`number`&&e.id>0).map(e=>e.id);e({spawnOrchId:S.id,spawnProvider:c||V(S),spawnModel:u||H(c||V(S)),spawnEffort:p,spawnProfile:i.spawnProfile||`default-relay`,spawnCwd:_||S.baseDir||``,spawnLabel:x,spawnApproval:b,spawnWorkspaceMode:y,spawnPrompt:`Continue from this previous session.`,spawnSystemPromptAppend:D,spawnCount:1,pendingForkImport:{sourcePeerId:a.id,sourceAgentId:a.id,sourceThreadId:a.id,sourceAgentLabel:C,messageIds:ne},orchestratorSpawnOpen:!0})},openOrchestratorInstall(){e({orchestratorInstallOpen:!0})},openOrchestratorSpawnFor(n){let r=t(),i=r.orchestrators.find(e=>e.id===n),a=V(i),o=H(a,r.providerCatalog),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:V(a),s=i.spawnProvider===o&&i.spawnModel&&Ue(o,i.providerCatalog).some(e=>e.alias===i.spawnModel)?i.spawnModel:H(o,i.providerCatalog);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:C,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}})}}),zt=(e,t)=>({managedPolicies:[],policyModal:{open:!1,editing:``,name:``,description:``,orchestratorId:``,cwd:``,enabled:void 0,provider:`claude`,rig:``,model:H(`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}t().fetchProviderCatalog(),e({policyModal:{open:!0,editing:``,name:``,description:``,orchestratorId:n[0].id,cwd:``,enabled:void 0,provider:V(n[0]),rig:``,model:H(V(n[0]),t().providerCatalog),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(n){t().fetchProviderCatalog(),e({policyModal:{open:!0,editing:n.name,name:n.name,enabled:n.enabled,description:n.description||``,orchestratorId:n.orchestratorId,cwd:n.cwd,provider:n.provider,rig:n.rig||``,model:n.model||H(n.provider,t().providerCatalog),effort:n.effort||``,profile:n.profile||`default-relay`,providerArgs:(n.providerArgs||[]).join(` `),prompt:n.prompt||``,tags:(n.tags||[]).join(`, `),capabilities:(n.capabilities||[]).join(`, `),label:n.label||``,mode:n.mode,permissionMode:n.permissionMode,restartOnUpdate:n.restartOnUpdate,scheduledDailyRestart:n.scheduledDailyRestart,keepaliveSeconds:String(n.onDemand?.keepaliveSeconds??300),backoffSchedule:(n.backoff?.schedule||[5,15,60,300]).join(`, `),backoffResetAfterSeconds:String(n.backoff?.resetAfterSeconds??600),channelId:n.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)}})}}),Bt=(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:C,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 h(e.createdAt??e.ts)}function Vt(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 Ht=(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`?w(a,JSON.stringify({title:`Agent Relay Timeline`,exportedAt:i,events:r},null,2),`application/json`):w(a,Vt(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()};w(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()};w(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()};w(o,JSON.stringify(s,null,2),i===`json`?`application/json`:`text/markdown`)}}),Ut=(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()}}),Wt=(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)}})}}),Gt=(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}}}),Kt=(e,t)=>({projectFocusId:null,projectByCwd:{},async openProjectFocus(n){e({projectFocusId:n}),await t().switchView(`projects`)},consumeProjectFocus(){t().projectFocusId!==null&&e({projectFocusId:null})},async fetchProjectForCwd(n){if(!(!n||n in t().projectByCwd))try{let t=await r(`GET`,`/projects/resolve?cwd=`+encodeURIComponent(n));e(e=>({projectByCwd:{...e.projectByCwd,[n]:t.project??null}}))}catch{}}});function qt(){return $.persist.hasHydrated()?Promise.resolve():new Promise(e=>{let t=$.persist.onFinishHydration(()=>{t(),e()})})}var $=ce()(de((...e)=>({...vt({waitForHydration:qt})(...e),...yt(...e),...Dt(...e),...Mt(...e),...Nt(...e),...It(...e),...Lt(...e),...Rt(...e),...zt(...e),...mt(...e),...Bt(...e),...Ht(...e),...ht(...e),...Ut(...e),...Wt(...e),...Gt(...e),...Kt(...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(_t);export{Ue as a,N as c,Se as d,De as f,M as g,Oe as h,X as i,ke as l,Te as m,Pt as n,H as o,we as p,Y as r,Re as s,$ as t,Ae as u};
9
- //# sourceMappingURL=store-BB-YW24l.js.map
@@ -1,2 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{Bn as t,P as n,Qn as r,Rn as i,Vn as a,Z as ee,hn as o,l as s,m as te}from"./lucide-react-BbMYCUlW.js";import{i as ne,n as c,t as l}from"./store-BB-YW24l.js";import{H as re,U as u,X as d,d as f,h as p}from"./display-LAWaAboe.js";import{a as ie,i as ae,n as oe,r as se,t as ce}from"./select-Bhx6zSZr.js";import{t as m}from"./badge-C6NJQ60B.js";import{t as h}from"./button-DD2CCM3t.js";import{t as le}from"./input-08ItMIki.js";import{f as ue,s as g}from"./index-VGRP16ua.js";import{a as _,o as v,r as y,t as b}from"./card-GZqj3rMm.js";import{t as de}from"./PlanGraphPanel-BYmE8ldg.js";var x=e(r(),1),S=t();function C(e){if(e==null)return`-`;let t=Math.round(e/1e3);if(t<60)return`${t}s`;let n=Math.round(t/60);if(n<60)return`${n}m`;let r=Math.round(n/60);return r<48?`${r}h`:`${Math.round(r/24)}d`}function w(e){return`${Math.round(e*100)}%`}function T(e){return e===`success`?`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`:e===`partial`?`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`:e===`failed`?`bg-red-500/10 text-red-400 border-red-500/20`:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`}function fe({data:e,loading:t,error:n}){let r=e?.totals.byOutcomeStatus,i=e?.compositionShapes.slice(0,6)??[],a=e?.recent.slice(0,8)??[];return(0,S.jsxs)(b,{children:[(0,S.jsx)(_,{children:(0,S.jsxs)(v,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(o,{className:`size-4 text-primary`}),` Outcomes`]}),(0,S.jsxs)(m,{variant:`secondary`,children:[e?.totals.total??0,` dissolved`]})]})}),(0,S.jsxs)(y,{className:`space-y-5`,children:[n?(0,S.jsx)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:n}):null,t&&!e?(0,S.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`Loading outcomes…`}):!e||e.totals.total===0?(0,S.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`No dissolved teams yet`}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`flex flex-wrap gap-2 text-xs`,children:[`success`,`partial`,`failed`,`unknown`].map(e=>{let t=r?.[e]??0;return(0,S.jsxs)(m,{variant:`outline`,className:t===0?`text-muted-foreground`:T(e===`unknown`?null:e),children:[t,` `,e]},e)})}),(0,S.jsxs)(`section`,{className:`space-y-2`,children:[(0,S.jsx)(`div`,{className:`text-sm font-medium`,children:`Composition win-rate`}),(0,S.jsx)(`div`,{className:`divide-y divide-border rounded-md border border-border`,children:i.map(e=>(0,S.jsxs)(`div`,{className:`grid gap-2 px-3 py-2 text-sm md:grid-cols-[1fr_auto_auto] md:items-center`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`div`,{className:`break-words font-medium`,title:e.shape,children:e.shape}),(0,S.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[e.count,` team`,e.count===1?``:`s`,` · avg `,C(e.avgWallClockMs)]})]}),(0,S.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.successCount,`/`,e.count]}),(0,S.jsx)(m,{variant:`outline`,className:T(e.successRate>=.5?`success`:e.successRate>0?`partial`:`failed`),children:w(e.successRate)})]},e.shape))})]}),(0,S.jsxs)(`section`,{className:`space-y-2`,children:[(0,S.jsx)(`div`,{className:`text-sm font-medium`,children:`Recent outcomes`}),(0,S.jsx)(`div`,{className:`overflow-hidden rounded-md border border-border`,children:(0,S.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,S.jsx)(`thead`,{className:`bg-muted/40 text-xs text-muted-foreground`,children:(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Team`}),(0,S.jsx)(`th`,{className:`px-3 py-2 text-left font-medium`,children:`Outcome`}),(0,S.jsx)(`th`,{className:`px-3 py-2 text-right font-medium`,children:`Members`}),(0,S.jsx)(`th`,{className:`px-3 py-2 text-right font-medium`,children:`Duration`})]})}),(0,S.jsx)(`tbody`,{className:`divide-y divide-border`,children:a.map(e=>(0,S.jsxs)(`tr`,{children:[(0,S.jsxs)(`td`,{className:`max-w-[220px] px-3 py-2`,children:[(0,S.jsx)(`div`,{className:`truncate font-medium`,children:e.title||e.id.slice(0,12)}),(0,S.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.id})]}),(0,S.jsx)(`td`,{className:`px-3 py-2`,children:(0,S.jsx)(m,{variant:`outline`,className:T(e.outcome),children:e.outcome??`unknown`})}),(0,S.jsx)(`td`,{className:`px-3 py-2 text-right`,children:e.memberCount}),(0,S.jsx)(`td`,{className:`px-3 py-2 text-right text-muted-foreground`,children:C(e.durationMs)})]},e.id))})]})})]})]})]})]})}var pe=[],me=[{value:`all`,label:`All kinds`},{value:`decision`,label:`Decisions`},{value:`fact`,label:`Facts`},{value:`ruled_out`,label:`Ruled out`}],he={decision:`decision`,fact:`fact`,ruled_out:`ruled out`};function ge(e){return e.status===`dissolved`?`dissolved`:e.zeroMembersSince==null?`active`:`orphaned`}var _e={active:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,orphaned:`bg-amber-500/10 text-amber-400 border-amber-500/20`,dissolved:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`},ve={success:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,partial:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,failed:`bg-red-500/10 text-red-400 border-red-500/20`},ye={active:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,superseded:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,retracted:`bg-red-500/10 text-red-400 border-red-500/20`};function E(e){return e?e.slice(0,12):`-`}function be(e){if(e===void 0)return`-`;let t=Math.round(e/1e3);if(t<60)return`${t}s`;let n=Math.round(t/60);if(n<60)return`${n}m`;let r=Math.round(n/60);return r<48?`${r}h`:`${Math.round(r/24)}d`}function xe(e){if(!e.composition)return null;try{let t=JSON.parse(e.composition);return Array.isArray(t)?t.length:null}catch{return null}}function Se(e,t){let n=t.trim().toLowerCase();return n?[e.title,e.id,e.coordinatorId,e.rootCoordinatorId,e.outcomeStatus,e.outcomeSummary].some(e=>String(e??``).toLowerCase().includes(n)):!0}function Ce(e){return e.status===`offline`?`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`:e.status===`busy`?`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`:e.status===`stale`?`bg-red-500/10 text-red-400 border-red-500/20`:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`}function D(){let[e,t]=(0,x.useState)(null),[r,o]=(0,x.useState)([]),[C,w]=(0,x.useState)(null),[T,D]=(0,x.useState)(`all`),[O,we]=(0,x.useState)(``),[k,A]=(0,x.useState)(!1),[Te,j]=(0,x.useState)(!1),[M,N]=(0,x.useState)(null),[P,Ee]=(0,x.useState)(()=>Date.now()),F=l(e=>e.teams),I=e??F[0]?.id??null,L=I?c(`team`,I):``,R=l(e=>e.teamsLoading),z=l(e=>e.teamsError),De=l(e=>e.fetchTeams),B=l(e=>(I?e.issuesByEntity[L]:void 0)??pe),V=l(e=>e.issueRefsById),Oe=l(e=>L?!!e.issueLoading[L]:!1),H=l(e=>L?e.issueErrors[L]??null:null),U=l(e=>e.fetchIssuesForEntity),ke=l(e=>e.teamOutcomeAggregates),Ae=l(e=>e.teamOutcomeAggregatesLoading),je=l(e=>e.teamOutcomeAggregatesError),Me=l(e=>e.fetchTeamOutcomeAggregates),W=l(e=>e.fetchPlan),Ne=l(e=>e.dissolveTeam),Pe=l(e=>e.openConfirm),G=l(e=>e.agentsById),Fe=l(e=>e.switchView),Ie=l(e=>e.openInboxThread),Le=l(e=>I?e.plansByTeam[ne(I)]??null:null),K=e=>{let t=G[e];return t?f(t):e.slice(-8)};async function q(e,t=T){j(!0),N(null);try{let n=new URLSearchParams({team:e});t!==`all`&&n.set(`kind`,t),o((await a(`GET`,`/blackboard?${n.toString()}`)).entries),w(e)}catch(t){N(d(t)),o([]),w(e)}finally{j(!1)}}async function J(){A(!0),N(null);try{let[t]=await Promise.all([De(),Me()]);Ee(Date.now());let n=e??t[0]?.id;n?(W({teamId:n}),await Promise.all([q(n,T),U(`team`,n)])):(o([]),w(null))}catch(e){N(d(e))}finally{A(!1)}}(0,x.useEffect)(()=>{J()},[]),(0,x.useEffect)(()=>{C&&q(C,T)},[T]);let Y=(0,x.useMemo)(()=>F.filter(e=>Se(e,O)),[F,O]),X=F.find(e=>e.id===I)??null,Z=C===I?r:[],Q=(0,x.useMemo)(()=>B.map(e=>({...e,issueRef:V[e.issueRef.id]??e.issueRef})),[V,B]),$=(0,x.useMemo)(()=>I?Object.values(G).filter(e=>e.teamId===I).sort((e,t)=>f(e).localeCompare(f(t))||e.id.localeCompare(t.id)):[],[G,I]),Re=(0,x.useMemo)(()=>{let e={decision:[],fact:[],ruled_out:[]};for(let t of Z)e[t.kind].push(t);return e},[Z]),ze=T===`all`?[`decision`,`fact`,`ruled_out`]:[T];return(0,S.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`size-5 text-primary`}),(0,S.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Teams`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`active and dissolved team working sets`})]}),(0,S.jsxs)(h,{variant:`outline`,size:`sm`,onClick:()=>void J(),disabled:k||R,children:[(0,S.jsx)(n,{className:i(`size-4`,(k||R)&&`animate-spin`)}),` Refresh`]})]}),(M||z)&&(0,S.jsx)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:M||z}),(0,S.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(320px,420px)_1fr]`,children:[(0,S.jsxs)(`div`,{className:`min-h-[520px] min-w-0 space-y-3`,children:[(0,S.jsxs)(`div`,{className:`space-y-3`,children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,S.jsx)(`span`,{children:`Team list`}),(0,S.jsx)(m,{variant:`secondary`,children:F.length})]}),(0,S.jsx)(le,{value:O,onChange:e=>we(e.target.value),placeholder:`Filter teams`,className:`h-8`})]}),(0,S.jsx)(`div`,{children:(k||R)&&F.length===0?(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`Loading teams…`}):Y.length===0?(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:F.length===0?`No teams`:`No teams match`}):(0,S.jsx)(g,{className:`h-[610px] pr-3`,children:(0,S.jsx)(`div`,{className:`space-y-2`,children:Y.map(e=>{let n=e.id===I,r=xe(e),a=ge(e),o=e.coordinatorId,s=()=>{t(e.id),W({teamId:e.id}),U(`team`,e.id),q(e.id,T)};return(0,S.jsx)(`div`,{role:`button`,tabIndex:0,onClick:s,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),s())},className:`block w-full cursor-pointer text-left`,children:(0,S.jsx)(b,{className:i(`transition-colors hover:border-primary/50`,n&&`border-primary/60 bg-primary/5`),children:(0,S.jsxs)(y,{className:`space-y-3 p-3`,children:[(0,S.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.title||E(e.id)}),(0,S.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.id})]}),(0,S.jsx)(m,{variant:`outline`,className:_e[a],children:a})]}),(0,S.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-3 gap-y-1 text-xs text-muted-foreground`,children:[(0,S.jsx)(`span`,{children:`Coordinator`}),o?(0,S.jsxs)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),Ie(o),Fe(`chat`)},className:`flex min-w-0 items-center justify-end gap-1 text-right text-primary hover:underline`,title:`Chat with ${o}`,children:[(0,S.jsx)(ee,{className:`size-3 shrink-0`}),(0,S.jsx)(`span`,{className:`truncate`,children:K(o)})]}):(0,S.jsx)(`span`,{className:`text-right text-muted-foreground`,children:`—`}),(0,S.jsx)(`span`,{children:`Members`}),(0,S.jsx)(`span`,{className:`text-right text-foreground`,children:r??`-`}),(0,S.jsx)(`span`,{children:`Created`}),(0,S.jsx)(`span`,{className:`text-right text-foreground`,title:p(e.createdAt),children:u(P,e.createdAt)}),e.dissolvedAt?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`span`,{children:`Dissolved`}),(0,S.jsx)(`span`,{className:`text-right text-foreground`,title:p(e.dissolvedAt),children:u(P,e.dissolvedAt)})]}):null]}),a===`orphaned`&&e.zeroMembersSince!=null?(0,S.jsx)(`div`,{className:`flex items-center gap-1.5 border-t border-border pt-2 text-xs text-amber-400`,title:p(e.zeroMembersSince),children:(0,S.jsxs)(`span`,{children:[`No live members since `,u(P,e.zeroMembersSince),` — auto-dissolving`]})}):null,e.status===`dissolved`?(0,S.jsxs)(`div`,{className:`space-y-1 border-t border-border pt-2`,children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[e.outcomeStatus?(0,S.jsx)(m,{variant:`outline`,className:ve[e.outcomeStatus],children:e.outcomeStatus}):(0,S.jsx)(m,{variant:`outline`,children:`no outcome`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:be(e.wallClockMs)})]}),e.outcomeSummary?(0,S.jsx)(`p`,{className:`line-clamp-2 text-xs text-muted-foreground`,children:e.outcomeSummary}):null]}):null]})})},e.id)})})})})]}),(0,S.jsxs)(`div`,{className:`min-h-[520px] min-w-0 space-y-4`,children:[(0,S.jsx)(fe,{data:ke,loading:Ae,error:je}),X?(0,S.jsxs)(b,{children:[(0,S.jsx)(_,{children:(0,S.jsxs)(v,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`span`,{children:`Issues`}),(0,S.jsxs)(`span`,{className:`ml-2 text-xs font-normal text-muted-foreground`,children:[Q.length,` associated`]})]}),Oe?(0,S.jsx)(m,{variant:`secondary`,children:`loading`}):null]})}),(0,S.jsx)(y,{children:H?(0,S.jsx)(`div`,{className:`text-xs text-destructive`,children:H}):Q.length===0?(0,S.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`No associated issues`}):(0,S.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:Q.map(({association:e,issueRef:t})=>(0,S.jsx)(ue,{issueRef:t,now:P,showSync:!0},`${e.issueRefId}:${e.createdAt}`))})})]}):null,X&&Le?(0,S.jsx)(b,{className:`p-0`,children:(0,S.jsx)(de,{teamId:X.id})}):null,(0,S.jsxs)(b,{children:[(0,S.jsx)(_,{children:(0,S.jsxs)(v,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`span`,{children:`Roster`}),(0,S.jsxs)(`span`,{className:`ml-2 text-xs font-normal text-muted-foreground`,children:[$.length,` member`,$.length===1?``:`s`]})]}),X&&X.status!==`dissolved`?(0,S.jsxs)(h,{variant:`destructive`,size:`sm`,onClick:()=>Pe(`Dissolve Team`,`Dissolve "${X.title||X.id}"? This closes the team working set but keeps its records visible.`,()=>void Ne(X.id)),children:[(0,S.jsx)(te,{className:`size-4`}),` Dissolve`]}):null]})}),(0,S.jsx)(y,{children:X?$.length===0?(0,S.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`No members`}):(0,S.jsx)(`div`,{className:`grid gap-2 md:grid-cols-2`,children:$.map(e=>(0,S.jsxs)(`div`,{className:`flex min-w-0 items-center justify-between gap-3 rounded-md border border-border bg-background px-3 py-2`,children:[(0,S.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,S.jsx)(`span`,{className:i(`h-2 w-2 shrink-0 rounded-full`,re(e,P))}),(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`div`,{className:`truncate text-sm font-medium`,children:f(e)}),(0,S.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,children:e.id})]})]}),(0,S.jsx)(m,{variant:`outline`,className:Ce(e),children:e.status})]},e.id))}):(0,S.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`No team selected`})})]}),(0,S.jsxs)(b,{children:[(0,S.jsx)(_,{children:(0,S.jsxs)(v,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`span`,{children:`Blackboard`}),X?(0,S.jsx)(`span`,{className:`ml-2 text-xs font-normal text-muted-foreground`,children:X.title||X.id}):null]}),(0,S.jsxs)(ce,{value:T,onValueChange:e=>D(e),children:[(0,S.jsx)(ae,{size:`sm`,className:`w-36`,children:(0,S.jsx)(ie,{})}),(0,S.jsx)(oe,{children:me.map(e=>(0,S.jsx)(se,{value:e.value,children:e.label},e.value))})]})]})}),(0,S.jsx)(y,{children:X?Te&&Z.length===0?(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`Loading blackboard…`}):Z.length===0?(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`No blackboard entries`}):(0,S.jsx)(g,{className:`h-[640px] pr-3`,children:(0,S.jsx)(`div`,{className:`space-y-5`,children:ze.map(e=>{let t=Re[e];return t.length===0?null:(0,S.jsxs)(`section`,{className:`space-y-2`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(m,{variant:`secondary`,children:he[e]}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t.length})]}),(0,S.jsx)(`div`,{className:`space-y-2`,children:t.map(e=>(0,S.jsxs)(`div`,{className:`space-y-3 rounded-md border border-border bg-background p-3`,children:[(0,S.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-2`,children:[(0,S.jsxs)(`div`,{className:`min-w-0`,children:[(0,S.jsx)(`div`,{className:`text-sm font-medium`,children:e.title}),(0,S.jsxs)(`div`,{className:`text-xs text-muted-foreground`,children:[`by `,E(e.authorId),` · `,u(P,e.updatedAt||e.createdAt)]})]}),(0,S.jsxs)(`div`,{className:`flex flex-wrap justify-end gap-1`,children:[(0,S.jsx)(m,{variant:`outline`,className:ye[e.status],children:e.status}),e.supersedes?(0,S.jsxs)(m,{variant:`outline`,children:[`supersedes `,E(e.supersedes)]}):null]})]}),e.body?(0,S.jsx)(`p`,{className:`whitespace-pre-wrap text-sm text-muted-foreground`,children:e.body}):null]},e.id))})]},e)})})}):(0,S.jsx)(`div`,{className:`py-16 text-center text-sm text-muted-foreground`,children:`No team selected`})})]})]})]})]})}export{D as TeamsView};
2
- //# sourceMappingURL=teams-D_Ttv7qD.js.map
@@ -1,3 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{Bn as t,Ft as n,In as r,K as i,Lt as a,Mt as o,Nn as s,On as c,P as l,Qn as u,Qt as d,Rt as f,St as p,Tt as m,fn as h,i as g,kt as _,m as v,p as y,pn as b,un as ee,wt as x}from"./lucide-react-BbMYCUlW.js";import{l as S,t as C}from"./store-BB-YW24l.js";import{U as w,Y as T,d as E}from"./display-LAWaAboe.js";import{t as D}from"./badge-C6NJQ60B.js";import{t as O}from"./button-DD2CCM3t.js";import{t as k}from"./copy-button-DqAoeiPC.js";import{a as A,o as j,r as M,t as N}from"./card-GZqj3rMm.js";var P=e(u(),1),F=t(),I=new Set([`active`,`ready`,`conflict`,`review_requested`,`merge_planned`,`cleanup_requested`]),L=new Set([`active`,`ready`,`conflict`,`review_requested`,`merge_planned`]),R=new Set([`active`,`ready`,`review_requested`,`merge_planned`,`conflict`]),z={active:`bg-blue-500/10 text-blue-400 border-blue-500/20`,ready:`bg-emerald-500/10 text-emerald-400 border-emerald-500/20`,conflict:`bg-red-500/10 text-red-400 border-red-500/20`,review_requested:`bg-yellow-500/10 text-yellow-400 border-yellow-500/20`,merge_planned:`bg-indigo-500/10 text-indigo-400 border-indigo-500/20`,merged:`bg-violet-500/10 text-violet-400 border-violet-500/20`,abandoned:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`,cleanup_requested:`bg-orange-500/10 text-orange-400 border-orange-500/20`,cleaned:`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`},B={active:`active`,ready:`ready`,conflict:`conflict`,review_requested:`review`,merge_planned:`merge planned`,merged:`merged`,abandoned:`abandoned`,cleanup_requested:`cleanup`,cleaned:`cleaned`},V={conflict:0,ready:1,review_requested:2,merge_planned:3,active:4,cleanup_requested:5,merged:6,abandoned:7,cleaned:8},H=new Set(T);function U(e){let t=e.split(`/`).filter(Boolean);return t.length<=3?e||`-`:`/${t.slice(-3).join(`/`)}`}function W(e,t){return e?E(e):t||`-`}function G(e){return z[e]||`bg-zinc-500/10 text-zinc-400 border-zinc-500/20`}function K(e,t){let n=(V[e.status]??99)-(V[t.status]??99);return n===0?Number(t.updatedAt||0)-Number(e.updatedAt||0):n}function q(e){let t=new Map;for(let n of e){let e=n.repoRoot||n.sourceCwd||`unknown repo`;t.set(e,[...t.get(e)||[],n])}return[...t.entries()].map(([e,t])=>({repoRoot:e,workspaces:t.sort(K)})).sort((e,t)=>{let n=e.workspaces.some(e=>I.has(e.status));return n===t.workspaces.some(e=>I.has(e.status))?e.repoRoot.localeCompare(t.repoRoot):n?-1:1})}function J(e,t){return t===`all`?e:t===`cleaned`?e.filter(e=>H.has(e.status)):e.filter(e=>!H.has(e.status))}function Y({workspace:e,expanded:t,onToggleDetails:n}){let r=C(e=>e.workspaceAction),i=C(e=>e.purgeWorkspace),a=C(e=>e.fetchWorkspaceMergePreview),s=C(e=>e.openFilesAt),c=e.status===`cleaned`||e.status===`merged`||e.status===`abandoned`,l=c||e.status===`cleanup_requested`,u=e.worktreePath||e.sourceCwd||e.repoRoot,d=C(t=>t.workspaceGitState[e.id]),m=!!d&&d.available!==!1&&d.landed===!0,y=e.mode===`isolated`&&!!e.worktreePath&&R.has(e.status)&&!m;async function x(){await a(e.id),await r(e.id,`merge`)}return(0,F.jsxs)(`div`,{className:`flex flex-wrap justify-end gap-1.5`,children:[(0,F.jsx)(O,{size:`icon-sm`,variant:`ghost`,title:t?`Hide details`:`Show diff & timeline`,onClick:n,children:t?(0,F.jsx)(h,{className:`h-3.5 w-3.5`}):(0,F.jsx)(ee,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(O,{size:`icon-sm`,variant:`ghost`,title:`Open workspace`,disabled:!u||e.status===`cleaned`,onClick:()=>void s({path:u}),children:(0,F.jsx)(_,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(k,{value:u,label:`Copy path`,copiedLabel:`Copied path`,size:`icon-sm`,variant:`ghost`,disabled:!u}),(0,F.jsx)(O,{size:`icon-sm`,variant:`outline`,title:`Mark ready`,disabled:l||e.status===`ready`,onClick:()=>void r(e.id,`ready`),children:(0,F.jsx)(b,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(O,{size:`icon-sm`,variant:`outline`,title:`Request review`,disabled:l||e.status===`review_requested`,onClick:()=>void r(e.id,`request-review`),children:(0,F.jsx)(f,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(O,{size:`icon-sm`,variant:`outline`,title:`Mark merge planned`,disabled:l||e.status===`merge_planned`,onClick:()=>void r(e.id,`merge-plan`),children:(0,F.jsx)(o,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(O,{size:`icon-sm`,variant:`default`,title:m?`Already merged into base — nothing to land`:`Merge & land work`,disabled:!y,onClick:()=>void x(),children:(0,F.jsx)(p,{className:`h-3.5 w-3.5`})}),(0,F.jsx)(O,{size:`icon-sm`,variant:`outline`,title:`Request cleanup (removes the worktree on the host)`,disabled:e.status===`cleaned`||e.status===`cleanup_requested`,onClick:()=>void r(e.id,`cleanup`),children:(0,F.jsx)(v,{className:`h-3.5 w-3.5`})}),c&&(0,F.jsx)(O,{size:`icon-sm`,variant:`ghost`,title:`Purge record (clears the row, does not touch disk)`,onClick:()=>void i(e.id),children:(0,F.jsx)(g,{className:`h-3.5 w-3.5`})})]})}function X({workspace:e,unmerged:t}){let n=C(t=>t.workspaceMergePreview[e.id]),r=C(e=>e.fetchWorkspaceMergePreview),i=t>0&&R.has(e.status);return(0,P.useEffect)(()=>{i&&n===void 0&&r(e.id)},[i,n,e.id,r]),!i||n===void 0||n.available===!1?null:n.conflict?(0,F.jsxs)(`span`,{className:`flex items-center gap-0.5 text-amber-400`,title:`Merging into ${n.baseRef||`base`} would conflict — resolve before merging`,children:[(0,F.jsx)(y,{className:`h-3 w-3`}),`conflict`]}):n.conflict===!1?(0,F.jsxs)(`span`,{className:`flex items-center gap-0.5 text-emerald-400`,title:`Clean to merge via ${n.strategy===`pr`?`PR`:`rebase + fast-forward`} into ${n.baseRef||`base`}`,children:[(0,F.jsx)(b,{className:`h-3 w-3`}),n.strategy===`pr`?`PR ready`:`clean`]}):null}function Z({workspace:e}){let t=S(),r=C(t=>t.workspaceGitState[e.id]),i=C(e=>e.fetchWorkspaceGitState),a=e.mode===`isolated`&&!!e.worktreePath&&L.has(e.status);if((0,P.useEffect)(()=>{a&&r===void 0&&i(e.id)},[a,r,e.id,i]),!a)return null;let o=(0,F.jsx)(O,{size:`icon-sm`,variant:`ghost`,className:`h-5 w-5`,title:`Refresh git state`,onClick:()=>void i(e.id),children:(0,F.jsx)(l,{className:`h-3 w-3`})});if(r===void 0)return(0,F.jsx)(`div`,{className:`flex items-center gap-1 text-[11px] text-muted-foreground`,children:`Loading git state…`});if(r.available===!1)return(0,F.jsxs)(`div`,{className:`flex items-center gap-1 text-[11px] text-muted-foreground`,title:r.reason,children:[(0,F.jsx)(`span`,{children:`git state unavailable`}),o]});if(r.missing)return(0,F.jsxs)(`div`,{className:`flex items-center gap-1 text-[11px] text-muted-foreground`,children:[`worktree gone `,o]});if(r.error)return(0,F.jsxs)(`div`,{className:`flex items-center gap-1 text-[11px] text-red-400`,title:r.error,children:[(0,F.jsx)(`span`,{children:`git error`}),o]});let u=r.ahead??0,d=r.landed===!0,f=d?0:r.unmergedAhead??u,p=r.behind??0,m=r.dirtyCount??0,h=f===0&&m===0&&!d,g=r.lastCommit;return(0,F.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-0.5 text-[11px]`,children:[h?(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`no unmerged work`}):(0,F.jsxs)(F.Fragment,{children:[d?(0,F.jsxs)(`span`,{className:`flex items-center gap-0.5 text-emerald-400`,title:`Work already landed in ${r.baseRef||`base`} via squash/cherry-pick — safe to clean up`,children:[(0,F.jsx)(b,{className:`h-3 w-3`}),`landed`]}):(0,F.jsxs)(`span`,{className:f>0?`flex items-center text-emerald-400`:`flex items-center text-muted-foreground`,title:u===f?`${f} commit(s) ahead of base`:`${f} unmerged commit(s) (${u} ahead of base)`,children:[(0,F.jsx)(c,{className:`h-3 w-3`}),f]}),(0,F.jsxs)(`span`,{className:p>0?`flex items-center text-amber-400`:`flex items-center text-muted-foreground`,title:`${p} commit(s) behind base`,children:[(0,F.jsx)(s,{className:`h-3 w-3`}),p]}),m>0&&(0,F.jsxs)(`span`,{className:`flex items-center text-orange-400`,title:`${m} uncommitted change(s)`,children:[(0,F.jsx)(n,{className:`h-3 w-3`}),m]}),!d&&(0,F.jsx)(X,{workspace:e,unmerged:f})]}),o]}),g&&(0,F.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1 text-[11px] text-muted-foreground`,title:`${g.sha.slice(0,8)} — ${g.message}`,children:[(0,F.jsx)(x,{className:`h-3 w-3 shrink-0`}),(0,F.jsx)(`span`,{className:`truncate`,children:g.message||g.sha.slice(0,8)}),g.at?(0,F.jsxs)(`span`,{className:`shrink-0 opacity-70`,children:[`· `,w(t,g.at)]}):null]})]})}function Q({workspace:e}){let t=S(),n=typeof e.metadata?.mergedAt==`number`?e.metadata.mergedAt:void 0,r=[{label:`created`,at:e.createdAt},{label:`ready`,at:e.readyAt},{label:`merged`,at:n},{label:`cleaned`,at:e.cleanedAt}].filter(e=>typeof e.at==`number`&&e.at>0);return(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] text-muted-foreground`,children:[(0,F.jsxs)(`span`,{className:`flex items-center gap-1 font-medium text-foreground`,children:[(0,F.jsx)(d,{className:`h-3 w-3`}),`Timeline`]}),r.map((e,n)=>(0,F.jsxs)(`span`,{className:`flex items-center gap-1`,children:[n>0&&(0,F.jsx)(`span`,{className:`opacity-40`,children:`→`}),(0,F.jsx)(`span`,{className:`text-foreground`,children:e.label}),(0,F.jsx)(`span`,{title:new Date(e.at).toLocaleString(),children:w(t,e.at)})]},e.label))]})}function te(e){return e.startsWith(`+`)&&!e.startsWith(`+++`)?`text-emerald-400`:e.startsWith(`-`)&&!e.startsWith(`---`)?`text-red-400`:e.startsWith(`@@`)?`text-cyan-400`:e.startsWith(`diff `)||e.startsWith(`index `)||e.startsWith(`+++`)||e.startsWith(`---`)?`text-muted-foreground`:``}function ne({workspace:e}){let t=C(t=>t.workspaceDiff[e.id]),n=C(e=>e.fetchWorkspaceDiff),r=e.mode===`isolated`&&!!e.worktreePath;if((0,P.useEffect)(()=>{r&&t===void 0&&n(e.id)},[r,t,e.id,n]),!r)return null;if(t===void 0)return(0,F.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:`Loading diff…`});if(t.available===!1)return(0,F.jsxs)(`div`,{className:`text-[11px] text-muted-foreground`,children:[`Diff unavailable`,t.reason?`: ${t.reason}`:``]});if(t.missing)return(0,F.jsx)(`div`,{className:`text-[11px] text-muted-foreground`,children:`Worktree no longer on disk`});if(t.error)return(0,F.jsxs)(`div`,{className:`text-[11px] text-red-400`,children:[`Diff error: `,t.error]});if(!t.files.length)return(0,F.jsxs)(`div`,{className:`text-[11px] text-muted-foreground`,children:[`No committed changes against `,t.baseRef||`base`]});let i=(0,F.jsx)(O,{size:`icon-sm`,variant:`ghost`,className:`h-5 w-5`,title:`Refresh diff`,onClick:()=>void n(e.id),children:(0,F.jsx)(l,{className:`h-3 w-3`})});return(0,F.jsxs)(`div`,{className:`space-y-1`,children:[(0,F.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] font-medium`,children:[(0,F.jsx)(a,{className:`h-3 w-3`}),(0,F.jsxs)(`span`,{children:[t.files.length,` file`,t.files.length===1?``:`s`,` vs `,t.baseRef||`base`]}),i]}),(0,F.jsx)(`ul`,{className:`space-y-0.5 text-[11px]`,children:t.files.map(e=>(0,F.jsxs)(`li`,{className:`flex items-center gap-2 font-mono`,children:[(0,F.jsx)(`span`,{className:`truncate`,title:e.path,children:e.path}),e.binary?(0,F.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:`binary`}):(0,F.jsxs)(`span`,{className:`shrink-0`,children:[(0,F.jsxs)(`span`,{className:`text-emerald-400`,children:[`+`,e.additions??0]}),` `,(0,F.jsxs)(`span`,{className:`text-red-400`,children:[`−`,e.deletions??0]})]})]},e.path))}),t.patch&&(0,F.jsxs)(`pre`,{className:`max-h-80 overflow-auto rounded border border-border bg-muted/30 p-2 text-[10.5px] leading-relaxed`,children:[t.patch.split(`
2
- `).map((e,t)=>(0,F.jsx)(`div`,{className:te(e),children:e||` `},t)),t.truncated&&(0,F.jsx)(`div`,{className:`mt-1 text-muted-foreground`,children:`… patch truncated`})]})]})}function $({workspace:e}){return(0,F.jsxs)(`div`,{className:`space-y-3 border-t border-dashed border-border bg-muted/20 px-3 py-3`,children:[(0,F.jsx)(Q,{workspace:e}),(0,F.jsx)(ne,{workspace:e})]})}function re(){let e=C(e=>e.workspaceOrphans),t=C(e=>e.fetchWorkspaceOrphans),n=C(e=>e.reclaimWorkspaceOrphan);return(0,P.useEffect)(()=>{t()},[t]),e.length?(0,F.jsxs)(N,{className:`border-amber-500/30`,children:[(0,F.jsxs)(A,{className:`px-4 py-3`,children:[(0,F.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,F.jsx)(i,{className:`h-4 w-4 text-amber-400`}),(0,F.jsx)(j,{className:`text-sm font-medium`,children:`Orphaned worktrees`}),(0,F.jsx)(D,{variant:`outline`,className:`border-amber-500/30 text-amber-400 text-[10px]`,children:e.length}),(0,F.jsx)(O,{size:`icon-sm`,variant:`ghost`,className:`ml-auto h-6 w-6`,title:`Rescan`,onClick:()=>void t(),children:(0,F.jsx)(l,{className:`h-3.5 w-3.5`})})]}),(0,F.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`Agent worktrees on disk with no live workspace. Reclaim removes them from the host.`})]}),(0,F.jsx)(M,{className:`p-0`,children:e.map(e=>(0,F.jsxs)(`div`,{className:`flex items-center gap-3 border-t border-border px-4 py-2 text-xs`,children:[(0,F.jsx)(m,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,F.jsx)(`span`,{className:`truncate font-medium`,title:e.branch,children:e.branch||`(detached)`}),(0,F.jsx)(`span`,{className:`truncate font-mono text-muted-foreground`,title:e.worktreePath,children:U(e.worktreePath)}),e.hadTerminalRow&&(0,F.jsx)(D,{variant:`outline`,className:`text-[10px]`,children:`cleanup failed`}),(0,F.jsxs)(O,{size:`sm`,variant:`outline`,className:`ml-auto h-7 text-xs`,onClick:()=>void n(e),children:[(0,F.jsx)(r,{className:`mr-1 h-3.5 w-3.5`}),`Reclaim`]})]},e.worktreePath))})]}):null}function ie(e){let t=e.match(/\/pull\/(\d+)/);return t?`PR #${t[1]}`:`View PR`}function ae({workspace:e}){let t=e.metadata?.mergeResult,n=t?.prUrl,r=t?.error||e.metadata?.mergeError;return!n&&!r?null:(0,F.jsxs)(F.Fragment,{children:[n&&(0,F.jsxs)(`a`,{href:n,target:`_blank`,rel:`noreferrer`,title:n,className:`inline-flex items-center gap-0.5 rounded border border-violet-500/30 px-1.5 py-0 text-[10px] text-violet-400 hover:text-violet-300`,children:[(0,F.jsx)(p,{className:`h-2.5 w-2.5`}),ie(n)]}),r&&(0,F.jsxs)(D,{variant:`outline`,className:`max-w-[16rem] border-amber-500/30 text-amber-400 text-[10px]`,title:r,children:[(0,F.jsx)(y,{className:`mr-0.5 h-2.5 w-2.5 shrink-0`}),(0,F.jsxs)(`span`,{className:`truncate`,children:[`merge: `,r]})]})]})}function oe({workspace:e}){let t=S(),[n,r]=(0,P.useState)(!1),i=C(e=>e.agentsById),a=C(t=>t.workspaceFocusId===e.id),o=e.ownerAgentId?i[e.ownerAgentId]:void 0,s=e.stewardAgentId?i[e.stewardAgentId]:void 0,c=e.worktreePath||e.sourceCwd||e.repoRoot,l=(0,P.useRef)(null);return(0,P.useEffect)(()=>{a&&l.current?.scrollIntoView({behavior:`smooth`,block:`center`})},[a]),(0,F.jsxs)(`div`,{ref:l,className:`border-t border-border ${a?`bg-primary/5 ring-1 ring-inset ring-primary/40`:``}`,children:[(0,F.jsxs)(`div`,{className:`grid gap-3 px-3 py-3 text-sm lg:grid-cols-[minmax(180px,1.2fr)_minmax(220px,1.5fr)_minmax(160px,1fr)_minmax(170px,auto)]`,children:[(0,F.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,F.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,F.jsx)(m,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,F.jsx)(`span`,{className:`truncate font-medium`,title:e.branch||e.id,children:e.branch||e.id})]}),(0,F.jsxs)(`div`,{className:`flex flex-wrap gap-1`,children:[(0,F.jsx)(D,{variant:`outline`,className:`text-[10px] ${e.mode===`isolated`?`border-sky-500/30 text-sky-400`:`border-zinc-500/30 text-zinc-400`}`,children:e.mode}),e.requestedMode&&e.requestedMode!==e.mode&&(0,F.jsxs)(D,{variant:`outline`,className:`text-[10px]`,children:[`requested `,e.requestedMode]}),(0,F.jsx)(D,{variant:`outline`,className:`text-[10px] ${G(e.status)}`,children:B[e.status]||e.status}),(0,F.jsx)(ae,{workspace:e})]})]}),(0,F.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,F.jsx)(`div`,{className:`truncate font-mono text-xs`,title:c,children:U(c)}),(0,F.jsx)(`div`,{className:`truncate text-xs text-muted-foreground`,title:e.sourceCwd,children:e.sourceCwd}),(0,F.jsx)(Z,{workspace:e})]}),(0,F.jsxs)(`div`,{className:`grid grid-cols-[4.5rem_minmax(0,1fr)] gap-x-2 gap-y-1 text-xs`,children:[(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`Owner`}),(0,F.jsx)(`span`,{className:`truncate`,title:e.ownerAgentId,children:W(o,e.ownerPolicyName||e.ownerAgentId)}),(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`Steward`}),(0,F.jsx)(`span`,{className:`truncate`,title:e.stewardAgentId,children:W(s,e.stewardAgentId)}),(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`Updated`}),(0,F.jsx)(`span`,{children:w(t,e.updatedAt)}),e.baseRef&&(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(`span`,{className:`text-muted-foreground`,children:`Base`}),(0,F.jsx)(`span`,{className:`truncate`,title:e.baseSha,children:e.baseRef})]})]}),(0,F.jsx)(Y,{workspace:e,expanded:n,onToggleDetails:()=>r(e=>!e)})]}),n&&(0,F.jsx)($,{workspace:e})]})}function se({repoRoot:e,workspaces:t}){let n=t.filter(e=>I.has(e.status)).length,r=t.filter(e=>e.status===`ready`||e.status===`review_requested`||e.status===`merge_planned`).length,i=t.filter(e=>e.status===`conflict`).length;return(0,F.jsxs)(N,{children:[(0,F.jsx)(A,{className:`px-4 py-3`,children:(0,F.jsx)(`div`,{className:`flex min-w-0 items-start gap-3`,children:(0,F.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,F.jsx)(j,{className:`truncate text-sm font-medium`,title:e,children:e}),(0,F.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1.5`,children:[(0,F.jsxs)(D,{variant:`outline`,className:`text-[10px]`,children:[t.length,` total`]}),(0,F.jsxs)(D,{variant:`outline`,className:`text-[10px]`,children:[n,` live`]}),r>0&&(0,F.jsxs)(D,{variant:`outline`,className:`border-emerald-500/20 text-emerald-400 text-[10px]`,children:[r,` merge signal`]}),i>0&&(0,F.jsxs)(D,{variant:`outline`,className:`border-red-500/20 text-red-400 text-[10px]`,children:[i,` conflict`]})]})]})})}),(0,F.jsx)(M,{className:`p-0`,children:t.map(e=>(0,F.jsx)(oe,{workspace:e},e.id))})]})}function ce(){let[e,t]=(0,P.useState)(`active`),n=C(e=>e.workspaces),r=C(e=>e.set),i=C(e=>e.workspaceFocusId);(0,P.useEffect)(()=>{i&&t(`all`)},[i]),(0,P.useEffect)(()=>()=>{r({workspaceFocusId:null})},[r]);let a=(0,P.useMemo)(()=>J(n,e),[n,e]),o=(0,P.useMemo)(()=>q(a),[a]),s=n.filter(e=>I.has(e.status)).length,c=n.filter(e=>e.mode===`isolated`).length,l=n.filter(e=>e.status===`ready`||e.status===`review_requested`||e.status===`merge_planned`).length,u=n.filter(e=>e.status===`conflict`).length,d=n.filter(e=>H.has(e.status)).length,f=[{key:`active`,label:`Active`,count:n.length-d},{key:`cleaned`,label:`Done`,count:d},{key:`all`,label:`All`,count:n.length}];return(0,F.jsxs)(`div`,{className:`space-y-4`,children:[(0,F.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`h1`,{className:`text-2xl font-semibold`,children:`Workspaces`}),(0,F.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Agent worktrees, ownership, and merge readiness.`})]}),(0,F.jsxs)(`div`,{className:`ml-auto flex flex-wrap gap-1.5`,children:[(0,F.jsxs)(D,{variant:`outline`,children:[c,` isolated`]}),(0,F.jsxs)(D,{variant:`outline`,children:[s,` live`]}),(0,F.jsxs)(D,{variant:`outline`,children:[l,` ready`]}),u>0&&(0,F.jsxs)(D,{variant:`outline`,className:`border-red-500/20 text-red-400`,children:[u,` conflict`]})]})]}),(0,F.jsx)(re,{}),(0,F.jsx)(`div`,{className:`flex flex-wrap items-center gap-2`,children:(0,F.jsx)(`div`,{className:`flex rounded-md border border-border bg-card p-1`,children:f.map(n=>(0,F.jsxs)(O,{size:`sm`,variant:e===n.key?`secondary`:`ghost`,className:`h-7 text-xs`,onClick:()=>t(n.key),children:[n.label,(0,F.jsx)(`span`,{className:`ml-1 text-muted-foreground`,children:n.count})]},n.key))})}),o.length===0?(0,F.jsxs)(`div`,{className:`rounded-md border border-border px-3 py-12 text-center text-sm text-muted-foreground`,children:[`No `,e===`all`?``:e,` workspaces`]}):(0,F.jsx)(`div`,{className:`space-y-3`,children:o.map(e=>(0,F.jsx)(se,{repoRoot:e.repoRoot,workspaces:e.workspaces},e.repoRoot))})]})}export{ce as WorkspacesView};
3
- //# sourceMappingURL=workspaces-CrtAeVnv.js.map