@runfusion/fusion 0.56.0 → 0.57.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 (130) hide show
  1. package/dist/bin.js +5871 -4484
  2. package/dist/client/.vite/manifest.json +242 -242
  3. package/dist/client/assets/AgentDetailView-DexqYfz4.js +18 -0
  4. package/dist/client/assets/{AgentPermissionPolicyEditor-CqlLF0pf.js → AgentPermissionPolicyEditor-B65iWSFw.js} +2 -2
  5. package/dist/client/assets/AgentsView-DWBHXG4w.js +24 -0
  6. package/dist/client/assets/ChatView-BaGockES.js +6 -0
  7. package/dist/client/assets/{CommandCenter-BhIfVVjz.js → CommandCenter-DNSpf5Nq.js} +2 -2
  8. package/dist/client/assets/{DevServerView-Bd86MWUa.js → DevServerView-T7YAMRMr.js} +1 -1
  9. package/dist/client/assets/{DirectoryPicker-BDe9G84f.js → DirectoryPicker-p_bMALI6.js} +1 -1
  10. package/dist/client/assets/{DocumentsView-BkAHMt19.js → DocumentsView-CSZ1_bEk.js} +1 -1
  11. package/dist/client/assets/{EvalsView-BxxCVaJ8.js → EvalsView-C03NFn9p.js} +1 -1
  12. package/dist/client/assets/{ExperimentalAgentOnboardingModal-7-BD6W1v.js → ExperimentalAgentOnboardingModal-DaYU4VlV.js} +1 -1
  13. package/dist/client/assets/{GoalsView-B3KICwNu.js → GoalsView-CwXL_l6r.js} +1 -1
  14. package/dist/client/assets/{InsightsView-DO8qefU1.js → InsightsView-D-pumdKK.js} +2 -2
  15. package/dist/client/assets/{MemoryView-urkPdqTn.js → MemoryView--frKZACq.js} +1 -1
  16. package/dist/client/assets/{PiExtensionsManager-BwVKjJIo.js → PiExtensionsManager-HTYWFcsw.js} +2 -2
  17. package/dist/client/assets/PluginManager-47FXVbWv.js +1 -0
  18. package/dist/client/assets/{PluginManager-DSiHizRD.css → PluginManager-Bm9FXhxQ.css} +1 -1
  19. package/dist/client/assets/{PullRequestView-B4q4X5WV.js → PullRequestView-jqo0u_qP.js} +1 -1
  20. package/dist/client/assets/{ResearchView-DlW6z3sm.js → ResearchView-lUFw0eBY.js} +1 -1
  21. package/dist/client/assets/{SecretsView-C-3eC0KB.js → SecretsView-DZ1NCe-c.js} +1 -1
  22. package/dist/client/assets/SessionTerminal-B10eN86g.js +2 -0
  23. package/dist/client/assets/SettingsModal-BIIWHPyY.js +21 -0
  24. package/dist/client/assets/SettingsModal-BqIOpGm9.css +1 -0
  25. package/dist/client/assets/{SettingsModal-BzXctrhu.js → SettingsModal-C3PIQwOw.js} +1 -1
  26. package/dist/client/assets/SettingsModal-D-z02qbd.css +1 -0
  27. package/dist/client/assets/{SetupWizardModal-DDJ8PCkH.js → SetupWizardModal-BtCAK9gq.js} +2 -2
  28. package/dist/client/assets/{ShadcnColorPicker-BcD5fZ_P.js → ShadcnColorPicker-CgbOh2Vh.js} +1 -1
  29. package/dist/client/assets/{SkillsView-DojlvxFh.js → SkillsView-xknpWJDp.js} +1 -1
  30. package/dist/client/assets/{TodoView-BKZ07WxZ.js → TodoView-BOIUCi-b.js} +2 -2
  31. package/dist/client/assets/{WorkflowNodeEditor-BJNbi4_V.js → WorkflowNodeEditor-BoGuTbgL.js} +3 -3
  32. package/dist/client/assets/{agentSkills-NbIIJy87.js → agentSkills-HBp0qQK2.js} +1 -1
  33. package/dist/client/assets/app-CC21pBBX.js +13 -0
  34. package/dist/client/assets/app-D5aQhT6F.js +13 -0
  35. package/dist/client/assets/app-DRTCMx1I.js +13 -0
  36. package/dist/client/assets/{app-CEtD1B9K.js → app-gWIFDNxJ.js} +2 -2
  37. package/dist/client/assets/app-pKygaS_p.js +13 -0
  38. package/dist/client/assets/app-usRdP6KP.js +13 -0
  39. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CJu9RVXs.js → architectureDiagram-3BPJPVTR-DFSc_ojZ.js} +1 -1
  40. package/dist/client/assets/{blockDiagram-GPEHLZMM-crZsLLTq.js → blockDiagram-GPEHLZMM-BeWCvgkB.js} +1 -1
  41. package/dist/client/assets/{c4Diagram-AAUBKEIU-D5mmJKvW.js → c4Diagram-AAUBKEIU-53kLf9YA.js} +1 -1
  42. package/dist/client/assets/channel-DqmRVQcu.js +1 -0
  43. package/dist/client/assets/{chunk-2J33WTMH-BZIDltTX.js → chunk-2J33WTMH-oiPMiLQk.js} +1 -1
  44. package/dist/client/assets/{chunk-4BX2VUAB-ND_SzhUa.js → chunk-4BX2VUAB-DtEYW63S.js} +1 -1
  45. package/dist/client/assets/{chunk-55IACEB6-C3n-Nisk.js → chunk-55IACEB6-CRyY-eBJ.js} +1 -1
  46. package/dist/client/assets/{chunk-727SXJPM-DfiPA7wv.js → chunk-727SXJPM-DpPz5T23.js} +1 -1
  47. package/dist/client/assets/{chunk-AQP2D5EJ-CDE0u57Z.js → chunk-AQP2D5EJ-DsvlwOK0.js} +1 -1
  48. package/dist/client/assets/{chunk-FMBD7UC4-COR53PTE.js → chunk-FMBD7UC4-B4PI9bUA.js} +1 -1
  49. package/dist/client/assets/{chunk-ND2GUHAM-CbcTdl7C.js → chunk-ND2GUHAM-CNvgVhAJ.js} +1 -1
  50. package/dist/client/assets/{chunk-QZHKN3VN-DiB3PReK.js → chunk-QZHKN3VN-PzmFXGK3.js} +1 -1
  51. package/dist/client/assets/classDiagram-4FO5ZUOK-BkGcNuxB.js +1 -0
  52. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BkGcNuxB.js +1 -0
  53. package/dist/client/assets/{cose-bilkent-S5V4N54A-Dg3YVyLX.js → cose-bilkent-S5V4N54A-B2hi4baG.js} +1 -1
  54. package/dist/client/assets/{dagre-BM42HDAG-D2bK3gNb.js → dagre-BM42HDAG-CtfJbsAQ.js} +1 -1
  55. package/dist/client/assets/{dashboard-view-BcbTWSCe.js → dashboard-view-DmxFuwxK.js} +1 -1
  56. package/dist/client/assets/{dashboard-view-t2UfQxck.js → dashboard-view-Y7yFASOR.js} +1 -1
  57. package/dist/client/assets/{diagram-2AECGRRQ-BWT8KaEl.js → diagram-2AECGRRQ-CCNdu-lI.js} +1 -1
  58. package/dist/client/assets/{diagram-5GNKFQAL-DWfJlASD.js → diagram-5GNKFQAL-CRFRDKo6.js} +1 -1
  59. package/dist/client/assets/{diagram-KO2AKTUF-DE3hFbLT.js → diagram-KO2AKTUF-qzA8EYKe.js} +1 -1
  60. package/dist/client/assets/{diagram-LMA3HP47-CYCFeD4B.js → diagram-LMA3HP47-BcVh_7JQ.js} +1 -1
  61. package/dist/client/assets/{diagram-OG6HWLK6-C0C8lEGv.js → diagram-OG6HWLK6-ti62bhwU.js} +1 -1
  62. package/dist/client/assets/{erDiagram-TEJ5UH35-kSo7RjKA.js → erDiagram-TEJ5UH35-R-0m-loG.js} +1 -1
  63. package/dist/client/assets/{flowDiagram-I6XJVG4X-DxRf1SVH.js → flowDiagram-I6XJVG4X-DmchEhZJ.js} +1 -1
  64. package/dist/client/assets/{folder-open-DO1rnCxq.js → folder-open-BnJacMSp.js} +1 -1
  65. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CGtxSeWq.js → ganttDiagram-6RSMTGT7-CRZY8cRF.js} +1 -1
  66. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BNZv_DFY.js → gitGraphDiagram-PVQCEYII-DJ6KnPoF.js} +1 -1
  67. package/dist/client/assets/index-BxaBW271.css +1 -0
  68. package/dist/client/assets/index-C-IxdGPX.js +2526 -0
  69. package/dist/client/assets/{infoDiagram-5YYISTIA-DailohMo.js → infoDiagram-5YYISTIA-BEXH-GHB.js} +1 -1
  70. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-Cy3shDZP.js → ishikawaDiagram-YF4QCWOH-CVuF17Yd.js} +1 -1
  71. package/dist/client/assets/{journeyDiagram-JHISSGLW-B1rU18Qx.js → journeyDiagram-JHISSGLW-CCcBBtY4.js} +1 -1
  72. package/dist/client/assets/{kanban-definition-UN3LZRKU-CRNUDgkO.js → kanban-definition-UN3LZRKU-B5bqvapW.js} +1 -1
  73. package/dist/client/assets/{mermaid.core-Cg0po76i.js → mermaid.core-DfKOBw3p.js} +4 -4
  74. package/dist/client/assets/{mindmap-definition-RKZ34NQL-CEjwlhOe.js → mindmap-definition-RKZ34NQL-D6YDtYgW.js} +1 -1
  75. package/dist/client/assets/{pieDiagram-4H26LBE5-70T-php2.js → pieDiagram-4H26LBE5-BokP1BTt.js} +1 -1
  76. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-ChcpRG7l.js → quadrantDiagram-W4KKPZXB-B9NJMDnf.js} +1 -1
  77. package/dist/client/assets/{requirementDiagram-4Y6WPE33-9Pzb_Cot.js → requirementDiagram-4Y6WPE33-CkVaSHtt.js} +1 -1
  78. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-Bx6DkeKq.js → sankeyDiagram-5OEKKPKP-BoU2JDPH.js} +1 -1
  79. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-emWPkPv7.js → sequenceDiagram-3UESZ5HK-Damqlxg5.js} +1 -1
  80. package/dist/client/assets/{shield-alert-BdAjnDkU.js → shield-alert-BTMxVnOy.js} +1 -1
  81. package/dist/client/assets/{stateDiagram-AJRCARHV-B_X2-VQy.js → stateDiagram-AJRCARHV-BC72nvu_.js} +1 -1
  82. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-DvQssSEq.js → stateDiagram-v2-BHNVJYJU-BSoMYClQ.js} +1 -1
  83. package/dist/client/assets/{timeline-definition-PNZ67QCA-CkyhunuI.js → timeline-definition-PNZ67QCA-DxHz0a6F.js} +1 -1
  84. package/dist/client/assets/{upload-D9-yuO2D.js → upload-1isayrJo.js} +1 -1
  85. package/dist/client/assets/{users-B4aebngl.js → users-C3jhPg5Q.js} +1 -1
  86. package/dist/client/assets/{vennDiagram-CIIHVFJN-8OGD6Vb7.js → vennDiagram-CIIHVFJN-B3nVtXfZ.js} +1 -1
  87. package/dist/client/assets/{wardley-L42UT6IY-MnRFGNPm.js → wardley-L42UT6IY-D-hb-Ks4.js} +1 -1
  88. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BAEzb08c.js → wardleyDiagram-YWT4CUSO-DVqAvZPQ.js} +1 -1
  89. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DUxideKC.js → xychartDiagram-2RQKCTM6-0RALveCq.js} +1 -1
  90. package/dist/client/index.html +2 -2
  91. package/dist/client/version.json +1 -1
  92. package/dist/droid-cli/package.json +1 -1
  93. package/dist/extension.js +2794 -1195
  94. package/dist/pi-claude-cli/package.json +1 -1
  95. package/dist/plugin-sdk/index.d.ts +35 -0
  96. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  97. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  98. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  99. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  100. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  101. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  102. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +21 -8
  103. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  104. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  105. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  106. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  107. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  108. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  109. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  110. package/package.json +1 -1
  111. package/skill/fusion/references/extension-tools.md +4 -2
  112. package/skill/fusion/references/fusion-capabilities.md +2 -2
  113. package/dist/client/assets/AgentDetailView-BPzzEIn1.js +0 -18
  114. package/dist/client/assets/AgentsView-C4uCWzdt.js +0 -24
  115. package/dist/client/assets/ChatView-BGV9F2K0.js +0 -6
  116. package/dist/client/assets/PluginManager-C-OuqDLa.js +0 -1
  117. package/dist/client/assets/SessionTerminal-DVfyVeS2.js +0 -2
  118. package/dist/client/assets/SettingsModal-BC_2Y56_.css +0 -1
  119. package/dist/client/assets/SettingsModal-CaE4JYxi.css +0 -1
  120. package/dist/client/assets/SettingsModal-qs8w3rov.js +0 -21
  121. package/dist/client/assets/app-0jcSCRQr.js +0 -13
  122. package/dist/client/assets/app-BPzPEE6G.js +0 -13
  123. package/dist/client/assets/app-BSZU5Uns.js +0 -13
  124. package/dist/client/assets/app-CVyRSEUX.js +0 -13
  125. package/dist/client/assets/app-DoLz_4Dg.js +0 -13
  126. package/dist/client/assets/channel-Zfk0yRN2.js +0 -1
  127. package/dist/client/assets/classDiagram-4FO5ZUOK-BehQ-wnv.js +0 -1
  128. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BehQ-wnv.js +0 -1
  129. package/dist/client/assets/index-BCf32Sgx.css +0 -1
  130. package/dist/client/assets/index-D7eX7QJk.js +0 -2511
