agent-relay-server 0.52.0 → 0.54.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 (135) hide show
  1. package/docs/openapi.json +1 -1
  2. package/package.json +1 -1
  3. package/public/assets/PlanGraphPanel-CQ0CH7e9.js +2 -0
  4. package/public/assets/PlanGraphPanel-CQ0CH7e9.js.map +1 -0
  5. package/public/assets/{activity-BNLuP717.js → activity-CxnH-3Zt.js} +2 -2
  6. package/public/assets/{activity-BNLuP717.js.map → activity-CxnH-3Zt.js.map} +1 -1
  7. package/public/assets/{agent-profiles-BhVEehP8.js → agent-profiles-JhWQY-pg.js} +2 -2
  8. package/public/assets/{agent-profiles-BhVEehP8.js.map → agent-profiles-JhWQY-pg.js.map} +1 -1
  9. package/public/assets/agents-Bn7CXOMZ.js +2 -0
  10. package/public/assets/{agents-CqQhC2aN.js.map → agents-Bn7CXOMZ.js.map} +1 -1
  11. package/public/assets/{analytics-44eqtAsx.js → analytics-BCVgYihk.js} +3 -3
  12. package/public/assets/{analytics-44eqtAsx.js.map → analytics-BCVgYihk.js.map} +1 -1
  13. package/public/assets/{automation-x65cxlk4.js → automation-Cu5J1Yh4.js} +2 -2
  14. package/public/assets/{automation-x65cxlk4.js.map → automation-Cu5J1Yh4.js.map} +1 -1
  15. package/public/assets/{badge-BR4bvEsy.js → badge-D6yb-Kia.js} +2 -2
  16. package/public/assets/{badge-BR4bvEsy.js.map → badge-D6yb-Kia.js.map} +1 -1
  17. package/public/assets/branch-state-badge-fOM74RDq.js +2 -0
  18. package/public/assets/{branch-state-badge-Dp6Jk4LH.js.map → branch-state-badge-fOM74RDq.js.map} +1 -1
  19. package/public/assets/{button-BwqJZS4O.js → button-B-w6a1Ng.js} +2 -2
  20. package/public/assets/{button-BwqJZS4O.js.map → button-B-w6a1Ng.js.map} +1 -1
  21. package/public/assets/card-j6bjYxys.js +2 -0
  22. package/public/assets/{card-C7JtSyuM.js.map → card-j6bjYxys.js.map} +1 -1
  23. package/public/assets/{channels-CmfUfiV0.js → channels-D4q8I1q-.js} +2 -2
  24. package/public/assets/{channels-CmfUfiV0.js.map → channels-D4q8I1q-.js.map} +1 -1
  25. package/public/assets/chat-6QaNdZGN.js +2 -0
  26. package/public/assets/{chat-nugo0m55.js.map → chat-6QaNdZGN.js.map} +1 -1
  27. package/public/assets/{connectors-Bf74bw_9.js → connectors-DuWMf8KT.js} +2 -2
  28. package/public/assets/{connectors-Bf74bw_9.js.map → connectors-DuWMf8KT.js.map} +1 -1
  29. package/public/assets/{copy-button-nbDhTE0M.js → copy-button-CJDmQ9UB.js} +2 -2
  30. package/public/assets/{copy-button-nbDhTE0M.js.map → copy-button-CJDmQ9UB.js.map} +1 -1
  31. package/public/assets/{dist-BIAvrITs.js → dist-1iqvQR2q.js} +2 -2
  32. package/public/assets/{dist-BIAvrITs.js.map → dist-1iqvQR2q.js.map} +1 -1
  33. package/public/assets/{dist-MdPDPcyo.js → dist-BNF6RqQf.js} +2 -2
  34. package/public/assets/{dist-MdPDPcyo.js.map → dist-BNF6RqQf.js.map} +1 -1
  35. package/public/assets/{dist-Dvspm7RE.js → dist-Bg5mAaEO.js} +2 -2
  36. package/public/assets/{dist-Dvspm7RE.js.map → dist-Bg5mAaEO.js.map} +1 -1
  37. package/public/assets/{dist-C7UYAwBf.js → dist-BtFzbpiK.js} +2 -2
  38. package/public/assets/{dist-C7UYAwBf.js.map → dist-BtFzbpiK.js.map} +1 -1
  39. package/public/assets/{dist-svixSeDF.js → dist-CLUvHFPE.js} +2 -2
  40. package/public/assets/{dist-svixSeDF.js.map → dist-CLUvHFPE.js.map} +1 -1
  41. package/public/assets/{dist-BiVJ8IWp.js → dist-Cl4PfJEy.js} +2 -2
  42. package/public/assets/{dist-BiVJ8IWp.js.map → dist-Cl4PfJEy.js.map} +1 -1
  43. package/public/assets/dist-D1g0W-kO.js +2 -0
  44. package/public/assets/{dist-BkDVLgYg.js.map → dist-D1g0W-kO.js.map} +1 -1
  45. package/public/assets/{dist-DvLO--_O.js → dist-DLc4vQoq.js} +2 -2
  46. package/public/assets/{dist-DvLO--_O.js.map → dist-DLc4vQoq.js.map} +1 -1
  47. package/public/assets/{dist-CSISzAHD.js → dist-HMkrkMzb.js} +2 -2
  48. package/public/assets/{dist-CSISzAHD.js.map → dist-HMkrkMzb.js.map} +1 -1
  49. package/public/assets/dist-MX7mVzej.js +2 -0
  50. package/public/assets/{dist-D5y1HX8f.js.map → dist-MX7mVzej.js.map} +1 -1
  51. package/public/assets/dist-fe-f7EIl.js +2 -0
  52. package/public/assets/{dist-tX4uIBFU.js.map → dist-fe-f7EIl.js.map} +1 -1
  53. package/public/assets/{es2015-Cu7l1536.js → es2015-4dO99MHc.js} +2 -2
  54. package/public/assets/{es2015-Cu7l1536.js.map → es2015-4dO99MHc.js.map} +1 -1
  55. package/public/assets/{formatted-body-impl-UeUBqdRz.js → formatted-body-impl-CTv-ZFNo.js} +2 -2
  56. package/public/assets/{formatted-body-impl-UeUBqdRz.js.map → formatted-body-impl-CTv-ZFNo.js.map} +1 -1
  57. package/public/assets/index-Cobj8Cqd.js +21 -0
  58. package/public/assets/index-Cobj8Cqd.js.map +1 -0
  59. package/public/assets/index-D7FDcoef.css +2 -0
  60. package/public/assets/{input-YoPXrp72.js → input-EazHb1Bc.js} +2 -2
  61. package/public/assets/{input-YoPXrp72.js.map → input-EazHb1Bc.js.map} +1 -1
  62. package/public/assets/{insights-C9k7mCoJ.js → insights-Ucwp3dHJ.js} +2 -2
  63. package/public/assets/{insights-C9k7mCoJ.js.map → insights-Ucwp3dHJ.js.map} +1 -1
  64. package/public/assets/{integrations-By3hMfqC.js → integrations-eRsF4CjO.js} +2 -2
  65. package/public/assets/{integrations-By3hMfqC.js.map → integrations-eRsF4CjO.js.map} +1 -1
  66. package/public/assets/{lib-D8ccisdr.js → lib-C7poqE0I.js} +3 -3
  67. package/public/assets/{lib-D8ccisdr.js.map → lib-C7poqE0I.js.map} +1 -1
  68. package/public/assets/{lucide-react-ChOGD4vc.js → lucide-react-Dr0-sUx6.js} +2 -2
  69. package/public/assets/{lucide-react-ChOGD4vc.js.map → lucide-react-Dr0-sUx6.js.map} +1 -1
  70. package/public/assets/{maintenance-tgb7AMTv.js → maintenance-BW56fE-T.js} +2 -2
  71. package/public/assets/{maintenance-tgb7AMTv.js.map → maintenance-BW56fE-T.js.map} +1 -1
  72. package/public/assets/{managed-agents-DJ3TfBJ5.js → managed-agents-BkFAu1Ub.js} +2 -2
  73. package/public/assets/{managed-agents-DJ3TfBJ5.js.map → managed-agents-BkFAu1Ub.js.map} +1 -1
  74. package/public/assets/{markdown-preview-impl-DcHq1Hto.js → markdown-preview-impl-BT43MQ7E.js} +2 -2
  75. package/public/assets/{markdown-preview-impl-DcHq1Hto.js.map → markdown-preview-impl-BT43MQ7E.js.map} +1 -1
  76. package/public/assets/memory-Cw279dr5.js +2 -0
  77. package/public/assets/{memory-CMdemdtb.js.map → memory-Cw279dr5.js.map} +1 -1
  78. package/public/assets/{messages-CLuLC9wC.js → messages-5InjjgUv.js} +2 -2
  79. package/public/assets/{messages-CLuLC9wC.js.map → messages-5InjjgUv.js.map} +1 -1
  80. package/public/assets/{orchestrators-d27zYyT9.js → orchestrators-B78CQxLl.js} +2 -2
  81. package/public/assets/{orchestrators-d27zYyT9.js.map → orchestrators-B78CQxLl.js.map} +1 -1
  82. package/public/assets/{overview-BY-cs5SI.js → overview-C9V2X2oo.js} +2 -2
  83. package/public/assets/{overview-BY-cs5SI.js.map → overview-C9V2X2oo.js.map} +1 -1
  84. package/public/assets/{pairs-CmyQx_4F.js → pairs-Cc3tOjXB.js} +2 -2
  85. package/public/assets/{pairs-CmyQx_4F.js.map → pairs-Cc3tOjXB.js.map} +1 -1
  86. package/public/assets/{react-dom-DgWuIw1o.js → react-dom-CQSYEHV9.js} +2 -2
  87. package/public/assets/{react-dom-DgWuIw1o.js.map → react-dom-CQSYEHV9.js.map} +1 -1
  88. package/public/assets/{security-CxCnWTlk.js → security-CpBET4KN.js} +2 -2
  89. package/public/assets/{security-CxCnWTlk.js.map → security-CpBET4KN.js.map} +1 -1
  90. package/public/assets/{select-B6iG4oYX.js → select-FNVeUxFZ.js} +2 -2
  91. package/public/assets/{select-B6iG4oYX.js.map → select-FNVeUxFZ.js.map} +1 -1
  92. package/public/assets/settings-CPto3TdF.js +10 -0
  93. package/public/assets/settings-CPto3TdF.js.map +1 -0
  94. package/public/assets/{store-BLZA3u7Y.js → store-h-egULYA.js} +4 -4
  95. package/public/assets/store-h-egULYA.js.map +1 -0
  96. package/public/assets/{tasks-BYUAWEL-.js → tasks-BPplMcnM.js} +2 -2
  97. package/public/assets/{tasks-BYUAWEL-.js.map → tasks-BPplMcnM.js.map} +1 -1
  98. package/public/assets/teams-CCeuRt7v.js +2 -0
  99. package/public/assets/{teams-gWvyw7ET.js.map → teams-CCeuRt7v.js.map} +1 -1
  100. package/public/assets/{terminal-viewer-impl-CHP0w79T.js → terminal-viewer-impl-DRlbl8Yv.js} +3 -3
  101. package/public/assets/{terminal-viewer-impl-CHP0w79T.js.map → terminal-viewer-impl-DRlbl8Yv.js.map} +1 -1
  102. package/public/assets/{use-keyboard-viewport-BY99X7eI.js → use-keyboard-viewport-Iaz6IT4p.js} +2 -2
  103. package/public/assets/{use-keyboard-viewport-BY99X7eI.js.map → use-keyboard-viewport-Iaz6IT4p.js.map} +1 -1
  104. package/public/assets/{work-queue-CBjXlNuG.js → work-queue-qtjloIIF.js} +2 -2
  105. package/public/assets/{work-queue-CBjXlNuG.js.map → work-queue-qtjloIIF.js.map} +1 -1
  106. package/public/assets/workspaces-BcnSfMmi.js +3 -0
  107. package/public/assets/{workspaces-PdCwiSQx.js.map → workspaces-BcnSfMmi.js.map} +1 -1
  108. package/public/index.html +21 -21
  109. package/src/db/message-reads.ts +60 -0
  110. package/src/mcp.ts +7 -5
  111. package/src/routes/workspaces.ts +2 -2
  112. package/src/services/register-agent.ts +4 -1
  113. package/src/services/shutdown-agent.ts +24 -7
  114. package/src/services/spawn-agent.ts +15 -0
  115. package/src/spawn-command.ts +8 -0
  116. package/src/workspace-actions.ts +2 -2
  117. package/src/workspace-merge.ts +4 -1
  118. package/public/assets/PlanGraphPanel-BnYmYHnY.js +0 -2
  119. package/public/assets/PlanGraphPanel-BnYmYHnY.js.map +0 -1
  120. package/public/assets/agents-CqQhC2aN.js +0 -2
  121. package/public/assets/branch-state-badge-Dp6Jk4LH.js +0 -2
  122. package/public/assets/card-C7JtSyuM.js +0 -2
  123. package/public/assets/chat-nugo0m55.js +0 -2
  124. package/public/assets/dist-BkDVLgYg.js +0 -2
  125. package/public/assets/dist-D5y1HX8f.js +0 -2
  126. package/public/assets/dist-tX4uIBFU.js +0 -2
  127. package/public/assets/index-C0aWKi0g.css +0 -2
  128. package/public/assets/index-D--CyG66.js +0 -21
  129. package/public/assets/index-D--CyG66.js.map +0 -1
  130. package/public/assets/memory-CMdemdtb.js +0 -2
  131. package/public/assets/settings-vSYPv8kE.js +0 -10
  132. package/public/assets/settings-vSYPv8kE.js.map +0 -1
  133. package/public/assets/store-BLZA3u7Y.js.map +0 -1
  134. package/public/assets/teams-gWvyw7ET.js +0 -2
  135. package/public/assets/workspaces-PdCwiSQx.js +0 -3