@@ -1,6 +0,0 @@
1
- import{r as s,j as t,b as Ua}from"./vendor-react-SZ_qB27O.js";import{c as Ka,aB as Ze,az as Xe,dO as $s,dP as ts,bW as Tt,dQ as Os,aE as ie,dR as an,dA as bt,dS as Bs,dT as Nt,dU as Ga,dB as cn,dN as gt,dV as Va,dW as zs,dX as Wa,dY as Xa,dZ as qa,d_ as Qa,aj as ga,d$ as Ya,aA as qn,bD as Hs,e0 as Ja,e1 as Za,e2 as _n,e3 as er,e4 as tr,e5 as nr,e6 as sr,e7 as ar,e8 as rr,f as ln,e9 as or,ea as ir,bq as cr,am as lr,bd as rn,a3 as dr,c2 as ur,eb as mr,i as hr,ec as pa,ed as fr,dy as gr,W as pr,ee as br,ef as Us,G as vr,H as yr,dv as $n,bw as Qn,o as Yt,I as On,P as mt,V as wr,bu as Ks,dl as Gs,dk as xr,X as Cr,aL as Sr,J as Bn,bQ as Mr,eg as zn,eh as Vs,ei as Hn,ej as Ws,ek as kr,bO as Xs,bR as Rr}from"./index-D7eX7QJk.js";import{u as et}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as qs}from"./SessionTerminal-DVfyVeS2.js";import"./vendor-reactflow-CnI7NMXG.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";import"./shield-alert-BdAjnDkU.js";/**
2
- * @license lucide-react v1.7.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const Ar=[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]],ba=Ka("hash",Ar);function Qs(n){const{sessionId:r,tempUserMessageId:i,initialText:g,initialThinking:c,initialToolCalls:d,setStreamingText:b,setStreamingThinking:p,setStreamingToolCalls:o,cancelStreamingFlushesRef:f,addToast:B,onDone:C,onError:M,onFallbackSession:N}=n;let F=g??"",E=c??"",A=d?[...d]:[],W,k=null,ae=null;const G=()=>{k=null,b(F)},me=()=>{ae=null,p(E)},R=()=>{k!==null&&(cancelAnimationFrame(k),k=null),ae!==null&&(cancelAnimationFrame(ae),ae=null)};return f.current=R,{handlers:{onThinking:U=>{E+=U,ae===null&&(ae=requestAnimationFrame(me))},onText:U=>{F+=U,k===null&&(k=requestAnimationFrame(G))},onToolStart:U=>{A=[...A,{toolName:U.toolName,args:U.args,isError:!1,status:"running"}],o(A)},onToolEnd:U=>{const X=[...A];for(let _=X.length-1;_>=0;_--){const V=X[_];if(V?.toolName===U.toolName&&V.status==="running"){X[_]={...V,status:"completed",isError:U.isError,result:U.result},A=X,o(X);return}}A=[...X,{toolName:U.toolName,isError:U.isError,result:U.result,status:"completed"}],o(A)},onFallback:U=>{W=U,N?.(U,r),B?.(`Primary model unavailable. Switched to fallback ${U.fallbackModel}.`,"warning")},onDone:U=>{R(),C({messageId:U.messageId,message:U.message,accumulated:{text:F,thinking:E,toolCalls:A,fallbackInfo:W}})},onError:(U,X)=>{R(),M(U,i,X)}},cancelFlushes:R}}const Nr="fusion:chat-pending:";function ns(n){return n?`${Nr}${n}`:null}function Er(n){const r=ns(n);if(!r||typeof window>"u")return[];try{const i=localStorage.getItem(r);if(!i)return[];try{const c=JSON.parse(i);if(Array.isArray(c))return c.filter(d=>typeof d=="string"&&d.trim().length>0)}catch{}const g=i.trim();return g?[g]:[]}catch{return[]}}function Un(n,r){const i=ns(n);if(!(!i||typeof window>"u"))try{const g=r.filter(c=>c.trim().length>0);if(g.length===0){localStorage.removeItem(i);return}localStorage.setItem(i,JSON.stringify(g))}catch{}}function Jt(n){const r=ns(n);if(!(!r||typeof window>"u"))try{localStorage.removeItem(r)}catch{}}const Kn="kb-chat-active-session",Tr="task-planner:";function Yn(n){return n.agentId.startsWith(Tr)}function jr(n){return Yn(n)&&!n.lastMessageAt&&!n.lastMessagePreview}function Ys(n){const r=typeof n=="string"?n.trim():"",i=r.indexOf("/");return!r||i<=0||i>=r.length-1?{}:{modelProvider:r.slice(0,i),modelId:r.slice(i+1)}}function Dr(n){const r=n?.toolCalls;if(!Array.isArray(r))return;const i=r.map(g=>{if(!g||typeof g!="object")return null;const c=g,d=typeof c.toolName=="string"?c.toolName:"";if(!d)return null;const b=c.args;return{toolName:d,...b&&typeof b=="object"?{args:b}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(g=>g!==null);return i.length>0?i:void 0}function Fr(n){const r=n?.fallback;if(!r||typeof r!="object")return;const i=r,g=typeof i.primaryModel=="string"?i.primaryModel:"",c=typeof i.fallbackModel=="string"?i.fallbackModel:"",d=i.triggerPoint;if(!(!g||!c||d!=="session-creation"&&d!=="prompt-time"))return{primaryModel:g,fallbackModel:c,triggerPoint:d}}function Ir(n){const r=n?.failureInfo;if(!r||typeof r!="object")return;const i=r,g=typeof i.summary=="string"?i.summary.trim():"";if(!g)return;const c=(()=>{const d=i.reference;if(!d||typeof d!="object")return;const b=d,p=typeof b.kind=="string"?b.kind.trim():"",o=typeof b.id=="string"?b.id.trim():"";if(!(!p||!o))return{kind:p,id:o,...typeof b.label=="string"&&b.label.trim()?{label:b.label.trim()}:{}}})();return{summary:g,...typeof i.errorClass=="string"&&i.errorClass.trim()?{errorClass:i.errorClass.trim()}:{},...typeof i.code=="string"&&i.code.trim()?{code:i.code.trim()}:{},...typeof i.detail=="string"&&i.detail.trim()?{detail:i.detail.trim()}:{},...c?{reference:c}:{}}}function Js(n,r){const i="Failed to get response";return typeof n=="string"?{summary:n.trim()||i}:{summary:typeof n.summary=="string"&&n.summary.trim()?n.summary.trim():i,...typeof n.errorClass=="string"&&n.errorClass.trim()?{errorClass:n.errorClass.trim()}:{},...typeof n.code=="string"&&n.code.trim()?{code:n.code.trim()}:{},...typeof n.detail=="string"&&n.detail.trim()?{detail:n.detail.trim()}:{},...n.reference?{reference:n.reference}:{}}}function Zt(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:Dr(n.metadata),fallbackInfo:Fr(n.metadata),failureInfo:Ir(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function Zs(n,r){if(n.some(c=>c.id===r.id))return n;const i=n.findIndex(c=>c.role==="user"&&c.id.startsWith("temp-")&&c.sessionId===r.sessionId&&c.content.trim()===r.content.trim());if(i<0)return[...n,r];const g=[...n];return g[i]=r,g}function Lr(n,r){const i=s.useCallback(h=>h?`${Ze.CHAT_SESSIONS_PREFIX}${h}`:null,[]),g=s.useCallback((h,v)=>h&&v?`${Ze.CHAT_MESSAGES_PREFIX}${h}:${v}`:null,[]),c=s.useCallback(h=>{const v=i(h);return v?(Xe(v,{maxAgeMs:$s})??[]).filter($=>!Yn($)):[]},[i]),[d,b]=s.useState(()=>c(n)),[p,o]=s.useState(null),[f,B]=s.useState(()=>c(n).length===0),[C,M]=s.useState([]),[N,F]=s.useState(!1),[E,A]=s.useState(!1),[W,k]=s.useState(""),[ae,G]=s.useState(""),[me,R]=s.useState([]),[le,U]=s.useState([]),[X,_]=s.useState(""),[V,y]=s.useState(!1),{agentsMap:L}=ts(n),j=s.useRef(null),q=s.useRef(null),S=s.useRef(!1),T=s.useRef([]),D=s.useRef(()=>!1),m=s.useRef(null),I=s.useRef(d),l=s.useRef(p),re=s.useRef(C),O=s.useRef(E);I.current=d,l.current=p,re.current=C,O.current=E,s.useEffect(()=>{T.current=le},[le]);const z=s.useRef(new Set),fe=s.useRef(0),be=s.useRef(n);be.current!==n&&(Tt({view:"useChat",trigger:"project-context-change",projectId:n,replayAttempted:!1,detail:{previousProjectId:be.current??null}}),be.current=n,fe.current++);const ee=s.useCallback(async()=>{I.current.length===0&&B(!0);try{const v=[...(await Os(n)).sessions].sort(($,se)=>new Date(se.updatedAt).getTime()-new Date($.updatedAt).getTime());b(v);const x=i(n);x&&ie(x,v,{maxBytes:5e5})}catch{const h=c(n);if(I.current.length===0&&h.length===0){const v=i(n);v&&an(v)}}finally{B(!1)}},[i,n]);s.useEffect(()=>{const h=c(n);b(h),B(h.length===0)},[n,c]),s.useEffect(()=>{ee()},[ee,n]);const ye=s.useRef(()=>{}),we=s.useRef(!1);s.useEffect(()=>{we.current=!1,q.current=null},[n]),s.useEffect(()=>{if(f||we.current||l.current)return;const h=bt(Kn,n);if(!h){we.current=!0;return}const v=d.find(x=>x.id===h);if(v){we.current=!0,ye.current(h,v);return}we.current=!0},[f,d,n]);const He=s.useCallback((h,v)=>{const x=g(h,v);return x?Xe(x,{maxAgeMs:$s})??[]:[]},[g]),Ue=s.useCallback((h,v)=>{const x=He(n,h);return x.length>0?(M(x),F(!1),!0):(v?.clearOnMiss!==!1&&M([]),!1)},[n,He]),xe=s.useCallback(async(h,v)=>{const x=typeof v?.offset=="number"&&v.offset>0||typeof v?.before=="string",$=g(n,h),se=x?[]:He(n,h),H=se.length>0;!x&&H?(M(se),F(!1)):F(!0);try{const Q=await Bs(h,{limit:50,order:"desc",...v},n),Y=Q.messages.slice().reverse().map(Zt),K=l.current?.id===h||v?.commitForStreamingAttach===!0&&q.current?.sessionId===h;x?K&&(M(oe=>[...Y,...oe]),y(Q.messages.length>=50)):K&&(M(Y),y(Q.messages.length>=50),$&&ie($,Y,{maxBytes:5e5}))}catch{!x&&re.current.length===0&&H&&(M(se),F(!1))}finally{F(!1)}},[g,n,He]),De=s.useCallback(()=>{m.current?.(),m.current=null,T.current=[],U([]),k(""),G(""),R([]),A(!1)},[]),jt=s.useCallback(h=>{const v=l.current?.id;if(typeof h=="number"){const x=T.current.filter(($,se)=>se!==h);T.current=x,U(x),Un(v,x);return}Jt(v),T.current=[],U([])},[]),ge=s.useCallback(()=>{const[h,...v]=T.current,x=h?.trim();if(!x)return;const $=l.current?.id;T.current=v,U(v),Un($,v),yt.current(x)},[]),qe=s.useCallback(async(h,v)=>{try{const{session:x}=await Nt(h,n);if(l.current?.id!==h||T.current.length===0)return;if(x.isGenerating||x.inFlightGeneration){D.current(h,x.inFlightGeneration,{silent:v?.silent,priorThreadLoadAlreadyStarted:!0});return}ge()}catch{}},[ge,n]),he=s.useCallback((h,v,x)=>{if(j.current||!h)return!0;S.current=!1;const $=re.current,se=$.length===0||$[0]?.sessionId!==h;q.current={sessionId:h,replayFromEventId:typeof v?.replayFromEventId=="number"?v.replayFromEventId:null},se&&!x?.priorThreadLoadAlreadyStarted&&(Ue(h,{clearOnMiss:!1}),xe(h,{commitForStreamingAttach:!0})),v&&(k(v.streamingText),G(v.streamingThinking),R(v.toolCalls)),A(!0);const{handlers:H}=Qs({sessionId:h,tempUserMessageId:"",initialText:v?.streamingText,initialThinking:v?.streamingThinking,initialToolCalls:v?.toolCalls,setStreamingText:k,setStreamingThinking:G,setStreamingToolCalls:R,cancelStreamingFlushesRef:m,addToast:x?.silent?void 0:r,onFallbackSession:(Y,K)=>{const oe=Ys(Y.fallbackModel);b(J=>J.map(Z=>Z.id===K?{...Z,...oe}:Z)),o(J=>J&&J.id===K?{...J,...oe}:J)},onDone:()=>{k(""),G(""),R([]),A(!1),O.current=!1,j.current=null,q.current=null,xe(h),ge()},onError:Y=>{k(""),G(""),R([]),A(!1),O.current=!1,j.current=null,q.current=null;const K=Js(Y);x?.silent||r?.(K.summary,"error"),xe(h),qe(h,{silent:x?.silent})}});Tt({view:"useChat",trigger:"sse-open",projectId:n,replayAttempted:typeof v?.replayFromEventId=="number",replayFromEventId:v?.replayFromEventId??null,lastEventId:v?.replayFromEventId??null});const Q=Ga(h,H,n,{...typeof v?.replayFromEventId=="number"?{lastEventId:v.replayFromEventId}:{}});return j.current=Q,!0},[r,ge,qe,Ue,xe,n]);D.current=he;const Te=s.useCallback((h,v)=>{const x=l.current?.id??null;if(h&&x===h&&!v)return;j.current&&(j.current.close(),j.current=null),q.current=null;const $=v??d.find(se=>se.id===h);o($||null),l.current=$||null,h&&Nt(h,n).then(({session:se})=>{!se.isGenerating||!se.inFlightGeneration||o(H=>!H||H.id!==h?H:{...H,...se})}).catch(()=>{}),De(),y(!1),h?(Ue(h),xe(h)):M([]),$?.isGenerating&&he($.id,$.inFlightGeneration,{priorThreadLoadAlreadyStarted:!0}),h?cn(Kn,h,n):gt(Kn,n)},[he,Ue,d,xe,n,De]);ye.current=Te,s.useEffect(()=>{const h=p?.id;if(!h)return;const v=Er(h);if(v.length===0)return;T.current=v,U(v);let x=!1;return Nt(h,n).then(({session:$})=>{if(!(x||l.current?.id!==h||T.current.length===0)){if($.isGenerating){j.current||he(h,$.inFlightGeneration);return}!O.current&&!j.current&&ge()}}).catch(()=>{}),()=>{x=!0}},[p?.id,he,ge,n]);const vt=s.useCallback(async h=>{const v=l.current?.id,x=await Va(h,n);j.current&&(j.current.close(),j.current=null),q.current=null;const $={id:x.session.id,title:x.session.title,agentId:x.session.agentId,status:x.session.status,modelProvider:x.session.modelProvider,modelId:x.session.modelId,createdAt:x.session.createdAt,updatedAt:x.session.updatedAt};return b(se=>se.some(H=>H.id===$.id)?se:[$,...se]),Jt(v),De(),Te($.id,$),$},[n,De,Te]),dn=s.useCallback(async h=>{Jt(h),await zs(h,{status:"archived"},n),b(v=>v.filter(x=>x.id!==h)),p?.id===h&&(q.current=null,o(null),M([]))},[p,n]),tt=s.useCallback(async(h,v)=>{const x=v.trim()||null,$=d,se=p;b(H=>H.map(Q=>Q.id===h?{...Q,title:x}:Q)),o(H=>H?.id===h?{...H,title:x}:H);try{const Q=(await zs(h,{title:x},n)).session;b(Y=>Y.map(K=>K.id===h?{...K,title:Q.title,updatedAt:Q.updatedAt}:K)),o(Y=>Y?.id===h?{...Y,title:Q.title,updatedAt:Q.updatedAt}:Y)}catch(H){throw b($),o(se),r?.("Failed to rename conversation","error"),H}},[p,r,n,d]),Dt=s.useCallback(async h=>{Jt(h),p?.id===h&&j.current&&(j.current.close(),j.current=null),p?.id===h&&(q.current=null),await Wa(h,n);const v=g(n,h);v&&an(v),b(x=>x.filter($=>$.id!==h)),p?.id===h&&(o(null),M([]))},[p,g,n]),je=s.useCallback(async()=>{if(!p||!V)return;const h=re.current[0]?.createdAt;h&&await xe(p.id,{before:h})},[p,V,xe]),Ft=s.useCallback(()=>{p&&(S.current=!0,m.current?.(),m.current=null,j.current?.close(),j.current=null,q.current=null,Xa(p.id,n).catch(()=>{}),A(!1),O.current=!1,k(""),G(""),R([]),ge())},[p,n,ge]),yt=s.useRef(()=>{}),wt=qa(),nt=s.useCallback(async h=>{try{await ee();const v=await Nt(h,n);l.current?.id===h&&o(x=>!x||x.id!==h?x:{...x,...v.session}),v.session.isGenerating?(k(""),G(""),R([]),A(!0),O.current=!0,he(h,v.session.inFlightGeneration,{silent:!0})):(k(""),G(""),R([]),A(!1),O.current=!1,await xe(h))}catch{}},[he,xe,n,ee]),st=s.useCallback((h,v)=>{if(!p)return;if(O.current){const H=h.trim();if(!H)return;const Q=[...T.current,H];T.current=Q,U(Q),Un(p.id,Q);return}S.current=!1,j.current&&(j.current.close(),j.current=null),q.current=null;const x=`temp-${Date.now()}`,$={id:x,sessionId:p.id,role:"user",content:h,createdAt:new Date().toISOString()};M(H=>[...H,$]),k(""),G(""),R([]),A(!0),O.current=!0;const{handlers:se}=Qs({sessionId:p.id,tempUserMessageId:x,setStreamingText:k,setStreamingThinking:G,setStreamingToolCalls:R,cancelStreamingFlushesRef:m,addToast:r,onFallbackSession:(H,Q)=>{const Y=Ys(H.fallbackModel);b(K=>K.map(oe=>oe.id===Q?{...oe,...Y}:oe)),o(K=>K&&K.id===Q?{...K,...Y}:K)},onDone:({messageId:H,message:Q,accumulated:Y})=>{const K=Q?{...Zt(Q),...Y.text.length>0?{content:Y.text}:{}}:{id:H||`msg-${Date.now()}`,sessionId:p.id,role:"assistant",content:Y.text,thinkingOutput:Y.thinking,toolCalls:Y.toolCalls.length>0?Y.toolCalls:void 0,fallbackInfo:Y.fallbackInfo,createdAt:new Date().toISOString()};z.current.add(K.id),M(oe=>[...oe,K]),k(""),G(""),R([]),A(!1),O.current=!1,j.current=null,q.current=null,setTimeout(()=>{z.current.delete(K.id)},1e3),ee(),ge()},onError:(H,Q,Y)=>{const K=Js(H),oe=typeof H=="string"?H:K.summary,J=Ya(oe),Z=Y?.requestAccepted===!0;M(de=>{const pe=Z?de:de.filter(Se=>Se.id!==Q);return J?pe:[...pe,{id:`error-${Date.now()}`,sessionId:p.id,role:"assistant",content:K.summary,failureInfo:K,createdAt:new Date().toISOString()}]}),k(""),G(""),R([]),A(!1),O.current=!1,j.current=null,q.current=null,console.error("[useChat] Stream error:",H),J?(console.info("[useChat] Suppressed tab-suspension stream error:",H),p?.id&&(k(""),G(""),R([]),A(!0),O.current=!0,nt(p.id))):(r?.(K.summary,"error"),Z&&Bs(p.id,{limit:50,order:"desc"},n).then(de=>{if(l.current?.id!==p.id)return;const pe=de.messages.slice().reverse().map(Zt);M(Se=>pe.reduce(Zs,Se))}).catch(()=>{}),ee()),S.current||ge()}});j.current=Qa(p.id,h,se,v,n)},[p,n,ee,r,he,nt,ge]);yt.current=st;const un=X?d.filter(h=>h.title?.toLowerCase().includes(X.toLowerCase())||h.agentId.toLowerCase().includes(X.toLowerCase())):d;return s.useEffect(()=>{if(!p?.id||p.isGenerating!==!0||j.current)return;const h=typeof p.inFlightGeneration?.replayFromEventId=="number"?p.inFlightGeneration.replayFromEventId:null,v=q.current;v?.sessionId===p.id&&v.replayFromEventId===h||he(p.id,p.inFlightGeneration,{silent:!0})},[p?.id,p?.isGenerating,p?.inFlightGeneration,he]),s.useEffect(()=>{if(!l.current?.isGenerating||(j.current||he(l.current.id,l.current.inFlightGeneration),!O.current||j.current||!l.current))return;const h=setInterval(async()=>{if(!O.current||j.current||!l.current){clearInterval(h);return}try{(await Os(n)).sessions.find($=>$.id===l.current?.id)?.isGenerating||(clearInterval(h),await xe(l.current.id),k(""),G(""),R([]),A(!1),O.current=!1,ge())}catch{}},3e3);return()=>clearInterval(h)},[he,xe,n,p,ge]),s.useEffect(()=>wt.onBecameVisible(()=>{const v=l.current;if(!v||j.current)return;const x=fe.current;Nt(v.id,n).then($=>{if(!(fe.current!==x||j.current)){if($.session.isGenerating){k(""),G(""),R([]),A(!0),O.current=!0,he(v.id,$.session.inFlightGeneration,{silent:!0});return}O.current&&(k(""),G(""),R([]),A(!1),O.current=!1,ge(),xe(v.id))}}).catch(()=>{})}),[he,xe,n,wt,ge]),s.useEffect(()=>{const h=fe.current,v=n?`?projectId=${encodeURIComponent(n)}`:"",x=()=>fe.current!==h,$=oe=>{if(x())return;const J=JSON.parse(oe.data);if(Yn(J)){jr(J)||ee();return}b(Z=>Z.some(de=>de.id===J.id)?Z:[J,...Z])},se=oe=>{if(x())return;const J=JSON.parse(oe.data);b(Z=>[...Z.map(pe=>pe.id===J.id?J:pe)]),l.current?.id===J.id&&(o(J),J.isGenerating&&!j.current&&he(J.id,J.inFlightGeneration))},H=oe=>{if(x())return;const{id:J}=JSON.parse(oe.data);b(de=>de.filter(pe=>pe.id!==J));const Z=g(n,J);Z&&an(Z),l.current?.id===J&&(o(null),M([]))},Q=oe=>{if(x())return;const J=JSON.parse(oe.data),Z=Zt(J);if(I.current.some(de=>de.id===Z.sessionId)||ee(),!z.current.has(Z.id)){if(l.current?.id===Z.sessionId&&O.current&&!j.current&&Z.role==="assistant"){M(de=>de.some(pe=>pe.id===Z.id)?de:[...de,Z]),k(""),G(""),R([]),A(!1),O.current=!1,ge();return}l.current?.id===Z.sessionId&&!O.current&&M(de=>de.some(pe=>pe.id===Z.id)?de:Z.role==="user"?Zs(de,Z):[...de,Z])}},Y=oe=>{if(x())return;const{id:J}=JSON.parse(oe.data);M(Z=>Z.filter(de=>de.id!==J))};return ga(`/api/events${v}`,{events:{"chat:session:created":$,"chat:session:updated":se,"chat:session:deleted":H,"chat:message:added":Q,"chat:message:deleted":Y}})},[he,g,n,ge,ee]),s.useEffect(()=>()=>{j.current&&(j.current.close(),j.current=null),q.current=null},[]),{sessions:d,activeSession:p,sessionsLoading:f,messages:C,messagesLoading:N,isStreaming:E,streamingText:W,streamingThinking:ae,streamingToolCalls:me,pendingMessages:le,selectSession:Te,createSession:vt,archiveSession:dn,renameSession:tt,deleteSession:Dt,sendMessage:st,stopStreaming:Ft,clearPendingMessage:jt,loadMoreMessages:je,hasMoreMessages:V,searchQuery:X,setSearchQuery:_,filteredSessions:un,refreshSessions:ee,agentsMap:L}}function en(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function Pr(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function Gn(n,r){const i=Pr(),g=r?.warm===!0,c=en(),d=new Map;let b=!1,p=!1;return{mark(f){b||p||!i||d.has(f)||d.set(f,en())},complete:f=>{if(!i||b||p){b=!0;return}b=!0,d.set("complete",en());const B=Array.from(d.entries()).sort((F,E)=>F[1]-E[1]);let C=c;const M={};for(const[F,E]of B)M[F]=Math.max(0,E-C),C=E;const N=Math.max(0,en()-c);try{console.debug("[room-open]",{roomId:n,warm:g,totalMs:N,phases:M,...f??{}})}catch{}},cancel(){p=!0,b=!0}}}const We="fusion:chat-active-room";class va extends Error{roomId;constructor(r,i){super(r),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=i}}function Jn(n){return[...n].sort((r,i)=>new Date(i.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function ht(n,r){const i=n.findIndex(c=>c.id===r.id);if(i===-1)return Jn([r,...n]);const g=[...n];return g[i]=r,Jn(g)}function ze(n){try{return JSON.parse(n.data)}catch{return null}}function _r(n,r,i){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:n,role:"user",content:r,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...i?.length?{attachments:i}:{},createdAt:new Date().toISOString()}}function ea(n,r,i){if(n.some(c=>c.id===r.id))return n;const g=i?n.findIndex(c=>c.id===i):-1;if(g>=0){const c=[...n];return c[g]=r,c}if(r.role==="user"){const c=n.findIndex(d=>d.role==="user"&&d.id.startsWith("temp-")&&d.content.trim()===r.content.trim());if(c>=0){const d=[...n];return d[c]=r,d}}return[...n,r]}function $r(n,r){const{t:i}=et("app"),g=`${Ze.CHAT_ROOMS}:${n??"global"}`,c=`${Ze.ACTIVE_CHAT_ROOM_ID}:${n??"global"}`,d=s.useCallback(S=>`${Ze.CHAT_ROOM_MESSAGES_PREFIX}${n??"global"}:${S}`,[n]),b=s.useCallback(S=>`${Ze.CHAT_ROOM_MEMBERS_PREFIX}${n??"global"}:${S}`,[n]),[p,o]=s.useState(()=>{const S=Xe(g,{maxAgeMs:qn});return Array.isArray(S)?S:[]}),[f,B]=s.useState(()=>p.length===0),[C,M]=s.useState(null),[N,F]=s.useState(()=>{const S=Xe(c,{maxAgeMs:Hs});return S?p.find(T=>T.id===S)??null:null}),[E,A]=s.useState([]),[W,k]=s.useState([]),[ae,G]=s.useState(!1),me=s.useRef(p),R=s.useRef(N),le=s.useRef(0),U=s.useRef(n);me.current=p,R.current=N,U.current!==n&&(U.current=n,le.current+=1);const X=s.useCallback(async S=>{if(!S){A([]),k([]),G(!1);return}const T=Gn(S.id,{warm:!1});T.mark("select");const D=Xe(d(S.id),{maxAgeMs:Ja}),m=Xe(b(S.id),{maxAgeMs:qn}),I=Array.isArray(D)&&D.length>0,l=Array.isArray(m)&&m.length>0;I||l?(T.mark("cache-hit"),I&&(k(D),T.mark("hydrate")),l&&A(m),G(!1)):(k([]),G(!0));try{const[re,O]=await Promise.all([Za(S.id,n),_n(S.id,{limit:100,order:"desc"},n)]);T.mark("members-fetch"),T.mark("messages-fetch"),ie(b(S.id),re.members,{maxBytes:5e5}),ie(d(S.id),O.messages,{maxBytes:5e5}),R.current?.id===S.id&&(A(re.members),k(O.messages),T.mark("hydrate"))}catch{!I&&!l&&(A([]),k([]))}finally{G(!1),T.complete({warm:I,membersCached:l})}},[b,d,n]),_=s.useCallback(async()=>{me.current.length===0&&B(!0);try{const S=await er({},n),T=Jn(S.rooms);o(T),ie(g,T,{maxBytes:5e5}),M(null);const D=Xe(c,{maxAgeMs:Hs})??bt(We,n);if(D){const m=T.find(I=>I.id===D)??null;m?(F(m),X(m)):(gt(We,n),ie(c,"",{maxBytes:5e5}))}}catch(S){const T=S instanceof Error?S.message:i("chatRooms.error.failedToLoad","Failed to load chat rooms");M(T),r?.(T,"error")}finally{B(!1)}},[c,r,X,n,g]),V=s.useCallback(S=>{if(!S){R.current=null,F(null),gt(We,n),ie(c,"",{maxBytes:5e5}),X(null);return}const T=me.current.find(D=>D.id===S)??null;R.current=T,F(T),T&&(cn(We,T.id,n),ie(c,T.id,{maxBytes:5e5}),X(T))},[c,X,n]),y=s.useCallback(async S=>{const D=(await tr({name:S.name,memberAgentIds:S.memberAgentIds},n)).room;return o(m=>ht(m,D)),R.current=D,F(D),cn(We,D.id,n),ie(c,D.id,{maxBytes:5e5}),await X(D),D},[c,X,n]),L=s.useCallback(async S=>{await nr(S,n),o(T=>T.filter(D=>D.id!==S)),ie(d(S),[],{maxBytes:5e5}),ie(b(S),[],{maxBytes:5e5}),R.current?.id===S&&(R.current=null,F(null),A([]),k([]),gt(We,n),ie(c,"",{maxBytes:5e5}))},[c,b,d,n]),j=s.useCallback(async(S,T)=>{const D=R.current,m=D?.id;if(!m)throw new Error(i("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const I=Gn(m,{warm:!1}),l=T?.files?.map(z=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:z.name,originalName:z.name,mimeType:z.type||"application/octet-stream",size:z.size,createdAt:new Date().toISOString()})),re=_r(m,S,l?.length?l:T?.attachments);R.current?.id===m&&k(z=>{const fe=[...z,re];return ie(d(m),fe,{maxBytes:5e5}),fe});let O=!1;try{const z=[];if(T?.files?.length)for(const ye of T.files)try{const we=await sr(m,ye,n);z.push(we.attachment)}catch{throw new Error(i("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:ye.name}))}const fe=[...T?.attachments??[],...z],be=await ar(m,{content:S,...fe.length?{attachments:fe}:{}},n);O=!0,be.message?.createdAt&&D&&o(ye=>ht(ye,{...D,updatedAt:be.message.createdAt})),R.current?.id===m&&k(ye=>{const we=ea(ye,be.message,re.id);return ie(d(m),we,{maxBytes:5e5}),we});const ee=await _n(m,{limit:100,order:"desc"},n);if(ie(d(m),ee.messages,{maxBytes:5e5}),R.current?.id!==m)return;k(ee.messages),I.mark("hydrate")}catch(z){let fe=null;try{const ee=await _n(m,{limit:100,order:"desc"},n);fe=ee.messages,ie(d(m),ee.messages,{maxBytes:5e5}),R.current?.id===m&&(k(ee.messages),I.mark("hydrate"))}catch{!O&&R.current?.id===m&&k(ee=>{const ye=ee.filter(we=>we.id!==re.id);return ie(d(m),ye,{maxBytes:5e5}),ye})}const be=fe?.some(ee=>ee.role==="user"&&ee.content.trim()===re.content.trim());if(O||be){const ee=z instanceof Error&&z.message.trim()?z.message:i("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new va(ee,m)}throw z}finally{I.complete({source:"send-room-message"})}},[d,n]),q=s.useCallback(async S=>{!S||!me.current.some(T=>T.id===S)||(await rr(S,n),ie(d(S),[],{maxBytes:5e5}),R.current?.id===S&&k([]))},[d,n]);return s.useEffect(()=>{_()},[_]),s.useEffect(()=>{const S=le.current,T=n?`/api/events?projectId=${encodeURIComponent(n)}`:"/api/events";return ga(T,{onReconnect:()=>{Tt({view:"useChatRooms",trigger:"sse-reconnect",projectId:n,replayAttempted:!1});const D=R.current?.id;if(D){const m=Gn(D,{warm:!0});m.mark("sse-reconnect-refresh"),_().finally(()=>m.complete({source:"sse-reconnect"}));return}_()},events:{"chat:room:created":D=>{if(le.current!==S)return;const m=ze(D);m&&o(I=>ht(I,m))},"chat:room:updated":D=>{if(le.current!==S)return;const m=ze(D);m&&(o(I=>ht(I,m)),R.current?.id===m.id&&F(m))},"chat:room:deleted":D=>{if(le.current!==S)return;const m=ze(D);m?.id&&(o(I=>I.filter(l=>l.id!==m.id)),ie(d(m.id),[],{maxBytes:5e5}),ie(b(m.id),[],{maxBytes:5e5}),R.current?.id===m.id&&(R.current=null,F(null),A([]),k([]),gt(We,n),ie(c,"",{maxBytes:5e5})))},"chat:room:member:added":D=>{if(le.current!==S)return;const m=ze(D);!m||R.current?.id!==m.roomId||A(I=>{if(I.some(re=>re.agentId===m.agentId))return I;const l=[...I,m];return ie(b(m.roomId),l,{maxBytes:5e5}),l})},"chat:room:member:removed":D=>{if(le.current!==S)return;const m=ze(D);!m||R.current?.id!==m.roomId||A(I=>{const l=I.filter(re=>re.agentId!==m.agentId);return ie(b(m.roomId),l,{maxBytes:5e5}),l})},"chat:room:message:added":D=>{if(le.current!==S)return;const m=ze(D);m&&(o(I=>{const l=I.find(re=>re.id===m.roomId);return l?ht(I,{...l,updatedAt:m.createdAt}):I}),R.current?.id===m.roomId&&k(I=>{const l=ea(I,m);return l===I?I:(ie(d(m.roomId),l,{maxBytes:5e5}),l)}))},"chat:room:message:updated":D=>{if(le.current!==S)return;const m=ze(D);!m||R.current?.id!==m.roomId||k(I=>{const l=I.map(re=>re.id===m.id?m:re);return ie(d(m.roomId),l,{maxBytes:5e5}),l})},"chat:room:message:deleted":D=>{if(le.current!==S)return;const m=ze(D);m?.id&&k(I=>{const l=I.filter(O=>O.id!==m.id),re=R.current?.id;return re&&ie(d(re),l,{maxBytes:5e5}),l})},"chat:room:messages:cleared":D=>{if(le.current!==S)return;const m=ze(D);m?.roomId&&(ie(d(m.roomId),[],{maxBytes:5e5}),R.current?.id===m.roomId&&k([]),o(I=>{const l=I.find(re=>re.id===m.roomId);return l?ht(I,{...l,updatedAt:new Date().toISOString()}):I}))}}})},[c,b,d,n,_]),s.useEffect(()=>{N&&(p.some(S=>S.id===N.id)||(R.current=null,F(null),A([]),k([]),gt(We,n),ie(c,"",{maxBytes:5e5})))},[N,c,n,p]),{rooms:p,roomsLoading:f,roomsError:C,activeRoom:N,activeRoomMembers:E,messages:W,messagesLoading:ae,selectRoom:V,createRoom:y,deleteRoom:L,sendRoomMessage:j,clearRoom:q,refreshRooms:_}}const Et={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},ta=200;function Zn(n){if(!n)return null;const r=new Date(n).getTime();return Number.isFinite(r)?r:null}function ya(n){const r=Object.entries(n);if(r.length<=ta)return n;const i=r.map(([g,c])=>({id:g,timestamp:c,value:Zn(c)??0})).sort((g,c)=>c.value-g.value).slice(0,ta);return Object.fromEntries(i.map(({id:g,timestamp:c})=>[g,c]))}function tn(n){if(!n)return{};try{const r=JSON.parse(n);if(!r||typeof r!="object")return{};const i={};for(const[g,c]of Object.entries(r))typeof g=="string"&&typeof c=="string"&&(i[g]=c);return ya(i)}catch{return{}}}function Or(n){const[r,i]=s.useState(()=>{try{return tn(bt(Et.direct,n))}catch{return{}}}),[g,c]=s.useState(()=>{try{return tn(bt(Et.room,n))}catch{return{}}});s.useEffect(()=>{try{i(tn(bt(Et.direct,n)))}catch{i({})}try{c(tn(bt(Et.room,n)))}catch{c({})}},[n]);const d=s.useMemo(()=>({direct:r,room:g}),[r,g]),b=s.useCallback((C,M)=>{const N=ya(M);try{cn(Et[C],JSON.stringify(N),n)}catch{}return N},[n]),p=s.useCallback((C,M)=>{if(C==="direct"){i(N=>b(C,M(N)));return}c(N=>b(C,M(N)))},[b]),o=s.useCallback((C,M,N)=>{const F=Zn(N);if(F===null)return!1;const E=d[C][M],A=Zn(E);return A===null?!0:F>A},[d]),f=s.useCallback((C,M,N)=>{if(!M)return;const F=N??new Date().toISOString();p(C,E=>({...E,[M]:F}))},[p]),B=s.useCallback((C,M)=>{M.length!==0&&p(C,N=>{const F={...N};for(const E of M)E.id&&(F[E.id]=E.lastActivityAt??new Date().toISOString());return F})},[p]);return{isUnread:o,markRead:f,markAllRead:B}}function na(n){return n.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function wa(n,r){const i=r.trim();if(!i)return!0;const g=na(i);return na(n).includes(g)||n.toLowerCase().includes(i.toLowerCase())}function sa({agents:n,filter:r,highlightedIndex:i,visible:g,onSelect:c,position:d="below",roomMemberIds:b,roomName:p}){const{t:o}=et("app"),f=s.useMemo(()=>n.filter(E=>wa(E.name,r)),[n,r]),B=!!b,C=B&&r.trim().length>0,M=s.useMemo(()=>B?f.filter(E=>b?.has(E.id)):f,[f,b,B]),N=s.useMemo(()=>B?f.filter(E=>!b?.has(E.id)):[],[f,b,B]),F=C?[...M,...N]:M;return g?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${d}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":o("agentMention.suggestionsLabel","Agent mention suggestions"),children:F.length===0?t.jsx("div",{className:"agent-mention-empty",children:o("agentMention.noAgentsFound","No agents found")}):t.jsxs(t.Fragment,{children:[B&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:p?o("agentMention.membersOf","Members of #{{roomName}}",{roomName:p}):o("agentMention.roomMembers","Room members")}),M.map((E,A)=>t.jsxs("button",{type:"button",className:`agent-mention-item${A===i?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${E.id}`,onMouseDown:W=>W.preventDefault(),onClick:()=>c(E),role:"option","aria-selected":A===i,children:[t.jsx(ln,{agent:E,size:20}),B&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":o("agentMention.roomMemberBadge","Room member")}),t.jsx("span",{className:"agent-mention-name",children:E.name}),t.jsx("span",{className:"agent-mention-role",children:E.role})]},E.id)),B&&!C&&N.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:o("agentMention.typeToSearch","Type to search other agents")}),B&&C&&N.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:o("agentMention.otherAgents","Other agents")}),N.map((E,A)=>{const W=M.length+A;return t.jsxs("button",{type:"button",className:`agent-mention-item${W===i?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${E.id}`,onMouseDown:k=>k.preventDefault(),onClick:()=>c(E),role:"option","aria-selected":W===i,children:[t.jsx(ln,{agent:E,size:20}),t.jsx("span",{className:"agent-mention-name",children:E.name}),t.jsx("span",{className:"agent-mention-role",children:E.role})]},E.id)})]})]})}):null}function Br(n,r){return n+r}function zr({visible:n,position:r,tasks:i,files:g,selectedIndex:c,onSelectTask:d,onSelectFile:b,loading:p}){const{t:o}=et("app");if(!n)return null;const f=i.length>0,B=g.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:r.top,left:r.left},"data-testid":"file-mention-popup",onMouseDown:C=>{C.preventDefault()},children:[p&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!p&&!f&&!B&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:o("fileMention.empty","No tasks or files found")}),!p&&(f||B)&&t.jsxs("div",{className:"file-mention-popup-groups",children:[f&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:o("fileMention.taskHeader","Tasks")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":o("fileMention.taskMatches","Task matches"),children:i.map((C,M)=>{const N=M;return t.jsxs("li",{className:`file-mention-popup-item${N===c?" file-mention-popup-item--selected":""}`,onClick:()=>d(C),role:"option","aria-selected":N===c,"data-testid":`task-mention-item-${N}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(ba,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsxs("div",{className:"file-mention-popup-task-row",children:[t.jsx("span",{className:"file-mention-popup-task-id",children:C.id}),t.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${C.column}`,children:C.column})]}),t.jsx("span",{className:"file-mention-popup-item-path",children:C.title})]})]},C.id)})})]}),B&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:o("fileMention.fileHeader","Files")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":o("fileMention.fileMatches","File matches"),children:g.map((C,M)=>{const N=Br(i.length,M),F=or(C.path);return t.jsxs("li",{className:`file-mention-popup-item${N===c?" file-mention-popup-item--selected":""}`,onClick:()=>b(C),role:"option","aria-selected":N===c,"data-testid":`file-mention-item-${N}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(ir,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:C.name}),F&&t.jsx("span",{className:"file-mention-popup-item-path",children:F})]})]},C.path)})})]})]})]})}function Hr(n,r=[],i){const g=n.trim().replace(/^#/,""),c=(b,p)=>i?i(b,p):p;if(!g)return{ok:!1,error:c("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(g))return{ok:!1,error:c("createRoom.lowercase","Use lowercase letters only.")};const d=g.toLowerCase();return d.length>80?{ok:!1,error:c("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(d)?/^[-_]|[-_]$/.test(d)?{ok:!1,error:c("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:r.some(b=>b.toLowerCase()===d)?{ok:!1,error:c("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:d}:{ok:!1,error:c("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function Ur({isOpen:n,onClose:r,onCreate:i,projectId:g,existingRoomNames:c=[]}){const{t:d}=et("app"),[b,p]=s.useState(""),[o,f]=s.useState([]),[B,C]=s.useState(""),[M,N]=s.useState([]),[F,E]=s.useState(!1),[A,W]=s.useState(null),[k,ae]=s.useState(!1),G=s.useRef(null),me=s.useRef(null);s.useEffect(()=>{n&&(me.current=document.activeElement instanceof HTMLElement?document.activeElement:null,E(!0),W(null),cr(void 0,g).then(y=>f(y)).catch(()=>{f([]),W(d("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>E(!1)))},[n,g]),s.useEffect(()=>{if(!n){p(""),C(""),N([]),W(null),ae(!1);return}const y=window.requestAnimationFrame(()=>G.current?.focus());return()=>window.cancelAnimationFrame(y)},[n]),s.useEffect(()=>{if(!n)return;const y=L=>{L.key==="Escape"&&r()};return document.addEventListener("keydown",y),()=>document.removeEventListener("keydown",y)},[n,r]),s.useEffect(()=>{n||me.current?.focus()},[n]);const R=s.useMemo(()=>Hr(b,c,d),[b,c,d]),le=s.useMemo(()=>{const y=B.trim().toLowerCase();return y?o.filter(L=>L.name.toLowerCase().includes(y)):o},[o,B]),U=s.useMemo(()=>o.filter(y=>M.includes(y.id)),[o,M]),X=R.ok&&M.length>0&&!k&&!F;if(!n)return null;const _=y=>{k||N(L=>L.includes(y)?L.filter(j=>j!==y):[...L,y])},V=async()=>{if(!R.ok){W(R.error);return}if(M.length===0){W(d("createRoom.selectMember","Select at least one member."));return}W(null),ae(!0);try{await i({name:R.name,displayName:`#${R.name}`,memberAgentIds:M}),r()}catch(y){W(y instanceof Error?y.message:d("createRoom.failedCreate","Failed to create room."))}finally{ae(!1)}};return Ua.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:y=>y.target===y.currentTarget&&r(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":d("createRoom.title","Create room"),onClick:y=>y.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:d("createRoom.title","Create room")}),t.jsx("button",{type:"button",className:"modal-close","aria-label":d("actions.close","Close"),onClick:r,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:d("createRoom.nameLabel","Room name")}),t.jsxs("div",{className:"create-room-modal-name-field",children:[t.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),t.jsx("input",{ref:G,id:"create-room-name",className:"input",value:b,disabled:k,onChange:y=>{const L=y.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();p(L)}})]}),!R.ok&&t.jsx("div",{className:"form-error",children:R.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:d("createRoom.members","Members")}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:d("createRoom.searchAgents","Search agents"),value:B,disabled:k,onChange:y=>C(y.target.value)})]}),U.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:U.map(y=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>_(y.id),disabled:k,children:[y.name," ×"]},y.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:F?t.jsx("div",{className:"create-room-modal-empty",children:t.jsx(lr,{label:d("createRoom.loadingAgents","Loading agents...")})}):le.length===0?t.jsx("div",{className:"create-room-modal-empty",children:o.length===0?d("createRoom.noAgents","No agents in this project yet."):d("createRoom.noMatch","No agents match your search.")}):le.map(y=>{const L=M.includes(y.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${L?" create-room-modal-member-row--selected":""}`,onClick:()=>_(y.id),disabled:k,children:[t.jsx(ln,{agent:y,size:20}),t.jsx("span",{children:y.name}),t.jsx("span",{className:"create-room-modal-member-role",children:y.role})]},y.id)})}),A&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:A})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:k,children:d("actions.cancel","Cancel")}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void V(),disabled:!X,children:k?d("createRoom.creating","Creating..."):d("createRoom.create","Create room")})]})]})}),document.body)}function Kr({cliSessionId:n,tier:r,projectId:i,renderTranscript:g,renderComposer:c,queuedCount:d=0,terminalProps:b}){const{t:p}=et("app"),o=r==="generic",[f,B]=s.useState(o?"terminal":"transcript");if(o)return t.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:t.jsx(qs,{sessionId:n,projectId:i,...b})});const C=f==="terminal";return t.jsxs("div",{className:"cli-chat-surface","data-tier":r,"data-view":f,children:[t.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":p("cliChat.viewToggleLabel","Chat view"),children:[t.jsxs("button",{type:"button",role:"tab","aria-selected":!C,className:`cli-chat-surface__tab${C?"":" is-active"}`,onClick:()=>B("transcript"),children:[t.jsx(rn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:p("cliChat.transcriptTab","Transcript")})]}),t.jsxs("button",{type:"button",role:"tab","aria-selected":C,className:`cli-chat-surface__tab${C?" is-active":""}`,onClick:()=>B("terminal"),children:[t.jsx(dr,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:p("cliChat.terminalTab","Terminal")})]})]}),t.jsx("div",{className:"cli-chat-surface__body",children:C?t.jsx(qs,{sessionId:n,projectId:i,...b}):g()}),!C&&t.jsxs("div",{className:"cli-chat-surface__composer",children:[d>0&&t.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:p("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:d})}),c()]})]})}const Gr=200,Vr=8,Wr=8;function aa(){return new DOMException("The operation was aborted.","AbortError")}function ra(n,r){return r.aborted?Promise.reject(aa()):new Promise((i,g)=>{const c=()=>g(aa());r.addEventListener("abort",c,{once:!0}),n.then(d=>{r.removeEventListener("abort",c),i(d)},d=>{r.removeEventListener("abort",c),g(d)})})}function oa(n,r,i){const g=n.slice(0,r),c=n.slice(r+1),d=c.match(/[\s]|$/),b=d?d.index??c.length:c.length,p=c.slice(b);return`${g}${i}${p}`}function Xr(n={}){const{projectId:r,workspace:i="project"}=n,[g,c]=s.useState(!1),[d,b]=s.useState(""),[p,o]=s.useState(-1),[f,B]=s.useState([]),[C,M]=s.useState([]),[N,F]=s.useState(!1),[E,A]=s.useState(0),W=s.useRef(null),k=s.useRef(null),ae=[...f.map(_=>({kind:"task",task:_})),...C.map(_=>({kind:"file",file:_}))];s.useEffect(()=>()=>{W.current&&clearTimeout(W.current),k.current?.abort()},[]);const G=s.useCallback((_,V)=>{if(V<0||V>_.length){c(!1);return}const y=L=>/[a-zA-Z0-9/_.-]/.test(L);for(let L=V-1;L>=0;L--){if(_[L]==="#"){if(L===0){const q=_.slice(L+1,V);o(L),b(q),A(0),c(!0);return}const j=_[L-1];if(/[\s,.;:!?'"()[\]{}]/.test(j)){const q=_.slice(L+1,V);o(L),b(q),A(0),c(!0);return}c(!1);return}if(!y(_[L])){c(!1);return}}c(!1)},[]),me=s.useCallback(()=>{k.current?.abort(),c(!1),b(""),o(-1),B([]),M([]),A(0),F(!1)},[]),R=s.useCallback(async _=>{if(!_.trim()){B([]),M([]),F(!1);return}k.current?.abort();const V=new AbortController;k.current=V;try{F(!0);const[y,L]=await Promise.allSettled([ra(ur(20,0,r,_),V.signal),ra(mr(_,i,r),V.signal)]);if(V.signal.aborted)return;const j=y.status==="fulfilled"?y.value.slice(0,Vr).map(S=>({id:S.id,title:S.title??"",column:S.column})):[],q=L.status==="fulfilled"?L.value.files.slice(0,Wr):[];B(j),M(q),A(0)}catch(y){y.name!=="AbortError"&&(B([]),M([]))}finally{V.signal.aborted||F(!1)}},[i,r]);s.useEffect(()=>{if(g)return W.current&&clearTimeout(W.current),W.current=setTimeout(()=>{R(d)},Gr),()=>{W.current&&clearTimeout(W.current)}},[d,g,R]);const le=s.useCallback((_,V)=>!g||p<0?V:oa(V,p,`#${_.id}`),[g,p]),U=s.useCallback((_,V)=>!g||p<0?V:oa(V,p,`#${_.path}`),[g,p]),X=s.useCallback((_,V)=>{if(!g||ae.length===0)return!1;switch(_.key){case"ArrowDown":return _.preventDefault(),A(y=>Math.min(y+1,ae.length-1)),!0;case"ArrowUp":return _.preventDefault(),A(y=>Math.max(y-1,0)),!0;case"Enter":case"Tab":return ae[E]?(_.preventDefault(),!0):!1;case"Escape":return _.preventDefault(),me(),!0;default:return!1}},[g,ae,E,me]);return{mentionActive:g,tasks:f,files:C,combinedItems:ae,loading:N,mentionQuery:d,selectedIndex:E,setSelectedIndex:A,detectMention:G,selectTask:le,selectFile:U,dismissMention:me,handleKeyDown:X}}const Vn=new Map,on=new Map;function ss(n){return n??"global"}function es(n){return`${Ze.DISCOVERED_SKILLS_PREFIX}${ss(n)}`}function ft(n){return Xe(es(n),{maxAgeMs:qn})}function qr(n,r){for(const i of on.get(n)??[])i(r)}async function Qr(n){const r=ss(n),i=Vn.get(r);if(i)return i;const g=hr(n).finally(()=>{Vn.delete(r)});return Vn.set(r,g),g}function Yr(n){const[r,i]=s.useState(()=>ft(n)??[]),[g,c]=s.useState(()=>ft(n)===null),d=s.useRef(ft(n)!==null),b=ss(n);s.useEffect(()=>{const f=ft(n)??[];i(f),c(ft(n)===null),d.current=ft(n)!==null},[n]),s.useEffect(()=>{const f=on.get(b)??new Set;return f.add(i),on.set(b,f),()=>{f.delete(i),f.size===0&&on.delete(b)}},[b]);const p=s.useCallback(async()=>{try{const f=await Qr(n);d.current=!0,ie(es(n),f,{maxBytes:5e5}),qr(b,f)}catch{d.current||an(es(n))}finally{c(!1)}},[n,b]);s.useEffect(()=>{p()},[p]);const o=s.useCallback(async()=>{c(!0),await p()},[p]);return{skills:r,loading:g,refresh:o}}function Jr(n,r){const i=n.reduce((g,c)=>g+(c.content?.length??0),0)+(r?.length??0);return Math.ceil(i/4)}function ia(n){if(!Number.isFinite(n)||n<=0)return"0";if(n<1e3)return String(Math.round(n));const r=n/1e3;return r<10?`~${Number(r.toFixed(1))}k`:`${Math.round(r)}k`}const as=640,Zr=200,ca="__SKIP__";let Wn=!1;function eo(n,r=as){return n>r?"auto":"hidden"}function to(n,r=as){return Math.max(40,Math.min(n,r))}function no(n,r){const i=new Date(n),c=new Date().getTime()-i.getTime(),d=Math.floor(c/1e3),b=Math.floor(d/60),p=Math.floor(b/60),o=Math.floor(p/24);return d<60?r("chat.relativeTimeJustNow","just now"):b<60?r("chat.relativeTimeMinutes","{{count}}m ago",{count:b}):p<24?r("chat.relativeTimeHours","{{count}}h ago",{count:p}):o<7?r("chat.relativeTimeDays","{{count}}d ago",{count:o}):i.toLocaleDateString()}const pt="__fn_agent__",so=280,nn=180,sn=500,la="fusion:chat-sidebar-width",Xn="fusion:chat-scope",ao="fusion:chat-draft:";function da(n,r){return n.slice(r+1).find(i=>i.role==="user")?.content}function ua(n,r){return r?`${ao}${n}:${r}`:null}function ma(n){if(!n)return"";try{return localStorage.getItem(n)??""}catch{return""}}const ro=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function ha(n){const r=/(^|[\s])\/([^\s]*)$/.exec(n);if(!r)return null;const i=r[1]??"",g=r[2]??"",c=r.index+i.length;return{filter:g,start:c,end:n.length}}function oo(n,r){const i=n.slice(0,r),g=/(^|[\s\n])@([\w-]*)$/.exec(i);if(!g)return null;const c=g[2]??"",d=i.length-c.length-1;return{filter:c,start:d,end:r}}function io(n){const r=n?.runtimeConfig;if(!r||typeof r!="object")return null;const i=Reflect.get(r,"modelProvider"),g=Reflect.get(r,"modelId");return typeof i!="string"||i.trim().length===0||typeof g!="string"||g.trim().length===0?null:{provider:i,modelId:g}}function fa(n,r,i){if(n?.modelProvider&&n?.modelId)return{provider:n.modelProvider,modelId:n.modelId};const g=io(r??void 0);return g||(i.provider&&i.modelId?{provider:i.provider,modelId:i.modelId}:null)}function co({projectId:n,defaultModel:r,onClose:i,onCreate:g}){const{t:c}=et("app"),[d,b]=s.useState("agent"),{agents:p,loading:o}=ts(n),[f,B]=s.useState(""),{models:C,favoriteProviders:M,favoriteModels:N,loading:F,refresh:E}=pa(),A=r.provider&&r.modelId?`${r.provider}/${r.modelId}`:"",[W,k]=s.useState(A),[ae,G]=s.useState(M),[me,R]=s.useState(N);s.useEffect(()=>{G(M)},[M]),s.useEffect(()=>{R(N)},[N]),s.useEffect(()=>{A&&k(y=>y||A)},[A]);const le=s.useCallback(async y=>{const L=ae,q=L.includes(y)?L.filter(S=>S!==y):[y,...L];G(q);try{await Xs({favoriteProviders:q,favoriteModels:me}),await E()}catch{G(L)}},[ae,me,E]),U=s.useCallback(async y=>{const L=me,q=L.includes(y)?L.filter(S=>S!==y):[y,...L];R(q);try{await Xs({favoriteProviders:ae,favoriteModels:q}),await E()}catch{R(L)}},[me,ae,E]),X=W||A,_=y=>{if(y.preventDefault(),d==="agent"){if(!f)return;g({agentId:f});return}if(!X)return;const L=X.indexOf("/");if(L<=0)return;const j=X.slice(0,L),q=X.slice(L+1);g({agentId:pt,modelProvider:j,modelId:q})},V=d==="agent"?!f:!X;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:i,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:y=>y.stopPropagation(),children:[t.jsx("h3",{children:c("chat.newChatTitle","New Chat")}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{b("agent")},children:c("chat.newChatModeAgent","Agent")}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${d==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{b("model"),B(""),k(y=>y||A)},children:c("chat.newChatModeModel","Model")})]}),t.jsxs("form",{onSubmit:_,children:[d==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:[c("chat.newChatModeAgent","Agent"),o?t.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingAgents","Loading agents...")}):p.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:c("chat.noAgentsAvailable","No agents available")}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:p.map(y=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${f===y.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>B(y.id),"data-testid":`agent-option-${y.id}`,children:[t.jsx(Qn,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:y.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:y.role})]},y.id))})]}),d==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:F?t.jsx("div",{className:"chat-new-dialog-loading",children:c("chat.loadingModels","Loading models...")}):t.jsx(Rr,{models:C,value:W,onChange:k,label:c("chat.newChatModeModel","Model"),placeholder:c("chat.selectModel","Select a model"),favoriteProviders:ae,onToggleFavorite:le,favoriteModels:me,onToggleModelFavorite:U})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:i,children:c("chat.cancel","Cancel")}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:V,children:c("chat.create","Create")})]})]})]})})}function vo({projectId:n,addToast:r,floating:i=!1,compactLayout:g=!1,onPopOut:c,onMaximize:d,onMinimize:b,onClose:p}){const{t:o}=et("app");s.useEffect(()=>(Tt({view:"ChatView",trigger:Wn?"route-active":"remount",projectId:n,replayAttempted:!1}),Wn=!1,()=>{Wn=!0,Tt({view:"ChatView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{activeSession:f,sessionsLoading:B,messages:C,messagesLoading:M,isStreaming:N,streamingText:F,streamingThinking:E,streamingToolCalls:A,selectSession:W,createSession:k,archiveSession:ae,renameSession:G,deleteSession:me,sendMessage:R,stopStreaming:le,pendingMessages:U,clearPendingMessage:X,loadMoreMessages:_,hasMoreMessages:V,searchQuery:y,setSearchQuery:L,filteredSessions:j,agentsMap:q}=Lr(n,r),[S,T]=s.useState(!1),D=!0,[m,I]=s.useState(()=>{try{if(localStorage.getItem(Xn)==="rooms"&&D)return"rooms"}catch{}return"direct"}),l=$r(n,r),{isUnread:re,markRead:O}=Or(n),[z,fe]=s.useState(()=>{const e=ua(m,m==="rooms"?l.activeRoom?.id:f?.id);return ma(e)}),[be,ee]=s.useState(null),[ye,we]=s.useState(null),[He,Ue]=s.useState(""),[xe,De]=s.useState(null),[jt,ge]=s.useState(null),[qe,he]=s.useState(!0),[Te,vt]=s.useState(so),[dn,tt]=s.useState(!1),{agentsMap:Dt}=ts(n),je=s.useMemo(()=>q.size>0?q:Dt,[Dt,q]),{models:Ft,defaultProvider:yt,defaultModelId:wt}=pa(),nt=s.useMemo(()=>({provider:yt,modelId:wt}),[wt,yt]),{skills:st,loading:un}=Yr(n),[h,v]=s.useState(!1),[x,$]=s.useState(""),[se,H]=s.useState(0),[Q,Y]=s.useState(""),[K,oe]=s.useState(!1),[J,Z]=s.useState(0),[de,pe]=s.useState(-1),[Se,mn]=s.useState([]),[rs,at]=s.useState(!1),[os,It]=s.useState(!1),[rt,is]=s.useState({}),[Lt,Ke]=s.useState(!1),[Pt,xt]=s.useState(!1),{pushNav:cs}=fr(),[,_t]=s.useState(!1),[xa,Ca]=s.useState({top:0,left:0}),ce=Xr({projectId:n}),hn=s.useCallback(e=>{if(!e||!ce.mentionActive)return;const a=e.getBoundingClientRect();Ca({top:a.top-260,left:a.left+8})},[ce.mentionActive]),ls=s.useRef(null),ds=s.useRef(null),us=s.useRef(null),ms=s.useRef(null),ke=s.useRef(!1),$t=s.useRef(null),hs=s.useRef(null),Ge=s.useRef(null),Ot=s.useRef(0),fn=s.useRef(null),Ct=s.useRef(null),Ie=s.useRef(null),Re=s.useRef(null),gn=s.useRef(null),Bt=s.useRef(!1),Le=s.useRef(null),Pe=s.useRef(null),Me=s.useRef(null),zt=s.useRef(null),fs=s.useRef([]),ot=s.useRef(0),St=s.useRef(new Map),pn=s.useRef(!1),Ht=gr(),Qe=Ht==="mobile",bn=Ht==="tablet",gs=s.useRef(null),[Sa,ps]=s.useState(!1);s.useLayoutEffect(()=>{if(!i){ps(!1);return}const e=gs.current;if(!e||typeof ResizeObserver>"u")return;const a=()=>{ps(e.getBoundingClientRect().width<=768)};a();const u=new ResizeObserver(a);return u.observe(e),()=>u.disconnect()},[i]);const te=Qe||Sa||g;s.useEffect(()=>{f?.id&&O("direct",f.id,f.lastMessageAt??f.updatedAt)},[f?.id,f?.lastMessageAt,f?.updatedAt,O]),s.useEffect(()=>{l.activeRoom?.id&&O("room",l.activeRoom.id,l.activeRoom.updatedAt)},[l.activeRoom?.id,l.activeRoom?.updatedAt,O]),s.useEffect(()=>{if(!f?.id||C.length===0)return;const e=C[C.length-1];O("direct",f.id,e?.createdAt??f.lastMessageAt??f.updatedAt)},[f?.id,f?.lastMessageAt,f?.updatedAt,O,C]),s.useEffect(()=>{if(!l.activeRoom?.id||l.messages.length===0)return;const e=l.messages[l.messages.length-1];O("room",l.activeRoom.id,e?.createdAt??l.activeRoom.updatedAt)},[O,l.activeRoom?.id,l.activeRoom?.updatedAt,l.messages]),s.useEffect(()=>{try{const e=localStorage.getItem(la);if(!e)return;const a=Number.parseInt(e,10);if(Number.isNaN(a))return;const u=Math.max(nn,Math.min(sn,a));vt(u)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(Xn);if(e==="direct"){I("direct");return}e==="rooms"&&D&&I("rooms")}catch{}},[D]),s.useEffect(()=>{try{localStorage.setItem(Xn,m)}catch{}},[D,m]);const Ae=ua(m,m==="rooms"?l.activeRoom?.id:f?.id),vn=s.useRef(Ae);s.useEffect(()=>{Ae!==vn.current&&(vn.current=Ae,fe(ma(Ae)))},[Ae]),s.useEffect(()=>{if(!(!Ae||vn.current!==Ae))try{if(z){localStorage.setItem(Ae,z);return}localStorage.removeItem(Ae)}catch{}},[Ae,z]);const ve=m==="rooms"&&!!l.activeRoom,{keyboardOverlap:bs,keyboardOpen:Ut}=pr({enabled:(te||bn)&&(!!f||ve),allowNonMobileViewport:bn}),Mt=bn&&Ut,Ne=s.useMemo(()=>{const e=x.trim().toLowerCase();return(e?st.filter(u=>u.name.toLowerCase().includes(e)):st).slice(0,10)},[st,x]),it=s.useMemo(()=>Array.from(je.values()),[je]),_e=s.useMemo(()=>m!=="rooms"||!l.activeRoom?null:{roomId:l.activeRoom.id,roomName:l.activeRoom.name,memberIds:new Set(l.activeRoomMembers.map(e=>e.agentId))},[D,m,l.activeRoom,l.activeRoomMembers]),Ye=s.useMemo(()=>{const e=it.filter(w=>wa(w.name,Q));if(!_e)return e;const a=e.filter(w=>_e.memberIds.has(w.id));if(Q.trim().length===0)return a;const u=e.filter(w=>!_e.memberIds.has(w.id));return[...a,...u]},[it,Q,_e]),yn=s.useMemo(()=>{const e=new Map;for(const a of it)e.set(a.name.toLowerCase(),a);return e},[it]),Ma=s.useMemo(()=>Ne.map(e=>e.id).join("\0"),[Ne]);s.useEffect(()=>{H(0)},[Ma]),s.useEffect(()=>{Z(0)},[Q,K]),s.useEffect(()=>()=>{Ie.current!==null&&window.clearTimeout(Ie.current)},[]),s.useEffect(()=>{const e=ds.current;if(!e||!V||M)return;const a=new IntersectionObserver(u=>{u[0].isIntersecting&&_()},{threshold:.1});return a.observe(e),()=>a.disconnect()},[V,M,_]);const ct=s.useCallback(()=>ve?l.activeRoom?.id??null:f?.id??null,[ve,l.activeRoom?.id,f?.id]),vs=s.useCallback((e,a)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(a)}"]`):e.querySelector(`.chat-message[data-message-id="${a.replace(/"/g,'\\"')}"]`),[]),Kt=s.useCallback(()=>{const e=Re.current,a=ct();if(!e||!a)return;const u=e.scrollTop,w=e.querySelectorAll(".chat-message[data-message-id]"),P=Array.from(w).find(Ce=>Ce.offsetTop+Ce.offsetHeight>=u)??w[0]??null,ne=P?.getAttribute("data-message-id")??null,ue=P?P.offsetTop-u:0;Ct.current={threadId:a,scrollTop:u,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:ne,anchorOffset:ue,wasPinnedBefore:!ke.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[ct]),ys=s.useCallback(()=>{const e=Re.current;if(!e)return;const u=e.scrollTop+e.clientHeight>=e.scrollHeight-50;It(!u),ke.current=!u,Kt()},[Kt]),$e=s.useCallback((e,a)=>{if(!e.isConnected||!a?.force&&ke.current)return;let u=0,w=0,P=-1;const ne=6,ue=()=>{if(e.isConnected&&!(!a?.force&&ke.current)){if(e.scrollTop=e.scrollHeight,e.scrollHeight===P?w+=1:(w=0,P=e.scrollHeight),u+=1,u>=ne||w>=2){It(!1),ke.current=!1;return}window.requestAnimationFrame(ue)}};ue()},[]),kt=ve?l.messages:C;s.useLayoutEffect(()=>{const e=Re.current,a=ct(),u=Ct.current;if(!e||!a||!u||u.threadId!==a||u.wasPinnedBefore)return;const w=(typeof performance<"u"?performance.now():Date.now())-u.capturedAtMs,P=e.scrollHeight>e.clientHeight,ne=w>3e3,ue=u.scrollTop<=0&&u.anchorOffset<=0&&P;if(!ke.current||ne||ue){Ct.current=null;return}let Ce=u.scrollTop;if(u.anchorMessageId){const Be=vs(e,u.anchorMessageId);Be?Ce=Be.offsetTop-u.anchorOffset:Ce=u.scrollTop+(e.scrollHeight-u.scrollHeight)}else Ce=u.scrollTop+(e.scrollHeight-u.scrollHeight);e.scrollTop=Math.max(0,Ce),ke.current=!0,It(!0),Ct.current=null},[kt,ct,vs]);const wn=s.useCallback(e=>{},[kt.length,ve]),Fe=s.useCallback(e=>{wn(e);const a=Re.current;a&&(Ct.current=null,ke.current=!1,$e(a))},[$e,wn]);s.useLayoutEffect(()=>{Ge.current!==null&&(window.clearTimeout(Ge.current),Ge.current=null);const e=ve?l.activeRoom?.id??null:f?.id??null;if(!e){$t.current=null;return}const a={threadId:e,loaded:ve?!l.messagesLoading:!M,hasMessages:ve?l.messages.length>0:C.length>0},u=$t.current,w=u?.threadId!==e,P=u?.threadId===e&&!u.loaded&&a.loaded,ne=u?.threadId===e&&!u.hasMessages&&a.hasMessages;if(!(u===null||w||P||ne))return;const Ce=Re.current;if(Ce)return wn(w?"thread-change":P?"finished-loading":ne?"first-messages":"mount"),$e(Ce,{force:!0}),ve||(Ge.current=window.setTimeout(()=>{if(Ge.current=null,ke.current)return;const Be=Re.current;Be&&$e(Be)},250)),$t.current=a,()=>{Ge.current!==null&&(window.clearTimeout(Ge.current),Ge.current=null)}},[ve,l.activeRoom?.id,l.messages.length,l.messagesLoading,f?.id,C.length,M,$e]),s.useEffect(()=>{!N||ke.current||Fe("streaming")},[N,F,E,Fe]),s.useEffect(()=>{const e=ct();if(!e){Ot.current=0,fn.current=null;return}if(fn.current!==e){fn.current=e,Ot.current=kt.length;return}const a=Ot.current,u=kt.length,w=u>a,P=!ke.current;Ot.current=u,w&&P&&Fe("new-message")},[kt,ct,Fe]),s.useEffect(()=>{bs<=0||!Re.current||Fe("keyboard")},[bs,Fe]),br(Qe&&Ut),s.useLayoutEffect(()=>{if(!Qe||!f&&!ve||typeof window>"u")return;const e=gn.current,a=window.visualViewport;if(!e||!a)return;const u=P=>{if(!(P instanceof HTMLElement))return!1;if(P.tagName==="TEXTAREA")return!0;if(P.tagName!=="INPUT")return!1;const ne=P.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(ne)},w=()=>{if(Bt.current){e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange="";return}const P=Math.max(0,window.innerHeight-a.offsetTop-a.height),ne=a.offsetTop||0;e.style.setProperty("--vv-height",`${a.height}px`),e.style.setProperty("--vv-offset-top",`${ne}px`),e.style.setProperty("--keyboard-overlap",`${P}px`);const ue=(P>0||ne>0)&&u(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",ue),e.style.setProperty("--chat-keyboard-accessory-clearance",ue&&Hn()?"calc(var(--space-2xl) + var(--space-md))":"0px"),ue&&ne>0?(e.style.transform=`translateY(${ne}px)`,e.style.willChange="transform"):(e.style.transform="",e.style.willChange="")};return w(),a.addEventListener("resize",w),a.addEventListener("scroll",w),document.addEventListener("focusin",w),document.addEventListener("focusout",w),window.addEventListener("pageshow",w),document.addEventListener("visibilitychange",w),()=>{a.removeEventListener("resize",w),a.removeEventListener("scroll",w),document.removeEventListener("focusin",w),document.removeEventListener("focusout",w),window.removeEventListener("pageshow",w),document.removeEventListener("visibilitychange",w),e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange=""}},[f,Qe,ve]),s.useEffect(()=>{const e=()=>ee(null);if(be)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[be]),s.useEffect(()=>{if(!Qe||!Ut)return;const e=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[Qe,Ut]),s.useEffect(()=>{const e=hs.current;if(hs.current=m,m==="rooms"&&!l.activeRoom){$t.current=null;return}if(!(m==="direct"&&(e===null||e==="rooms"))&&!(m==="rooms"&&(e===null||e==="direct")))return;const w=Re.current;w&&($e(w,{force:!0}),ke.current=!1,It(!1))},[m,l.activeRoom,$e]),s.useEffect(()=>{if(!f&&!ve||ve&&!te)return;const e=()=>{const u=!ke.current;Kt(),u&&te&&Re.current&&Fe("visibility-restore")},a=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",a),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pageshow",e)}},[te,Qe,f,ve,Kt,Fe]),s.useEffect(()=>{if(ve||typeof ResizeObserver>"u")return;const e=Re.current;if(!e)return;const a=new ResizeObserver(()=>{ke.current||$e(e)});return a.observe(e),()=>{a.disconnect()}},[ve,$e,f?.id,m]),s.useEffect(()=>{fs.current=Se},[Se]),s.useEffect(()=>()=>{for(const e of fs.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of St.current.values())window.clearTimeout(e);St.current.clear()},[]);const lt=s.useCallback(e=>{if(!e||e.length===0)return;const a=[];for(const u of Array.from(e)){if(!ro.includes(u.type))continue;const w=u.type.startsWith("image/");a.push({file:u,previewUrl:w?URL.createObjectURL(u):""})}a.length>0&&mn(u=>[...u,...a])},[]),ws=s.useCallback(e=>{mn(a=>{const u=a[e];return u?.previewUrl&&URL.revokeObjectURL(u.previewUrl),a.filter((w,P)=>P!==e)})},[]),xs=s.useCallback(e=>{const a=e.clipboardData?.files;if(!a||a.length===0)return;const u=Array.from(a).filter(w=>w.type.startsWith("image/"));u.length!==0&&lt(u)},[lt]),ka=s.useCallback(async e=>{try{await k(e),T(!1),te&&he(!1)}catch{r(o("chat.failedToCreateSession","Failed to create chat session"),"error")}},[k,r,te]),Ee=s.useCallback(e=>{const a=e??Me.current;if(!a)return;const u=Ht==="tablet"?Zr:as;a.style.height="auto",a.style.height=`${to(a.scrollHeight,u)}px`,a.style.overflowY=eo(a.scrollHeight,u)},[Ht]),Cs=s.useCallback(e=>{Me.current=e,e&&Ee(e)},[Ee]);s.useLayoutEffect(()=>{Ee()},[m,z,f?.id,l.activeRoom?.id,Ee]);const dt=s.useCallback(()=>{if(fe(""),Ae)try{localStorage.removeItem(Ae)}catch{}v(!1),$(""),oe(!1),Y(""),pe(-1),mn(e=>{for(const a of e)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[Ae]),xn=s.useCallback(()=>{const e=z.trim(),a=Se.map(u=>u.file);if(!(!e&&a.length===0||!f)){if(e==="/clear"||e==="/new"){dt(),X(),le(),k({agentId:f.agentId,modelProvider:f.modelProvider??void 0,modelId:f.modelId??void 0}).catch(()=>{r(o("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}dt(),R(e,a)}},[z,Se,f,dt,le,X,k,r,R]),Cn=s.useCallback(async()=>{const e=z.trim(),a=Se.map(u=>u.file);if(!(!e&&a.length===0)){if(m==="rooms"){if(!l.activeRoom)return;if(e==="/clear"||e==="/new"){dt();try{await l.clearRoom(l.activeRoom.id)}catch{r(o("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(pn.current)return;pn.current=!0;const u=z;dt();try{await l.sendRoomMessage(e,{files:a})}catch(w){if(w instanceof va){const ne=w.message.trim()?w.message:o("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");r(o("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:ne}),"error");return}fe(u);const P=w instanceof Error&&w.message.trim()?w.message:o("chat.failedToSendRoomMessage","Failed to send room message");r(P,"error")}finally{pn.current=!1}return}xn()}},[z,Se,D,m,l,l.clearRoom,dt,r,xn]),Gt=s.useCallback(async e=>{if(m==="rooms"){if(!l.activeRoom)return;try{await l.sendRoomMessage(e)}catch(a){const u=a instanceof Error&&a.message.trim()?a.message:o("chat.failedToSendRoomMessage","Failed to send room message");r(u,"error")}return}f&&R(e)},[f,r,D,m,l,R,o]),Sn=s.useCallback(e=>{fe(a=>{const u=ha(a);if(!u)return a;const w=`/skill:${e.name} `,P=a.slice(0,u.start)+w+a.slice(u.end);return window.requestAnimationFrame(()=>{Me.current&&(Ee(Me.current),Me.current.focus())}),P}),v(!1),$(""),H(0)},[Ee]),Vt=s.useCallback(e=>{const a=Me.current;if(!a||de<0)return;const u=a.selectionStart??ot.current,w=a.selectionEnd??u,P=Math.max(u,w),ne=Math.min(de,P),Ce=`${`@${e.name.replace(/\s+/g,"_")}`} `,Be=z.slice(0,ne)+Ce+z.slice(P),ut=ne+Ce.length;fe(Be),oe(!1),Y(""),Z(0),pe(-1),window.requestAnimationFrame(()=>{Me.current&&(Ee(Me.current),Me.current.focus(),Me.current.setSelectionRange(ut,ut))})},[de,z,Ee]),Rt=s.useCallback((e,a)=>{const w=Me.current?.selectionStart??ot.current,P=z.lastIndexOf("#",w),ne=P>=0?P+a.length:e.length;fe(e),ce.dismissMention(),_t(!1),window.requestAnimationFrame(()=>{Me.current&&(Ee(Me.current),Me.current.focus(),Me.current.setSelectionRange(ne,ne))})},[ce,z,Ee]),Ss=s.useCallback(e=>{if(ot.current=e.currentTarget.selectionStart??ot.current,ce.mentionActive&&ce.combinedItems.length>0){if(ce.handleKeyDown(e,z),e.key==="Enter"||e.key==="Tab"){const a=ce.combinedItems[ce.selectedIndex];a?.kind==="task"?Rt(ce.selectTask(a.task,z),`#${a.task.id}`):a?.kind==="file"&&Rt(ce.selectFile(a.file,z),`#${a.file.path}`)}return}if(K&&e.key==="ArrowDown"){e.preventDefault(),Ye.length>0&&Z(a=>(a+1)%Ye.length);return}if(K&&e.key==="ArrowUp"){e.preventDefault(),Ye.length>0&&Z(a=>a===0?Ye.length-1:a-1);return}if(K&&e.key==="Enter"){e.preventDefault();const a=Ye[J]??Ye[0];a&&Vt(a);return}if(K&&e.key==="Escape"){e.preventDefault(),oe(!1),Y(""),pe(-1);return}if(h&&e.key==="ArrowDown"){e.preventDefault(),Ne.length>0&&H(a=>(a+1)%Ne.length);return}if(h&&e.key==="ArrowUp"){e.preventDefault(),Ne.length>0&&H(a=>a===0?Ne.length-1:a-1);return}if(h&&(e.key==="Enter"||e.key==="Tab")&&Ne.length>0){e.preventDefault();const a=Ne[se]??Ne[0];a&&Sn(a);return}if(h&&e.key==="Escape"){e.preventDefault(),v(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Cn())},[K,Ye,J,Vt,h,Ne,se,Sn,Cn,ce,Rt,z]),Wt=s.useCallback((e,a)=>{const u=oo(e,a);if(u){oe(!0),Y(u.filter),pe(u.start);return}oe(!1),Y(""),pe(-1)},[]),Ms=s.useCallback(e=>{const a=e.target,u=a.value,w=a.selectionStart??u.length;Ee(a),ot.current=w,fe(u);const P=ha(u);P?(v(!0),$(P.filter)):(v(!1),$("")),Wt(u,w),ce.detectMention(u,w),_t(ce.mentionActive),ce.mentionActive&&hn(a)},[Wt,Ee]),Xt=s.useCallback(e=>{const a=e.currentTarget,u=a.selectionStart??a.value.length;ot.current=u,Wt(a.value,u),ce.detectMention(a.value,u),_t(ce.mentionActive),ce.mentionActive&&hn(a)},[Wt,ce,hn]),ks=s.useCallback(e=>{e.key!=="Escape"&&Xt(e)},[Xt]),Rs=s.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(Bt.current=!0,Le.current!==null&&window.clearTimeout(Le.current),Le.current=window.setTimeout(()=>{Bt.current=!1,Le.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),Pe.current!==null&&window.clearTimeout(Pe.current),Pe.current=window.setTimeout(()=>{Pe.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Ie.current!==null&&window.clearTimeout(Ie.current),Ie.current=window.setTimeout(()=>{v(!1),oe(!1),Y(""),pe(-1),_t(!1),ce.dismissMention(),Ie.current=null},120)},[ce]),As=s.useCallback(()=>{Bt.current=!1,Le.current!==null&&(window.clearTimeout(Le.current),Le.current=null),Ie.current!==null&&(window.clearTimeout(Ie.current),Ie.current=null),Pe.current!==null&&(window.clearTimeout(Pe.current),Pe.current=null)},[]);s.useEffect(()=>()=>{Le.current!==null&&window.clearTimeout(Le.current),Pe.current!==null&&window.clearTimeout(Pe.current)},[]);const Ra=s.useCallback(async e=>{ee(null);try{await ae(e),r(o("chat.conversationArchived","Conversation archived"),"success")}catch{r(o("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[ae,r]),Mn=s.useCallback(e=>{const a=j.find(u=>u.id===e)??(f?.id===e?f:null);ee(null),Ke(!1),Ue(a?.title??""),we({sessionId:e,title:a?.title??""})},[f,j]),Ns=s.useCallback(async()=>{if(ye)try{await G(ye.sessionId,He),we(null),Ue(""),r(o("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[r,ye,G,He,o]),Aa=s.useCallback(async e=>{De(null),ee(null);try{await me(e),r(o("chat.conversationDeleted","Conversation deleted"),"success")}catch{r(o("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[me,r]),At=s.useCallback(e=>{try{localStorage.setItem(la,String(e))}catch{}},[]),Na=s.useCallback(e=>{if(te||Mt)return;e.preventDefault(),e.stopPropagation();const a=e.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(e.pointerId);const u=e.clientX,w=Te;let P=w;document.body.style.userSelect="none";const ne=Ce=>{const Be=Ce.clientX-u,ut=Math.max(nn,Math.min(sn,w+Be));P=ut,vt(ut),At(ut)},ue=Ce=>{typeof a.releasePointerCapture=="function"&&a.releasePointerCapture(Ce.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",ne),document.removeEventListener("pointerup",ue),At(P)};document.addEventListener("pointermove",ne),document.addEventListener("pointerup",ue)},[te,At,Te,Mt]),Ea=s.useCallback(e=>{if(te||Mt||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const a=e.shiftKey?50:10,u=e.key==="ArrowLeft"?-a:a,w=Math.max(nn,Math.min(sn,Te+u));vt(w),At(w)},[te,At,Te,Mt]),Es=s.useCallback(e=>{const a=j.find(u=>u.id===e);O("direct",e,a?.lastMessageAt??a?.updatedAt),W(e),Ke(!1),te&&he(!1)},[j,te,O,W]),kn=s.useCallback(()=>{W(""),he(!0),Ke(!1)},[W]),Rn=s.useCallback(()=>{l.selectRoom(null),he(!0),Ke(!1)},[l]),Ta=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(rn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:o("chat.startNewConversation","Start a new conversation")}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>T(!0),children:[t.jsx(mt,{size:16}),o("chat.newChat","New Chat")]})]}),Oe=fa(f,f?.agentId?je.get(f.agentId)??null:null,nt),An=s.useMemo(()=>{if(!Oe?.provider||!Oe.modelId)return null;const e=Ft.find(a=>a.provider===Oe.provider&&a.id===Oe.modelId);return e?.contextWindow?e.contextWindow:null},[Oe?.modelId,Oe?.provider,Ft]),ja=s.useMemo(()=>Jr(C,N?F:void 0),[N,C,F]),Ve=Us(Oe?.provider,Oe?.modelId),Je=Oe?.provider??null,Nn=!!(f||N||C.length>0),qt=m==="rooms"?ve:!!f,Ts=s.useRef(qt);s.useEffect(()=>{const e=Ts.current;Ts.current=qt,te&&(e||!qt||cs({type:"view",revert:m==="rooms"?Rn:kn}))},[m,kn,Rn,qt,te,cs]);const js=f?.agentId===pt?Ve??"Fusion":f?.title||je.get(f?.agentId??"")?.name||f?.agentId||"Chat",Da=f?.title||o("chat.untitledSession","Untitled"),Fa=!!(Ve&&Ve!==js),Ia=!te&&Nn&&An!==null,Ds=ia(ja),Qt=An!==null?ia(An):null,En=Qt?o("chat.contextWindowAria","Estimated {{used}} of {{total}} context tokens",{used:Ds,total:Qt}):null,La=te&&m==="direct"&&!!f,Fs=te&&m==="direct"&&Nn,Tn=je.get(f?.agentId??"")?.name||(f?.agentId===pt?Ve??"Fusion":f?.agentId?.slice(0,30)??"Fusion"),jn=!1,Dn=f?.agentId===pt,Pa=e=>e.length>50?`${e.slice(0,50)}…`:e;s.useEffect(()=>{if(!Lt)return;const e=a=>{us.current?.contains(a.target)||Ke(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[Lt]),s.useEffect(()=>{if(!Pt)return;const e=u=>{ms.current?.contains(u.target)||xt(!1)},a=u=>{u.key==="Escape"&&xt(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",a),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",a)}},[Pt]),s.useEffect(()=>{(!te||m!=="direct"||qe)&&Ke(!1)},[te,m,qe]),s.useEffect(()=>{xt(!1)},[l.activeRoom?.id]);const Fn=s.useCallback((e,a)=>{const u=St.current.get(e);u&&window.clearTimeout(u),is(P=>({...P,[e]:a}));const w=window.setTimeout(()=>{is(P=>{const{[e]:ne,...ue}=P;return ue}),St.current.delete(e)},2e3);St.current.set(e,w)},[]),Is=s.useCallback(async(e,a)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(a),Fn(e,"success")}catch{Fn(e,"error")}},[Fn]),In=f?.agentId===pt,Ln=s.useCallback((e,a,u)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${rt[e]==="success"?" chat-message-copy-action--success":""}${rt[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":u??`chat-copy-response-${e}`,"aria-label":rt[e]==="success"?o("chat.responseCopied","Response copied"):rt[e]==="error"?o("chat.copyFailed","Copy failed"):o("chat.copyResponse","Copy response"),onClick:()=>{Is(e,a)},children:rt[e]==="success"?t.jsx(vr,{size:14}):t.jsx(yr,{size:14})}),[rt,Is]),Pn=s.useCallback(e=>{const a=Re.current;if(!a)return;const u=`[data-testid="chat-message-${e}"]`,w=a.querySelector(u);if(!w)return;const P=w.getBoundingClientRect().top-a.getBoundingClientRect().top+a.scrollTop,ne=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;a.scrollTo({top:P,behavior:ne?"auto":"smooth"})},[]),Ls=f?.cliExecutorAdapterId??null,_a=!!Ls,$a=Ls==="generic"?"generic":"hybrid",Oa=f?.cliSessionFile||f?.id||"",Ps=()=>t.jsxs("div",{className:"chat-messages",ref:Re,onScroll:ys,children:[t.jsx("div",{ref:ds,className:"chat-load-more-sentinel",children:V&&M&&t.jsx("div",{className:"chat-loading-older",children:o("chat.loadingOlderMessages","Loading older messages…")})}),N?t.jsxs(t.Fragment,{children:[C.map((e,a)=>t.jsx(zn,{message:e,forcePlain:!1,agentName:Tn,hideAssistantIdentity:Dn,showAssistantModelTag:jn,activeModelTag:Ve,activeModelProvider:Je,activeSessionId:f?.id??null,mentionAgentsByName:yn,roomContext:null,copyAction:In&&e.role==="assistant"?Ln(e.id,e.content):void 0,onScrollToTop:Pn,isAwaitingQuestionAnswer:e.role==="assistant"&&a===C.length-1&&!N,submittedQuestionAnswer:da(C,a),onQuestionSubmit:Gt},e.id)),t.jsx(kr,{streamingText:F,streamingThinking:E,streamingToolCalls:A,forcePlain:!1,agentName:Tn,hideAssistantIdentity:Dn,showAssistantModelTag:jn,activeModelTag:Ve,activeModelProvider:Je,copyAction:In&&F?Ln("__streaming__",F,"chat-copy-response-streaming"):void 0,onQuestionSubmit:Gt})]}):M?t.jsx("div",{className:"chat-empty-state",children:o("chat.loadingMessages","Loading messages...")}):C.length===0&&!f?Ta():C.length===0&&f?t.jsx("div",{className:"chat-empty-state",children:o("chat.noMessagesYet","No messages yet. Start the conversation!")}):t.jsx(t.Fragment,{children:C.map((e,a)=>t.jsx(zn,{message:e,forcePlain:!1,agentName:Tn,hideAssistantIdentity:Dn,showAssistantModelTag:jn,activeModelTag:Ve,activeModelProvider:Je,activeSessionId:f?.id??null,mentionAgentsByName:yn,roomContext:null,copyAction:In&&e.role==="assistant"?Ln(e.id,e.content):void 0,onScrollToTop:Pn,isAwaitingQuestionAnswer:e.role==="assistant"&&a===C.length-1&&!N,submittedQuestionAnswer:da(C,a),onQuestionSubmit:Gt},e.id))}),t.jsx("div",{ref:ls})]}),_s=()=>t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:zt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{lt(e.target.files),e.target.value=""}}),h&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":o("chat.skillSuggestions","Skill suggestions"),children:un?t.jsx("div",{className:"chat-skill-menu-empty",children:o("chat.loadingSkills","Loading skills…")}):Ne.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:x?o("chat.noSkillsFound","No skills found"):o("chat.noSkillsAvailable","No skills available")}):Ne.map((e,a)=>t.jsxs("button",{type:"button",role:"option","aria-selected":a===se,className:`chat-skill-menu-item${a===se?" chat-skill-menu-item--highlighted":""}`,onMouseDown:u=>u.preventDefault(),onMouseEnter:()=>H(a),onClick:()=>Sn(e),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.relativePath,children:e.relativePath})]},e.id))}),Se.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Se.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>ws(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),U.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-pending-stack","data-testid":"chat-pending-stack",children:U.map((e,a)=>t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:o("chat.queuedMessage","Queued: {{preview}}",{preview:Pa(e)})}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":o("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":`chat-pending-dismiss-${a}`,onClick:()=>X(a),children:"×"})]},`${a}-${e}`))}),t.jsx("div",{className:"chat-pending-divider","aria-hidden":"true"})]}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":o("chat.attachFiles","Attach files"),onClick:()=>zt.current?.click(),children:t.jsx(Vs,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${rs?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),at(!0)},onDragLeave:()=>at(!1),onDrop:e=>{e.preventDefault(),at(!1),lt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:Cs,className:"chat-input-textarea",placeholder:o("chat.typeMessage","Type a message..."),value:z,onChange:Ms,onKeyDown:Ss,onKeyUp:ks,onClick:Xt,onBlur:Rs,onFocus:As,onPaste:xs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Hn()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(sa,{agents:it,filter:Q,highlightedIndex:J,visible:K,onSelect:Vt,position:"below",roomMemberIds:_e?.memberIds,roomName:_e?.roomName}),t.jsx(zr,{visible:ce.mentionActive&&!K,position:xa,tasks:ce.tasks,files:ce.files,selectedIndex:ce.selectedIndex,onSelectTask:e=>{Rt(ce.selectTask(e,z),`#${e.id}`)},onSelectFile:e=>{Rt(ce.selectFile(e,z),`#${e.path}`)},loading:ce.loading})]}),t.jsx(Ws,{isStreaming:N,canSend:!!(z.trim()||Se.length>0),onSend:xn,onStop:le})]})]}),Ba=te?void 0:{width:`${Te}px`},za=La?t.jsxs("div",{className:"chat-mobile-session-menu",ref:us,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":Lt,onClick:()=>Ke(e=>!e),children:[Je?t.jsx($n,{provider:Je,size:"md"}):t.jsx(Qn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Da}),t.jsx(Yt,{size:16,"aria-hidden":"true"})]}),Lt&&t.jsxs("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:[j.map(e=>t.jsxs("div",{className:`chat-mobile-session-option-row${f?.id===e.id?" chat-mobile-session-option-row--active":""}`,role:"none",children:[t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${f?.id===e.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${e.id}`,onClick:()=>Es(e.id),children:t.jsx("span",{className:"chat-mobile-session-option-title",children:e.title||o("chat.untitledSession","Untitled")})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-rename","data-testid":`chat-mobile-session-rename-${e.id}`,"aria-label":o("chat.renameConversationAria","Rename conversation {{title}}",{title:e.title||o("chat.untitledSession","Untitled")}),onClick:()=>Mn(e.id),children:t.jsx(On,{size:14})})]},e.id)),t.jsxs("button",{type:"button",role:"menuitem",className:"chat-mobile-session-new","data-testid":"chat-mobile-session-new",onClick:()=>{Ke(!1),T(!0)},children:[t.jsx(mt,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:o("chat.newChat","New Chat")})]})]})]}):null,Ha=t.jsxs("div",{className:"chat-sidebar-scope-toggle chat-view-header-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${m==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":m==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>I("direct"),children:[t.jsx(rn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:o("chat.scopeDirect","Direct")})]}),t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${m==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":m==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>I("rooms"),children:[t.jsx(ba,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:o("chat.scopeRooms","Rooms")})]})]});return t.jsxs("div",{ref:gs,className:`chat-view${i?" chat-view--floating":""}${te?" chat-view--narrow":""}${Fs?" chat-view--mobile-direct-thread":""}`,children:[t.jsx(wr,{icon:rn,title:o("chat.title","Chat"),actions:t.jsxs(t.Fragment,{children:[Fs?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn-icon chat-back-btn",onClick:kn,"data-testid":"chat-back-btn","aria-label":o("chat.backToConversations","Back to conversations"),children:t.jsx(Ks,{size:16})}),za]}):Ha,te?null:t.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:()=>T(!0),"data-testid":"chat-new-btn",children:[t.jsx(mt,{size:14}),o("chat.newChat","New Chat")]}),!i&&c?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:c,"aria-label":o("chat.popOut","Pop out chat"),title:o("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:t.jsx(Gs,{size:16})}):null,i&&d?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:d,"aria-label":o("chat.maximizeToChatView","Open in Chat view"),title:o("chat.maximizeToChatView","Open in Chat view"),"data-testid":"chat-modal-maximize",children:t.jsx(Gs,{size:16})}):null,i&&b?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:b,"aria-label":o("chat.minimizeToQuickChat","Minimize to quick chat"),title:o("chat.minimizeToQuickChat","Minimize to quick chat"),"data-testid":"chat-modal-minimize",children:t.jsx(xr,{size:16})}):null,i&&p?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:p,"aria-label":o("chat.closeChat","Close chat"),title:o("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:t.jsx(Cr,{size:16})}):null]})}),t.jsxs("div",{className:"chat-view__body",children:[t.jsxs("div",{className:`chat-sidebar${qe?"":" chat-sidebar--hidden"}`,style:Ba,children:[m==="direct"?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-sidebar-search-container",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Sr,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:o("chat.searchConversations","Search conversations..."),value:y,onChange:e=>L(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:B?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:o("chat.loadingConversations","Loading...")}):j.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:o("chat.noConversationsYet","No conversations yet")}):j.map(e=>{const a=f?.id===e.id,u=!a&&re("direct",e.id,e.lastMessageAt??e.updatedAt),w=fa(e,je.get(e.agentId)??null,nt),P=Us(w?.provider,w?.modelId)??"Fusion",ne=e.title||o("chat.untitledSession","Untitled");return t.jsxs("div",{className:`chat-session-item${a?" chat-session-item--active":""}`,onClick:()=>Es(e.id),onContextMenu:ue=>{ue.preventDefault(),ee({sessionId:e.id,x:ue.clientX,y:ue.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsxs("div",{className:"chat-session-actions",children:[t.jsx("button",{type:"button",className:"btn-icon chat-session-action-btn chat-session-rename-btn",onClick:ue=>{ue.stopPropagation(),Mn(e.id)},"data-testid":"chat-session-rename-btn","aria-label":o("chat.renameConversationAria","Rename conversation {{title}}",{title:ne}),children:t.jsx(On,{size:14})}),t.jsx("button",{type:"button",className:"btn-icon chat-session-action-btn chat-session-delete-btn",onClick:ue=>{ue.stopPropagation(),De(e.id)},"data-testid":"chat-session-delete-btn","aria-label":o("chat.deleteConversation","Delete conversation"),children:t.jsx(Bn,{size:14})})]}),t.jsxs("div",{className:"chat-session-title",children:[ne,u?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":o("chat.unreadMessages","Unread messages")}):null]}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||o("chat.noMessages","No messages")}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[w?.provider?t.jsx($n,{provider:w.provider,size:"sm"}):null,t.jsx("span",{children:je.get(e.agentId)?.name||(e.agentId===pt?P:e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?no(e.updatedAt,o):""})]})]},e.id)})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!te&&t.jsx("div",{className:"chat-sidebar-rooms-header","data-testid":"chat-sidebar-rooms-header",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>tt(!0),children:[t.jsx(mt,{size:14}),o("chat.createRoom","Create room")]})}),l.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:o("chat.noRoomsYet","No rooms yet.")}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l.rooms.map(e=>{const a=l.activeRoom?.id===e.id,u=!a&&re("room",e.id,e.updatedAt);return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${a?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{O("room",e.id,e.updatedAt),l.selectRoom(e.id),te&&he(!1)},onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),O("room",e.id,e.updatedAt),l.selectRoom(e.id),te&&he(!1))},children:[t.jsxs("span",{className:"chat-room-item-details",children:[t.jsxs("span",{className:"chat-room-item-name-row",children:[t.jsxs("span",{className:"chat-room-item-name",children:["#",e.name]}),u?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":o("chat.unreadMessages","Unread messages")}):null]}),a?t.jsx("span",{className:"chat-room-item-meta",children:o("chat.roomMemberCount","{{count}} member",{count:l.activeRoomMembers.length,defaultValue_one:"{{count}} member",defaultValue_other:"{{count}} members"})}):null]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":o("chat.deleteRoom","Delete room {{name}}",{name:e.name}),onClick:w=>{w.stopPropagation(),ge(e.id)},children:t.jsx(Bn,{size:14})})]},e.id)})})]}),m==="rooms"?te?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary chat-sidebar-footer-btn","data-testid":"chat-create-room-btn",onClick:()=>tt(!0),children:[t.jsx(mt,{size:14}),o("chat.createRoom","Create room")]})}):null:te?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>T(!0),"data-testid":"chat-new-btn",children:[t.jsx(mt,{size:14}),o("chat.newChat","New Chat")]})}):null]}),!te&&qe&&!Mt&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":nn,"aria-valuemax":sn,"aria-valuenow":Te,"aria-label":o("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:Na,onKeyDown:Ea}),be&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:be.y,left:be.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Mn(be.sessionId),"data-testid":"chat-context-rename",children:[t.jsx(On,{size:14}),o("chat.rename","Rename")]}),t.jsxs("button",{onClick:()=>Ra(be.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Mr,{size:14}),o("chat.archive","Archive")]}),t.jsxs("button",{onClick:()=>{ee(null),De(be.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(Bn,{size:14}),o("chat.delete","Delete")]})]}),ye&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>we(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"chat-rename-dialog-title",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{id:"chat-rename-dialog-title",children:o("chat.renameConversationTitle","Rename Conversation")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("chat.renameConversationBody","Choose a new name for this conversation. Leave it blank to show Untitled.")}),t.jsx("label",{className:"chat-rename-label",htmlFor:"chat-rename-input",children:o("chat.conversationName","Conversation name")}),t.jsx("input",{id:"chat-rename-input",className:"input chat-rename-input",type:"text",value:He,placeholder:o("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:e=>Ue(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),Ns())},autoFocus:!0}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>we(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Ns(),"data-testid":"chat-rename-save",children:o("chat.save","Save")})]})]})}),xe&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>De(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:o("chat.deleteConversationTitle","Delete Conversation?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("chat.deleteConversationBody","This action cannot be undone. All messages in this conversation will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>De(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Aa(xe),children:o("chat.delete","Delete")})]})]})}),jt&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>ge(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:o("chat.deleteRoomTitle","Delete Room?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("chat.deleteRoomBody","This action cannot be undone. This room and all its messages will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>ge(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await l.deleteRoom(jt),ge(null)}catch{r(o("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:o("chat.delete","Delete")})]})]})}),m==="rooms"?t.jsxs("div",{ref:gn,className:"chat-thread",children:[l.activeRoom?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-room-thread-header",children:[te&&t.jsx("button",{className:"btn-icon",onClick:Rn,"data-testid":"chat-back-btn",children:t.jsx(Ks,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:ms,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":Pt,onClick:()=>xt(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",l.activeRoom.name]}),t.jsx(Yt,{size:16,"aria-hidden":"true"})]}),Pt&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:l.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===l.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{O("room",e.id,e.updatedAt),l.selectRoom(e.id),xt(!1)},children:["#",e.name]},e.id))})]}),t.jsx("div",{className:"chat-room-thread-members",children:l.activeRoomMembers.map(e=>t.jsx(ln,{agent:je.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:Re,onScroll:ys,children:[l.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:o("chat.loadingMessages","Loading messages...")}):l.messages.filter(e=>e.content.trim()!==ca).length===0?t.jsx("div",{className:"chat-empty-state",children:o("chat.noMessagesYet","No messages yet. Start the conversation!")}):l.messages.filter(e=>e.content.trim()!==ca).map(e=>{const a=e.senderAgentId?je.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):o("chat.you","You"),u={id:e.id,sessionId:e.roomId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:e.attachments,createdAt:e.createdAt};return t.jsx(zn,{message:u,forcePlain:!1,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:l.activeRoom?.id??null,mentionAgentsByName:yn,roomContext:_e,onScrollToTop:Pn,isAwaitingQuestionAnswer:!1,onQuestionSubmit:Gt},e.id)}),t.jsx("div",{ref:ls})]}),l.activeRoom&&os&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Fe("fab-click"),children:[t.jsx(Yt,{size:14}),o("chat.latest","Latest")]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:o("chat.selectRoomOrCreate","Select a room or create one")}),l.activeRoom&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:zt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{lt(e.target.files),e.target.value=""}}),Se.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:Se.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>ws(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":o("chat.attachFiles","Attach files"),onClick:()=>zt.current?.click(),children:t.jsx(Vs,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${rs?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),at(!0)},onDragLeave:()=>at(!1),onDrop:e=>{e.preventDefault(),at(!1),lt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:Cs,className:"chat-input-textarea",placeholder:o("chat.typeMessage","Type a message..."),value:z,onChange:Ms,onKeyDown:Ss,onKeyUp:ks,onClick:Xt,onBlur:Rs,onFocus:As,onPaste:xs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Hn()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(sa,{agents:it,filter:Q,highlightedIndex:J,visible:K,onSelect:Vt,position:"below",roomMemberIds:_e?.memberIds,roomName:_e?.roomName})]}),t.jsx(Ws,{isStreaming:!1,canSend:!!(z.trim()||Se.length>0),onSend:Cn})]})]})]}):t.jsxs("div",{ref:gn,className:"chat-thread",children:[!te&&(Nn||!te)&&t.jsx("div",{className:"chat-thread-header",children:t.jsxs("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:[Je?t.jsx($n,{provider:Je,size:"md"}):t.jsx(Qn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:js}),Fa&&t.jsx("span",{className:"chat-model-tag",children:Ve}),Ia&&Qt&&En?t.jsxs("span",{className:"chat-thread-header-context","data-testid":"chat-thread-context-window",title:En,"aria-label":En,children:[Ds," / ",Qt]}):null]})}),_a?t.jsx(Kr,{cliSessionId:Oa,tier:$a,projectId:n,renderTranscript:Ps,renderComposer:()=>f?_s():null}):t.jsxs(t.Fragment,{children:[Ps(),os&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Fe("fab-click"),children:[t.jsx(Yt,{size:14}),o("chat.latest","Latest")]}),f&&_s()]})]}),t.jsx(Ur,{isOpen:dn,onClose:()=>tt(!1),projectId:n,existingRoomNames:l.rooms.map(e=>e.name),onCreate:async e=>{await l.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),m!=="rooms"&&I("rooms"),tt(!1),te&&he(!1)}})]}),S&&t.jsx(co,{projectId:n,defaultModel:nt,onClose:()=>T(!1),onCreate:ka})]})}export{vo as ChatView,to as clampChatInputHeight,eo as resolveChatInputOverflowY,fa as resolveSessionProvider};
@@ -1 +0,0 @@
1
- import{r as d,j as e}from"./vendor-react-SZ_qB27O.js";import{af as Me,ag as Ue,ah as $e,ai as ce,aj as qe,X as ge,ak as Ve,al as Te,am as de,P as pe,an as me,J as he,R as be,ao as We,a4 as Ke,ap as Qe,aq as Je,ar as Ye,as as Xe,at as Ze,au as es,av as ss,aw as O,ax as ns,ay as is}from"./index-D7eX7QJk.js";import{D as ts}from"./DirectoryPicker-BDe9G84f.js";import{u as as}from"./vendor-i18n-GF3RlKbq.js";import"./vendor-reactflow-CnI7NMXG.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-xterm-BNq00GSj.js";import"./folder-open-DO1rnCxq.js";const Ne="fusion-plugin-agent-browser",ye={enabled:{type:"boolean",label:"Enable Agent Browser",group:"General"},installChannel:{type:"enum",label:"Install Channel",enumValues:["stable","beta","nightly"],defaultValue:"stable",group:"General"},commandTimeoutMs:{type:"number",label:"Command Timeout (ms)",defaultValue:12e4,group:"General"},headlessMode:{type:"boolean",label:"Headless Mode",defaultValue:!0,group:"Browser"},allowedDomains:{type:"array",label:"Allowed Domains",itemType:"string",group:"Browser"},promptExecutorSystem:{type:"string",label:"Executor System Prompt",multiline:!0,group:"Prompt Contributions"},promptExecutorTask:{type:"string",label:"Executor Task Prompt",multiline:!0,group:"Prompt Contributions"},promptTriage:{type:"string",label:"Triage Prompt",multiline:!0,group:"Prompt Contributions"},promptReviewer:{type:"string",label:"Reviewer Prompt",multiline:!0,group:"Prompt Contributions"},promptHeartbeat:{type:"string",label:"Heartbeat Prompt",multiline:!0,group:"Prompt Contributions"},skillExposure:{type:"enum",label:"Skill Exposure",enumValues:["none","selected","all"],defaultValue:"selected",group:"Skills"}},xe={General:"plugins.agentBrowser.groupGeneral",Browser:"plugins.agentBrowser.groupBrowser","Prompt Contributions":"plugins.agentBrowser.groupPromptContributions",Skills:"plugins.agentBrowser.groupSkills"},fe={"Enable Agent Browser":"plugins.agentBrowser.labelEnabled","Install Channel":"plugins.agentBrowser.labelInstallChannel","Command Timeout (ms)":"plugins.agentBrowser.labelCommandTimeoutMs","Headless Mode":"plugins.agentBrowser.labelHeadlessMode","Allowed Domains":"plugins.agentBrowser.labelAllowedDomains","Executor System Prompt":"plugins.agentBrowser.labelPromptExecutorSystem","Executor Task Prompt":"plugins.agentBrowser.labelPromptExecutorTask","Triage Prompt":"plugins.agentBrowser.labelPromptTriage","Reviewer Prompt":"plugins.agentBrowser.labelPromptReviewer","Heartbeat Prompt":"plugins.agentBrowser.labelPromptHeartbeat","Skill Exposure":"plugins.agentBrowser.labelSkillExposure"},je=[{id:"fusion-plugin-hermes-runtime",name:"Hermes Runtime",description:"Runtime provider for Hermes CLI-backed execution.",category:"runtime",path:"./plugins/fusion-plugin-hermes-runtime",experimental:!0},{id:"fusion-plugin-paperclip-runtime",name:"Paperclip Runtime",description:"Runtime provider for Paperclip agent connections.",category:"runtime",path:"./plugins/fusion-plugin-paperclip-runtime"},{id:"fusion-plugin-openclaw-runtime",name:"OpenClaw Runtime",description:"Runtime provider for OpenClaw execution.",category:"runtime",path:"./plugins/fusion-plugin-openclaw-runtime",experimental:!0},{id:"fusion-plugin-droid-runtime",name:"Droid Runtime",description:"Runtime provider for Droid CLI execution.",category:"runtime",path:"./plugins/fusion-plugin-droid-runtime",experimental:!0},{id:"fusion-plugin-dependency-graph",name:"Dependency Graph",description:"Dashboard plugin for task dependency graph visualization.",category:"integration",path:"./plugins/fusion-plugin-dependency-graph"},{id:"fusion-plugin-reports",name:"Reports",description:"View report history, compare runs side-by-side, and export standalone HTML summaries.",category:"integration",path:"./plugins/fusion-plugin-reports"},{id:"fusion-plugin-whatsapp-chat",name:"WhatsApp Chat",description:"Pairs to WhatsApp Web (multi-device) with QR or pairing code, then bridges direct chats to a Fusion agent.",category:"integration",path:"./plugins/fusion-plugin-whatsapp-chat"},{id:"fusion-plugin-cli-printing-press",name:"CLI Printing Press",description:"Guided wizard for drafting external service CLI definitions.",category:"integration",path:"./plugins/fusion-plugin-cli-printing-press"},{id:"fusion-plugin-compound-engineering",name:"Compound Engineering",description:"A dedicated dashboard surface for compound-engineering artifacts and interactive ce-* sessions.",category:"integration",path:"./plugins/fusion-plugin-compound-engineering"},{id:"fusion-plugin-linear-import",name:"Linear Import",description:"Browse Linear issues and import selected issues as Fusion triage tasks through plugin-owned settings.",category:"integration",path:"./plugins/fusion-plugin-linear-import"},{id:Ne,name:"Agent Browser",description:"Built-in integration metadata. Package install support lands in FN-3101.",category:"integration",hasSetup:!0}],F={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function ls(r){const o=r.settingsSchema,n=o&&Object.keys(o).length>0;return r.id!==Ne?n?o:void 0:n?{...ye,...o}:ye}function rs(r){const o=new Map,n=[];for(const[j,y]of Object.entries(r))if(y.group){const v=o.get(y.group)??[];v.push([j,y]),o.set(y.group,v)}else n.push([j,y]);return{grouped:o,ungrouped:n}}function Se(r,o="plugin-error-text"){return r.state!=="error"||!r.error?null:e.jsx("p",{className:o,title:r.error,children:r.error})}function ys({addToast:r,projectId:o}){const{t:n}=as("app"),[j,y]=d.useState([]),[v,z]=d.useState(!0),[ve,L]=d.useState(!1),[E,A]=d.useState(""),[_,H]=d.useState(!1),[M,U]=d.useState(!1),[w,$]=d.useState(null),[c,G]=d.useState(null),[m,x]=d.useState({}),[we,q]=d.useState(!1),[V,T]=d.useState(null),[W,Pe]=d.useState([]),[Ce,K]=d.useState(!0),[Q,J]=d.useState(null),[b,Re]=d.useState(""),[f,Ie]=d.useState(""),[Ee,Y]=d.useState(null),P=d.useRef(null),[Be,D]=d.useState({}),[ke,X]=d.useState(null),[B,Z]=d.useState(null),{confirm:Fe}=Me(),h=d.useCallback(async()=>{try{z(!0);const s=await Ue(o);y(s)}catch(s){r(n("plugins.loadFailed","Failed to load plugins: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{z(!1)}},[o,r]),S=d.useCallback(async(s=b,i=f)=>{try{K(!0),J(null);const l=await $e(s,i||void 0,o);Pe(l)}catch(l){const u=l instanceof Error?l.message:String(l);J(u)}finally{K(!1)}},[o,f,b]);d.useEffect(()=>{h()},[h]),d.useEffect(()=>(P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{S(b,f)},300),()=>{P.current&&clearTimeout(P.current)}),[S,f,b]),d.useEffect(()=>{const s=je.filter(l=>l.hasSetup&&j.some(u=>u.id===l.id));if(s.length===0)return;let i=!1;return Promise.all(s.map(async l=>{try{const u=await ce(l.id,o);if(i)return;D(g=>({...g,[l.id]:u}))}catch{if(i)return;D(u=>({...u,[l.id]:{hasSetup:!0,setupCheckDeferred:!0,deferredReason:"plugin-not-started",pluginState:"installed"}}))}})),()=>{i=!0}},[j,o]);const Le=d.useRef([]);Le.current=j,d.useEffect(()=>{const s=o?`?projectId=${encodeURIComponent(o)}`:"",i=l=>{try{const u=JSON.parse(l.data);if(u.scope==="project"&&(u.projectId??o)!==o)return;switch(u.transition){case"installing":case"enabled":case"disabled":case"settings-updated":S(b,f),y(g=>{const a=g.findIndex(t=>t.id===u.pluginId);if(a>=0){const t=[...g];return t[a]={...t[a],enabled:u.enabled,state:u.state,settings:u.settings,error:u.error},t}else return h(),g});break;case"state-changed":y(g=>{const a=g.findIndex(t=>t.id===u.pluginId);if(a>=0){const t=[...g];return t[a]={...t[a],state:u.state,error:u.error},t}return g});break;case"uninstalled":y(g=>g.filter(a=>a.id!==u.pluginId)),S(b,f);break;case"error":y(g=>{const a=g.findIndex(t=>t.id===u.pluginId);if(a>=0){const t=[...g];return t[a]={...t[a],state:u.state,error:u.error},t}return g});break}}catch{}};return qe(`/api/events${s}`,{events:{"plugin:lifecycle":i},onReconnect:()=>{h(),S(b,f)}})},[o,h,S,f,b]);const ee=async()=>{if(!E.trim()){r(n("plugins.installPathRequired","Please enter a plugin path"),"error");return}try{H(!0),await O({path:E,...M?{aiScanOnLoad:!0}:{}},o),r(n("plugins.installedGlobally","Plugin installed globally"),"success"),L(!1),A(""),U(!1),await h()}catch(s){r(n("plugins.installFailed","Failed to install plugin: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{H(!1)}},Ae=async s=>{if(!s.path){r(n("plugins.builtinNoPackage","{{name}} is built in and does not have an installable package yet",{name:s.name}),"warning");return}try{T(s.id),await O({path:s.path},o),r(n("plugins.builtinInstalledGlobally","{{name}} installed globally",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.builtinInstallFailed","Failed to install {{name}}: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{T(null)}},Ge=async s=>{if(!s.path){r(n("plugins.registryNotInstallable","{{name}} is not available for one-click install yet",{name:s.name}),"warning");return}try{Y(s.id),await O({path:s.path},o),r(n("plugins.registryInstalled","{{name}} installed and enabled",{name:s.name}),"success"),await h(),await S(b,f)}catch(i){r(n("plugins.registryInstallFailed","Failed to install {{name}}: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{Y(null)}},se=async s=>{try{Z(s.id);const i=await is(s.id,o);if(!i.success){r(n("plugins.setupInstallFailed","Failed to install {{name}} setup: {{error}}",{name:s.name,error:i.error??n("plugins.unknownError","unknown error")}),"error");return}r(n("plugins.setupInstalled","{{name}} setup installed",{name:s.name}),"success"),X(s.id);const l=await ce(s.id,o);D(u=>({...u,[s.id]:l}))}catch(i){r(n("plugins.setupInstallFailed","Failed to install {{name}} setup: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{Z(null),X(null)}},ne=async s=>{try{const i=await es(s.id,o);if(i.state==="error"){r(n("plugins.enableFailed","Failed to enable {{name}}: {{error}}",{name:s.name,error:i.error??n("plugins.unknownError","unknown error")}),"error"),await h();return}r(n("plugins.enabledForProject","{{name}} enabled for this project",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.enablePluginFailed","Failed to enable plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},ie=async s=>{try{await Ze(s.id,o),r(n("plugins.disabledForProject","{{name}} disabled for this project",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.disablePluginFailed","Failed to disable plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},te=async s=>{try{$(s.id),await Xe(s.id,o),r(n("plugins.reloaded","{{name}} reloaded",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.reloadFailed","Failed to reload plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}finally{$(null)}},ae=async s=>{if(await Fe({title:n("plugins.uninstallTitle","Uninstall Plugin Globally"),message:n("plugins.uninstallConfirm",'Are you sure you want to uninstall "{{name}}" globally (all projects)?',{name:s.name}),danger:!0}))try{await ss(s.id,o),r(n("plugins.uninstalledGlobally","{{name}} uninstalled globally",{name:s.name}),"success"),await h(),G(null)}catch(l){r(n("plugins.uninstallFailed","Failed to uninstall plugin: {{error}}",{error:l instanceof Error?l.message:String(l)}),"error")}},De=async(s,i)=>{try{await Qe(s.id,{aiScanOnLoad:i},o),r(i?n("plugins.aiScanEnabled","AI scan on load enabled"):n("plugins.aiScanDisabled","AI scan on load disabled"),"success"),await h()}catch(l){r(n("plugins.updateFailed","Failed to update plugin: {{error}}",{error:l instanceof Error?l.message:String(l)}),"error")}},Oe=async s=>{try{await Je(s.id,o),r(n("plugins.rescanned","{{name}} rescanned",{name:s.name}),"success"),await h()}catch(i){r(n("plugins.rescanFailed","Failed to rescan plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},k=async s=>{G(s);try{q(!0);const i=await ns(s.id,o);x(i)}catch{x({})}finally{q(!1)}},ze=async()=>{if(c)try{await Ye(c.id,m,o),r(n("plugins.settingsSaved","Settings saved"),"success")}catch(s){r(n("plugins.saveSettingsFailed","Failed to save settings: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}};if(c)return e.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[e.jsxs("div",{className:"plugin-manager-detail-header",children:[e.jsx("button",{className:"btn-icon",onClick:()=>G(null),"aria-label":n("plugins.backToList","Back to plugin list"),children:e.jsx(ge,{size:16})}),e.jsxs("div",{className:"plugin-detail-title",children:[e.jsxs("div",{className:"plugin-detail-title-copy",children:[e.jsx("h4",{className:"plugin-detail-name",children:c.name}),Se(c,"plugin-error-text plugin-error-text--detail")]}),e.jsx("span",{className:"plugin-state-badge",style:{color:F[c.state]||F.installed},children:c.state})]})]}),e.jsxs("div",{className:"plugin-detail-content",children:[e.jsxs("div",{className:"plugin-detail-card",children:[c.description&&e.jsx("p",{className:"plugin-description",children:c.description}),c.author&&e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:n("plugins.author","Author:")}),c.author]}),c.homepage&&e.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[e.jsx("span",{className:"text-muted",children:n("plugins.homepage","Homepage:")}),e.jsxs("a",{href:c.homepage,target:"_blank",rel:"noopener noreferrer",children:[c.homepage,e.jsx(Ve,{size:12})]})]}),e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:n("plugins.version","Version:")}),c.version]})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h5",{className:"plugin-detail-section-heading",children:n("plugins.securityScan","Security Scan")}),e.jsxs("div",{className:"plugin-security-row",children:[e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:!!c.aiScanOnLoad,onChange:s=>void De(c,s.target.checked)}),n("plugins.enableAiScanBeforeLoad","Enable AI scan before load/reload")]}),e.jsxs("button",{className:"btn btn-secondary btn-sm",onClick:()=>void Oe(c),children:[e.jsx(Te,{size:14})," ",n("plugins.rescanAndReload","Rescan and Reload")]})]}),e.jsx("p",{className:"text-muted",children:n("plugins.aiScanHint","Turning this on only updates configuration. Use Rescan and Reload to run it now.")}),c.lastSecurityScan?e.jsxs("div",{className:"plugin-security-results",children:[e.jsxs("div",{className:"plugin-security-header",children:[e.jsx("span",{className:`plugin-state-badge plugin-security-badge plugin-security-badge--${c.lastSecurityScan.verdict}`,children:c.lastSecurityScan.verdict}),e.jsx("span",{className:"text-muted",children:c.lastSecurityScan.scannedAt})]}),e.jsx("p",{className:"plugin-security-summary",children:c.lastSecurityScan.summary}),e.jsxs("details",{children:[e.jsx("summary",{children:n("plugins.findings","Findings ({{count}})",{count:c.lastSecurityScan.findings.length})}),e.jsx("ul",{className:"plugin-security-findings",children:c.lastSecurityScan.findings.map((s,i)=>e.jsxs("li",{children:[e.jsx("strong",{children:s.severity})," ",s.category," — ",s.file,": ",s.reason]},`${s.file}-${i}`))})]})]}):e.jsx("p",{className:"text-muted",children:n("plugins.noSecurityScan","No security scan has been run yet.")})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h5",{className:"plugin-detail-section-heading",children:n("plugins.settings","Settings")}),we?e.jsx("p",{className:"text-muted",children:e.jsx(de,{label:n("plugins.loading","Loading...")})}):(()=>{const s=ls(c);return s&&Object.keys(s).length>0?e.jsxs("div",{className:"plugin-settings-form",children:[(()=>{const{grouped:i,ungrouped:l}=rs(s),u=[];l.length>0&&u.push({title:null,entries:l});for(const[g,a]of i.entries())u.push({title:g,entries:a});return u.map(g=>e.jsxs("div",{className:g.title?"plugin-settings-group":void 0,children:[g.title&&e.jsx("h6",{className:"plugin-settings-group-heading",children:xe[g.title]?n(xe[g.title],g.title):g.title}),g.entries.map(([a,t])=>{const N=`setting-${a}-help`,C=t.label?fe[t.label]?n(fe[t.label],t.label):t.label:a;return e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:`setting-${a}`,children:[C,t.required&&" *"]}),t.type==="string"&&!t.multiline&&e.jsx("input",{className:"input",type:"text",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="string"&&t.multiline&&e.jsx("textarea",{className:"input",id:`setting-${a}`,rows:4,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="password"&&e.jsx("input",{className:"input",type:"password",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="number"&&e.jsx("input",{className:"input",type:"number",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:Number(p.target.value)}),"aria-describedby":t.description&&!t.required?N:void 0}),t.type==="boolean"&&e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:m[a]??!1,onChange:p=>x({...m,[a]:p.target.checked})}),t.description]}),t.type==="enum"&&e.jsxs("select",{className:"select",id:`setting-${a}`,value:m[a]??"",onChange:p=>x({...m,[a]:p.target.value}),"aria-describedby":t.description&&!t.required?N:void 0,children:[e.jsx("option",{value:"",children:n("plugins.selectOption","Select...")}),t.enumValues?.map(p=>e.jsx("option",{value:p,children:p},p))]}),t.type==="array"&&e.jsxs("div",{className:"plugin-settings-array",children:[m[a]?.map((p,R)=>e.jsxs("div",{className:"plugin-settings-array-item",children:[e.jsx("input",{className:"input",type:t.itemType==="number"?"number":"text",value:p??"",onChange:ue=>{const I=ue.target.value,oe=[...m[a]||[]];oe[R]=t.itemType==="number"?Number(I):I,x({...m,[a]:oe})}}),e.jsx("button",{className:"btn-icon",onClick:()=>{const I=[...m[a]||[]];I.splice(R,1),x({...m,[a]:I})},"aria-label":n("plugins.removeItem","Remove item"),children:e.jsx(ge,{size:14})})]},R)),e.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const p=m[a]||[],R=t.itemType==="number"?0:"";x({...m,[a]:[...p,R]})},children:[e.jsx(pe,{size:14})," ",n("plugins.addItem","Add Item")]})]}),t.description&&!t.required&&!t.multiline&&e.jsx("span",{id:N,className:"form-help",children:t.description})]},a)})]},g.title??"ungrouped"))})(),e.jsx("button",{className:"btn btn-primary",onClick:ze,children:n("plugins.saveSettings","Save Settings")})]}):e.jsx("p",{className:"text-muted",children:n("plugins.noConfigurableSettings","No configurable settings.")})})()]}),e.jsxs("div",{className:"plugin-detail-actions",children:[c.state==="started"&&e.jsxs("button",{className:"btn btn-secondary",onClick:()=>te(c),disabled:w===c.id,children:[e.jsx(me,{size:14,className:w===c.id?"spin":""}),w===c.id?n("plugins.reloading","Reloading..."):n("plugins.reload","Reload")]}),c.enabled?e.jsx("button",{className:"btn btn-secondary",onClick:()=>ie(c),children:n("plugins.disableInProject","Disable in Project")}):e.jsx("button",{className:"btn btn-primary",onClick:()=>ne(c),children:n("plugins.enableInProject","Enable in Project")}),e.jsxs("button",{className:"btn btn-danger",onClick:()=>ae(c),children:[e.jsx(he,{size:14})," ",n("plugins.uninstallGlobally","Uninstall Globally")]})]})]})]});const le=new Map(j.map(s=>[s.id,s])),re=j,_e=()=>e.jsxs("section",{className:"plugin-registry-section","aria-label":n("plugins.browseRegistry","Browse Registry"),children:[e.jsxs("div",{className:"plugin-registry-header",children:[e.jsxs("div",{className:"plugin-registry-heading-copy",children:[e.jsx("h4",{className:"plugin-registry-heading",children:n("plugins.browseRegistry","Browse Registry")}),e.jsx("p",{className:"plugin-registry-description",children:n("plugins.registryDescription","Discover curated runtimes and integrations that can be added to this Fusion workspace.")})]}),e.jsxs("div",{className:"plugin-registry-controls",children:[e.jsxs("label",{className:"plugin-registry-category-label",children:[e.jsx("span",{className:"sr-only",children:n("plugins.registryCategory","Registry category")}),e.jsxs("select",{className:"select plugin-registry-category-select",value:f,onChange:s=>Ie(s.target.value),"aria-label":n("plugins.registryCategory","Registry category"),children:[e.jsx("option",{value:"",children:n("plugins.registryCategoryAll","All Categories")}),e.jsx("option",{value:"runtime",children:n("plugins.registryCategoryRuntime","Runtime")}),e.jsx("option",{value:"integration",children:n("plugins.registryCategoryIntegration","Integration")})]})]}),e.jsxs("label",{className:"plugin-registry-search-label",children:[e.jsx("span",{className:"sr-only",children:n("plugins.searchRegistry","Search registry")}),e.jsx("input",{className:"input plugin-registry-search-input",type:"search",value:b,onChange:s=>Re(s.target.value),placeholder:n("plugins.searchRegistryPlaceholder","Search registry plugins")})]})]})]}),Ce?e.jsxs("div",{className:"plugin-registry-state",role:"status",children:[e.jsx(be,{size:14,className:"spin"}),n("plugins.registryLoading","Loading registry...")]}):Q?e.jsxs("div",{className:"plugin-registry-state plugin-registry-state--error",role:"alert",children:[e.jsx("span",{children:n("plugins.registryLoadFailed","Failed to load registry: {{error}}",{error:Q})}),e.jsx("button",{className:"btn btn-secondary btn-sm plugin-registry-retry",onClick:()=>void S(b,f),children:n("plugins.retry","Retry")})]}):W.length===0?e.jsx("div",{className:"plugin-registry-state",children:b.trim()?n("plugins.registryEmptySearch","No registry plugins match your search."):n("plugins.registryEmpty","No registry plugins are available.")}):e.jsx("div",{className:"plugin-registry-list","aria-label":n("plugins.registryPluginResults","Registry plugin results"),children:W.map(s=>{const i=le.get(s.id),l=Ee===s.id;return e.jsxs("div",{className:"plugin-registry-item",children:[e.jsxs("div",{className:"plugin-registry-meta",children:[e.jsxs("div",{className:"plugin-registry-title-row",children:[e.jsx("span",{className:"plugin-registry-name",children:s.name}),e.jsxs("span",{className:"plugin-registry-version",children:["v",s.version]}),e.jsx("span",{className:"plugin-registry-badge",children:s.category}),s.installed&&e.jsxs("span",{className:"plugin-registry-status plugin-registry-status--installed",children:[n("plugins.statusInstalled","Installed"),s.installedVersion&&s.installedVersion!==s.version?` · v${s.installedVersion}`:""]})]}),e.jsx("span",{className:"plugin-registry-description-text",children:s.description}),e.jsx("span",{className:"plugin-registry-author",children:n("plugins.registryByAuthor","By {{author}}",{author:s.author})})]}),e.jsx("div",{className:"plugin-registry-actions",children:s.installed?e.jsx("button",{className:"btn btn-secondary btn-sm plugin-registry-action",onClick:()=>{i?k(i):h()},children:n("plugins.manage","Manage")}):s.canInstall?e.jsx("button",{className:"btn btn-primary btn-sm plugin-registry-action",onClick:()=>void Ge(s),disabled:l,children:l?n("plugins.installing","Installing..."):n("plugins.installFromRegistry","Install")}):e.jsx("span",{className:"plugin-registry-coming-soon",children:n("plugins.registryComingSoon","Coming Soon")})})]},s.id)})})]}),He=()=>e.jsxs("section",{className:"plugin-builtins-section","aria-label":n("plugins.builtinPlugins","Built-in Plugins"),children:[e.jsxs("div",{className:"plugin-builtins-header",children:[e.jsx("h4",{className:"plugin-builtins-heading",children:n("plugins.builtinPlugins","Built-in Plugins")}),e.jsx("p",{className:"plugin-builtins-description",children:n("plugins.builtinPluginsCatalog","Built-in plugin catalog for runtimes and integrations.")})]}),e.jsx("div",{className:"plugin-builtins-list","aria-label":n("plugins.builtinPluginRecommendations","Built-in plugin recommendations"),children:je.map(s=>{const i=le.get(s.id),l=!!i,u=Be[s.id],g=!!(u&&"setupCheckDeferred"in u&&u.setupCheckDeferred),a=u&&"status"in u?u.status:void 0,t=l&&s.hasSetup&&u?.hasSetup&&!g&&i?.state==="started"&&(a==="not-installed"||a==="error"),N=l&&u?.hasSetup&&a==="installed",C=ke===s.id,p=!s.path;return e.jsxs("div",{className:"plugin-builtins-item",children:[e.jsxs("div",{className:"plugin-builtins-meta",children:[e.jsx("span",{className:"plugin-builtins-name",children:s.name}),s.experimental&&e.jsx("span",{className:"plugin-builtins-runtime-badge",children:n("plugins.experimental","Experimental")}),e.jsx("span",{className:"plugin-builtins-runtime-badge",children:s.category}),e.jsx("span",{className:`plugin-builtins-status ${l?"plugin-builtins-status--installed":"plugin-builtins-status--available"}`,children:l?n("plugins.statusInstalled","Installed"):p?n("plugins.statusBuiltIn","Built in"):n("plugins.statusNotInstalled","Not installed")}),t&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--warning",children:n("plugins.setupRequired","Setup required")}),N&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--ready",children:n("plugins.setupReady","Setup ready")}),C&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--pending",children:n("plugins.checkingSetup","Checking setup...")}),g&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--deferred",children:n("plugins.startPluginToCheckSetup","Start plugin to check setup")}),e.jsx("span",{className:"plugin-builtins-description-text",children:s.description})]}),p?l&&t?e.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void se(s),disabled:B===s.id||C,children:B===s.id?n("plugins.settingUp","Setting up..."):n("plugins.installSetup","Install Setup")}):l&&i?e.jsx("button",{className:"btn btn-secondary btn-sm",onClick:()=>void k(i),children:n("plugins.manage","Manage")}):e.jsx("span",{className:"plugin-builtins-metadata-only",children:n("plugins.builtinMetadataOnly","Built-in metadata only")}):e.jsx("button",{className:`btn ${l&&!t?"btn-secondary":"btn-primary"} btn-sm`,onClick:()=>{if(!l){Ae(s);return}if(t){se(s);return}i&&k(i)},disabled:V===s.id||B===s.id||C,children:l?t?B===s.id?n("plugins.settingUp","Setting up..."):n("plugins.installSetup","Install Setup"):n("plugins.manage","Manage"):V===s.id?n("plugins.installing","Installing..."):n("plugins.installNamed","Install {{name}}",{name:s.name})})]},s.id)})})]});return e.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[e.jsxs("div",{className:"plugin-manager-header",children:[e.jsx("span",{className:"plugin-manager-header-title",children:n("plugins.installedPlugins","Installed Plugins")}),e.jsxs("div",{className:"plugin-manager-actions",children:[e.jsxs("button",{className:"btn btn-sm",onClick:h,title:n("plugins.refresh","Refresh"),"aria-label":n("plugins.refreshPluginList","Refresh plugin list"),children:[e.jsx(be,{size:14,className:v?"spin":""}),n("plugins.refresh","Refresh")]}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>L(!0),children:[e.jsx(pe,{size:14})," ",n("plugins.install","Install")]})]})]}),ve&&e.jsxs("div",{className:"plugin-install-form",children:[e.jsx("p",{className:"plugin-install-hint",children:n("plugins.installHint","Browse to a plugin package root (contains manifest.json) or a built dist directory.")}),e.jsx(ts,{value:E,onChange:A,placeholder:n("plugins.installPathPlaceholder","Absolute path to plugin directory or dist folder"),onInputKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),ee())}}),e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:M,onChange:s=>U(s.target.checked)}),n("plugins.enableAiSecurityScan","Enable AI security scan on load")]}),e.jsxs("div",{className:"plugin-install-actions",children:[e.jsx("button",{className:"btn btn-primary",onClick:ee,disabled:_||!E.trim(),children:_?n("plugins.installing","Installing..."):n("plugins.installPluginGlobally","Install Plugin Globally")}),e.jsx("button",{className:"btn btn-secondary",onClick:()=>{L(!1),A("")},children:n("plugins.cancel","Cancel")})]})]}),v?e.jsx("div",{className:"settings-empty-state",children:e.jsx(de,{label:n("plugins.loadingPlugins","Loading plugins...")})}):e.jsxs(e.Fragment,{children:[re.length===0?e.jsxs("div",{className:"settings-empty-state",children:[e.jsx(We,{size:32,className:"text-muted"}),e.jsx("p",{children:n("plugins.noPluginsInstalled","No plugins installed.")}),e.jsx("p",{className:"text-muted",children:n("plugins.noPluginsHint","Install a plugin to get started, or use the built-in catalog below.")})]}):e.jsx("div",{className:"plugin-list",children:re.map(s=>e.jsxs("div",{className:"plugin-item",children:[e.jsx("div",{className:"plugin-info",children:e.jsxs("div",{className:"plugin-copy",children:[e.jsxs("div",{className:"plugin-copy-header",children:[e.jsx("span",{className:"plugin-name",children:s.name}),e.jsxs("span",{className:"plugin-version text-muted",children:["v",s.version]}),e.jsx("span",{className:"plugin-state-badge",style:{color:F[s.state]||F.installed},children:s.state})]}),Se(s)]})}),e.jsxs("div",{className:"plugin-actions",children:[s.state==="started"&&e.jsx("button",{className:"btn-icon",onClick:()=>te(s),disabled:w===s.id,title:n("plugins.reload","Reload"),children:e.jsx(me,{size:14,className:w===s.id?"spin":""})}),e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>s.enabled?ie(s):ne(s),"aria-label":s.enabled?n("plugins.disablePlugin","Disable {{name}}",{name:s.name}):n("plugins.enablePlugin","Enable {{name}}",{name:s.name})}),e.jsx("span",{className:"toggle-slider"})]}),e.jsx("button",{className:"btn-icon",onClick:()=>k(s),title:n("plugins.settings","Settings"),children:e.jsx(Ke,{size:14})}),e.jsx("button",{className:"btn-icon",onClick:()=>ae(s),title:n("plugins.uninstallGloballyTitle","Uninstall globally"),children:e.jsx(he,{size:14})})]})]},s.id))}),He(),_e()]})]})}export{ye as AGENT_BROWSER_SETTINGS_SCHEMA,Ne as BUILTIN_AGENT_BROWSER_PLUGIN_ID,je as BUILTIN_PLUGINS,ys as PluginManager,F as STATE_COLORS};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-xterm-BNq00GSj.js","assets/vendor-react-SZ_qB27O.js","assets/vendor-xterm-LZoznX6r.css","assets/addon-fit-C1WQXRvu.js","assets/addon-unicode11-BVmNDUBM.js","assets/addon-webgl-uLc0RKcC.js"])))=>i.map(i=>d[i]);
2
- import{W as Te,Y as Q,$ as le,a0 as V,a1 as ce,a2 as F,a3 as ge,a4 as Ce,F as xe,a5 as J,a6 as Ne,a7 as Re,a8 as Pe,_ as B,a9 as je}from"./index-D7eX7QJk.js";import{r as i,j as t}from"./vendor-react-SZ_qB27O.js";import"./vendor-xterm-BNq00GSj.js";import{u as Me}from"./vendor-i18n-GF3RlKbq.js";import{S as De}from"./shield-alert-BdAjnDkU.js";import"./vendor-reactflow-CnI7NMXG.js";import"./vendor-codemirror-jBKmHyH0.js";const Le=32*1024,Oe=100,Ae="\x1B",ze=" ",Fe="",Be="\x1B[A",Ie="\x1B[B",Ke="\x1B[C",We="\x1B[D",I={ctrl:"Ctrl",escape:"Esc",tab:"Tab",ctrlC:"^C"};function de(u){if(u.length!==1)return null;const o=u.toUpperCase().charCodeAt(0);return o>=64&&o<=95?String.fromCharCode(o&31):null}function $e(){const[u,f]=i.useState(()=>J());return i.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const o=window.matchMedia(Ne),a=window.visualViewport,y=()=>f(J());return y(),typeof a?.addEventListener=="function"&&a.addEventListener("resize",y),typeof o.addEventListener=="function"?(o.addEventListener("change",y),()=>{o.removeEventListener("change",y),typeof a?.removeEventListener=="function"&&a.removeEventListener("resize",y)}):(o.addListener(y),()=>{o.removeListener(y),typeof a?.removeEventListener=="function"&&a.removeEventListener("resize",y)})},[]),u}function Ue(u,f){if(typeof window>"u")return"";const a=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/cli-sessions/ws?sessionId=${encodeURIComponent(u)}&ticket=${encodeURIComponent(f)}`;return je(a)}function Qe(){return/Mac|iPhone|iPad|iPod/i.test(navigator.platform)}function Ve(u){if(typeof window<"u"&&typeof window.atob=="function"){const f=window.atob(u),o=new Uint8Array(f.length);for(let a=0;a<f.length;a++)o[a]=f.charCodeAt(a);return new TextDecoder("utf-8").decode(o)}return Buffer.from(u,"base64").toString("utf8")}function nt({sessionId:u,readOnly:f=!1,posture:o,mode:a="live",projectId:y,onConfirmAdvance:E,showConfirmAdvance:K=!1,onOpenAdapterSettings:Y}){const{t:r}=Me("app"),T=i.useRef(null),g=i.useRef(null),j=i.useRef(null),_=i.useRef(null),[H,G]=i.useState(!1),[ue,W]=i.useState(!1),[Z,q]=i.useState(!1),C=$e(),{keyboardOpen:O,keyboardOverlap:me}=Te({enabled:C}),fe=i.useRef(null),[S,X]=i.useState(""),[x,A]=i.useState(!1),[ee,te]=i.useState(null),ne=f||ee===!0,M=!f&&ee===!1&&a==="live",b=i.useCallback(e=>{if(!e||!M)return;const n=_.current;n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:"input",data:e}))},[M]),N=i.useCallback(e=>{if(x){const n=de(e);if(A(!1),n){b(n);return}}b(e)},[x,b]),c=i.useCallback(e=>{e.preventDefault()},[]),pe=i.useCallback(e=>{e?.preventDefault?.(),S&&b(S),b("\r"),X("")},[S,b]),ye=i.useCallback(e=>{if(x&&e.length>S.length){const n=e.slice(S.length,S.length+1),d=de(n);if(A(!1),d){b(d);return}}X(e)},[x,S,b]);i.useEffect(()=>{K&&W(!1)},[K,u]);const D=i.useCallback((e,n)=>{const d=_.current;d?.readyState===WebSocket.OPEN&&d.send(JSON.stringify({type:"resize",cols:e,rows:n}))},[]),ie=i.useCallback(()=>{const e=g.current;if(!e)return;const n=Q(),d=le(n.fontFamily);e.options.fontFamily=d,T.current?.style.setProperty("--terminal-glyph-font-family",V(n.fontFamily)),e.options.fontSize=n.fontSize,e.options.cursorStyle=n.cursorStyle,e.options.cursorBlink=n.cursorBlink&&M;try{j.current?.fit?.(),D(e.cols,e.rows)}catch{}ce(n.fontSize,d).then(R=>{if(!(!R||g.current!==e||e.options.fontSize!==n.fontSize||e.options.fontFamily!==d)){F(e,d),e.options.fontSize=n.fontSize;try{j.current?.fit?.(),D(e.cols,e.rows),F(e,d),e.refresh(0,Math.max(0,e.rows-1))}catch{}}},()=>{})},[M,D]);i.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.key===Re&&ie()};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[ie]),i.useEffect(()=>{if(!u||typeof window>"u")return;let e=!1,n=null,d=null,R=0;te(null);const $=D,_e=p=>{if(R+=p,R<Le)return;const h=_.current;h?.readyState===WebSocket.OPEN&&h.send(JSON.stringify({type:"ack",bytes:R})),R=0};return(async()=>{let p;try{p=await Pe(`/cli-sessions/${encodeURIComponent(u)}/attach-ticket`,{method:"POST",body:JSON.stringify(y?{projectId:y}:{})})}catch{return}if(e)return;te(p.readOnly);const h=!f&&!p.readOnly&&a==="live",[{Terminal:Se},{FitAddon:ke},{Unicode11Addon:ve}]=await Promise.all([B(()=>import("./vendor-xterm-BNq00GSj.js").then(l=>l.x),__vite__mapDeps([0,1,2])),B(()=>import("./addon-fit-C1WQXRvu.js").then(l=>l.a),__vite__mapDeps([3,1])),B(()=>import("./addon-unicode11-BVmNDUBM.js").then(l=>l.a),__vite__mapDeps([4,1]))]);if(e||!T.current)return;const w=Q(),L=le(w.fontFamily);T.current.style.setProperty("--terminal-glyph-font-family",V(w.fontFamily));const s=new Se({convertEol:!1,cursorBlink:w.cursorBlink&&h,cursorStyle:w.cursorStyle,disableStdin:!h,scrollback:1e4,fontFamily:L,fontSize:w.fontSize}),P=new ke;s.loadAddon(P);const Ee=new ve;if(s.loadAddon(Ee),s.unicode.activeVersion="11",s.open(T.current),g.current=s,j.current=P,w.renderer==="auto"&&!J())try{const{WebglAddon:l}=await B(async()=>{const{WebglAddon:m}=await import("./addon-webgl-uLc0RKcC.js").then(k=>k.a);return{WebglAddon:m}},__vite__mapDeps([5,1]));if(!e){const m=new l;m.onContextLoss(()=>{try{m.dispose()}catch{}}),s.loadAddon(m)}}catch{}try{P.fit()}catch{}(async()=>{if(!(!await ce(w.fontSize,L)||e||g.current!==s||j.current!==P||s.options.fontSize!==w.fontSize||s.options.fontFamily!==L))try{F(s,L),s.options.fontSize=w.fontSize,P.fit(),$(s.cols,s.rows),F(s,L),s.refresh(0,Math.max(0,s.rows-1))}catch{}})(),h&&(s.onData(l=>{const m=_.current;m?.readyState===WebSocket.OPEN&&m.send(JSON.stringify({type:"input",data:l}))}),s.attachCustomKeyEventHandler(l=>{if(l.type!=="keydown"||!(Qe()?l.metaKey:l.ctrlKey)||l.altKey||l.shiftKey)return!0;const k=l.key.toLowerCase();if(k==="c"){const v=s.hasSelection()?s.getSelection():"";return v?(navigator.clipboard?.writeText(v).catch(()=>{}),!1):!0}if(k==="v"){const v=navigator.clipboard?.readText;return v&&v.call(navigator.clipboard).then(ae=>{if(!ae)return;const re=_.current;re?.readyState===WebSocket.OPEN&&re.send(JSON.stringify({type:"input",data:ae}))}).catch(()=>{}),!1}return!0})),n=new ResizeObserver(()=>{d&&clearTimeout(d),d=setTimeout(()=>{try{P.fit(),$(s.cols,s.rows)}catch{}},Oe)}),n.observe(T.current);const U=new WebSocket(Ue(u,p.ticket));_.current=U,U.onopen=()=>{$(s.cols,s.rows)},U.onmessage=l=>{let m;try{m=JSON.parse(typeof l.data=="string"?l.data:"")}catch{return}switch(m.type){case"scrollback":case"data":{if(typeof m.data!="string")return;const k=Ve(m.data),v=k.length;s.write(k,()=>_e(v));break}}}})(),()=>{e=!0,d&&clearTimeout(d),n&&n.disconnect();const p=_.current;if(p){p.onopen=null,p.onmessage=null,p.onclose=null,p.onerror=null;try{p.close()}catch{}_.current=null}const h=g.current;if(h){try{h.dispose()}catch{}g.current=null}j.current=null}},[u,f,a,y,D]);const se=i.useMemo(()=>a==="idle"?r("cliTerminal.replayIdle","Session idle"):a==="ended"?r("cliTerminal.replayEnded","Session ended"):null,[a,r]),be=i.useCallback(async()=>{if(E){q(!0);try{await E("advance"),W(!0)}finally{q(!1)}}},[E]),he=i.useCallback(async()=>{E&&await E("not-yet"),W(!0)},[E]),z=!!o?.elevated,oe=o?.elevatedFlags?.join(", "),we={"--terminal-glyph-font-family":V(Q().fontFamily)};return t.jsxs("div",{className:`cli-session-terminal${C?" cli-session-terminal--mobile":""}${C&&O?" cli-session-terminal--keyboard-open":""}`,"data-mode":a,"data-read-only":ne,"data-mobile":C,"data-keyboard-open":C&&O,children:[t.jsxs("header",{className:"cli-session-terminal__header",children:[o&&t.jsxs("div",{className:"cli-session-terminal__posture-wrap",children:[t.jsxs("button",{type:"button",className:`cli-posture-chip${z?" cli-posture-chip--elevated":""}`,"data-elevated":z,"aria-expanded":H,onClick:()=>G(e=>!e),children:[z?t.jsx(De,{size:13,"aria-hidden":"true"}):t.jsx(ge,{size:13,"aria-hidden":"true"}),t.jsx("span",{className:"cli-posture-chip__name",children:o.adapterName}),o.mode&&t.jsx("span",{className:"cli-posture-chip__mode",children:o.mode}),z&&oe&&t.jsx("span",{className:"cli-posture-chip__flag",children:oe})]}),H&&t.jsxs("div",{className:"cli-posture-tooltip",role:"tooltip",children:[t.jsx("p",{className:"cli-posture-tooltip__title",children:r("cliTerminal.postureResolved","Resolved posture")}),t.jsxs("ul",{className:"cli-posture-tooltip__list",children:[(o.resolved??[]).map((e,n)=>t.jsx("li",{children:e},n)),(o.resolved??[]).length===0&&t.jsx("li",{children:o.mode??r("cliTerminal.postureBaseline","Baseline")})]}),Y&&t.jsxs("button",{type:"button",className:"cli-posture-tooltip__settings",onClick:()=>{G(!1),Y()},children:[t.jsx(Ce,{size:12,"aria-hidden":"true"}),r("cliTerminal.adapterSettings","Adapter settings")]})]})]}),ne&&t.jsxs("span",{className:"cli-session-terminal__readonly-badge",children:[t.jsx(xe,{size:12,"aria-hidden":"true"}),r("cliTerminal.readOnly","Read-only")]}),se&&t.jsx("span",{className:"cli-session-terminal__replay-badge","data-replay-mode":a,children:se})]}),t.jsx("div",{className:"cli-session-terminal__viewport",ref:T,"data-testid":"cli-terminal-viewport",style:we}),K&&!ue&&t.jsxs("div",{className:"cli-session-terminal__advance-strip",role:"region",children:[t.jsx("span",{className:"cli-session-terminal__advance-copy",children:r("cliTerminal.advancePrompt","This session looks idle — advance to review?")}),t.jsxs("div",{className:"cli-session-terminal__advance-actions",children:[t.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn",disabled:Z,onClick:be,children:r("cliTerminal.advance","Advance")}),t.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn cli-session-terminal__advance-btn--secondary",disabled:Z,onClick:he,children:r("cliTerminal.notYet","Not yet")})]})]}),C&&M&&t.jsxs("div",{className:`cli-session-terminal__mobile-bar${O?" cli-session-terminal__mobile-bar--keyboard-open":""}`,"data-testid":"cli-terminal-mobile-bar",style:O?{bottom:`${me}px`}:void 0,children:[t.jsxs("div",{className:"cli-session-terminal__key-row","data-testid":"cli-terminal-key-bar",children:[t.jsx("button",{type:"button",className:`cli-terminal-key cli-terminal-key--ctrl${x?" cli-terminal-key--active":""}`,"data-testid":"cli-key-ctrl","aria-label":r("cliTerminal.mobileKeyCtrl","Sticky Ctrl modifier"),"aria-pressed":x,onPointerDown:c,onMouseDown:c,onClick:()=>A(e=>!e),children:I.ctrl}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-esc","aria-label":r("cliTerminal.mobileKeyEsc","Send Escape"),onPointerDown:c,onMouseDown:c,onClick:()=>N(Ae),children:I.escape}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-tab","aria-label":r("cliTerminal.mobileKeyTab","Send Tab"),onPointerDown:c,onMouseDown:c,onClick:()=>N(ze),children:I.tab}),t.jsx("button",{type:"button",className:"cli-terminal-key cli-terminal-key--ctrlc","data-testid":"cli-key-ctrl-c","aria-label":r("cliTerminal.mobileKeyCtrlC","Send Ctrl-C"),onPointerDown:c,onMouseDown:c,onClick:()=>{A(!1),b(Fe)},children:I.ctrlC}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-up","aria-label":r("cliTerminal.mobileKeyArrowUp","Cursor up"),onPointerDown:c,onMouseDown:c,onClick:()=>N(Be),children:"↑"}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-down","aria-label":r("cliTerminal.mobileKeyArrowDown","Cursor down"),onPointerDown:c,onMouseDown:c,onClick:()=>N(Ie),children:"↓"}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-left","aria-label":r("cliTerminal.mobileKeyArrowLeft","Cursor left"),onPointerDown:c,onMouseDown:c,onClick:()=>N(We),children:"←"}),t.jsx("button",{type:"button",className:"cli-terminal-key","data-testid":"cli-key-arrow-right","aria-label":r("cliTerminal.mobileKeyArrowRight","Cursor right"),onPointerDown:c,onMouseDown:c,onClick:()=>N(Ke),children:"→"})]}),t.jsxs("form",{className:"cli-session-terminal__input-row",onSubmit:pe,children:[t.jsx("input",{ref:fe,type:"text",className:"cli-session-terminal__mobile-input","data-testid":"cli-terminal-mobile-input",value:S,placeholder:r("cliTerminal.mobileInputPlaceholder","Type to send to the session…"),autoCapitalize:"off",autoCorrect:"off",autoComplete:"off",spellCheck:!1,onChange:e=>ye(e.target.value)}),t.jsx("button",{type:"submit",className:"cli-session-terminal__mobile-send","data-testid":"cli-terminal-mobile-send","aria-label":r("cliTerminal.mobileSend","Send"),onPointerDown:c,onMouseDown:c,children:r("cliTerminal.mobileSend","Send")})]})]})]})}export{nt as SessionTerminal};
@@ -1 +0,0 @@
1
- .settings-header-actions{--settings-header-action-height: calc(var(--space-md) * 2 + var(--space-xs) / 2);display:flex;align-items:stretch;gap:var(--space-xs);margin-left:auto;margin-right:var(--space-sm)}.settings-header-actions>.settings-github-star-btn,.settings-header-actions>.settings-header-discord-btn{height:var(--settings-header-action-height);box-sizing:border-box}.settings-header-discord-btn,.settings-footer-help-btn{display:inline-flex;align-items:center}@media(max-width:768px){.settings-modal .modal-header{flex-wrap:nowrap;align-items:center;column-gap:var(--space-sm)}.settings-modal-heading{flex:1 1 0;min-width:0}.settings-header-actions{margin-left:auto;margin-right:var(--space-sm)}}.settings-github-star-btn{display:inline-flex;align-items:stretch;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--card);color:var(--text);font-size:12px;font-weight:500;text-decoration:none;overflow:hidden;transition:border-color var(--transition-fast),background var(--transition-fast)}.settings-github-star-btn:hover{border-color:var(--text-muted);background:var(--card-hover)}.settings-github-star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-color:var(--todo)}.settings-github-star-btn__action{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 2)}.settings-github-star-btn__count{display:inline-flex;align-items:center;padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 4);border-left:var(--btn-border-width) solid var(--border);background:color-mix(in srgb,var(--surface) 60%,var(--card));color:var(--text-muted);font-variant-numeric:tabular-nums}.settings-modal{width:min(95vw,1100px);max-width:95vw;min-width:520px;height:80vh;min-height:480px;max-height:calc(100dvh - var(--overlay-padding-top, 10vh) - 16px);overflow:hidden;resize:both}.settings-embedded.right-dock-embedded-view{display:flex;flex:1;width:100%;height:100%;min-height:0;padding:0;overflow:hidden}.settings-embedded .settings-modal--embedded{flex:1;width:100%;max-width:none;min-width:0;height:100%;min-height:0;max-height:none;resize:none;box-shadow:none;border:none;border-radius:0;background:transparent;position:static}.settings-modal--embedded .modal-header--embedded{box-sizing:border-box;display:flex;align-items:center;gap:var(--space-sm);min-height:var(--view-header-min-height);padding:var(--space-lg) var(--space-xl);background:var(--surface);border-bottom:none;flex-shrink:0}.settings-modal--embedded .modal-header--embedded .settings-header-actions{margin-left:auto}.settings-modal--embedded .modal-header--embedded .settings-modal-heading h3{display:flex;align-items:center;gap:var(--space-sm);font-size:1.125rem;font-weight:600;color:var(--text);letter-spacing:normal}.settings-modal--embedded .modal-header--embedded .settings-modal-heading svg{color:var(--todo);flex-shrink:0}.settings-modal--embedded .modal-actions{background:transparent;flex-shrink:0;padding-bottom:var(--space-sm)}@media(max-width:768px){.modal-overlay.settings-modal-overlay,.modal-overlay:has(.settings-modal:not(.settings-modal--embedded)){padding:0;inset:0;align-items:stretch;justify-content:stretch}.modal.settings-modal:not(.settings-modal--embedded){width:100vw;min-width:0;max-width:100vw;height:100dvh;min-height:100dvh;max-height:100dvh;margin:0;border:none;border-radius:0;resize:none;flex:1 1 auto}.modal.settings-modal:not(.settings-modal--embedded)[style*=--keyboard-overlap]{height:var(--vv-height, 100dvh);min-height:var(--vv-height, 100dvh);max-height:var(--vv-height, 100dvh);transform:translateY(var(--vv-offset-top, 0px));will-change:transform}.settings-embedded.right-dock-embedded-view{padding:var(--space-sm)}.settings-embedded .settings-modal--embedded{width:100%;height:100%}}.settings-modal-heading{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-modal-heading h3{margin:0}.settings-modal-version{margin:0;font-size:.85rem;color:var(--text-muted);font-weight:500}.settings-modal-footer-version{display:flex;align-items:center;gap:var(--space-xs);margin-right:var(--space-sm);min-width:0}.settings-update-check{display:flex;align-items:center;gap:var(--space-sm);min-width:0}@media(max-width:768px){.settings-modal-footer-version{flex:1 1 100%;margin-right:0}.settings-update-check{flex-wrap:wrap;row-gap:var(--space-xs)}.settings-update-result{flex:1 1 100%}.settings-footer-help-btn{flex-shrink:0}}.settings-version-check-btn{--settings-inline-touch-target: calc(var(--space-lg) + var(--space-lg) + var(--space-xs));display:inline-flex;align-items:center;gap:var(--space-xs);margin:0;min-height:var(--settings-inline-touch-target);padding:var(--space-xs) var(--space-sm);border:none;background:transparent;color:var(--text-muted);cursor:pointer;transition:opacity var(--transition-fast),box-shadow var(--transition-fast)}.settings-version-check-btn:hover:not(:disabled){opacity:.85}.settings-version-check-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.settings-version-check-btn:disabled{cursor:default;opacity:.7}.settings-version-check-btn svg{color:var(--text-muted)}.settings-version-check-btn svg.spinning{animation:settings-update-spin 1s linear infinite}.settings-update-result{display:inline-flex;align-items:center;flex-wrap:wrap;gap:var(--space-xs);font-size:.85rem;font-weight:500}.settings-update-result--up-to-date{color:var(--color-success)}.settings-update-result--available{color:var(--color-info)}.settings-update-result--error{color:var(--color-error)}.settings-update-result-link{color:var(--color-info);text-decoration:underline;transition:color var(--transition-fast),box-shadow var(--transition-fast)}.settings-update-result-link:hover{color:color-mix(in srgb,var(--color-info) 80%,var(--text))}.settings-update-result-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.settings-update-now-btn{display:inline-flex;align-items:center;gap:var(--space-xs);min-height:calc(var(--space-lg) + var(--space-sm));color:var(--text)}.settings-update-now-btn:disabled{color:var(--color-warning)}.settings-update-now-btn svg.spinning{animation:settings-update-spin 1s linear infinite}.settings-update-install-status{color:var(--text-muted)}.settings-update-install-status--success{color:var(--color-success)}.settings-update-install-status--error{color:var(--color-error)}@keyframes settings-update-spin{to{transform:rotate(360deg)}}.backup-stats{display:flex;align-items:center;gap:var(--space-lg);padding:var(--space-sm) var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,transparent)}.backup-stat{display:flex;flex:1 1 0;flex-direction:column;align-items:center;gap:var(--space-xs);min-width:0}.backup-stat-value{color:var(--text);font-size:1rem;font-weight:600;font-variant-numeric:tabular-nums}.backup-stat-label{color:var(--text-muted);font-size:.75rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.backup-list{margin-top:var(--space-sm)}.backup-list summary{padding:var(--space-sm) 0;color:var(--text-muted);cursor:pointer;transition:color var(--transition-fast)}.backup-list summary:hover{color:var(--text)}.backup-list summary:focus-visible{outline:none;border-radius:var(--radius-sm);box-shadow:var(--focus-ring-strong)}.backup-list ul{display:flex;flex-direction:column;gap:var(--space-xs);margin:0;margin-top:var(--space-sm);padding:0;list-style:none}.backup-list li{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) 0;border-top:var(--btn-border-width) solid color-mix(in srgb,var(--border) 80%,transparent)}.backup-list li code{min-width:0;color:var(--text);font-family:var(--font-mono);font-size:.75rem;white-space:nowrap;overflow-x:auto}.backup-size{color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem;text-align:right;white-space:nowrap}@media(max-width:768px){.backup-stats{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.backup-stat{align-items:flex-start}.backup-list ul{max-height:calc(var(--space-xl) * 9 + var(--space-md));overflow-y:auto;-webkit-overflow-scrolling:touch}.backup-list li code{white-space:normal;overflow-wrap:anywhere;word-break:normal}}.settings-layout{display:flex;flex:1;flex-direction:row;min-height:0;overflow:hidden}.settings-navigation{width:calc(var(--space-xl) * 7 + var(--space-sm));min-width:calc(var(--space-xl) * 7 + var(--space-sm));border-right:var(--btn-border-width) solid var(--border);display:flex;flex-direction:column;min-height:0;background:color-mix(in srgb,var(--text) 10%,transparent)}.settings-search{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm);border-bottom:var(--btn-border-width) solid var(--border)}.settings-search-label{color:var(--text-muted);font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em}.settings-search-input-wrap{display:flex;align-items:center;gap:var(--space-xs);min-width:0}.settings-search-input{min-width:0;width:100%}.settings-search-clear{flex-shrink:0}.settings-search-results,.settings-search-empty-hint{color:var(--text-muted);font-size:.75rem;margin:0}.settings-search-empty{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md);color:var(--text-muted)}.settings-search-empty p,.settings-search-content-empty p{margin:0}.settings-search-content-empty{gap:var(--space-md)}.settings-mobile-section-picker{display:none}.settings-sidebar{display:flex;flex:1;flex-direction:column;min-height:0;overflow-y:auto;padding:var(--space-sm) var(--space-sm);gap:calc(var(--space-xs) / 2);scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-sidebar::-webkit-scrollbar{width:6px}.settings-sidebar::-webkit-scrollbar-track{background:transparent}.settings-sidebar::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-sidebar::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-research-source-locked{cursor:default;color:var(--text-muted)!important}.settings-research-source-locked input[type=checkbox]{cursor:not-allowed}.settings-research-source-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);min-width:0}.settings-research-source-grid>*{min-width:0}.settings-research-limits-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm);min-width:0}.settings-research-limits-grid>*{min-width:0}.settings-research-limit-field{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.settings-research-limits-error{grid-column:1 / -1}@media(max-width:768px){.settings-research-source-grid,.settings-research-limits-grid{grid-template-columns:1fr}}.settings-nav-item{display:block;width:100%;padding:var(--space-sm) var(--space-md);font-size:13px;font-weight:500;color:var(--text-muted);background:none;border:none;border-left:3px solid transparent;border-radius:0 var(--radius-md) var(--radius-md) 0;cursor:pointer;text-align:left;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.settings-nav-item:hover{background:var(--bg);color:var(--text);border-left-color:var(--border)}.settings-nav-item:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}.settings-nav-item.active{background:var(--bg);color:var(--todo);font-weight:600;border-left-color:var(--todo)}.settings-group-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);padding:var(--space-md) var(--space-md) var(--space-xs);margin-top:var(--space-sm);user-select:none}.settings-group-header:first-child{margin-top:0}.settings-content{flex:1;overflow-x:hidden;overflow-y:auto;padding:var(--space-md) var(--space-xl) var(--space-lg);scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-content::-webkit-scrollbar{width:6px}.settings-content::-webkit-scrollbar-track{background:transparent}.settings-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-content::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-content>*{animation:settingsFadeIn var(--duration-normal) ease}@keyframes settingsFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.settings-section-heading{font-size:14px;font-weight:600;padding:var(--space-lg) 0 var(--space-md);margin:0 0 var(--space-md);color:var(--text)}.settings-content>.settings-section-heading:first-child,.settings-modal-section>.settings-section-heading:first-child{padding-top:var(--space-md)}.settings-section-heading--spaced{margin-top:var(--space-lg)}.settings-section-description{margin:0;margin-bottom:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.settings-plugins-subsection-toggle{display:inline-flex;gap:var(--space-xs);margin:var(--space-md) 0}.settings-plugins-subsection-btn{display:inline-flex;align-items:center;justify-content:center;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--surface);color:var(--text-muted);font-size:.85rem;font-weight:600;padding:var(--space-xs) var(--space-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.settings-plugins-subsection-btn:hover{background:var(--surface-hover, color-mix(in srgb, var(--text) 6%, transparent));color:var(--text)}.settings-plugins-subsection-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.settings-plugins-subsection-btn.active{background:color-mix(in srgb,var(--todo) 14%,transparent);border-color:color-mix(in srgb,var(--todo) 45%,var(--border));color:var(--todo)}.settings-plugins-subsection-panel{padding-bottom:var(--space-md)}.settings-scope-icon{margin-right:6px;display:inline-flex;vertical-align:middle;color:var(--text-muted)}.settings-scope-banner{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-xl);margin:0 var(--space-xl) var(--space-xs);font-size:12px;border-radius:var(--radius-md);color:var(--text-muted)}.settings-scope-global{background:color-mix(in srgb,var(--color-info) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-info) 40%,transparent)}.settings-scope-project{background:color-mix(in srgb,var(--color-success) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-success) 40%,transparent)}.settings-scope-mixed{background:color-mix(in srgb,var(--triage) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--triage) 40%,transparent)}.settings-note{display:block;padding:0 var(--space-xl);margin-top:var(--space-xs);font-size:12px;color:var(--text-muted)}.form-inline-group{display:flex;align-items:center;gap:var(--space-sm)}.form-inline-group .input{flex:1;min-width:0}.btn-link{background:none;border:none;padding:0;font-size:12px;color:var(--accent, #4a90e2);cursor:pointer;text-decoration:underline;white-space:nowrap}.btn-link:hover{text-decoration:none}.settings-overlap-ignore-group code{font-family:var(--font-mono);font-size:.9em}.settings-button-row{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-sm)}.settings-raw-output{margin:var(--space-sm) 0 0;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);max-height:calc(var(--space-2xl) * 7);overflow:auto;font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs))}.settings-url-output{display:block;margin-top:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));overflow-wrap:anywhere;word-break:break-word;overflow-x:auto;max-width:100%}.settings-qr-preview{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-qr-preview-label{margin:0;font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.settings-qr-preview-image-wrap{width:fit-content;max-width:100%;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--card)}.settings-qr-preview-image{display:block;width:min(calc(var(--space-2xl) * 6),100%);height:auto;aspect-ratio:1 / 1}.remote-provider-selector{display:flex;gap:var(--space-xs);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-xs);background:var(--surface)}.remote-provider-option{position:relative;flex:1;cursor:pointer}.remote-provider-option input{position:absolute;opacity:0;width:0;height:0}.remote-provider-option span{display:block;padding:var(--space-sm) var(--space-md);text-align:center;border-radius:var(--radius-sm);border:var(--btn-border-width) solid transparent;color:var(--text-muted);transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.remote-provider-option-content{display:inline-flex;align-items:center;gap:var(--space-xs)}.remote-provider-option input:checked+span{background:var(--card);color:var(--text);border-color:var(--border)}.remote-provider-option input:focus-visible+span{box-shadow:var(--focus-ring-strong)}.remote-status-bar{--status-color: var(--text-muted);display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);margin:0 var(--space-xl) var(--space-md);background:color-mix(in srgb,var(--status-color) 10%,transparent)}.remote-status-bar--running{--status-color: var(--color-success)}.remote-status-bar--starting{--status-color: var(--color-warning)}.remote-status-bar--error{--status-color: var(--color-error)}.remote-status-bar--stopped{--status-color: var(--text-muted)}.remote-share-block{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--text-muted) 5%,transparent)}.remote-share-row{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-share-row .settings-qr-preview-image{margin-top:var(--space-xs)}.remote-status-dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;display:inline-block;flex-shrink:0}.remote-status-dot--running{background:var(--color-success)}.remote-status-dot--starting{background:var(--color-warning)}.remote-status-dot--error{background:var(--color-error)}.remote-status-dot--stopped{background:var(--text-muted)}.remote-status-url{margin-left:auto;font-family:var(--font-mono);overflow-wrap:anywhere;word-break:break-word;user-select:all}.remote-provider-settings{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-cli-detection{display:flex;align-items:flex-start;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm)}.remote-cli-detection--available{background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)}.remote-cli-detection--missing{background:color-mix(in srgb,var(--color-warning) 10%,transparent);color:var(--color-warning)}.remote-cli-detection-content{display:flex;flex-direction:column;gap:var(--space-xs);color:var(--text)}.remote-cli-detection .btn{align-self:flex-start}.remote-cli-install-error{color:var(--color-error)}.remote-cli-manual{color:var(--text-dim)}.remote-external-tunnel-panel{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-info) 10%,transparent)}.remote-external-tunnel-header{display:flex;align-items:center;gap:var(--space-sm);color:var(--color-info)}.remote-external-tunnel-qr{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-external-tunnel-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-advanced-details{margin:var(--space-lg) var(--space-xl) 0;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);background:var(--surface)}.remote-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-advanced-details>summary::-webkit-details-marker{display:none}.remote-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-advanced-details[open]>summary:before{content:"▾"}.settings-option-details{margin-top:var(--space-xs)}.settings-research-provider-group{display:flex;flex-direction:column;gap:var(--space-sm);min-width:0}.settings-research-provider-advanced-details{min-width:0;padding-inline-start:var(--space-md)}.settings-research-provider-advanced-body{display:flex;flex-direction:column;gap:var(--space-sm);min-width:0;padding-top:var(--space-sm)}.settings-research-provider-advanced-body>.form-group{margin-top:0;padding:0;min-width:0}.settings-research-provider-advanced-body .input{width:100%;min-width:0}.settings-research-empty-state{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm);min-width:0}@media(max-width:768px){.settings-research-provider-advanced-details{padding-inline-start:0}}.settings-option-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.settings-option-details>summary::-webkit-details-marker{display:none}.settings-option-details>summary:before{content:"▸";margin-right:var(--space-xs)}.settings-option-details[open]>summary:before{content:"▾"}.settings-gitlab-disclosure{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface-secondary)}.settings-gitlab-disclosure>summary{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);cursor:pointer;list-style:none;color:var(--text-primary)}.settings-gitlab-disclosure>summary::-webkit-details-marker{display:none}.settings-gitlab-disclosure>summary:before{content:"▸";color:var(--text-muted)}.settings-gitlab-disclosure[open]>summary:before{content:"▾"}.settings-gitlab-disclosure__title{flex:1 1 auto;font-weight:var(--font-weight-semibold);min-width:0}.settings-gitlab-disclosure__toggle{flex:0 0 auto}.settings-gitlab-disclosure__body{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm);min-width:0}.settings-gitlab-disclosure__body>.form-group{margin-top:0;padding:0}@media(max-width:768px){.settings-gitlab-disclosure{padding:var(--space-sm)}.settings-gitlab-disclosure>summary{align-items:flex-start;flex-wrap:wrap;gap:var(--space-sm)}.settings-gitlab-disclosure__toggle{flex-basis:100%}}.remote-cf-advanced-details{margin-top:var(--space-xs)}.remote-cf-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-cf-advanced-details>summary::-webkit-details-marker{display:none}.remote-cf-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-cf-advanced-details[open]>summary:before{content:"▾"}.remote-cf-advanced-fields{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.remote-tunnel-actions{margin-top:var(--space-md)}.remote-tunnel-actions .btn{width:100%}.settings-overlap-ignore-list{display:flex;flex-direction:column;gap:var(--space-sm);margin:var(--space-sm) 0}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-sm);align-items:center}.settings-overlap-path-picker-modal{max-width:min(960px,calc(100vw - var(--space-2xl)))}.settings-overlap-path-picker-body{display:flex;flex-direction:column;gap:var(--space-sm);max-height:min(70vh,720px)}.settings-overlap-path-picker-note{margin:0;font-size:12px;color:var(--text-muted)}.settings-section-divider{border-top:1px solid var(--border);margin:var(--space-lg) var(--space-xl)}.settings-reset-dialog__choice{display:flex;flex-direction:column;gap:var(--space-xs);margin-block-end:var(--space-md)}.settings-reset-dialog__choice-btn{align-self:flex-start;width:100%}.settings-reset-dialog__ineligible-reason{color:var(--text-muted)}@media(max-width:768px){.settings-reset-dialog{max-width:calc(100vw - var(--space-md))}.settings-reset-dialog__choice-btn{width:100%}}@media(max-width:768px){.settings-note{padding:0 var(--space-lg)}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{grid-template-columns:minmax(0,1fr)}.settings-overlap-ignore-row>.btn{justify-self:start}.settings-overlap-path-picker-modal{max-width:calc(100vw - var(--space-md))}.remote-provider-selector{flex-direction:column}.remote-status-bar{flex-wrap:wrap;margin:0 var(--space-lg) var(--space-md)}.remote-share-block{margin:0 var(--space-lg) var(--space-md)}.remote-status-url{width:100%;margin-left:0;font-size:.8em}.remote-provider-option,.remote-tunnel-actions .btn{min-height:36px}.remote-cli-detection,.remote-external-tunnel-panel{margin:0 var(--space-lg) var(--space-md)}}.ntfy-advanced-disclosure{margin-top:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.ntfy-advanced-disclosure>summary{cursor:pointer;list-style:none;padding:var(--space-sm) var(--space-md);font-size:12px;font-weight:600;color:var(--text)}.ntfy-advanced-disclosure>summary::-webkit-details-marker{display:none}.ntfy-advanced-content{padding:0 var(--space-md) var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-inline-link{color:var(--todo);text-decoration:none;transition:text-decoration var(--transition-fast)}.settings-inline-link:hover{text-decoration:underline}.settings-inline-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.notification-provider-card{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-lg);background:var(--surface);margin:0 var(--space-xl) var(--space-lg);overflow:hidden}.notification-provider-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border)}.notification-provider-body{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.notification-provider-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm);padding-top:var(--space-md);border-top:var(--btn-border-width) solid var(--border);margin-top:var(--space-md)}.notification-test-feedback{display:flex;flex-direction:column;gap:var(--space-xs);margin-top:var(--space-sm)}.notification-test-feedback-item{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);padding:var(--space-xs) var(--space-sm)}.notification-test-feedback-item--success{border-color:color-mix(in srgb,var(--color-success) 45%,var(--border));background:color-mix(in srgb,var(--color-success) 8%,transparent);color:var(--color-success)}.notification-test-feedback-item--error{border-color:color-mix(in srgb,var(--color-error) 45%,var(--border));background:color-mix(in srgb,var(--color-error) 8%,transparent);color:var(--color-error)}@media(max-width:768px){.notification-provider-actions{flex-direction:column}.notification-provider-actions .btn{width:100%}}.memory-status-message{display:flex;gap:var(--space-md);align-items:center;justify-content:space-between;margin-bottom:var(--space-md)}.memory-status-message span{min-width:0}.memory-retrieval-test{margin-top:var(--space-lg)}.memory-test-result{margin:0 var(--space-xl) var(--space-lg);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-test-result strong,.memory-test-result span{color:var(--text);font-size:12px}.memory-test-result small{display:block;margin-top:var(--space-xs);color:var(--text-muted);font-size:12px}.memory-test-result ul{margin:var(--space-md) 0 0;padding:0;list-style:none}.memory-test-result li{padding-top:var(--space-sm);border-top:var(--btn-border-width) solid var(--border)}.memory-test-result li+li{margin-top:var(--space-sm)}.memory-test-result p{margin:var(--space-xs) 0 0;color:var(--text-muted);font-size:12px;line-height:1.5;overflow-wrap:anywhere}.memory-editor-section{margin-top:var(--space-lg);display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-editor-form-group{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-file-summary{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-xs) var(--space-md);align-items:center;margin:0 var(--space-xl) var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-file-summary span{display:inline-flex;align-items:center;justify-content:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent);font-size:11px;font-weight:600}.memory-file-summary strong{min-width:0;overflow-wrap:anywhere;color:var(--text);font-family:var(--font-mono);font-size:12px}.memory-file-summary small{grid-column:2;color:var(--text-muted);font-size:12px}.memory-editor-frame{min-height:50vh;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;display:flex;flex:1 1 auto;flex-direction:column;min-width:0}.auth-panel-body{padding-inline:var(--space-md)}.auth-section-hint{padding:var(--space-md) var(--space-lg);margin-bottom:var(--space-md);background:var(--bg-tertiary);border-radius:var(--radius-md);font-size:13px;color:var(--text-muted);border-left:3px solid var(--text-muted)}.auth-provider-group{margin-bottom:calc(var(--space-sm) + var(--space-xs) / 2)}.auth-group-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin-bottom:var(--space-xs);padding:0 4px}.auth-provider-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-xs);overflow:hidden;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.auth-provider-card:hover{border-color:var(--text-dim)}.auth-provider-card--authenticated{border-color:color-mix(in srgb,var(--color-success) 40%,var(--border));background:color-mix(in srgb,var(--color-success) 5%,var(--surface))}.auth-provider-card--authenticated:hover{border-color:color-mix(in srgb,var(--color-success) 60%,var(--border))}.auth-provider-header{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);gap:12px}.auth-provider-info{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.auth-provider-info strong{font-weight:500;color:var(--text)}.auth-provider-icon-slot{display:inline-flex;align-items:center;justify-content:center;inline-size:calc(var(--space-md) + var(--space-xs) * 2);block-size:calc(var(--space-md) + var(--space-xs) * 2);flex-shrink:0}.auth-provider-icon-slot .provider-icon{display:inline-flex}.auth-hint{display:block;padding:12px 4px 0;font-size:12px;color:var(--text-muted);border-top:1px solid var(--border);margin-top:8px}.auth-apikey-section{display:flex;flex-direction:column;gap:var(--space-xs);align-items:flex-end;flex-shrink:0}.auth-apikey-input-row{display:flex;gap:6px;align-items:center}.auth-apikey-input{background:var(--surface-1);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 10px;font-size:13px;width:180px;font-family:monospace}.auth-apikey-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.auth-apikey-input:disabled{opacity:.6}.auth-apikey-progress{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding-right:4px}.auth-apikey-error{font-size:11px;color:var(--color-error);padding-right:4px}.auth-provider-actions-row{display:flex;width:100%;align-items:center;gap:var(--space-sm)}.auth-device-code-panel{width:100%;margin-top:var(--space-sm);padding:var(--space-sm);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,transparent);display:flex;flex-direction:column;gap:var(--space-sm)}.auth-device-code-pill{font-family:var(--font-mono);font-size:calc(var(--space-md) + var(--space-xs) * .5);letter-spacing:var(--space-xs);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-pill);border:var(--btn-border-width) solid var(--border);background:var(--card);color:var(--text);display:flex;align-self:stretch}.auth-key-hint{font-family:var(--font-mono);font-size:12px;color:var(--text-muted);display:inline-block;margin-top:var(--space-xs);user-select:none}.settings-lane-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:500;white-space:nowrap}.settings-lane-badge--override{background-color:color-mix(in srgb,var(--todo) 20%,transparent);color:var(--todo)}.settings-lane-badge--inherited{background-color:color-mix(in srgb,var(--text-muted) 15%,transparent);color:var(--text-muted)}.settings-scope-group{margin-top:var(--space-md)}.settings-scope-group-header{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.settings-scope-group-header .settings-section-heading{padding-bottom:0;margin-bottom:0}.settings-scope-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:500;white-space:nowrap}.settings-scope-badge--global{background-color:color-mix(in srgb,var(--accent, #4a90e2) 18%,transparent);color:var(--accent, #4a90e2)}.settings-scope-badge--project{background-color:color-mix(in srgb,var(--text-muted) 15%,transparent);color:var(--text-muted)}.settings-scope-caption{display:block;margin:var(--space-xs) 0 var(--space-md);color:var(--text-muted);font-size:12px;line-height:1.4}.settings-description{font-size:13px;color:var(--text-dim);padding-inline:var(--space-xl);margin-block:0 var(--space-md);line-height:1.5}.settings-token-cap-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.settings-model-lane-control-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-control-main{flex:1}.settings-model-lane-actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm);padding:var(--space-md) var(--space-xl) var(--space-lg);margin-block:var(--space-sm) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border)}.settings-error{color:var(--color-error)}.settings-summarization-actions{justify-content:flex-start}.settings-model-presets{display:flex;flex-direction:column;gap:var(--space-md)}.settings-preset-list{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-item{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.settings-preset-item-meta{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.settings-preset-item-meta strong{color:var(--text);overflow-wrap:anywhere}.settings-preset-summary{font-size:12px;overflow-wrap:anywhere}.settings-preset-item-actions{display:flex;gap:var(--space-xs);flex-wrap:wrap;justify-content:flex-end}.settings-preset-actions{display:flex;justify-content:flex-start}.settings-preset-editor{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,var(--card))}.settings-preset-editor-fields{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-editor .form-group{padding:0}.settings-preset-editor-actions{justify-content:flex-start;margin-top:0;padding:0}.settings-preset-auto-select{margin-top:var(--space-sm)}.settings-preset-size-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-sm)}.settings-preset-size-row{padding:0}@media(max-width:768px){.settings-layout{flex-direction:column;min-height:0}.settings-navigation{width:100%;min-width:0;flex:0 0 auto;border-right:none;border-bottom:var(--btn-border-width) solid var(--border);background:var(--surface)}.settings-search{padding:var(--space-md) var(--space-lg) var(--space-sm)}.settings-search-input-wrap{align-items:stretch}.settings-search-input{font-size:16px}.settings-mobile-section-picker{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm) var(--space-lg) var(--space-md);border-bottom:none;background:var(--surface)}.settings-mobile-section-picker label{color:var(--text-muted);font-weight:600;text-transform:uppercase}.settings-mobile-section-picker select{width:100%}.settings-mobile-section-picker select:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.settings-sidebar{display:none}.settings-nav-item{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);border-left:none;border-bottom:2px solid transparent;border-radius:var(--radius-md) var(--radius-md) 0 0;padding:calc(var(--space-xs) + var(--space-xs) / 2) var(--space-md);white-space:nowrap}.settings-nav-item:hover{border-left-color:transparent;border-bottom-color:var(--border)}.settings-nav-item.active{border-left-color:transparent;border-bottom-color:var(--todo)}.settings-group-header{display:none}.notification-provider-card{margin:0 var(--space-lg) var(--space-md)}.notification-provider-header{padding:var(--space-sm) var(--space-md)}.notification-provider-body{padding:var(--space-md)}.settings-scope-icon{margin-right:0}.settings-content{flex:1;min-height:0;overflow-x:hidden;overflow-y:auto}.settings-content .form-group small{overflow-wrap:break-word;word-break:normal}.settings-content input,.settings-content select,.settings-content textarea{font-size:16px}.settings-section-heading{padding:var(--space-lg) var(--space-lg) var(--space-md);margin:0 0 var(--space-md)}.settings-plugins-subsection-toggle{display:flex;width:100%;padding:0 var(--space-lg)}.settings-plugins-subsection-btn{flex:1;min-height:36px}.settings-plugins-subsection-panel{padding-left:var(--space-lg);padding-right:var(--space-lg)}.form-group{padding:0 calc(var(--space-md) + var(--space-xs) / 2)}.settings-scope-banner{padding:var(--space-sm) var(--space-lg)}.memory-editor-frame{min-height:65vh}.memory-file-summary{grid-template-columns:1fr;margin:0 var(--space-lg) var(--space-md)}.memory-status-message{align-items:stretch;flex-direction:column}.memory-file-summary span{justify-content:flex-start}.memory-file-summary small{grid-column:auto}.settings-description{padding:0 var(--space-lg)}.settings-model-lane-actions{align-items:stretch;flex-direction:column;padding-inline:calc(var(--space-md) + var(--space-xs) / 2)}.settings-content .btn,.settings-preset-item-actions .btn{min-height:36px}.auth-provider-row{flex-wrap:wrap;padding:var(--space-md) calc(var(--space-md) + var(--space-xs) / 2);gap:var(--space-sm)}.auth-section-hint{margin:0 calc(var(--space-md) + var(--space-xs) / 2) var(--space-md);padding:calc(var(--space-sm) + var(--space-xs) / 2) calc(var(--space-md) + var(--space-xs) / 2)}.auth-provider-group{margin-bottom:var(--space-md)}.auth-group-label{padding:0 calc(var(--space-md) + var(--space-xs) / 2)}.auth-provider-card{margin:0 calc(var(--space-md) + var(--space-xs) / 2) var(--space-sm)}.auth-provider-header{flex-wrap:wrap;padding:calc(var(--space-sm) + var(--space-xs) / 2) calc(var(--space-md) + var(--space-xs) / 2);gap:10px}.auth-provider-header>div:not(.auth-provider-info):not(.auth-apikey-section){margin-left:auto}.auth-provider-actions-row{width:100%;justify-content:flex-end}.auth-device-code-panel{width:100%}.auth-device-code-pill{max-width:100%;overflow-wrap:anywhere}.auth-provider-info{width:100%;flex-basis:100%}.auth-apikey-section{width:100%;flex-basis:100%;align-items:flex-end}.auth-apikey-input-row{width:100%;flex-wrap:wrap;justify-content:flex-end}.auth-apikey-input{flex:1;min-width:120px;width:auto}.auth-apikey-input-row .btn{flex-shrink:0;margin-left:auto}.auth-hint{padding:var(--space-md) calc(var(--space-md) + var(--space-xs) / 2) 0}.settings-model-presets{gap:var(--space-sm)}.settings-preset-item{flex-direction:column;align-items:stretch;padding:var(--space-sm) var(--space-md)}.settings-preset-item-actions{justify-content:flex-start}.settings-preset-editor{padding:var(--space-sm) var(--space-md)}.settings-preset-editor-actions{flex-wrap:wrap}.settings-preset-size-grid{grid-template-columns:1fr;gap:var(--space-xs)}.settings-node-routing-note{padding:var(--space-sm) var(--space-md);font-size:12px}}.settings-node-routing-note{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);margin-top:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.settings-node-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-sm);font-size:12px;color:var(--text-muted)}.auth-advanced-disclosure{margin-top:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.auth-advanced-disclosure>summary{cursor:pointer;padding:var(--space-sm) var(--space-md)}.auth-advanced-content{display:flex;flex-direction:column;gap:var(--space-sm);padding:0 var(--space-md) var(--space-md)}.auth-custom-provider-item{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.auth-custom-provider-actions{display:flex;gap:var(--space-sm)}.settings-warning-banner{margin-top:var(--space-sm);padding:var(--space-sm) var(--space-md);border:1px solid var(--color-warning);border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-warning) 12%,transparent);color:var(--text);font-size:.875rem;line-height:1.4}.settings-warning-banner strong{color:var(--color-warning);margin-right:var(--space-xs)}.settings-sync-workflow-note{margin-top:var(--space-md);font-size:.875rem;color:var(--text-muted)}@media(max-width:768px){.auth-custom-provider-item{flex-direction:column;align-items:flex-start}.settings-warning-banner{padding:var(--space-sm)}}.shortcut-category{margin-top:var(--space-lg)}.shortcut-category:first-of-type{margin-top:0}.shortcut-row{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm) 0;border-bottom:1px solid var(--color-border)}.shortcut-row:last-child{border-bottom:0}.shortcut-capture{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.shortcut-capture__input{flex:1 1 auto;min-width:0}.shortcut-capture__input--invalid{border-color:var(--color-error)}.shortcut-capture__record--active{color:var(--color-warning)}.shortcut-conflict-banner{color:var(--color-error)}@media(max-width:768px){.shortcut-capture{flex-direction:column;align-items:stretch}.shortcut-capture__input{width:100%}}
@@ -1 +0,0 @@
1
- .language-selector{display:flex;flex-direction:column;gap:8px}.language-selector-title{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted, #888)}.language-options{display:flex;flex-wrap:wrap;gap:8px}.language-option{display:inline-flex;align-items:center;padding:6px 12px;border:1px solid var(--border);border-radius:6px;background:var(--bg-secondary, transparent);color:var(--text);font-size:.875rem;cursor:pointer;transition:border-color .15s ease,background .15s ease}.language-option:hover{border-color:var(--accent)}.language-option.active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent);font-weight:600}.tracking-repo-select{display:flex;flex-direction:column;gap:var(--space-sm)}.tracking-repo-select__custom-input{margin-top:0}.tracking-repo-select__hint{color:var(--text-muted)}.tracking-repo-select__hint--error{color:var(--color-error)}@media(max-width:768px){.tracking-repo-select{gap:var(--space-xs)}}.cli-binary-panel{display:flex;flex-direction:column;gap:12px;padding:0 var(--space-xl);margin-top:var(--space-lg);border:0;background:transparent}.cli-binary-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.cli-binary-header .settings-section-heading{margin:0}.cli-binary-pill{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;font-size:11px;font-weight:600;letter-spacing:.02em;text-transform:uppercase}.cli-binary-pill--ok{background:color-mix(in srgb,var(--color-success) 18%,transparent);color:var(--color-success);border:1px solid color-mix(in srgb,var(--color-success) 40%,transparent)}.cli-binary-pill--warn{background:color-mix(in srgb,var(--color-warning) 18%,transparent);color:var(--color-warning);border:1px solid color-mix(in srgb,var(--color-warning) 40%,transparent)}.cli-binary-pill--err{background:color-mix(in srgb,var(--color-error) 18%,transparent);color:var(--color-error);border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent)}.cli-binary-help{color:var(--text-muted);line-height:1.4}.cli-binary-help code{background:color-mix(in srgb,var(--text) 6%,transparent);padding:1px 6px;border-radius:4px;font-size:.92em}.cli-binary-status-line{margin:0;color:var(--text-muted)}.cli-binary-status-line code{background:color-mix(in srgb,var(--text) 6%,transparent);padding:1px 6px;border-radius:4px}.cli-binary-detail{display:flex;flex-direction:column;gap:12px}.cli-binary-info-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px;font-size:13px}.cli-binary-info-list li{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.cli-binary-info-list span{color:var(--text-muted);min-width:64px}.cli-binary-info-list code{background:color-mix(in srgb,var(--text) 6%,transparent);padding:1px 6px;border-radius:4px;word-break:break-all}.cli-binary-expected{color:var(--text-muted);font-size:12px}.cli-binary-actions{display:flex;gap:8px;flex-wrap:wrap}.cli-binary-install-btn,.cli-binary-refresh-btn,.cli-binary-copy-btn{cursor:pointer;border-radius:6px;padding:6px 12px;font-size:13px;border:1px solid transparent;transition:background .15s ease,border-color .15s ease}.cli-binary-install-btn{background:var(--accent, #3b82f6);color:var(--accent-text)}.cli-binary-install-btn:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 88%,var(--text) 12%)}.cli-binary-install-btn:disabled,.cli-binary-refresh-btn:disabled{opacity:.55;cursor:not-allowed}.cli-binary-refresh-btn,.cli-binary-copy-btn{background:color-mix(in srgb,var(--text) 4%,transparent);color:var(--text);border-color:color-mix(in srgb,var(--text) 12%,transparent)}.cli-binary-refresh-btn:hover:not(:disabled),.cli-binary-copy-btn:hover{background:color-mix(in srgb,var(--text) 8%,transparent)}.cli-binary-commands{display:flex;flex-direction:column;gap:6px}.cli-binary-commands label{font-size:12px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}.cli-binary-command-row{display:flex;align-items:center;gap:8px;background:color-mix(in srgb,var(--bg) 25%,transparent);border:1px solid color-mix(in srgb,var(--text) 6%,transparent);border-radius:6px;padding:6px 8px 6px 12px}.cli-binary-command-row code{flex:1;font-family:var(--font-mono, ui-monospace, "SFMono-Regular", monospace);font-size:12.5px;color:var(--text);white-space:nowrap;overflow-x:auto}.cli-binary-install-log{border-top:1px solid color-mix(in srgb,var(--text) 6%,transparent);padding-top:10px;font-size:12.5px}.cli-binary-install-log summary{cursor:pointer;color:var(--text-muted)}.cli-binary-install-output{margin:6px 0 0;padding:8px 10px;background:color-mix(in srgb,var(--bg) 35%,transparent);border-radius:4px;max-height:220px;overflow:auto;white-space:pre-wrap;font-size:12px;line-height:1.4}.cli-binary-install-output--err{color:var(--color-error)}.cli-binary-permissions-hint{margin:6px 0;padding:8px 10px;background:color-mix(in srgb,var(--color-error) 10%,transparent);border-left:3px solid color-mix(in srgb,var(--color-error) 55%,transparent);border-radius:0 var(--radius-sm) var(--radius-sm) 0;color:var(--color-error);font-size:12.5px;line-height:1.5}.mcp-servers-card{display:flex;flex-direction:column;gap:var(--space-md)}.mcp-servers-card__header,.mcp-server-row,.mcp-discovery__header,.mcp-discovery-row,.mcp-import-export,.mcp-sensitive-row,.mcp-inline-actions{display:flex;gap:var(--space-md)}.mcp-servers-card__header,.mcp-server-row,.mcp-discovery__header,.mcp-discovery-row{align-items:flex-start;justify-content:space-between}.mcp-servers-card__title,.mcp-server-row p,.mcp-discovery p,.mcp-discovery h6,.mcp-import-export h6{margin:0}.mcp-servers-card__description,.mcp-server-row p,.mcp-discovery p,.mcp-empty,.mcp-empty-inline,.mcp-effective-count{color:var(--text-muted)}.mcp-server-list,.mcp-discovery,.mcp-discovery__group,.mcp-editor,.mcp-sensitive-list,.mcp-import-export__pane,.mcp-server-row__main{display:flex;flex-direction:column;gap:var(--space-sm)}.mcp-server-row,.mcp-discovery,.mcp-discovery-row,.mcp-editor,.mcp-import-export__pane{padding:var(--space-md);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.mcp-discovery-row{background:var(--surface-hover)}.mcp-discovery__notes,.mcp-discovery-row__note{color:var(--color-warning)}.mcp-server-row__titleline,.mcp-validation-status,.mcp-server-row__actions{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.mcp-state-badge,.mcp-transport-badge{display:inline-flex;align-items:center;border-radius:var(--radius-full);padding:var(--space-2xs) var(--space-xs);font-size:var(--font-size-xs);line-height:var(--line-height-tight);border:var(--border-width) solid var(--border);color:var(--text-muted)}.mcp-state-badge--disabled,.mcp-state-badge--disabled-global{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 12%,transparent)}.mcp-state-badge--overridden,.mcp-state-badge--project-local{color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent)}.mcp-state-badge--inherited{color:var(--color-warning);background:color-mix(in srgb,var(--color-warning) 12%,transparent)}.mcp-state-badge--configured{color:var(--color-success);background:color-mix(in srgb,var(--color-success) 12%,transparent)}.mcp-state-badge--required{color:var(--color-warning);background:color-mix(in srgb,var(--color-warning) 12%,transparent)}.mcp-validation-status{color:var(--text-muted)}.mcp-validation-status__badge{display:inline-flex;align-items:center;border-radius:var(--radius-full);padding:var(--space-2xs) var(--space-xs);border:var(--border-width) solid var(--border);color:inherit}.mcp-validation-status--pending{color:var(--color-warning)}.mcp-validation-status--valid{color:var(--color-success)}.mcp-validation-status--unreachable,.mcp-validation-status--error{color:var(--color-error)}.mcp-editor-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-md)}.mcp-editor-grid__wide,.mcp-import-export__pane,.mcp-server-row__main{flex:1 1 auto;min-width:0}.mcp-sensitive-row{align-items:center;flex-wrap:wrap}.mcp-sensitive-row .input,.mcp-sensitive-row .select{flex:1 1 var(--settings-field-min-width, 12rem);min-width:0}.mcp-subheading{font-weight:var(--font-weight-semibold)}.mcp-json-textarea{min-height:calc(var(--space-xl) * 4);resize:vertical;font-family:var(--font-mono)}.mcp-enabled-toggle{align-self:flex-start}@media(max-width:768px){.mcp-servers-card__header,.mcp-server-row,.mcp-discovery__header,.mcp-discovery-row,.mcp-import-export,.mcp-server-row__actions,.mcp-sensitive-row,.mcp-inline-actions{flex-direction:column;align-items:stretch}.mcp-editor-grid{grid-template-columns:1fr}.mcp-server-row__actions .btn,.mcp-inline-actions .btn,.mcp-sensitive-row .btn{justify-content:center}}.model-pricing-section{display:flex;flex-direction:column;gap:var(--space-md)}.model-pricing-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md)}.model-pricing-section__meta{margin:var(--space-xs) 0 0}.model-pricing-summary{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);padding:var(--space-md);border:thin solid var(--border);border-radius:var(--radius-md);background:var(--surface-secondary)}.model-pricing-summary__empty,.model-pricing-modal__subtitle{margin:var(--space-xs) 0 0}.model-pricing-modal__body{overflow-x:auto}.model-pricing-table{display:flex;flex-direction:column;gap:var(--space-xs);min-width:min-content}.model-pricing-row{display:grid;grid-template-columns:minmax(12rem,1.4fr) minmax(7rem,1fr) minmax(7rem,1fr) minmax(7rem,1fr) minmax(7rem,1fr) minmax(10rem,1.2fr) minmax(5rem,auto);gap:var(--space-xs);align-items:center}.model-pricing-row--head{color:var(--text-muted);font-size:var(--font-size-xs, .75rem);font-weight:600}.model-pricing-row--add{padding-top:var(--space-xs);border-top:thin solid var(--border)}.model-pricing-key{overflow-wrap:anywhere;color:var(--text)}.model-pricing-empty{grid-column:1 / -1}@media(max-width:768px){.model-pricing-section__header,.model-pricing-summary{flex-direction:column}.model-pricing-section__header .btn,.model-pricing-summary .btn{width:100%}.model-pricing-modal__body{overflow-x:visible}.model-pricing-table{min-width:0}.model-pricing-row{grid-template-columns:minmax(14rem,1fr);padding:var(--space-sm);border:thin solid var(--border);border-radius:var(--radius-md)}.model-pricing-row--head{display:none}.model-pricing-row--add{border-top:thin solid var(--border)}}@keyframes custom-provider-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.custom-providers-section .onboarding-disclosure-content{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.custom-provider-list{display:flex;flex-direction:column;gap:var(--space-sm)}.custom-provider-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.custom-provider-item:hover{border-color:var(--text-dim)}.custom-provider-item-info{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.custom-provider-item-name{font-weight:600;color:var(--text)}.custom-provider-item-meta{color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.custom-provider-item-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.custom-provider-refresh-btn{white-space:nowrap}.custom-provider-detect-actions{display:flex;align-items:center;gap:var(--space-sm);margin-top:var(--space-xs)}.custom-provider-row-message{display:flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-xs);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm)}.custom-provider-row-message--success{color:var(--color-success);background:color-mix(in srgb,var(--color-success) 10%,transparent)}.custom-provider-row-message--error{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.custom-provider-badge{display:inline-flex;align-items:center;padding:var(--space-xs);border-radius:var(--radius-pill);background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.custom-provider-empty{color:var(--text-muted);padding:var(--space-sm) 0}.custom-provider-add-btn{margin-top:var(--space-sm)}.custom-provider-form{padding:var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-top:var(--space-sm)}.custom-provider-form-row{margin-bottom:var(--space-sm)}.custom-provider-form-actions{display:flex;gap:var(--space-sm);margin-top:var(--space-md)}.custom-provider-form-error{display:flex;align-items:center;gap:var(--space-xs);color:var(--color-error);margin-top:var(--space-xs);background:color-mix(in srgb,var(--color-error) 10%,transparent);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm)}.custom-provider-item-edit-form{margin-top:var(--space-xs)}.custom-provider-spin{animation:custom-provider-spin calc(var(--duration-slow) * 4) linear infinite}@media(max-width:768px){.custom-provider-item{flex-direction:column;align-items:flex-start;gap:var(--space-xs)}.custom-provider-item-meta{max-width:100%}.custom-provider-form{padding:var(--space-sm)}.custom-provider-item-actions{align-self:stretch;justify-content:flex-start;margin-top:var(--space-xs)}.custom-provider-refresh-btn{flex:1 1 auto;justify-content:center}}.prompt-manager{display:flex;flex-direction:column;gap:var(--space-md);padding:0 var(--space-xl);margin-top:var(--space-md)}.prompt-manager-tabs{display:flex;gap:var(--space-xs);border-bottom:1px solid var(--border);padding-bottom:var(--space-sm)}.prompt-manager-tab{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);background:none;border:1px solid transparent;border-radius:var(--radius-md);color:var(--text-muted);font-size:13px;cursor:pointer;transition:all var(--transition-fast)}.prompt-manager-tab:hover{color:var(--text);background:var(--surface)}.prompt-manager-tab:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-color:var(--todo)}.prompt-manager-tab.active{color:var(--text);background:var(--surface);border-color:var(--border)}.prompt-manager-content{min-height:200px}.prompt-manager-templates-tab,.prompt-manager-assignments-tab,.prompt-manager-overrides-tab{display:flex;flex-direction:column;gap:var(--space-lg)}.prompt-template-section{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-section-title{font-size:14px;font-weight:600;color:var(--text);margin:0}.prompt-template-section-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-template-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-card{padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast)}.prompt-template-card:hover{border-color:var(--text-dim)}.prompt-template-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-bottom:var(--space-sm)}.prompt-template-card-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.prompt-template-card-name{font-weight:600;color:var(--text);font-size:14px}.prompt-template-badge-built-in,.prompt-template-badge-custom,.prompt-template-badge-override{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) calc(var(--space-xs) * 1.5);font-size:10px;font-weight:500;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.02em}.prompt-template-badge-built-in{background:var(--surface);color:var(--text-muted);border:1px solid var(--border)}.prompt-template-badge-custom{background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.prompt-template-badge-override{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.prompt-template-badge-role{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) calc(var(--space-xs) * 1.5);font-size:10px;font-weight:500;border-radius:var(--radius-sm)}.prompt-template-badge-built-in,.prompt-template-badge-role,.prompt-role-badge{--prompt-role-color: var(--color-muted)}.prompt-role-tone--executor{--prompt-role-color: var(--todo)}.prompt-role-tone--triage{--prompt-role-color: var(--triage)}.prompt-role-tone--reviewer{--prompt-role-color: var(--in-review)}.prompt-role-tone--merger{--prompt-role-color: var(--done)}.prompt-role-tone--scheduler{--prompt-role-color: var(--color-info)}.prompt-role-tone--engineer{--prompt-role-color: var(--color-warning)}.prompt-role-tone--custom{--prompt-role-color: var(--color-muted)}.prompt-template-badge-role,.prompt-role-badge{background:color-mix(in srgb,var(--prompt-role-color) 15%,transparent);color:var(--prompt-role-color)}.prompt-template-badge-built-in.prompt-role-tone--executor,.prompt-template-badge-built-in.prompt-role-tone--triage,.prompt-template-badge-built-in.prompt-role-tone--reviewer,.prompt-template-badge-built-in.prompt-role-tone--merger,.prompt-template-badge-built-in.prompt-role-tone--scheduler,.prompt-template-badge-built-in.prompt-role-tone--engineer,.prompt-template-badge-built-in.prompt-role-tone--custom{border-color:var(--prompt-role-color)}.prompt-template-card-actions{display:flex;gap:var(--space-xs)}.prompt-template-card-actions .btn-icon{padding:var(--space-xs)}.prompt-template-card-description{font-size:12px;color:var(--text-muted);margin:0 0 var(--space-sm) 0;line-height:1.4}.prompt-template-card-preview{background:var(--surface);border-radius:var(--radius-sm);padding:var(--space-sm);overflow:hidden}.prompt-template-card-preview code{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;display:block;max-height:120px;overflow-y:auto}.prompt-template-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:13px;background:var(--surface);border:1px dashed var(--border);border-radius:var(--radius-md)}.prompt-template-add-btn{align-self:flex-start;margin-top:var(--space-sm)}.prompt-template-editor{padding:var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-lg)}.prompt-template-editor-title{font-size:14px;font-weight:600;color:var(--text);margin:0 0 var(--space-md) 0}.prompt-template-editor-fields{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-template-field{display:flex;flex-direction:column;gap:var(--space-xs)}.prompt-template-field label{font-size:12px;font-weight:500;color:var(--text-muted)}.prompt-template-field input,.prompt-template-field select,.prompt-template-prompt-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;transition:border-color var(--transition-fast)}.prompt-template-field input:focus,.prompt-template-field select:focus,.prompt-template-prompt-textarea:focus{outline:none;border-color:var(--todo)}.prompt-template-prompt-textarea{font-family:var(--font-mono);font-size:12px;line-height:1.5;resize:vertical;min-height:120px}.prompt-template-error{padding:var(--space-sm);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-sm);color:var(--color-error);font-size:12px}.prompt-template-editor-actions{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-sm)}.prompt-template-delete-confirm{padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid var(--color-error);border-radius:var(--radius-md);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-template-delete-confirm p{margin:0;font-size:13px;color:var(--text)}.prompt-template-delete-actions{display:flex;gap:var(--space-sm)}.prompt-assignments-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-role-assignment-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-role-assignment-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-lg);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md)}.prompt-role-assignment-label{display:flex;align-items:center;gap:var(--space-md)}.prompt-role-badge{display:inline-flex;align-items:center;padding:var(--space-xs) var(--space-sm);font-size:12px;font-weight:600;border-radius:var(--radius-sm)}.prompt-role-assignment-status{font-size:12px;color:var(--text-muted)}.prompt-role-select{min-width:200px;padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:13px;cursor:pointer}.prompt-role-select:focus{outline:none;border-color:var(--todo)}.prompt-role-select:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.prompt-assignments-note{margin-top:var(--space-md);padding:var(--space-md);background:var(--surface);border-radius:var(--radius-md);font-size:12px;color:var(--text-muted);line-height:1.5}.prompt-assignments-note strong{color:var(--text)}.prompt-overrides-desc{font-size:12px;color:var(--text-muted);margin:0}.prompt-overrides-list{display:flex;flex-direction:column;gap:var(--space-md)}.prompt-override-item{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.prompt-override-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md);cursor:pointer;transition:background var(--transition-fast)}.prompt-override-header:hover{background:var(--card-hover)}.prompt-override-info{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm);flex:1;min-width:0;border:none;background:none;color:inherit;padding:0;text-align:left;font:inherit;cursor:pointer;border-radius:var(--radius-sm)}.prompt-override-info:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.prompt-override-name{font-weight:600;color:var(--text);font-size:13px}.prompt-override-key{font-size:11px;font-family:var(--font-mono);color:var(--text-muted);padding:calc(var(--space-xs) * .5) var(--space-xs);background:var(--surface);border-radius:var(--radius-sm)}.prompt-override-badge{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) calc(var(--space-xs) * 1.5);font-size:10px;font-weight:500;background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning);border-radius:var(--radius-sm)}.prompt-override-expand-btn{display:flex;align-items:center;justify-content:center;width:var(--space-xl);height:var(--space-xl);background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-expand-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-expand-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);color:var(--text);background:var(--surface)}.prompt-override-description{font-size:12px;color:var(--text-muted);margin:0;padding:0 var(--space-md) var(--space-md);line-height:1.4}.prompt-override-editor{padding:var(--space-md);border-top:1px solid var(--border);background:var(--surface);display:flex;flex-direction:column;gap:var(--space-sm)}.prompt-override-textarea{padding:var(--space-sm) var(--space-md);background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);font-size:12px;font-family:var(--font-mono);line-height:1.5;resize:vertical;min-height:calc(var(--space-xl) * 3 + var(--space-sm));transition:border-color var(--transition-fast)}.prompt-override-textarea:focus{outline:none;border-color:var(--todo)}.prompt-override-footer{display:flex;align-items:center;gap:var(--space-md)}.prompt-override-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.prompt-override-header-actions{display:flex;align-items:center;gap:var(--space-xs)}.prompt-override-fullscreen-btn{display:flex;align-items:center;justify-content:center;width:var(--space-xl);height:var(--space-xl);background:none;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.prompt-override-fullscreen-btn:hover{color:var(--text);background:var(--surface)}.prompt-override-fullscreen-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);color:var(--text);background:var(--surface)}.prompt-override-fullscreen{position:fixed;inset:0;z-index:10000;background:var(--surface);padding:max(var(--space-lg),env(safe-area-inset-top,0px)) max(var(--space-lg),env(safe-area-inset-right,0px)) max(var(--space-lg),env(safe-area-inset-bottom,0px)) max(var(--space-lg),env(safe-area-inset-left,0px));display:flex;flex-direction:column}.prompt-override-fullscreen-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-md);flex-shrink:0}.prompt-override-fullscreen-title{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:var(--space-sm)}.prompt-override-fullscreen-close{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:none;border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text-muted);cursor:pointer;font-size:12px;transition:all var(--transition-fast)}.prompt-override-fullscreen-close:hover{color:var(--text);border-color:var(--text-muted)}.prompt-override-fullscreen-close:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.prompt-override-fullscreen textarea{flex:1;min-height:unset;resize:none;border-radius:var(--radius-md);font-size:14px;line-height:1.6}.prompt-template-fullscreen-pre{flex:1;font-family:var(--font-mono);font-size:13px;line-height:1.6;color:var(--text);white-space:pre-wrap;word-break:break-word;overflow-y:auto;padding:var(--space-md);background:var(--bg);border-radius:var(--radius-md);border:1px solid var(--border);margin:0}.prompt-override-fullscreen .prompt-override-footer{flex-shrink:0;padding-top:var(--space-sm)}.prompt-template-prompt-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.prompt-template-prompt-label-row label{display:block}.prompt-template-fullscreen-btn{vertical-align:middle}.prompt-template-prompt-label-row .prompt-template-fullscreen-btn{margin-left:var(--space-xs)}@media(max-width:768px){.prompt-manager{padding:0 var(--space-lg)}.prompt-manager-tabs{flex-wrap:wrap}.prompt-manager-tab{flex:1;justify-content:center;min-width:calc(50% - var(--space-xs))}.prompt-role-assignment-row{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.prompt-role-select{width:100%}.prompt-template-editor-actions{flex-direction:column}.prompt-template-editor-actions .btn{width:100%}.prompt-override-fullscreen{padding:max(var(--space-md),env(safe-area-inset-top,0px)) max(var(--space-md),env(safe-area-inset-right,0px)) max(var(--space-md),env(safe-area-inset-bottom,0px)) max(var(--space-md),env(safe-area-inset-left,0px))}.prompt-override-fullscreen textarea{font-size:16px}.prompt-override-expand-btn,.prompt-override-fullscreen-btn{width:calc(var(--space-lg) * 2 + var(--space-xs));height:calc(var(--space-lg) * 2 + var(--space-xs))}}.settings-moved-stub{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface-2, var(--surface))}.settings-moved-stub__message{margin:0;font-size:.85rem;color:var(--text-muted)}.settings-moved-stub__action{align-self:flex-start;padding:var(--space-xs) var(--space-md);font-size:.85rem;font-weight:600;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background-color var(--duration-fast) ease,border-color var(--duration-fast) ease}.settings-moved-stub__action:hover:not(:disabled){background:var(--surface-hover, var(--surface-2, var(--surface)));border-color:var(--accent, var(--border))}.settings-moved-stub__action:disabled{opacity:.6;cursor:not-allowed}.agent-provisioning-policy-editor{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-lg)}.agent-provisioning-policy-help{color:var(--text-muted);font-size:.75rem;margin:0}.agent-provisioning-policy-help code{font-family:var(--font-mono)}.agent-provisioning-policy-textarea{min-height:calc(var(--space-2xl) + var(--space-xl));resize:vertical}@media(max-width:768px){.agent-provisioning-policy-editor{padding:var(--space-md)}}