@@ -1,2 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{B as t,D as n,E as r,I as ee,M as i,Rt as te,Un as a,jn as o,m as ne,pn as re}from"./lucide-react-ChOGD4vc.js";import{o as ie,t as s}from"./store-BLZA3u7Y.js";import{H as c,d as ae,h as l}from"./display-CXhnBwGf.js";import{t as u}from"./badge-BR4bvEsy.js";import{t as d}from"./button-BwqJZS4O.js";import{t as f}from"./input-YoPXrp72.js";import{M as oe,r as se,s as ce}from"./index-D--CyG66.js";import{i as p,n as m,r as h,t as g}from"./card-C7JtSyuM.js";var _=e(a(),1),v=o(),y=[`organization`,`role`,`project`,`task`,`interaction`,`agent`],le=[`private`,`project`,`org`,`public`],ue=[`public`,`normal`,`sensitive`,`secret`],b=[`reported`,`inferred`,`verified`];function x(){return{type:`project`,scope:`default`,title:``,content:``,tags:``,visibility:`project`,sensitivity:`normal`,confidence:`reported`,relevanceScore:`0.7`}}function S(e){return{type:e.type,scope:e.scope,title:e.title,content:e.content,tags:e.tags.join(`, `),visibility:e.visibility,sensitivity:e.sensitivity,confidence:e.confidence,relevanceScore:String(e.relevanceScore)}}function C(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function de(e){let t={limit:100};e.type&&(t.type=e.type),e.scope.trim()&&(t.scope=e.scope.trim()),e.visibility&&(t.visibility=e.visibility);let n=C(e.tags);if(n.length&&(t.tags=n),e.minRelevance.trim()){let n=Number(e.minRelevance);Number.isFinite(n)&&(t.minRelevance=Math.max(0,Math.min(1,n)))}return t}function w(e){return e===`secret`?`bg-red-500/10 text-red-400 border-red-500/30`:e===`sensitive`?`bg-yellow-500/10 text-yellow-400 border-yellow-500/30`:e===`public`?`bg-blue-500/10 text-blue-400 border-blue-500/30`:`bg-zinc-500/10 text-zinc-400 border-zinc-500/30`}function T(e){return e>=.8?`text-emerald-400`:e>=.5?`text-yellow-400`:`text-zinc-400`}function fe(e){return e?Object.entries(e).map(([e,t])=>`${e}=${Array.isArray(t)?t.join(` `):String(t)}`).join(` `):`default`}function pe(e){return e.filter(e=>![`system`,`user`,`channel`].includes(e.kind||``))}function E(){let e=ie(),a=s(e=>e.agents),o=s(e=>e.memories),E=s(e=>e.memoryTotal),O=s(e=>e.memoryStats),k=s(e=>e.memoryBrokerInfo),A=s(e=>e.memoryFilters),j=s(e=>e.selectedMemoryId),he=s(e=>e.memoryLoading),M=s(e=>e.set),ge=s(e=>e.fetchMemories),N=s(e=>e.refreshMemory),P=s(e=>e.saveMemory),F=s(e=>e.deleteMemory),I=s(e=>e.injectMemory),L=o.find(e=>e.id===j),[R,z]=(0,_.useState)(`create`),[B,V]=(0,_.useState)(x),[H,U]=(0,_.useState)(``),[W,_e]=(0,_.useState)(`manual`),[G,ve]=(0,_.useState)(`1600`),[K,ye]=(0,_.useState)(`8`),[q,be]=(0,_.useState)(``),J=(0,_.useMemo)(()=>pe(a),[a]);(0,_.useEffect)(()=>{!H&&J[0]&&U(J[0].id)},[J,H]),(0,_.useEffect)(()=>{L&&R===`edit`&&V(S(L))},[L?.id,R]);let Y=(0,_.useMemo)(()=>{let e=A.search.trim().toLowerCase();return e?o.filter(t=>[t.id,t.type,t.scope,t.title,t.content,...t.tags].some(t=>String(t).toLowerCase().includes(e))):o},[o,A.search]);function X(e){M({memoryFilters:{...A,...e}})}async function Z(){let e=Number(B.relevanceScore),t={title:B.title.trim(),content:B.content.trim(),tags:C(B.tags),visibility:B.visibility,sensitivity:B.sensitivity,confidence:B.confidence,relevanceScore:Number.isFinite(e)?Math.max(0,Math.min(1,e)):.7};if(R===`edit`&&L){await P(t,L.id);return}await P({...t,type:B.type,scope:B.scope.trim()}),z(`create`),V(x())}async function Q(e){if(!H)return;let t=await I({agentId:H,memoryIds:e,query:e?.length?void 0:de(A),reason:W.trim()||`manual`,budget:{maxTokens:Math.max(200,Number(G)||1600),maxMemories:Math.max(1,Number(K)||8),priorityCutoff:3}});t?.command?.id&&be(t.command.id)}function xe(){z(`create`),V(x())}function Se(){L&&(z(`edit`),V(S(L)))}let Ce=B.title.trim()&&B.content.trim()&&(R===`edit`||B.scope.trim()),$=fe(k?.config);return(0,v.jsxs)(`div`,{className:`space-y-4`,children:[(0,v.jsxs)(`div`,{className:`flex items-center justify-between gap-3 flex-wrap`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,v.jsx)(re,{className:`w-5 h-5 text-muted-foreground`}),(0,v.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Memory`}),(0,v.jsx)(u,{variant:`secondary`,children:O?.total??E}),k&&(0,v.jsx)(u,{className:k.external?`bg-blue-500/15 text-blue-400 border-blue-500/30`:`bg-emerald-500/15 text-emerald-400 border-emerald-500/30`,children:k.type})]}),(0,v.jsxs)(d,{size:`sm`,variant:`outline`,className:`gap-1.5`,onClick:()=>N(),children:[(0,v.jsx)(i,{className:`w-3.5 h-3.5 ${he?`animate-spin`:``}`}),`Refresh`]})]}),(0,v.jsxs)(`div`,{className:`grid gap-3 xl:grid-cols-[1.2fr_0.8fr]`,children:[(0,v.jsxs)(g,{children:[(0,v.jsx)(h,{className:`py-3 px-4`,children:(0,v.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,v.jsxs)(p,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,v.jsx)(te,{className:`w-4 h-4 text-muted-foreground`}),`Broker`]}),k?.capabilities&&(0,v.jsx)(`div`,{className:`flex flex-wrap gap-1 justify-end`,children:Object.entries(k.capabilities).filter(([,e])=>!!e).map(([e])=>(0,v.jsx)(u,{variant:`outline`,className:`text-[10px] px-1.5 py-0`,children:e},e))})]})}),(0,v.jsxs)(m,{className:`px-4 pb-4 space-y-3`,children:[(0,v.jsxs)(`div`,{className:`grid grid-cols-2 md:grid-cols-5 gap-2`,children:[(0,v.jsx)(D,{label:`total`,value:O?.total??E}),(0,v.jsx)(D,{label:`project`,value:O?.byType?.project??0}),(0,v.jsx)(D,{label:`task`,value:O?.byType?.task??0}),(0,v.jsx)(D,{label:`agent`,value:O?.byType?.agent??0}),(0,v.jsx)(D,{label:`sensitive`,value:(O?.bySensitivity?.sensitive??0)+(O?.bySensitivity?.secret??0)})]}),(0,v.jsx)(`div`,{className:`font-mono text-xs text-muted-foreground truncate`,title:$,children:$})]})]}),(0,v.jsxs)(g,{children:[(0,v.jsx)(h,{className:`py-3 px-4`,children:(0,v.jsx)(p,{className:`text-sm font-medium`,children:`Inject`})}),(0,v.jsxs)(m,{className:`px-4 pb-4 space-y-2`,children:[(0,v.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-2`,children:[(0,v.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:H,onChange:e=>U(e.target.value),children:[(0,v.jsx)(`option`,{value:``,children:`Agent`}),J.map(e=>(0,v.jsx)(`option`,{value:e.id,children:ae(e)},e.id))]}),(0,v.jsx)(f,{value:W,onChange:e=>_e(e.target.value),placeholder:`reason`}),(0,v.jsx)(f,{value:G,onChange:e=>ve(e.target.value),inputMode:`numeric`,placeholder:`tokens`}),(0,v.jsx)(f,{value:K,onChange:e=>ye(e.target.value),inputMode:`numeric`,placeholder:`memories`})]}),(0,v.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,v.jsxs)(d,{size:`sm`,className:`gap-1.5`,disabled:!H||!L,onClick:()=>L&&Q([L.id]),children:[(0,v.jsx)(r,{className:`w-3.5 h-3.5`}),`Selected`]}),(0,v.jsxs)(d,{size:`sm`,variant:`outline`,className:`gap-1.5`,disabled:!H,onClick:()=>Q(),children:[(0,v.jsx)(n,{className:`w-3.5 h-3.5`}),`Filtered`]}),q&&(0,v.jsx)(u,{variant:`outline`,className:`font-mono text-[10px]`,children:q})]})]})]})]}),(0,v.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(0,1fr)_420px]`,children:[(0,v.jsxs)(`div`,{className:`space-y-3`,children:[(0,v.jsx)(g,{children:(0,v.jsx)(m,{className:`p-3`,children:(0,v.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-6 gap-2`,children:[(0,v.jsx)(f,{className:`lg:col-span-2`,value:A.search,onChange:e=>X({search:e.target.value}),placeholder:`Search visible memories`}),(0,v.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:A.type,onChange:e=>X({type:e.target.value}),children:[(0,v.jsx)(`option`,{value:``,children:`All types`}),y.map(e=>(0,v.jsx)(`option`,{value:e,children:e},e))]}),(0,v.jsx)(f,{value:A.scope,onChange:e=>X({scope:e.target.value}),placeholder:`scope`}),(0,v.jsx)(f,{value:A.tags,onChange:e=>X({tags:e.target.value}),placeholder:`tags`}),(0,v.jsxs)(`div`,{className:`flex gap-2`,children:[(0,v.jsx)(f,{value:A.minRelevance,onChange:e=>X({minRelevance:e.target.value}),placeholder:`score`}),(0,v.jsx)(d,{size:`sm`,variant:`outline`,className:`h-8 px-2`,onClick:()=>ge(),children:(0,v.jsx)(n,{className:`w-4 h-4`})})]})]})})}),(0,v.jsx)(ce,{className:`h-[calc(100dvh-24rem)] min-h-[360px]`,children:(0,v.jsxs)(`div`,{className:`space-y-2 pr-2`,children:[Y.length===0&&(0,v.jsx)(`div`,{className:`text-center text-sm text-muted-foreground py-16`,children:`No memories`}),Y.map(t=>(0,v.jsx)(me,{memory:t,selected:t.id===j,now:e,onSelect:()=>M({selectedMemoryId:t.id})},t.id))]})})]}),(0,v.jsxs)(g,{children:[(0,v.jsx)(h,{className:`py-3 px-4`,children:(0,v.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,v.jsx)(p,{className:`text-sm font-medium`,children:R===`edit`?`Edit Memory`:`New Memory`}),(0,v.jsxs)(`div`,{className:`flex gap-1`,children:[(0,v.jsx)(d,{size:`sm`,variant:`ghost`,className:`h-7 px-2`,onClick:xe,title:`New memory`,children:(0,v.jsx)(ee,{className:`w-3.5 h-3.5`})}),(0,v.jsx)(d,{size:`sm`,variant:`ghost`,className:`h-7 px-2`,onClick:Se,disabled:!L,title:`Edit selected`,children:(0,v.jsx)(t,{className:`w-3.5 h-3.5`})}),(0,v.jsx)(d,{size:`sm`,variant:`ghost`,className:`h-7 px-2 text-red-400 hover:text-red-300`,disabled:!L,onClick:()=>L&&F(L.id),title:`Delete selected`,children:(0,v.jsx)(ne,{className:`w-3.5 h-3.5`})})]})]})}),(0,v.jsxs)(m,{className:`px-4 pb-4 space-y-3`,children:[L&&(0,v.jsxs)(v.Fragment,{children:[(0,v.jsxs)(`div`,{className:`space-y-2`,children:[(0,v.jsxs)(`div`,{className:`flex flex-wrap gap-1`,children:[(0,v.jsx)(u,{variant:`secondary`,children:L.type}),(0,v.jsx)(u,{variant:`outline`,children:L.scope}),(0,v.jsx)(u,{className:w(L.sensitivity),children:L.sensitivity}),(0,v.jsx)(u,{variant:`outline`,className:T(L.relevanceScore),children:L.relevanceScore.toFixed(2)})]}),(0,v.jsxs)(`div`,{className:`text-xs text-muted-foreground`,title:l(L.updatedAt),children:[`updated `,c(e,L.updatedAt)]}),(0,v.jsx)(`p`,{className:`text-sm font-medium`,children:L.title}),(0,v.jsx)(`p`,{className:`text-xs text-muted-foreground whitespace-pre-wrap max-h-24 overflow-auto`,children:L.content})]}),(0,v.jsx)(oe,{})]}),(0,v.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,v.jsx)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,disabled:R===`edit`,value:B.type,onChange:e=>V({...B,type:e.target.value}),children:y.map(e=>(0,v.jsx)(`option`,{value:e,children:e},e))}),(0,v.jsx)(f,{disabled:R===`edit`,value:B.scope,onChange:e=>V({...B,scope:e.target.value}),placeholder:`scope`}),(0,v.jsx)(f,{className:`col-span-2`,value:B.title,onChange:e=>V({...B,title:e.target.value}),placeholder:`title`}),(0,v.jsx)(se,{className:`col-span-2 min-h-32`,value:B.content,onChange:e=>V({...B,content:e.target.value}),placeholder:`content`}),(0,v.jsx)(f,{className:`col-span-2`,value:B.tags,onChange:e=>V({...B,tags:e.target.value}),placeholder:`tags`}),(0,v.jsx)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:B.visibility,onChange:e=>V({...B,visibility:e.target.value}),children:le.map(e=>(0,v.jsx)(`option`,{value:e,children:e},e))}),(0,v.jsx)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:B.sensitivity,onChange:e=>V({...B,sensitivity:e.target.value}),children:ue.map(e=>(0,v.jsx)(`option`,{value:e,children:e},e))}),(0,v.jsx)(`select`,{className:`rounded-md border border-input bg-background px-2 py-1.5 text-sm`,value:B.confidence,onChange:e=>V({...B,confidence:e.target.value}),children:b.map(e=>(0,v.jsx)(`option`,{value:e,children:e},e))}),(0,v.jsx)(f,{value:B.relevanceScore,onChange:e=>V({...B,relevanceScore:e.target.value}),inputMode:`decimal`,placeholder:`score`})]}),(0,v.jsx)(d,{size:`sm`,className:`w-full`,disabled:!Ce,onClick:Z,children:R===`edit`?`Save memory`:`Create memory`})]})]})]})]})}function D({label:e,value:t}){return(0,v.jsxs)(`div`,{className:`rounded-md border border-border bg-muted/20 px-3 py-2`,children:[(0,v.jsx)(`div`,{className:`text-lg font-semibold tabular-nums`,children:t}),(0,v.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:e})]})}function me({memory:e,selected:t,now:n,onSelect:r}){return(0,v.jsx)(`button`,{onClick:r,className:`w-full text-left rounded-md border p-3 transition-colors ${t?`border-primary bg-primary/5`:`border-border bg-card hover:border-zinc-600`}`,children:(0,v.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,v.jsxs)(`div`,{className:`min-w-0`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-1.5 flex-wrap`,children:[(0,v.jsx)(u,{variant:`secondary`,className:`text-[10px]`,children:e.type}),(0,v.jsx)(u,{variant:`outline`,className:`text-[10px] font-mono`,children:e.scope}),(0,v.jsx)(u,{className:`text-[10px] ${w(e.sensitivity)}`,children:e.sensitivity})]}),(0,v.jsx)(`div`,{className:`font-medium text-sm mt-2 truncate`,children:e.title}),(0,v.jsx)(`div`,{className:`text-xs text-muted-foreground line-clamp-2 mt-1`,children:e.content}),e.tags.length>0&&(0,v.jsx)(`div`,{className:`flex gap-1 flex-wrap mt-2`,children:e.tags.slice(0,8).map(e=>(0,v.jsxs)(u,{variant:`outline`,className:`text-[10px] text-zinc-400`,children:[`#`,e]},e))})]}),(0,v.jsxs)(`div`,{className:`text-right shrink-0 space-y-1`,children:[(0,v.jsx)(`div`,{className:`text-sm font-semibold tabular-nums ${T(e.relevanceScore)}`,children:e.relevanceScore.toFixed(2)}),(0,v.jsx)(`div`,{className:`text-[10px] text-muted-foreground`,title:l(e.updatedAt),children:c(n,e.updatedAt)}),e.accessCount>0&&(0,v.jsxs)(`div`,{className:`text-[10px] text-muted-foreground`,children:[e.accessCount,` hits`]})]})]})})}export{E as MemoryView};
2
- //# sourceMappingURL=memory-CMdemdtb.js.map
@@ -1,10 +0,0 @@
1
- import{r as e}from"./chunk-CilyBKbf.js";import{Mn as t,O as n,Un as r,c as i,fn as a,g as o,h as s,jn as c,vt as l,wt as u}from"./lucide-react-ChOGD4vc.js";import{c as d,t as f,u as p}from"./store-BLZA3u7Y.js";import{a as m,i as h,n as g,r as _,t as v}from"./select-B6iG4oYX.js";import{t as y}from"./button-BwqJZS4O.js";import{t as b}from"./input-YoPXrp72.js";import{N as x,r as S}from"./index-D--CyG66.js";var C=e(r(),1),w=c(),T=[`claude`,`codex`];function E(){let[e,r]=(0,C.useState)({}),[i,a]=(0,C.useState)(`claude`),[c,l]=(0,C.useState)(``);(0,C.useEffect)(()=>{t(`GET`,`/providers/config`).then(r).catch(e=>l(e.message))},[]);let u=e[i],d=t=>{u&&r({...e,[i]:{...u,...t}})};async function f(){if(!u)return;let n=await t(`PUT`,`/providers/${i}/config`,u);r({...e,[i]:n}),l(`${i} saved`)}async function p(){let e=await t(`POST`,`/providers/${i}/config/test`);l(e.ok?`${i} command: ${e.path||`found`}`:e.error||`command not found`)}return(0,w.jsxs)(`div`,{className:`space-y-4`,children:[(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h1`,{className:`text-xl font-semibold`,children:`Settings`}),(0,w.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Provider runner configuration`})]}),(0,w.jsx)(`div`,{className:`flex gap-2`,children:T.map(e=>(0,w.jsxs)(y,{variant:i===e?`default`:`outline`,onClick:()=>a(e),children:[(0,w.jsx)(o,{className:`w-4 h-4`}),e]},e))})]}),u&&(0,w.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]`,children:[(0,w.jsxs)(`section`,{className:`space-y-3`,children:[(0,w.jsx)(P,{label:`Command`,children:(0,w.jsx)(b,{value:u.command,onChange:e=>d({command:e.target.value})})}),(0,w.jsx)(P,{label:`Default arguments`,children:(0,w.jsx)(S,{rows:3,value:u.defaultArgs.join(`
2
- `),onChange:e=>d({defaultArgs:F(e.target.value)})})}),(0,w.jsx)(P,{label:`Plugin directories`,children:(0,w.jsx)(S,{rows:3,value:u.pluginDirs.join(`
3
- `),onChange:e=>d({pluginDirs:F(e.target.value)})})}),(0,w.jsx)(P,{label:`Environment`,children:(0,w.jsx)(S,{rows:5,value:I(u.env),onChange:e=>d({env:L(e.target.value)})})})]}),(0,w.jsxs)(`section`,{className:`space-y-3`,children:[(0,w.jsx)(P,{label:`Capabilities`,children:(0,w.jsx)(S,{rows:3,value:u.defaultCapabilities.join(`
4
- `),onChange:e=>d({defaultCapabilities:F(e.target.value)})})}),(0,w.jsx)(P,{label:`Tags`,children:(0,w.jsx)(S,{rows:3,value:u.defaultTags.join(`
5
- `),onChange:e=>d({defaultTags:F(e.target.value)})})}),(0,w.jsx)(P,{label:`Approval mode`,children:(0,w.jsx)(b,{value:u.defaultApprovalMode,onChange:e=>d({defaultApprovalMode:e.target.value})})}),(0,w.jsx)(P,{label:`Chat capture mode`,children:(0,w.jsxs)(v,{value:u.chatCaptureMode??`final`,onValueChange:e=>d({chatCaptureMode:e}),children:[(0,w.jsx)(h,{children:(0,w.jsx)(m,{})}),(0,w.jsxs)(g,{children:[(0,w.jsx)(_,{value:`final`,children:`Final response only`}),(0,w.jsx)(_,{value:`full`,children:`Full turn (intermediate messages)`})]})]})}),(0,w.jsx)(P,{label:`tmux prefix`,children:(0,w.jsx)(b,{value:u.headless.tmuxPrefix,onChange:e=>d({headless:{...u.headless,tmuxPrefix:e.target.value}})})}),(0,w.jsx)(P,{label:`Shutdown timeout`,children:(0,w.jsx)(b,{type:`number`,value:u.headless.shutdownTimeoutMs,onChange:e=>d({headless:{...u.headless,shutdownTimeoutMs:Number(e.target.value)||1e4}})})}),(0,w.jsxs)(`div`,{className:`flex gap-2 pt-2`,children:[(0,w.jsxs)(y,{onClick:f,children:[(0,w.jsx)(n,{className:`w-4 h-4`}),`Save`]}),(0,w.jsxs)(y,{variant:`outline`,onClick:p,children:[(0,w.jsx)(s,{className:`w-4 h-4`}),`Test`]})]}),c&&(0,w.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:c})]})]}),(0,w.jsx)(k,{}),(0,w.jsx)(O,{}),(0,w.jsx)(N,{}),(0,w.jsx)(A,{})]})}var D={symlinkPaths:[]};function O(){let[e,r]=(0,C.useState)(D),[i,a]=(0,C.useState)(``);(0,C.useEffect)(()=>{t(`GET`,`/workspace-config`).then(e=>r({...D,...e.value})).catch(e=>a(e.message))},[]);async function o(){try{let n=await t(`PUT`,`/workspace-config`,e);r({...D,...n.value}),a(`Workspace config saved`)}catch(e){a(e.message)}}return(0,w.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,w.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,w.jsx)(u,{className:`w-4 h-4`}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Isolated worktree symlinks`}),(0,w.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Untracked files or filename patterns symlinked from main into each isolated worktree (the "Workspace" spawn option), one per line. Plain names like `,(0,w.jsx)(`code`,{children:`AGENTS.md`}),` or `,(0,w.jsx)(`code`,{children:`.claude-rig`}),` match files and directories; entries with `,(0,w.jsxs)(`code`,{children:[`*?[]`,`{}`]}),` are expanded as globs. A path is only linked if it exists in main.`]})]})]}),(0,w.jsx)(P,{label:`Paths / patterns`,children:(0,w.jsx)(S,{rows:5,placeholder:`AGENTS.md
6
- .claude-rig`,value:e.symlinkPaths.join(`
7
- `),onChange:t=>r({...e,symlinkPaths:F(t.target.value)})})}),(0,w.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,w.jsxs)(y,{onClick:o,children:[(0,w.jsx)(n,{className:`w-4 h-4`}),`Save`]}),i&&(0,w.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:i})]})]})}function k(){let e=f(e=>e.showReasoning),t=f(e=>e.set);return(0,w.jsx)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,w.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,w.jsx)(a,{className:`w-4 h-4`}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Show reasoning details`}),(0,w.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Show the agent's internal thinking inline in chat, alongside its narration and tool steps. Off by default — narration is always shown either way.`})]})]}),(0,w.jsx)(x,{checked:e,onCheckedChange:e=>t({showReasoning:e})})]})})}function A(){let e=f(e=>e.voiceTtsEnabled),t=f(e=>e.setVoiceTtsEnabled),n=f(e=>e.voiceTtsMode),r=f(e=>e.setVoiceTtsMode),a=f(e=>e.voiceTtsKokoroVoice),o=f(e=>e.setVoiceTtsKokoroVoice),s=f(e=>e.voiceTtsBrowserVoice),c=f(e=>e.setVoiceTtsBrowserVoice),l=f(e=>e.voiceInputMode),u=f(e=>e.setVoiceInputMode),[y,b]=(0,C.useState)(()=>p());(0,C.useEffect)(()=>{if(typeof window>`u`||!(`speechSynthesis`in window))return;let e=()=>b(p());return e(),window.speechSynthesis.addEventListener?.(`voiceschanged`,e),()=>window.speechSynthesis.removeEventListener?.(`voiceschanged`,e)},[]);let S=d.some(e=>e.id===a)?d:[...d,{id:a,label:a}];return(0,w.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,w.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,w.jsx)(i,{className:`w-4 h-4`}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Voice`}),(0,w.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Speak agent responses aloud in the active chat, and how push-to-talk behaves.`})]})]}),(0,w.jsx)(x,{checked:e,onCheckedChange:t})]}),(0,w.jsx)(P,{label:`Speech engine`,children:(0,w.jsxs)(v,{value:n,onValueChange:e=>r(e),children:[(0,w.jsx)(h,{children:(0,w.jsx)(m,{})}),(0,w.jsxs)(g,{children:[(0,w.jsx)(_,{value:`kokoro`,children:`Kokoro (server, natural — falls back to browser)`}),(0,w.jsx)(_,{value:`browser`,children:`Browser (Web Speech API)`})]})]})}),(0,w.jsx)(P,{label:`Kokoro voice`,children:(0,w.jsxs)(v,{value:a,onValueChange:o,children:[(0,w.jsx)(h,{children:(0,w.jsx)(m,{})}),(0,w.jsx)(g,{children:S.map(e=>(0,w.jsx)(_,{value:e.id,children:e.label},e.id))})]})}),(0,w.jsx)(P,{label:`Browser voice`,children:(0,w.jsxs)(v,{value:s||`__default__`,onValueChange:e=>c(e===`__default__`?``:e),children:[(0,w.jsx)(h,{children:(0,w.jsx)(m,{})}),(0,w.jsxs)(g,{children:[(0,w.jsx)(_,{value:`__default__`,children:`System default`}),y.map(e=>(0,w.jsx)(_,{value:e.uri,children:e.label},e.uri))]})]})}),(0,w.jsx)(P,{label:`Push-to-talk input`,children:(0,w.jsxs)(v,{value:l,onValueChange:e=>u(e),children:[(0,w.jsx)(h,{children:(0,w.jsx)(m,{})}),(0,w.jsxs)(g,{children:[(0,w.jsx)(_,{value:`compose`,children:`Fill the message box (review, then Enter)`}),(0,w.jsx)(_,{value:`autosend`,children:`Send immediately (speak-and-send)`})]})]})})]})}var j=[`low`,`medium`,`high`,`xhigh`,`max`],M={enabled:!1,provider:`claude`,permissionMode:`open`,keepaliveSeconds:300};function N(){let[e,r]=(0,C.useState)(M),[i,a]=(0,C.useState)(``);(0,C.useEffect)(()=>{t(`GET`,`/steward-config`).then(e=>r({...M,...e.value})).catch(e=>a(e.message))},[]);let o=e=>r(t=>({...t,...e}));async function s(){try{let n=await t(`PUT`,`/steward-config`,e);r({...M,...n.value}),a(`Steward config saved`)}catch(e){a(e.message)}}return(0,w.jsxs)(`section`,{className:`space-y-3 rounded-lg border p-4`,children:[(0,w.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,w.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,w.jsx)(l,{className:`w-4 h-4`}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`h2`,{className:`text-sm font-semibold`,children:`Stewards`}),(0,w.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Auto-resolve merge conflicts & diverged branches across all repos. Provider-independent — applies to every repo's steward.`})]})]}),(0,w.jsx)(x,{checked:e.enabled,onCheckedChange:e=>o({enabled:e})})]}),(0,w.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,w.jsx)(P,{label:`Provider`,children:(0,w.jsxs)(v,{value:e.provider,onValueChange:e=>o({provider:e}),children:[(0,w.jsx)(h,{children:(0,w.jsx)(m,{})}),(0,w.jsx)(g,{children:T.map(e=>(0,w.jsx)(_,{value:e,children:e},e))})]})}),(0,w.jsx)(P,{label:`Model (optional)`,children:(0,w.jsx)(b,{value:e.model??``,placeholder:`e.g. gpt-5.5`,onChange:e=>o({model:e.target.value.trim()||void 0})})}),(0,w.jsx)(P,{label:`Effort`,children:(0,w.jsxs)(v,{value:e.effort??`default`,onValueChange:e=>o({effort:e===`default`?void 0:e}),children:[(0,w.jsx)(h,{children:(0,w.jsx)(m,{})}),(0,w.jsxs)(g,{children:[(0,w.jsx)(_,{value:`default`,children:`Provider default`}),j.map(e=>(0,w.jsx)(_,{value:e,children:e},e))]})]})}),(0,w.jsx)(P,{label:`Idle timeout (seconds)`,children:(0,w.jsx)(b,{type:`number`,value:e.keepaliveSeconds,onChange:e=>o({keepaliveSeconds:Number(e.target.value)||300})})})]}),(0,w.jsxs)(`div`,{className:`flex items-center gap-2 pt-1`,children:[(0,w.jsxs)(y,{onClick:s,children:[(0,w.jsx)(n,{className:`w-4 h-4`}),`Save`]}),i&&(0,w.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:i})]})]})}function P({label:e,children:t}){return(0,w.jsxs)(`label`,{className:`block space-y-1.5 text-sm`,children:[(0,w.jsx)(`span`,{className:`text-muted-foreground`,children:e}),t]})}function F(e){return e.split(`
8
- `).map(e=>e.trim()).filter(Boolean)}function I(e){return Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
9
- `)}function L(e){return Object.fromEntries(F(e).map(e=>{let t=e.indexOf(`=`);return t>=0?[e.slice(0,t).trim(),e.slice(t+1)]:[e,``]}))}export{E as SettingsView};
10
- //# sourceMappingURL=settings-vSYPv8kE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-vSYPv8kE.js","names":[],"sources":["../../dashboard/src/components/views/settings.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport { api } from '@/lib/api'\nimport { useRelayStore } from '@/store'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Textarea } from '@/components/ui/textarea'\nimport { Switch } from '@/components/ui/switch'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { KOKORO_VOICES, availableSpeechVoices } from '@/lib/voice'\nimport { Brain, FolderSymlink, GitMerge, Save, Terminal, TestTube2, Volume2 } from 'lucide-react'\n\ntype ProviderName = 'claude' | 'codex'\n\ninterface ProviderConfig {\n command: string\n defaultArgs: string[]\n env: Record<string, string>\n pluginDirs: string[]\n defaultCapabilities: string[]\n defaultApprovalMode: string\n defaultTags: string[]\n chatCaptureMode: 'final' | 'full'\n headless: {\n tmuxPrefix: string\n shutdownTimeoutMs: number\n }\n}\n\nconst providers: ProviderName[] = ['claude', 'codex']\n\nexport function SettingsView() {\n const [configs, setConfigs] = useState<Record<string, ProviderConfig>>({})\n const [selected, setSelected] = useState<ProviderName>('claude')\n const [status, setStatus] = useState('')\n\n useEffect(() => {\n api<Record<string, ProviderConfig>>('GET', '/providers/config')\n .then(setConfigs)\n .catch((e) => setStatus((e as Error).message))\n }, [])\n\n const config = configs[selected]\n const update = (patch: Partial<ProviderConfig>) => {\n if (!config) return\n setConfigs({ ...configs, [selected]: { ...config, ...patch } })\n }\n\n async function save() {\n if (!config) return\n const saved = await api<ProviderConfig>('PUT', `/providers/${selected}/config`, config)\n setConfigs({ ...configs, [selected]: saved })\n setStatus(`${selected} saved`)\n }\n\n async function test() {\n const result = await api<{ ok: boolean; path?: string; error?: string }>('POST', `/providers/${selected}/config/test`)\n setStatus(result.ok ? `${selected} command: ${result.path || 'found'}` : result.error || 'command not found')\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-xl font-semibold\">Settings</h1>\n <p className=\"text-sm text-muted-foreground\">Provider runner configuration</p>\n </div>\n <div className=\"flex gap-2\">\n {providers.map((provider) => (\n <Button key={provider} variant={selected === provider ? 'default' : 'outline'} onClick={() => setSelected(provider)}>\n <Terminal className=\"w-4 h-4\" />{provider}\n </Button>\n ))}\n </div>\n </div>\n\n {config && (\n <div className=\"grid gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]\">\n <section className=\"space-y-3\">\n <Field label=\"Command\">\n <Input value={config.command} onChange={(e) => update({ command: e.target.value })} />\n </Field>\n <Field label=\"Default arguments\">\n <Textarea rows={3} value={config.defaultArgs.join('\\n')} onChange={(e) => update({ defaultArgs: lines(e.target.value) })} />\n </Field>\n <Field label=\"Plugin directories\">\n <Textarea rows={3} value={config.pluginDirs.join('\\n')} onChange={(e) => update({ pluginDirs: lines(e.target.value) })} />\n </Field>\n <Field label=\"Environment\">\n <Textarea rows={5} value={recordLines(config.env)} onChange={(e) => update({ env: parseRecordLines(e.target.value) })} />\n </Field>\n </section>\n\n <section className=\"space-y-3\">\n <Field label=\"Capabilities\">\n <Textarea rows={3} value={config.defaultCapabilities.join('\\n')} onChange={(e) => update({ defaultCapabilities: lines(e.target.value) })} />\n </Field>\n <Field label=\"Tags\">\n <Textarea rows={3} value={config.defaultTags.join('\\n')} onChange={(e) => update({ defaultTags: lines(e.target.value) })} />\n </Field>\n <Field label=\"Approval mode\">\n <Input value={config.defaultApprovalMode} onChange={(e) => update({ defaultApprovalMode: e.target.value })} />\n </Field>\n <Field label=\"Chat capture mode\">\n <Select value={config.chatCaptureMode ?? 'final'} onValueChange={(v) => update({ chatCaptureMode: v as 'final' | 'full' })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"final\">Final response only</SelectItem>\n <SelectItem value=\"full\">Full turn (intermediate messages)</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"tmux prefix\">\n <Input value={config.headless.tmuxPrefix} onChange={(e) => update({ headless: { ...config.headless, tmuxPrefix: e.target.value } })} />\n </Field>\n <Field label=\"Shutdown timeout\">\n <Input type=\"number\" value={config.headless.shutdownTimeoutMs} onChange={(e) => update({ headless: { ...config.headless, shutdownTimeoutMs: Number(e.target.value) || 10000 } })} />\n </Field>\n <div className=\"flex gap-2 pt-2\">\n <Button onClick={save}><Save className=\"w-4 h-4\" />Save</Button>\n <Button variant=\"outline\" onClick={test}><TestTube2 className=\"w-4 h-4\" />Test</Button>\n </div>\n {status && <p className=\"text-sm text-muted-foreground\">{status}</p>}\n </section>\n </div>\n )}\n\n <ChatDisplaySettings />\n\n <WorkspaceSettings />\n\n <StewardSettings />\n\n <VoiceSettings />\n </div>\n )\n}\n\ninterface WorkspaceConfig {\n symlinkPaths: string[]\n}\n\nconst DEFAULT_WORKSPACE: WorkspaceConfig = { symlinkPaths: [] }\n\n// Global isolated-worktree provisioning (#159 follow-up). A fresh git worktree only has\n// git-tracked files; node_modules are symlinked automatically and these extra untracked\n// paths are too. Only links what actually exists in main — missing entries are ignored.\nfunction WorkspaceSettings() {\n const [config, setConfig] = useState<WorkspaceConfig>(DEFAULT_WORKSPACE)\n const [status, setStatus] = useState('')\n\n useEffect(() => {\n api<{ value: WorkspaceConfig }>('GET', '/workspace-config')\n .then((entry) => setConfig({ ...DEFAULT_WORKSPACE, ...entry.value }))\n .catch((e) => setStatus((e as Error).message))\n }, [])\n\n async function save() {\n try {\n const saved = await api<{ value: WorkspaceConfig }>('PUT', '/workspace-config', config)\n setConfig({ ...DEFAULT_WORKSPACE, ...saved.value })\n setStatus('Workspace config saved')\n } catch (e) {\n setStatus((e as Error).message)\n }\n }\n\n return (\n <section className=\"space-y-3 rounded-lg border p-4\">\n <div className=\"flex items-center gap-2\">\n <FolderSymlink className=\"w-4 h-4\" />\n <div>\n <h2 className=\"text-sm font-semibold\">Isolated worktree symlinks</h2>\n <p className=\"text-xs text-muted-foreground\">\n Untracked files or filename patterns symlinked from main into each isolated worktree (the &quot;Workspace&quot; spawn option), one per line. Plain names like <code>AGENTS.md</code> or <code>.claude-rig</code> match files and directories; entries with <code>*?[]{'{}'}</code> are expanded as globs. A path is only linked if it exists in main.\n </p>\n </div>\n </div>\n <Field label=\"Paths / patterns\">\n <Textarea\n rows={5}\n placeholder={'AGENTS.md\\n.claude-rig'}\n value={config.symlinkPaths.join('\\n')}\n onChange={(e) => setConfig({ ...config, symlinkPaths: lines(e.target.value) })}\n />\n </Field>\n <div className=\"flex items-center gap-2 pt-1\">\n <Button onClick={save}><Save className=\"w-4 h-4\" />Save</Button>\n {status && <p className=\"text-sm text-muted-foreground\">{status}</p>}\n </div>\n </section>\n )\n}\n\n// Chat display: per-viewer rendering preferences for the Chat panel. These are\n// client-side (persisted in the browser), not provider config — toggling is instant\n// and retroactive. Reasoning steps are still captured by the runner; this only\n// controls whether they're shown. The agent's narration (the terminal's `●` lines)\n// is always shown.\nfunction ChatDisplaySettings() {\n const showReasoning = useRelayStore((s) => s.showReasoning)\n const set = useRelayStore((s) => s.set)\n return (\n <section className=\"space-y-3 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <Brain className=\"w-4 h-4\" />\n <div>\n <h2 className=\"text-sm font-semibold\">Show reasoning details</h2>\n <p className=\"text-xs text-muted-foreground\">Show the agent&apos;s internal thinking inline in chat, alongside its narration and tool steps. Off by default — narration is always shown either way.</p>\n </div>\n </div>\n <Switch checked={showReasoning} onCheckedChange={(v) => set({ showReasoning: v })} />\n </div>\n </section>\n )\n}\n\n// Voice settings: TTS output (speak agent responses — engine + per-engine voice)\n// and the push-to-talk mic-input behaviour. TTS config used to live inline in the\n// chat header; it moved here to declutter the header (especially on mobile). The\n// header keeps only the speaker on/off toggle for quick muting.\nfunction VoiceSettings() {\n const voiceTtsEnabled = useRelayStore((s) => s.voiceTtsEnabled)\n const setVoiceTtsEnabled = useRelayStore((s) => s.setVoiceTtsEnabled)\n const voiceTtsMode = useRelayStore((s) => s.voiceTtsMode)\n const setVoiceTtsMode = useRelayStore((s) => s.setVoiceTtsMode)\n const voiceTtsKokoroVoice = useRelayStore((s) => s.voiceTtsKokoroVoice)\n const setVoiceTtsKokoroVoice = useRelayStore((s) => s.setVoiceTtsKokoroVoice)\n const voiceTtsBrowserVoice = useRelayStore((s) => s.voiceTtsBrowserVoice)\n const setVoiceTtsBrowserVoice = useRelayStore((s) => s.setVoiceTtsBrowserVoice)\n const voiceInputMode = useRelayStore((s) => s.voiceInputMode)\n const setVoiceInputMode = useRelayStore((s) => s.setVoiceInputMode)\n\n // External sync: the browser loads its speech voices asynchronously, so\n // re-read them when the engine signals the list changed.\n const [browserVoices, setBrowserVoices] = useState(() => availableSpeechVoices())\n useEffect(() => {\n if (typeof window === 'undefined' || !('speechSynthesis' in window)) return\n const refresh = () => setBrowserVoices(availableSpeechVoices())\n refresh()\n window.speechSynthesis.addEventListener?.('voiceschanged', refresh)\n return () => window.speechSynthesis.removeEventListener?.('voiceschanged', refresh)\n }, [])\n\n const kokoroOptions = KOKORO_VOICES.some((v) => v.id === voiceTtsKokoroVoice)\n ? KOKORO_VOICES\n : [...KOKORO_VOICES, { id: voiceTtsKokoroVoice, label: voiceTtsKokoroVoice }]\n\n return (\n <section className=\"space-y-3 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <Volume2 className=\"w-4 h-4\" />\n <div>\n <h2 className=\"text-sm font-semibold\">Voice</h2>\n <p className=\"text-xs text-muted-foreground\">Speak agent responses aloud in the active chat, and how push-to-talk behaves.</p>\n </div>\n </div>\n <Switch checked={voiceTtsEnabled} onCheckedChange={setVoiceTtsEnabled} />\n </div>\n <Field label=\"Speech engine\">\n <Select value={voiceTtsMode} onValueChange={(v) => setVoiceTtsMode(v as 'kokoro' | 'browser')}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"kokoro\">Kokoro (server, natural — falls back to browser)</SelectItem>\n <SelectItem value=\"browser\">Browser (Web Speech API)</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Kokoro voice\">\n <Select value={voiceTtsKokoroVoice} onValueChange={setVoiceTtsKokoroVoice}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {kokoroOptions.map((v) => <SelectItem key={v.id} value={v.id}>{v.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Browser voice\">\n <Select value={voiceTtsBrowserVoice || '__default__'} onValueChange={(v) => setVoiceTtsBrowserVoice(v === '__default__' ? '' : v)}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__default__\">System default</SelectItem>\n {browserVoices.map((v) => <SelectItem key={v.uri} value={v.uri}>{v.label}</SelectItem>)}\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Push-to-talk input\">\n <Select value={voiceInputMode} onValueChange={(v) => setVoiceInputMode(v as 'compose' | 'autosend' | 'handsfree')}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"compose\">Fill the message box (review, then Enter)</SelectItem>\n <SelectItem value=\"autosend\">Send immediately (speak-and-send)</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n </section>\n )\n}\n\ninterface StewardConfig {\n enabled: boolean\n provider: ProviderName\n model?: string\n effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max'\n permissionMode: string\n keepaliveSeconds: number\n}\n\nconst EFFORTS = ['low', 'medium', 'high', 'xhigh', 'max'] as const\nconst DEFAULT_STEWARD: StewardConfig = { enabled: false, provider: 'claude', permissionMode: 'open', keepaliveSeconds: 300 }\n\n// Global, provider-independent steward config (issue #167). Stewards are\n// auto-provisioned per repo from these settings to resolve conflicts / diverged\n// bases that can't auto-merge. External system: the /steward-config API.\nfunction StewardSettings() {\n const [config, setConfig] = useState<StewardConfig>(DEFAULT_STEWARD)\n const [status, setStatus] = useState('')\n\n useEffect(() => {\n api<{ value: StewardConfig }>('GET', '/steward-config')\n .then((entry) => setConfig({ ...DEFAULT_STEWARD, ...entry.value }))\n .catch((e) => setStatus((e as Error).message))\n }, [])\n\n const update = (patch: Partial<StewardConfig>) => setConfig((c) => ({ ...c, ...patch }))\n\n async function save() {\n try {\n const saved = await api<{ value: StewardConfig }>('PUT', '/steward-config', config)\n setConfig({ ...DEFAULT_STEWARD, ...saved.value })\n setStatus('Steward config saved')\n } catch (e) {\n setStatus((e as Error).message)\n }\n }\n\n return (\n <section className=\"space-y-3 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <GitMerge className=\"w-4 h-4\" />\n <div>\n <h2 className=\"text-sm font-semibold\">Stewards</h2>\n <p className=\"text-xs text-muted-foreground\">Auto-resolve merge conflicts &amp; diverged branches across all repos. Provider-independent — applies to every repo&apos;s steward.</p>\n </div>\n </div>\n <Switch checked={config.enabled} onCheckedChange={(v) => update({ enabled: v })} />\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <Field label=\"Provider\">\n <Select value={config.provider} onValueChange={(v) => update({ provider: v as ProviderName })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {providers.map((p) => <SelectItem key={p} value={p}>{p}</SelectItem>)}\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Model (optional)\">\n <Input value={config.model ?? ''} placeholder=\"e.g. gpt-5.5\" onChange={(e) => update({ model: e.target.value.trim() || undefined })} />\n </Field>\n <Field label=\"Effort\">\n <Select value={config.effort ?? 'default'} onValueChange={(v) => update({ effort: v === 'default' ? undefined : v as StewardConfig['effort'] })}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"default\">Provider default</SelectItem>\n {EFFORTS.map((e) => <SelectItem key={e} value={e}>{e}</SelectItem>)}\n </SelectContent>\n </Select>\n </Field>\n <Field label=\"Idle timeout (seconds)\">\n <Input type=\"number\" value={config.keepaliveSeconds} onChange={(e) => update({ keepaliveSeconds: Number(e.target.value) || 300 })} />\n </Field>\n </div>\n\n <div className=\"flex items-center gap-2 pt-1\">\n <Button onClick={save}><Save className=\"w-4 h-4\" />Save</Button>\n {status && <p className=\"text-sm text-muted-foreground\">{status}</p>}\n </div>\n </section>\n )\n}\n\nfunction Field({ label, children }: { label: string; children: React.ReactNode }) {\n return <label className=\"block space-y-1.5 text-sm\"><span className=\"text-muted-foreground\">{label}</span>{children}</label>\n}\n\nfunction lines(value: string): string[] {\n return value.split('\\n').map((line) => line.trim()).filter(Boolean)\n}\n\nfunction recordLines(value: Record<string, string>): string {\n return Object.entries(value).map(([key, item]) => `${key}=${item}`).join('\\n')\n}\n\nfunction parseRecordLines(value: string): Record<string, string> {\n return Object.fromEntries(lines(value).map((line) => {\n const idx = line.indexOf('=')\n return idx >= 0 ? [line.slice(0, idx).trim(), line.slice(idx + 1)] : [line, '']\n }))\n}\n"],"mappings":"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"}