@runfusion/fusion 0.77.0-beta.6 → 0.77.0-beta.7

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 (166) hide show
  1. package/dist/bin.js +42309 -39335
  2. package/dist/child-process-worker.js +7394 -4875
  3. package/dist/client/.vite/manifest.json +267 -330
  4. package/dist/client/assets/{AgentDetailView-oyY72uSo.js → AgentDetailView-C1eh_vXv.js} +4 -4
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-C3Qo9p1M.js → AgentPermissionPolicyEditor-CeKsO1LR.js} +2 -2
  6. package/dist/client/assets/{AgentsView-M2MhTIGW.js → AgentsView-BNe2ABOc.js} +4 -4
  7. package/dist/client/assets/{CommandCenter-CpcAt6jt.js → CommandCenter-BuREM-G1.js} +18 -18
  8. package/dist/client/assets/DevServerView-D0i1b-QO.js +1 -0
  9. package/dist/client/assets/DirectoryPicker-VOx91hQt.js +1 -0
  10. package/dist/client/assets/DocumentsView-CO5W_WVb.js +1 -0
  11. package/dist/client/assets/EvalsView-BqSINSrZ.js +1 -0
  12. package/dist/client/assets/ExperimentalAgentOnboardingModal-DEcFgONi.js +1 -0
  13. package/dist/client/assets/{GoalsView-DPj59B3l.js → GoalsView-DZ57wXmJ.js} +1 -1
  14. package/dist/client/assets/{InsightsView-QLJNkKJp.js → InsightsView-DSWfXG7Q.js} +3 -3
  15. package/dist/client/assets/{MemoryView-CDCS-1ig.js → MemoryView-BEX10uhl.js} +1 -1
  16. package/dist/client/assets/{PiExtensionsManager-DktXXrmF.js → PiExtensionsManager-DcAmXXoR.js} +2 -2
  17. package/dist/client/assets/PluginManager-BU0omQUv.js +1 -0
  18. package/dist/client/assets/{PullRequestView-CkObT6e3.js → PullRequestView-B-JL_8Kk.js} +2 -2
  19. package/dist/client/assets/{ReportModal-B5LTdDgi.js → ReportModal-DxggF_RH.js} +5 -5
  20. package/dist/client/assets/{ResearchView-CryFrV8l.js → ResearchView-CnwTXfQO.js} +1 -1
  21. package/dist/client/assets/{SecretsView-9YcNW_fo.js → SecretsView-BDvzsLFz.js} +1 -1
  22. package/dist/client/assets/SettingsModal-801eFQ9u.js +21 -0
  23. package/dist/client/assets/{SettingsModal-llkoaJev.js → SettingsModal-BZHeQ3ED.js} +1 -1
  24. package/dist/client/assets/{SettingsTextareaRow-B_Legu-A.js → SettingsTextareaRow-B0rTuelr.js} +1 -1
  25. package/dist/client/assets/SetupWizardModal-CoExPwIn.js +2 -0
  26. package/dist/client/assets/{SkillsView-CSeauwIw.js → SkillsView-WVP25LPj.js} +1 -1
  27. package/dist/client/assets/WorkflowNodeEditor-pCMyKcnS.js +8 -0
  28. package/dist/client/assets/{agent-import-generation-CttglSmZ.js → agent-import-generation-M_hKtjgN.js} +1 -1
  29. package/dist/client/assets/{agentsOrgChartLayout-f-9mwRbD.js → agentsOrgChartLayout-DjvIMhFD.js} +1 -1
  30. package/dist/client/assets/{app-C_PTWuI1.js → app-BOvA34XN.js} +3 -3
  31. package/dist/client/assets/{app-BBSLJDbV.js → app-Bic4iWXQ.js} +3 -3
  32. package/dist/client/assets/{app-Bvr57EZQ.js → app-BlbH7Tir.js} +2 -2
  33. package/dist/client/assets/{app-DwvelD-n.js → app-C6TctczU.js} +3 -3
  34. package/dist/client/assets/{app-DRW5hIgr.js → app-D3qZmEIu.js} +3 -3
  35. package/dist/client/assets/{app-BKwOvuxE.js → app-DLnMkUt5.js} +2 -2
  36. package/dist/client/assets/{app-DKx18PHE.js → app-mNy0DeDM.js} +3 -3
  37. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DA_Hm_di.js → architectureDiagram-3BPJPVTR-CkzEm8i9.js} +1 -1
  38. package/dist/client/assets/{blockDiagram-GPEHLZMM-JF7K8CcV.js → blockDiagram-GPEHLZMM-Dc-dUMjY.js} +1 -1
  39. package/dist/client/assets/{c4Diagram-AAUBKEIU-DN-wklCP.js → c4Diagram-AAUBKEIU-DnYjsrR0.js} +1 -1
  40. package/dist/client/assets/channel-CxQ40s_U.js +1 -0
  41. package/dist/client/assets/{chunk-2J33WTMH-ChtjU8Cu.js → chunk-2J33WTMH-0E1GEFEr.js} +1 -1
  42. package/dist/client/assets/{chunk-4BX2VUAB-dJL0n3nn.js → chunk-4BX2VUAB-Dj5oZd51.js} +1 -1
  43. package/dist/client/assets/{chunk-55IACEB6-Bfg-QB9A.js → chunk-55IACEB6-DfNT0s8E.js} +1 -1
  44. package/dist/client/assets/{chunk-727SXJPM-BHPPwYUS.js → chunk-727SXJPM-BnFjhiIQ.js} +1 -1
  45. package/dist/client/assets/{chunk-AQP2D5EJ-DIIpPUQN.js → chunk-AQP2D5EJ-DR84wSqR.js} +1 -1
  46. package/dist/client/assets/{chunk-FMBD7UC4-D230R32b.js → chunk-FMBD7UC4-IjByNOrR.js} +1 -1
  47. package/dist/client/assets/{chunk-ND2GUHAM-0Lhp5CRv.js → chunk-ND2GUHAM-By0q_jZm.js} +1 -1
  48. package/dist/client/assets/{chunk-QZHKN3VN-BxbHBfKJ.js → chunk-QZHKN3VN-BELcl3N5.js} +1 -1
  49. package/dist/client/assets/classDiagram-4FO5ZUOK-C2ARdiRL.js +1 -0
  50. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C2ARdiRL.js +1 -0
  51. package/dist/client/assets/{common-13IRj_PO.js → common-BsNuuNOe.js} +1 -1
  52. package/dist/client/assets/{common-BBynATth.js → common-CASsTuSW.js} +1 -1
  53. package/dist/client/assets/{common-BG-vw0tL.js → common-CfyFt5OG.js} +1 -1
  54. package/dist/client/assets/{common-DSo46rnH.js → common-DS98trLj.js} +1 -1
  55. package/dist/client/assets/common-DeoHWJCq.js +1 -0
  56. package/dist/client/assets/common-PpMdoH5r.js +1 -0
  57. package/dist/client/assets/{common-vpHuuvkd.js → common-cN--mrmm.js} +1 -1
  58. package/dist/client/assets/{cose-bilkent-S5V4N54A-3vEwhfYz.js → cose-bilkent-S5V4N54A-D4cCw9-_.js} +1 -1
  59. package/dist/client/assets/{dagre-BM42HDAG-Br44UsdY.js → dagre-BM42HDAG-JJp5dVeY.js} +1 -1
  60. package/dist/client/assets/dashboard-view-6zPJm9zC.js +1 -0
  61. package/dist/client/assets/{dashboard-view-_EglxMDl.js → dashboard-view-Bl9CPhxE.js} +1 -1
  62. package/dist/client/assets/{dashboard-view-BldxxYfz.js → dashboard-view-C5Nt8cvY.js} +1 -1
  63. package/dist/client/assets/{dashboard-view-CcPcELPx.js → dashboard-view-MAC_LHDX.js} +2 -2
  64. package/dist/client/assets/{diagram-2AECGRRQ-CLNxbHUP.js → diagram-2AECGRRQ-D4L7j_t_.js} +1 -1
  65. package/dist/client/assets/{diagram-5GNKFQAL-D3cNAeQH.js → diagram-5GNKFQAL-VAGFaXqG.js} +1 -1
  66. package/dist/client/assets/{diagram-KO2AKTUF-DkX7h6to.js → diagram-KO2AKTUF-hqXSggfW.js} +1 -1
  67. package/dist/client/assets/{diagram-LMA3HP47-6iQIiYUr.js → diagram-LMA3HP47-B3eAIuy8.js} +1 -1
  68. package/dist/client/assets/{diagram-OG6HWLK6-Caje3229.js → diagram-OG6HWLK6-BGufp0RK.js} +1 -1
  69. package/dist/client/assets/{erDiagram-TEJ5UH35-BkU-1HB1.js → erDiagram-TEJ5UH35-DplXdx8w.js} +1 -1
  70. package/dist/client/assets/{flowDiagram-I6XJVG4X-BRx3V6RE.js → flowDiagram-I6XJVG4X-C1Ms2bko.js} +1 -1
  71. package/dist/client/assets/{folder-open-BaSOBfk2.js → folder-open-nMraSDXu.js} +1 -1
  72. package/dist/client/assets/{ganttDiagram-6RSMTGT7-D9f1kH3t.js → ganttDiagram-6RSMTGT7-DVgxMtXb.js} +1 -1
  73. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CQwmZcRd.js → gitGraphDiagram-PVQCEYII-DH2_n0J8.js} +1 -1
  74. package/dist/client/assets/index-BJc-A7eB.css +1 -0
  75. package/dist/client/assets/index-CBFPgFTp.js +2787 -0
  76. package/dist/client/assets/{infoDiagram-5YYISTIA-DYWBkGjG.js → infoDiagram-5YYISTIA-DmZdWVcU.js} +1 -1
  77. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-Df0Nzvh4.js → ishikawaDiagram-YF4QCWOH-DsEIHSXr.js} +1 -1
  78. package/dist/client/assets/{journeyDiagram-JHISSGLW-bSvrZSyZ.js → journeyDiagram-JHISSGLW-CsfIWmu1.js} +1 -1
  79. package/dist/client/assets/{kanban-definition-UN3LZRKU-yHJ101M8.js → kanban-definition-UN3LZRKU-CQKqeZvc.js} +1 -1
  80. package/dist/client/assets/{mermaid.core-Bc_0VLJw.js → mermaid.core-DkC_dr4-.js} +4 -4
  81. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DWRnMguM.js → mindmap-definition-RKZ34NQL-RnmE-NUe.js} +1 -1
  82. package/dist/client/assets/{pieDiagram-4H26LBE5-Ds-DEOqr.js → pieDiagram-4H26LBE5-DPu6FPc4.js} +1 -1
  83. package/dist/client/assets/{puzzle-CdYF81IT.js → puzzle-DwhHOf32.js} +1 -1
  84. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Bz-j2fkf.js → quadrantDiagram-W4KKPZXB-CYbypO2p.js} +1 -1
  85. package/dist/client/assets/{requirementDiagram-4Y6WPE33-BaQ_PaZ-.js → requirementDiagram-4Y6WPE33-DFk1vK_N.js} +1 -1
  86. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-pUCz8V4-.js → sankeyDiagram-5OEKKPKP-CkUY1Zzu.js} +1 -1
  87. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CFwUMspe.js → sequenceDiagram-3UESZ5HK-CFivaLOO.js} +1 -1
  88. package/dist/client/assets/{standing-instructions-template-Crocrob7.js → standing-instructions-template-BbqKGAC1.js} +2 -2
  89. package/dist/client/assets/{stateDiagram-AJRCARHV-CHZwo-vd.js → stateDiagram-AJRCARHV-BPeD5PwG.js} +1 -1
  90. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BTvKaIZR.js → stateDiagram-v2-BHNVJYJU-DduiCPMb.js} +1 -1
  91. package/dist/client/assets/{timeline-definition-PNZ67QCA-Cn3XIoz2.js → timeline-definition-PNZ67QCA-CGUNNVro.js} +1 -1
  92. package/dist/client/assets/{upload--GqImz6h.js → upload-BS96H1o7.js} +1 -1
  93. package/dist/client/assets/{users-B0h1q4x6.js → users--irrWoyU.js} +1 -1
  94. package/dist/client/assets/{vennDiagram-CIIHVFJN-CS0FNVU_.js → vennDiagram-CIIHVFJN-CybTaJJH.js} +1 -1
  95. package/dist/client/assets/{wardley-L42UT6IY-DdYkfF5d.js → wardley-L42UT6IY-DSxaSCGi.js} +1 -1
  96. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-B_rFmPCh.js → wardleyDiagram-YWT4CUSO-YFb0AxNt.js} +1 -1
  97. package/dist/client/assets/{xychartDiagram-2RQKCTM6-CCoaCgmc.js → xychartDiagram-2RQKCTM6-Cv6zlMJC.js} +1 -1
  98. package/dist/client/index.html +2 -2
  99. package/dist/client/version.json +1 -1
  100. package/dist/droid-cli/package.json +1 -1
  101. package/dist/extension.js +23565 -20733
  102. package/dist/migrations/0065_fn_149_review_convergence_stage.sql +3 -0
  103. package/dist/pi-claude-cli/package.json +1 -1
  104. package/dist/plugin-sdk/index.d.ts +57 -10
  105. package/dist/plugin-sdk/index.js +103 -33
  106. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +158 -36
  107. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  108. package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +103 -33
  109. package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
  110. package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +103 -33
  111. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +103 -33
  113. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  114. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +103 -33
  115. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +103 -33
  117. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  118. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +103 -33
  119. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  120. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +103 -33
  121. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  122. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +103 -33
  123. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  124. package/dist/plugins/fusion-plugin-linear-import/bundled.js +103 -33
  125. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  126. package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +103 -33
  127. package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
  128. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +103 -33
  129. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  130. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +103 -33
  131. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  132. package/dist/plugins/fusion-plugin-quality/bundled.js +103 -33
  133. package/dist/plugins/fusion-plugin-quality/package.json +1 -1
  134. package/dist/plugins/fusion-plugin-reports/bundled.js +103 -33
  135. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  136. package/dist/plugins/fusion-plugin-roadmap/bundled.js +103 -33
  137. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  138. package/dist/plugins/fusion-plugin-todos/bundled.js +103 -33
  139. package/dist/plugins/fusion-plugin-todos/package.json +1 -1
  140. package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +103 -33
  141. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  142. package/package.json +1 -1
  143. package/skill/fusion/references/engine-tools.md +5 -5
  144. package/dist/client/assets/ChatView-DS4XiCm_.css +0 -1
  145. package/dist/client/assets/ChatView-zKrUSqiQ.js +0 -13
  146. package/dist/client/assets/DevServerView-CjTneoG7.js +0 -1
  147. package/dist/client/assets/DirectoryPicker-BY6V5HLV.js +0 -1
  148. package/dist/client/assets/DocumentsView-RDK56-qg.js +0 -1
  149. package/dist/client/assets/EvalsView-DKK4ceUW.js +0 -1
  150. package/dist/client/assets/ExperimentalAgentOnboardingModal-DiBPZVwC.js +0 -1
  151. package/dist/client/assets/PluginManager-CQ3iEFMq.js +0 -1
  152. package/dist/client/assets/SessionTerminal-2ZSXmOkG.css +0 -1
  153. package/dist/client/assets/SessionTerminal-BWsA9puD.js +0 -2
  154. package/dist/client/assets/SettingsModal-CL6aiXiI.js +0 -21
  155. package/dist/client/assets/SetupWizardModal-DLA4UAGp.js +0 -2
  156. package/dist/client/assets/WorkflowNodeEditor-CGgMiiWy.js +0 -8
  157. package/dist/client/assets/channel-CwFfFSI9.js +0 -1
  158. package/dist/client/assets/classDiagram-4FO5ZUOK-C8dZsxxX.js +0 -1
  159. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C8dZsxxX.js +0 -1
  160. package/dist/client/assets/common-DbOCE-0i.js +0 -1
  161. package/dist/client/assets/common-DnXF4Jmj.js +0 -1
  162. package/dist/client/assets/dashboard-view-B0OM3KYC.js +0 -1
  163. package/dist/client/assets/index-B8PcG8AJ.js +0 -2774
  164. package/dist/client/assets/index-Dki2LBAp.css +0 -1
  165. package/dist/client/assets/shield-alert-4qeU3_Rm.js +0 -6
  166. package/dist/client/assets/useDiscoveredSkillsCache-BEHgTFai.js +0 -1
@@ -1 +0,0 @@
1
- import{r as d,j as e}from"./vendor-react-SZ_qB27O.js";import{ag as ze,bg as He,bh as Ve,bi as ge,bj as Qe,X as me,aU as Ke,bk as Je,aK as he,P as be,b3 as ye,F as xe,R as fe,aN as Ye,a3 as Xe,bl as Ze,bm as es,bn as ss,bo as ns,bp as is,bq as ts,br as as,bs as Q,bt as ls,bu as rs}from"./index-B8PcG8AJ.js";import{D as os}from"./DirectoryPicker-BY6V5HLV.js";import{u as Ce}from"./vendor-i18n-Duky4gdQ.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";import"./vendor-xterm-BNq00GSj.js";import"./folder-open-BaSOBfk2.js";const us="/api/plugins/fusion-plugin-whatsapp-chat",cs=/^\d+$/;function K(r,c){const p=c?`?projectId=${encodeURIComponent(c)}`:"";return`${us}${r}${p}`}function ps({projectId:r,settings:c}){const{t:p}=Ce("app"),[n,x]=d.useState(null),[f,F]=d.useState(null),[L,_]=d.useState(()=>String(c?.pairingPhoneNumber??"")),[A,w]=d.useState(null),[P,k]=d.useState(null),v=d.useCallback(async()=>{try{const a=await fetch(K("/status",r)),y=await a.json();if(!a.ok)throw new Error(y.error??"WhatsApp pairing is unavailable. Enable the plugin and try again.");x(y),F(null)}catch(a){F(a instanceof Error?a.message:String(a))}},[r]);d.useEffect(()=>{v();const a=window.setInterval(()=>void v(),5e3);return()=>window.clearInterval(a)},[v]);const O=async()=>{const a=L.trim();if(!a||!cs.test(a)){w("Enter an E.164 phone number using digits only, without +.");return}k("code"),w(null);try{const y=await fetch(K("/pair-code",r),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({phoneNumber:a,...r?{projectId:r}:{}})}),m=await y.json();if(!y.ok)throw new Error(m.error??"Could not request a pairing code.");x(j=>({status:"awaiting-code",...j,pairingCode:m.pairingCode})),await v()}catch(y){w(y instanceof Error?y.message:String(y))}finally{k(null)}},U=async()=>{k("logout"),w(null);try{const a=await fetch(K("/logout",r),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r?{projectId:r}:{})});if(!a.ok){const y=await a.json();throw new Error(y.error??"Could not log out from WhatsApp.")}await v()}catch(a){w(a instanceof Error?a.message:String(a))}finally{k(null)}},B=c?.pairingMode==="code"?"code":"qr",R=n?.status??"starting";return e.jsxs("section",{className:"whatsapp-pairing-panel","aria-labelledby":"whatsapp-pairing-heading",children:[e.jsxs("div",{className:"whatsapp-pairing-heading-row",children:[e.jsxs("div",{children:[e.jsx("h5",{id:"whatsapp-pairing-heading",className:"plugin-detail-section-heading",children:p("whatsapp.pairing","WhatsApp pairing")}),e.jsx("p",{className:"whatsapp-pairing-description",children:p("whatsapp.description","Pair and monitor this project's WhatsApp connection here.")})]}),e.jsx("button",{className:"btn btn-secondary btn-sm",type:"button",onClick:()=>void v(),children:p("whatsapp.refreshStatus","Refresh status")})]}),e.jsxs("div",{className:`whatsapp-pairing-status whatsapp-pairing-status--${R}`,role:"status","data-testid":"whatsapp-pairing-status",children:[e.jsxs("strong",{children:[p("whatsapp.status","Status:")," ",R]}),n?.jid&&e.jsx("span",{children:p("whatsapp.connectedAs","Connected as {{jid}}",{jid:n.jid})}),(n?.lastError||f)&&e.jsx("span",{className:"field-error",children:n?.lastError??f})]}),R==="awaiting-qr"&&e.jsx("div",{className:"whatsapp-pairing-qr","data-testid":"whatsapp-pairing-qr",children:n?.qrDataUrl?e.jsx("img",{src:n.qrDataUrl,alt:p("whatsapp.qrCode","WhatsApp pairing QR code"),className:"whatsapp-pairing-qr-image"}):e.jsx("p",{className:"text-muted",children:p("whatsapp.waitingQr","Waiting for a fresh QR code. Keep this panel open and refresh if needed.")})}),(B==="code"||R==="awaiting-code")&&e.jsxs("div",{className:"whatsapp-pairing-code",children:[e.jsx("label",{htmlFor:"whatsapp-pairing-phone",children:p("whatsapp.phoneNumber","Phone number (E.164 digits without +)")}),e.jsxs("div",{className:"whatsapp-pairing-code-controls",children:[e.jsx("input",{id:"whatsapp-pairing-phone",className:"input",value:L,onChange:a=>_(a.target.value),inputMode:"numeric"}),e.jsx("button",{className:"btn btn-secondary",type:"button",onClick:()=>void O(),disabled:P!==null,children:P==="code"?p("whatsapp.requestingCode","Requesting code..."):p("whatsapp.requestPairingCode","Request pairing code")})]}),n?.pairingCode&&e.jsx("output",{className:"whatsapp-pairing-code-output",children:n.pairingCode})]}),R==="connected"&&e.jsx("p",{className:"whatsapp-pairing-success",children:p("whatsapp.connectedSuccess","WhatsApp is paired and ready to receive messages from allowed senders.")}),A&&e.jsx("p",{className:"field-error",children:A}),e.jsx("button",{className:"btn btn-danger",type:"button",onClick:()=>void U(),disabled:P!==null,"data-testid":"whatsapp-pairing-logout",children:P==="logout"?p("whatsapp.loggingOut","Logging out..."):p("whatsapp.logoutRepair","Logout and re-pair")}),e.jsxs("aside",{className:"whatsapp-pairing-instructions","aria-label":p("whatsapp.instructionsLabel","WhatsApp pairing instructions"),"data-testid":"whatsapp-pairing-instructions",children:[e.jsx("h6",{children:p("whatsapp.pairingConfiguration","Pairing and configuration")}),e.jsxs("ol",{children:[e.jsx("li",{children:p("whatsapp.installPlugin","Install and enable this plugin, then keep this settings panel open.")}),e.jsx("li",{children:p("whatsapp.allowedSenders","Set {{label}}; an empty list blocks all inbound messages.",{label:"Allowed WhatsApp Senders"})}),e.jsx("li",{children:p("whatsapp.choosePairingMethod","Choose {{qr}} to scan in WhatsApp Linked Devices, or {{code}} to enter a phone number and request a pairing code.",{qr:"QR",code:"code"})}),e.jsx("li",{children:p("whatsapp.waitConnected","Wait for the status above to become {{status}}.",{status:"connected"})}),e.jsx("li",{children:p("whatsapp.repairInstructions","Use Logout and re-pair to start over. If QR is still pending, wait briefly or refresh status for a new code.")})]})]})]})}const Pe="fusion-plugin-agent-browser",je={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"}},Ne={General:"plugins.agentBrowser.groupGeneral",Browser:"plugins.agentBrowser.groupBrowser","Prompt Contributions":"plugins.agentBrowser.groupPromptContributions",Skills:"plugins.agentBrowser.groupSkills"},Se={"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"},we=[{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-quality",name:"Quality",description:"Task QA tab and Quality hub: preview servers, test runs, reports, screenshots, and suggested cases.",category:"integration",path:"./plugins/fusion-plugin-quality"},{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:Pe,name:"Agent Browser",description:"Built-in integration metadata. Package install support lands in FN-3101.",category:"integration",hasSetup:!0}],T={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function ds(r){const c=r.settingsSchema,p=c&&Object.keys(c).length>0;return r.id!==Pe?p?c:void 0:p?{...je,...c}:je}function gs(r){const c=new Map,p=[];for(const[n,x]of Object.entries(r))if(x.group){const f=c.get(x.group)??[];f.push([n,x]),c.set(x.group,f)}else p.push([n,x]);return{grouped:c,ungrouped:p}}function ve(r,c="plugin-error-text"){return r.state!=="error"||!r.error?null:e.jsx("p",{className:c,title:r.error,children:r.error})}function ws({addToast:r,projectId:c,onPluginsChanged:p}){const{t:n}=Ce("app"),[x,f]=d.useState([]),[F,L]=d.useState(!0),[_,A]=d.useState(!1),[w,P]=d.useState(""),[k,v]=d.useState(!1),[O,U]=d.useState(!1),[B,R]=d.useState(null),[a,y]=d.useState(null),[m,j]=d.useState({}),[Re,J]=d.useState(!1),[Y,X]=d.useState(null),[Z,Ee]=d.useState([]),[Ie,ee]=d.useState(!0),[se,ne]=d.useState(null),[N,ke]=d.useState(""),[S,Be]=d.useState(""),[Ae,ie]=d.useState(null),q=d.useRef(null),[Fe,z]=d.useState({}),[Le,te]=d.useState(null),[$,ae]=d.useState(null),{confirm:qe}=ze(),b=d.useCallback(async(s=!1,i)=>{try{s||L(!0);const l=await He(c);f(i?l.some(o=>o.id===i.id)?l.map(o=>o.id===i.id?i:o):[...l,i]:l)}catch(l){r(n("plugins.loadFailed","Failed to load plugins: {{error}}",{error:l instanceof Error?l.message:String(l)}),"error")}finally{s||L(!1)}},[c,r]),E=d.useCallback(async(s=N,i=S)=>{try{ee(!0),ne(null);const l=await Ve(s,i||void 0,c);Ee(l)}catch(l){const o=l instanceof Error?l.message:String(l);ne(o)}finally{ee(!1)}},[c,S,N]);d.useEffect(()=>{b()},[b]),d.useEffect(()=>(q.current&&clearTimeout(q.current),q.current=setTimeout(()=>{E(N,S)},300),()=>{q.current&&clearTimeout(q.current)}),[E,S,N]),d.useEffect(()=>{const s=we.filter(l=>l.hasSetup&&x.some(o=>o.id===l.id));if(s.length===0)return;let i=!1;return Promise.all(s.map(async l=>{try{const o=await ge(l.id,c);if(i)return;z(g=>({...g,[l.id]:o}))}catch{if(i)return;z(o=>({...o,[l.id]:{hasSetup:!0,setupCheckDeferred:!0,deferredReason:"plugin-not-started",pluginState:"installed"}}))}})),()=>{i=!0}},[x,c]);const De=d.useRef([]);De.current=x,d.useEffect(()=>{const s=c?`?projectId=${encodeURIComponent(c)}`:"",i=l=>{try{const o=JSON.parse(l.data);if(o.scope==="project"&&(o.projectId??c)!==c)return;switch(o.transition){case"installing":case"enabled":case"disabled":case"settings-updated":E(N,S),f(g=>{const u=g.findIndex(t=>t.id===o.pluginId);if(u>=0){const t=[...g];return t[u]={...t[u],enabled:o.enabled,state:o.state,settings:o.settings,error:o.error},t}else return b(),g});break;case"state-changed":f(g=>{const u=g.findIndex(t=>t.id===o.pluginId);if(u>=0){const t=[...g];return t[u]={...t[u],state:o.state,error:o.error},t}return g});break;case"uninstalled":f(g=>g.filter(u=>u.id!==o.pluginId)),E(N,S);break;case"error":f(g=>{const u=g.findIndex(t=>t.id===o.pluginId);if(u>=0){const t=[...g];return t[u]={...t[u],state:o.state,error:o.error},t}return g});break}}catch{}};return Qe(`/api/events${s}`,{events:{"plugin:lifecycle":i},onReconnect:()=>{b(),E(N,S)}})},[c,b,E,S,N]);const le=async()=>{if(!w.trim()){r(n("plugins.installPathRequired","Please enter a plugin path"),"error");return}try{v(!0),await Q({path:w,...O?{aiScanOnLoad:!0}:{}},c),r(n("plugins.installedGlobally","Plugin installed globally"),"success"),A(!1),P(""),U(!1),await b(),p?.()}catch(s){r(n("plugins.installFailed","Failed to install plugin: {{error}}",{error:s instanceof Error?s.message:String(s)}),"error")}finally{v(!1)}},Ge=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{X(s.id),await Q({path:s.path},c),r(n("plugins.builtinInstalledGlobally","{{name}} installed globally",{name:s.name}),"success"),await b(),p?.()}catch(i){r(n("plugins.builtinInstallFailed","Failed to install {{name}}: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{X(null)}},Oe=async s=>{if(!s.path){r(n("plugins.registryNotInstallable","{{name}} is not available for one-click install yet",{name:s.name}),"warning");return}try{ie(s.id),await Q({path:s.path},c),r(n("plugins.registryInstalled","{{name}} installed and enabled",{name:s.name}),"success"),await b(),p?.(),await E(N,S)}catch(i){r(n("plugins.registryInstallFailed","Failed to install {{name}}: {{error}}",{name:s.name,error:i instanceof Error?i.message:String(i)}),"error")}finally{ie(null)}},re=async s=>{try{ae(s.id);const i=await rs(s.id,c);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"),te(s.id);const l=await ge(s.id,c);z(o=>({...o,[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{ae(null),te(null)}},H=async s=>{try{const i=await ts(s.id,c);if(f(l=>l.map(o=>o.id===i.id?i:o)),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 b();return}r(n("plugins.enabledForProject","{{name}} enabled for this project",{name:s.name}),"success"),await b(!0,i),p?.()}catch(i){r(n("plugins.enablePluginFailed","Failed to enable plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},V=async s=>{try{const i=await is(s.id,c);f(l=>l.map(o=>o.id===i.id?i:o)),r(n("plugins.disabledForProject","{{name}} disabled for this project",{name:s.name}),"success"),await b(!0,i),p?.()}catch(i){r(n("plugins.disablePluginFailed","Failed to disable plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},Ue=async s=>{s.enabled?await V(s):await H(s)},oe=async s=>{try{R(s.id),await ns(s.id,c),r(n("plugins.reloaded","{{name}} reloaded",{name:s.name}),"success"),await b()}catch(i){r(n("plugins.reloadFailed","Failed to reload plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}finally{R(null)}},ue=async s=>{if(await qe({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 as(s.id,c),r(n("plugins.uninstalledGlobally","{{name}} uninstalled globally",{name:s.name}),"success"),await b(),p?.(),y(null)}catch(l){r(n("plugins.uninstallFailed","Failed to uninstall plugin: {{error}}",{error:l instanceof Error?l.message:String(l)}),"error")}},$e=async(s,i)=>{try{await Ze(s.id,{aiScanOnLoad:i},c),r(i?n("plugins.aiScanEnabled","AI scan on load enabled"):n("plugins.aiScanDisabled","AI scan on load disabled"),"success"),await b()}catch(l){r(n("plugins.updateFailed","Failed to update plugin: {{error}}",{error:l instanceof Error?l.message:String(l)}),"error")}},We=async s=>{try{await es(s.id,c),r(n("plugins.rescanned","{{name}} rescanned",{name:s.name}),"success"),await b()}catch(i){r(n("plugins.rescanFailed","Failed to rescan plugin: {{error}}",{error:i instanceof Error?i.message:String(i)}),"error")}},W=async s=>{y(s);try{J(!0);const i=await ls(s.id,c);j(i)}catch{j({})}finally{J(!1)}},Me=async()=>{if(a)try{await ss(a.id,m,c),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(a)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:()=>y(null),"aria-label":n("plugins.backToList","Back to plugin list"),children:e.jsx(me,{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:a.name}),ve(a,"plugin-error-text plugin-error-text--detail")]}),e.jsx("span",{className:"plugin-state-badge",style:{color:T[a.state]||T.installed},children:a.state})]})]}),e.jsxs("div",{className:"plugin-detail-content",children:[e.jsxs("div",{className:"plugin-detail-card",children:[a.description&&e.jsx("p",{className:"plugin-description",children:a.description}),a.author&&e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:n("plugins.author","Author:")}),a.author]}),a.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:a.homepage,target:"_blank",rel:"noopener noreferrer",children:[a.homepage,e.jsx(Ke,{size:12})]})]}),e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:n("plugins.version","Version:")}),a.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:!!a.aiScanOnLoad,onChange:s=>void $e(a,s.target.checked)}),n("plugins.enableAiScanBeforeLoad","Enable AI scan before load/reload")]}),e.jsxs("button",{className:"btn btn-secondary btn-sm",onClick:()=>void We(a),children:[e.jsx(Je,{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.")}),a.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--${a.lastSecurityScan.verdict}`,children:a.lastSecurityScan.verdict}),e.jsx("span",{className:"text-muted",children:a.lastSecurityScan.scannedAt})]}),e.jsx("p",{className:"plugin-security-summary",children:a.lastSecurityScan.summary}),e.jsxs("details",{children:[e.jsx("summary",{children:n("plugins.findings","Findings ({{count}})",{count:a.lastSecurityScan.findings.length})}),e.jsx("ul",{className:"plugin-security-findings",children:a.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")}),a.id==="fusion-plugin-whatsapp-chat"&&e.jsx(ps,{projectId:c,settings:m}),Re?e.jsx("p",{className:"text-muted",children:e.jsx(he,{label:n("plugins.loading","Loading...")})}):(()=>{const s=ds(a);return s&&Object.keys(s).length>0?e.jsxs("div",{className:"plugin-settings-form",children:[(()=>{const{grouped:i,ungrouped:l}=gs(s),o=[];l.length>0&&o.push({title:null,entries:l});for(const[g,u]of i.entries())o.push({title:g,entries:u});return o.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:Ne[g.title]?n(Ne[g.title],g.title):g.title}),g.entries.map(([u,t])=>{const I=`setting-${u}-help`,D=t.label?Se[t.label]?n(Se[t.label],t.label):t.label:u;return e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:`setting-${u}`,children:[D,t.required&&" *"]}),t.type==="string"&&!t.multiline&&e.jsx("input",{className:"input",type:"text",id:`setting-${u}`,value:m[u]??"",onChange:h=>j({...m,[u]:h.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?I:void 0}),t.type==="string"&&t.multiline&&e.jsx("textarea",{className:"input",id:`setting-${u}`,rows:4,value:m[u]??"",onChange:h=>j({...m,[u]:h.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?I:void 0}),t.type==="password"&&e.jsx("input",{className:"input",type:"password",id:`setting-${u}`,value:m[u]??"",onChange:h=>j({...m,[u]:h.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?I:void 0}),t.type==="number"&&e.jsx("input",{className:"input",type:"number",id:`setting-${u}`,value:m[u]??"",onChange:h=>j({...m,[u]:Number(h.target.value)}),"aria-describedby":t.description&&!t.required?I:void 0}),t.type==="boolean"&&e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:m[u]??!1,onChange:h=>j({...m,[u]:h.target.checked})}),t.description]}),t.type==="enum"&&e.jsxs("select",{className:"select",id:`setting-${u}`,value:m[u]??"",onChange:h=>j({...m,[u]:h.target.value}),"aria-describedby":t.description&&!t.required?I:void 0,children:[e.jsx("option",{value:"",children:n("plugins.selectOption","Select...")}),t.enumValues?.map(h=>e.jsx("option",{value:h,children:h},h))]}),t.type==="array"&&e.jsxs("div",{className:"plugin-settings-array",children:[m[u]?.map((h,C)=>e.jsxs("div",{className:"plugin-settings-array-item",children:[e.jsx("input",{className:"input",type:t.itemType==="number"?"number":"text",value:h??"",onChange:M=>{const G=M.target.value,de=[...m[u]||[]];de[C]=t.itemType==="number"?Number(G):G,j({...m,[u]:de})}}),e.jsx("button",{className:"btn-icon",onClick:()=>{const G=[...m[u]||[]];G.splice(C,1),j({...m,[u]:G})},"aria-label":n("plugins.removeItem","Remove item"),children:e.jsx(me,{size:14})})]},C)),e.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const h=m[u]||[],C=t.itemType==="number"?0:"";j({...m,[u]:[...h,C]})},children:[e.jsx(be,{size:14})," ",n("plugins.addItem","Add Item")]})]}),t.description&&!t.required&&!t.multiline&&e.jsx("span",{id:I,className:"form-help",children:t.description})]},u)})]},g.title??"ungrouped"))})(),e.jsx("button",{className:"btn btn-primary",onClick:Me,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:[a.state==="started"&&e.jsxs("button",{className:"btn btn-secondary",onClick:()=>oe(a),disabled:B===a.id,children:[e.jsx(ye,{size:14,className:B===a.id?"spin":""}),B===a.id?n("plugins.reloading","Reloading..."):n("plugins.reload","Reload")]}),a.enabled?e.jsx("button",{className:"btn btn-secondary",onClick:()=>V(a),children:n("plugins.disableInProject","Disable in Project")}):e.jsx("button",{className:"btn btn-primary",onClick:()=>H(a),children:n("plugins.enableInProject","Enable in Project")}),e.jsxs("button",{className:"btn btn-danger",onClick:()=>ue(a),children:[e.jsx(xe,{size:14})," ",n("plugins.uninstallGlobally","Uninstall Globally")]})]})]})]});const ce=new Map(x.map(s=>[s.id,s])),pe=x,Te=()=>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:S,onChange:s=>Be(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:N,onChange:s=>ke(s.target.value),placeholder:n("plugins.searchRegistryPlaceholder","Search registry plugins")})]})]})]}),Ie?e.jsxs("div",{className:"plugin-registry-state",role:"status",children:[e.jsx(fe,{size:14,className:"spin"}),n("plugins.registryLoading","Loading registry...")]}):se?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:se})}),e.jsx("button",{className:"btn btn-secondary btn-sm plugin-registry-retry",onClick:()=>void E(N,S),children:n("plugins.retry","Retry")})]}):Z.length===0?e.jsx("div",{className:"plugin-registry-state",children:N.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:Z.map(s=>{const i=ce.get(s.id),l=Ae===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?W(i):b()},children:n("plugins.manage","Manage")}):s.canInstall?e.jsx("button",{className:"btn btn-primary btn-sm plugin-registry-action",onClick:()=>void Oe(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)})})]}),_e=()=>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:we.map(s=>{const i=ce.get(s.id),l=!!i,o=Fe[s.id],g=!!(o&&"setupCheckDeferred"in o&&o.setupCheckDeferred),u=o&&"status"in o?o.status:void 0,t=l&&s.hasSetup&&o?.hasSetup&&!g&&i?.state==="started"&&(u==="not-installed"||u==="error"),I=l&&o?.hasSetup&&u==="installed",D=Le===s.id,h=!s.path,C=s.category==="runtime",M=i?.enabled;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"):h?n("plugins.statusBuiltIn","Built in"):n("plugins.statusNotInstalled","Not installed")}),C&&M===!1&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--warning",children:n("plugins.builtinDisabled","Disabled")}),t&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--warning",children:n("plugins.setupRequired","Setup required")}),I&&e.jsx("span",{className:"plugin-builtins-setup-status plugin-builtins-setup-status--ready",children:n("plugins.setupReady","Setup ready")}),D&&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})]}),e.jsxs("div",{className:"plugin-builtins-actions",children:[C&&i&&e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:i.enabled,onChange:()=>void Ue(i),"aria-label":i.enabled?n("plugins.disablePlugin","Disable {{name}}",{name:s.name}):n("plugins.enablePlugin","Enable {{name}}",{name:s.name})}),e.jsx("span",{className:"toggle-slider"})]}),h?l&&t?e.jsx("button",{className:"btn btn-primary btn-sm",onClick:()=>void re(s),disabled:$===s.id||D,children:$===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 W(i),children:n("plugins.manage","Manage")}):C?null: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){Ge(s);return}if(t){re(s);return}i&&W(i)},disabled:Y===s.id||$===s.id||D,children:l?t?$===s.id?n("plugins.settingUp","Setting up..."):n("plugins.installSetup","Install Setup"):n("plugins.manage","Manage"):Y===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:()=>void b(),title:n("plugins.refresh","Refresh"),"aria-label":n("plugins.refreshPluginList","Refresh plugin list"),children:[e.jsx(fe,{size:14,className:F?"spin":""}),n("plugins.refresh","Refresh")]}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>A(!0),children:[e.jsx(be,{size:14})," ",n("plugins.install","Install")]})]})]}),_&&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(os,{value:w,onChange:P,placeholder:n("plugins.installPathPlaceholder","Absolute path to plugin directory or dist folder"),onInputKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),le())}}),e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:O,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:le,disabled:k||!w.trim(),children:k?n("plugins.installing","Installing..."):n("plugins.installPluginGlobally","Install Plugin Globally")}),e.jsx("button",{className:"btn btn-secondary",onClick:()=>{A(!1),P("")},children:n("plugins.cancel","Cancel")})]})]}),F?e.jsx("div",{className:"settings-empty-state",children:e.jsx(he,{label:n("plugins.loadingPlugins","Loading plugins...")})}):e.jsxs(e.Fragment,{children:[pe.length===0?e.jsxs("div",{className:"settings-empty-state",children:[e.jsx(Ye,{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:pe.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:T[s.state]||T.installed},children:s.state})]}),ve(s)]})}),e.jsxs("div",{className:"plugin-actions",children:[s.state==="started"&&e.jsx("button",{className:"btn-icon",onClick:()=>oe(s),disabled:B===s.id,title:n("plugins.reload","Reload"),children:e.jsx(ye,{size:14,className:B===s.id?"spin":""})}),e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>s.enabled?V(s):H(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:()=>W(s),title:n("plugins.settings","Settings"),children:e.jsx(Xe,{size:14})}),e.jsx("button",{className:"btn-icon",onClick:()=>ue(s),title:n("plugins.uninstallGloballyTitle","Uninstall globally"),children:e.jsx(xe,{size:14})})]})]},s.id))}),_e(),Te()]})]})}export{je as AGENT_BROWSER_SETTINGS_SCHEMA,Pe as BUILTIN_AGENT_BROWSER_PLUGIN_ID,we as BUILTIN_PLUGINS,ws as PluginManager,T as STATE_COLORS};
@@ -1 +0,0 @@
1
- @font-face{font-family:Fusion Terminal Nerd Font Symbols;src:url(/fonts/SymbolsNerdFontMono-Regular.ttf) format("truetype");font-display:swap;unicode-range:U+23FB-23FE,U+2665,U+26A1,U+2B58,U+E000-E00A,U+E0A0-E0D7,U+E200-E2A9,U+E300-E3E3,U+E5FA-E6B7,U+E700-E8EF,U+EA60-EC1E,U+ED00-F2FF,U+F300-F533,U+F0001-F1AF0}.cli-session-terminal{display:flex;flex-direction:column;min-height:0;height:100%;background:var(--terminal-bg, var(--bg));border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden}.cli-session-terminal__header{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-xs) var(--space-sm);background:var(--surface);border-bottom:1px solid var(--border);flex-wrap:wrap}.cli-session-terminal__posture-wrap{position:relative}.cli-posture-chip{display:inline-flex;align-items:center;gap:var(--space-xs);padding:2px var(--space-sm);font-size:.75rem;line-height:1.4;color:var(--text);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background var(--transition-fast, .12s) ease}.cli-posture-chip:hover{background:var(--card-hover)}.cli-posture-chip--elevated{color:var(--color-warning);border-color:var(--color-warning)}.cli-posture-chip__mode{color:var(--text-muted)}.cli-posture-chip__flag{font-weight:600}.cli-posture-tooltip{position:absolute;top:calc(100% + var(--space-xs));left:0;z-index:10;min-width:220px;padding:var(--space-sm);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-md)}.cli-posture-tooltip__title{margin:0 0 var(--space-xs);font-size:.75rem;font-weight:600;color:var(--text)}.cli-posture-tooltip__list{margin:0;padding-left:var(--space-md);font-size:.75rem;color:var(--text-muted)}.cli-posture-tooltip__settings{display:inline-flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-sm);padding:2px var(--space-sm);font-size:.75rem;color:var(--accent);background:transparent;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer}.cli-session-terminal__readonly-badge,.cli-session-terminal__replay-badge{display:inline-flex;align-items:center;gap:var(--space-xs);padding:2px var(--space-sm);font-size:.7rem;color:var(--text-muted);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-sm)}.cli-session-terminal__replay-badge[data-replay-mode=ended]{color:var(--text-muted)}.cli-session-terminal__viewport-shell{display:flex;flex:1 1 auto;min-height:0;padding:var(--space-xs);background:var(--terminal-bg, var(--bg))}.cli-session-terminal__viewport{flex:1 1 auto;min-width:0;min-height:0}.cli-session-terminal__viewport,.cli-session-terminal__viewport *{-webkit-text-size-adjust:none;text-size-adjust:none}.cli-session-terminal__viewport .xterm-rows span{font-family:var(--terminal-glyph-font-family, inherit)!important}.cli-session-terminal__advance-strip{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm);background:var(--surface);border-top:1px solid var(--border);flex-wrap:wrap}.cli-session-terminal__advance-copy{font-size:.8125rem;color:var(--text)}.cli-session-terminal__advance-actions{display:flex;gap:var(--space-xs)}.cli-session-terminal__advance-btn{padding:4px var(--space-md);font-size:.8125rem;color:var(--accent-text);background:var(--accent);border:1px solid transparent;border-radius:var(--radius-sm);cursor:pointer}.cli-session-terminal__advance-btn:disabled{opacity:.6;cursor:default}.cli-session-terminal__advance-btn--secondary{color:var(--text);background:var(--card);border-color:var(--border)}.cli-session-terminal__mobile-bar{position:sticky;bottom:0;z-index:5;display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm) calc(var(--space-sm) + env(safe-area-inset-bottom,0px));background:var(--surface);border-top:1px solid var(--border)}.cli-session-terminal__mobile-bar--keyboard-open{position:fixed;left:0;right:0;padding-bottom:var(--space-sm)}.cli-session-terminal__key-row{display:flex;gap:var(--space-xs);overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.cli-session-terminal__key-row::-webkit-scrollbar{display:none}.cli-terminal-key{flex:0 0 auto;min-width:40px;min-height:36px;padding:var(--space-xs) var(--space-sm);font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:.8125rem;color:var(--text);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;touch-action:manipulation}.cli-terminal-key:active{background:var(--card-hover)}.cli-terminal-key--ctrl.cli-terminal-key--active{color:var(--accent-text);background:var(--accent);border-color:var(--accent)}.cli-terminal-key--ctrlc{color:var(--color-warning);border-color:var(--color-warning)}.cli-terminal-key--custom{color:var(--accent-text);border-color:var(--accent)}.cli-session-terminal__input-row{display:flex;gap:var(--space-xs)}.cli-session-terminal__mobile-input{flex:1 1 auto;min-width:0;min-height:38px;padding:var(--space-xs) var(--space-sm);font-size:16px;color:var(--text);background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius-sm)}.cli-session-terminal__mobile-input:focus{outline:none;border-color:var(--accent)}.cli-session-terminal__mobile-send{flex:0 0 auto;min-height:38px;padding:var(--space-xs) var(--space-md);font-size:.8125rem;color:var(--accent-text);background:var(--accent);border:1px solid transparent;border-radius:var(--radius-sm);cursor:pointer;touch-action:manipulation}@media(max-width:768px),(max-height:480px){.cli-session-terminal__viewport{-webkit-overflow-scrolling:touch}}
@@ -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-webgl-uLc0RKcC.js"])))=>i.map(i=>d[i]);
2
- import{W as je,Y as z,_ as ue,$ as J,a0 as me,a1 as F,a2 as Me,a3 as Le,y as De,a4 as Oe,a5 as Y,a6 as Ae,a7 as ze,a as Fe,a8 as K,a9 as Be,aa as Ie}from"./index-B8PcG8AJ.js";import{r as i,j as t}from"./vendor-react-SZ_qB27O.js";import"./vendor-xterm-BNq00GSj.js";import{u as Ke}from"./vendor-i18n-Duky4gdQ.js";import{S as We}from"./shield-alert-4qeU3_Rm.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";const $e=32*1024,Ue=1e4,Qe=100,Ve="\x1B",Je=" ",Ye="",Ge="\x1B[A",He="\x1B[B",qe="\x1B[C",Ze="\x1B[D",W={ctrl:"Ctrl",escape:"Esc",tab:"Tab",ctrlC:"^C"};function fe(m){if(m.length!==1)return null;const o=m.toUpperCase().charCodeAt(0);return o>=64&&o<=95?String.fromCharCode(o&31):null}function Xe(){const[m,f]=i.useState(()=>Y());return i.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const o=window.matchMedia(Ae),a=window.visualViewport,y=()=>f(Y());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)})},[]),m}function et(m,f){if(typeof window>"u")return"";const a=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/cli-sessions/ws?sessionId=${encodeURIComponent(m)}&ticket=${encodeURIComponent(f)}`;return Ie(a)}function tt(){return/Mac|iPhone|iPad|iPod/i.test(navigator.platform)}function pe(m){if(typeof window<"u"&&typeof window.atob=="function"){const f=window.atob(m),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(m,"base64").toString("utf8")}function ut({sessionId:m,readOnly:f=!1,posture:o,mode:a="live",projectId:y,onConfirmAdvance:g,showConfirmAdvance:$=!1,onOpenAdapterSettings:G,active:H=!0}){const{t:r}=Ke("app"),x=i.useRef(null),C=i.useRef(null),N=i.useRef(null),R=i.useRef(null),w=i.useRef(null),[q,Z]=i.useState(!1),[ye,U]=i.useState(!1),[X,ee]=i.useState(!1),P=Xe(),{keyboardOpen:B,keyboardOverlap:be}=je({enabled:P}),he=i.useRef(null),[v,te]=i.useState(""),[j,D]=i.useState(!1),[we,Se]=i.useState(()=>z().customShortcuts),[ne,ie]=i.useState(null),se=f||ne===!0,O=!f&&ne===!1&&a==="live",b=i.useCallback(e=>{if(!e||!O)return;const n=w.current;n?.readyState===WebSocket.OPEN&&n.send(JSON.stringify({type:"input",data:e}))},[O]),M=i.useCallback(e=>{if(j){const n=fe(e);if(D(!1),n){b(n);return}}b(e)},[j,b]),c=i.useCallback(e=>{e.preventDefault()},[]),_e=i.useCallback(e=>{e?.preventDefault?.(),v&&b(v),b("\r"),te("")},[v,b]),ke=i.useCallback(e=>{if(j&&e.length>v.length){const n=e.slice(v.length,v.length+1),l=fe(n);if(D(!1),l){b(l);return}}te(e)},[j,v,b]);i.useEffect(()=>{$&&U(!1)},[$,m]);const T=i.useCallback((e,n)=>{const l=w.current;l?.readyState===WebSocket.OPEN&&l.send(JSON.stringify({type:"resize",cols:e,rows:n}))},[]),oe=i.useCallback(()=>{const e=C.current;if(!e)return;const n=z(),l=ue(n.fontFamily);e.options.fontFamily=l,x.current?.style.setProperty("--terminal-glyph-font-family",J(n.fontFamily)),e.options.fontSize=n.fontSize,e.options.cursorStyle=n.cursorStyle,e.options.cursorBlink=n.cursorBlink&&O;try{N.current?.fit?.(),T(e.cols,e.rows)}catch{}me(n.fontSize,l).then(E=>{if(!(!E||C.current!==e||e.options.fontSize!==n.fontSize||e.options.fontFamily!==l)){F(e,l),e.options.fontSize=n.fontSize;try{N.current?.fit?.(),T(e.cols,e.rows),F(e,l),e.refresh(0,Math.max(0,e.rows-1))}catch{}}},()=>{})},[O,T]);i.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.key===ze&&(oe(),Se(z().customShortcuts))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[oe]);const[ve,Ee]=i.useState(0);i.useEffect(()=>{if(!H)return;const e=C.current,n=N.current;if(e&&n?.fit)try{n.fit(),T(e.cols,e.rows),F(e,String(e.options.fontFamily??"")),e.refresh(0,Math.max(0,e.rows-1))}catch{}const l=w.current;l&&l.readyState!==WebSocket.OPEN&&l.readyState!==WebSocket.CONNECTING&&Ee(E=>E+1)},[H,T]),i.useEffect(()=>{if(!m||typeof window>"u")return;let e=!1,n=null,l=null,E=0;ie(null);const Q=T,le=p=>{if(E+=p,E<$e)return;const S=w.current;S?.readyState===WebSocket.OPEN&&S.send(JSON.stringify({type:"ack",bytes:E})),E=0};return(async()=>{let p;try{p=await Fe(`/cli-sessions/${encodeURIComponent(m)}/attach-ticket`,{method:"POST",body:JSON.stringify(y?{projectId:y}:{})})}catch{return}if(e)return;ie(p.readOnly);const S=!f&&!p.readOnly&&a==="live",[{Terminal:xe},{FitAddon:Ne},{Unicode11Addon:Re}]=await Promise.all([K(()=>import("./vendor-xterm-BNq00GSj.js").then(d=>d.x),__vite__mapDeps([0,1,2])),K(()=>import("./addon-fit-C1WQXRvu.js").then(d=>d.a),__vite__mapDeps([3,1])),K(()=>import("./addon-unicode11-D3Fsv-Po.js"),[])]);if(e||!x.current)return;const _=z(),A=ue(_.fontFamily);x.current.style.setProperty("--terminal-glyph-font-family",J(_.fontFamily));const s=new xe({convertEol:!1,cursorBlink:_.cursorBlink&&S,cursorStyle:_.cursorStyle,disableStdin:!S,scrollback:Ue,fontFamily:A,fontSize:_.fontSize}),L=new Ne;s.loadAddon(L);const Pe=new Re;if(s.loadAddon(Pe),s.unicode.activeVersion="11",Be(()=>{s.open(x.current)}),C.current=s,N.current=L,_.renderer==="auto"&&!Y())try{const{WebglAddon:d}=await K(async()=>{const{WebglAddon:u}=await import("./addon-webgl-uLc0RKcC.js").then(h=>h.a);return{WebglAddon:u}},__vite__mapDeps([4,1]));if(!e){const u=new d;u.onContextLoss(()=>{try{u.dispose()}catch{}R.current===u&&(R.current=null)}),s.loadAddon(u),R.current=u}}catch{}try{L.fit()}catch{}(async()=>{if(!(!await me(_.fontSize,A)||e||C.current!==s||N.current!==L||s.options.fontSize!==_.fontSize||s.options.fontFamily!==A))try{F(s,A),s.options.fontSize=_.fontSize,L.fit(),Q(s.cols,s.rows),F(s,A),s.refresh(0,Math.max(0,s.rows-1))}catch{}})(),S&&(s.onData(d=>{const u=w.current;u?.readyState===WebSocket.OPEN&&u.send(JSON.stringify({type:"input",data:d}))}),s.attachCustomKeyEventHandler(d=>{if(d.type!=="keydown"||!(tt()?d.metaKey:d.ctrlKey)||d.altKey||d.shiftKey)return!0;const h=d.key.toLowerCase();if(h==="c"){const k=s.hasSelection()?s.getSelection():"";return k?(navigator.clipboard?.writeText(k).catch(()=>{}),!1):!0}if(h==="v"){const k=navigator.clipboard?.readText;return k&&k.call(navigator.clipboard).then(ce=>{if(!ce)return;const de=w.current;de?.readyState===WebSocket.OPEN&&de.send(JSON.stringify({type:"input",data:ce}))}).catch(()=>{}),!1}return!0})),n=new ResizeObserver(()=>{l&&clearTimeout(l),l=setTimeout(()=>{try{L.fit(),Q(s.cols,s.rows),s.refresh(0,Math.max(0,s.rows-1))}catch{}},Qe)}),n.observe(x.current);const V=new WebSocket(et(m,p.ticket));w.current=V,V.onopen=()=>{Q(s.cols,s.rows)},V.onmessage=d=>{let u;try{u=JSON.parse(typeof d.data=="string"?d.data:"")}catch{return}switch(u.type){case"scrollback":{if(typeof u.data!="string")return;s.reset();const h=pe(u.data),k=h.length;s.write(h,()=>le(k));break}case"data":{if(typeof u.data!="string")return;const h=pe(u.data),k=h.length;s.write(h,()=>le(k));break}}}})(),()=>{e=!0,l&&clearTimeout(l),n&&n.disconnect();const p=w.current;if(p){p.onopen=null,p.onmessage=null,p.onclose=null,p.onerror=null;try{p.close()}catch{}w.current=null}if(R.current){try{R.current.dispose()}catch{}R.current=null}const S=C.current;if(S){try{S.dispose()}catch{}C.current=null}N.current=null}},[m,f,a,y,T,ve]);const ae=i.useMemo(()=>a==="idle"?r("cliTerminal.replayIdle","Session idle"):a==="ended"?r("cliTerminal.replayEnded","Session ended"):null,[a,r]),Ce=i.useCallback(async()=>{if(g){ee(!0);try{await g("advance"),U(!0)}finally{ee(!1)}}},[g]),Te=i.useCallback(async()=>{g&&await g("not-yet"),U(!0)},[g]),I=!!o?.elevated,re=o?.elevatedFlags?.join(", "),ge={"--terminal-glyph-font-family":J(z().fontFamily)};return t.jsxs("div",{className:`cli-session-terminal${P?" cli-session-terminal--mobile":""}${P&&B?" cli-session-terminal--keyboard-open":""}`,"data-mode":a,"data-read-only":se,"data-mobile":P,"data-keyboard-open":P&&B,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${I?" cli-posture-chip--elevated":""}`,"data-elevated":I,"aria-expanded":q,onClick:()=>Z(e=>!e),children:[I?t.jsx(We,{size:13,"aria-hidden":"true"}):t.jsx(Me,{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}),I&&re&&t.jsx("span",{className:"cli-posture-chip__flag",children:re})]}),q&&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")})]}),G&&t.jsxs("button",{type:"button",className:"cli-posture-tooltip__settings",onClick:()=>{Z(!1),G()},children:[t.jsx(Le,{size:12,"aria-hidden":"true"}),r("cliTerminal.adapterSettings","Adapter settings")]})]})]}),se&&t.jsxs("span",{className:"cli-session-terminal__readonly-badge",children:[t.jsx(De,{size:12,"aria-hidden":"true"}),r("cliTerminal.readOnly","Read-only")]}),ae&&t.jsx("span",{className:"cli-session-terminal__replay-badge","data-replay-mode":a,children:ae})]}),t.jsx("div",{className:"cli-session-terminal__viewport-shell",children:t.jsx("div",{className:"cli-session-terminal__viewport",ref:x,"data-testid":"cli-terminal-viewport",style:ge})}),$&&!ye&&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:X,onClick:Ce,children:r("cliTerminal.advance","Advance")}),t.jsx("button",{type:"button",className:"cli-session-terminal__advance-btn cli-session-terminal__advance-btn--secondary",disabled:X,onClick:Te,children:r("cliTerminal.notYet","Not yet")})]})]}),P&&O&&t.jsxs("div",{className:`cli-session-terminal__mobile-bar${B?" cli-session-terminal__mobile-bar--keyboard-open":""}`,"data-testid":"cli-terminal-mobile-bar",style:B?{bottom:`${be}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${j?" cli-terminal-key--active":""}`,"data-testid":"cli-key-ctrl","aria-label":r("cliTerminal.mobileKeyCtrl","Sticky Ctrl modifier"),"aria-pressed":j,onPointerDown:c,onMouseDown:c,onClick:()=>D(e=>!e),children:W.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:()=>M(Ve),children:W.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:()=>M(Je),children:W.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:()=>{D(!1),b(Ye)},children:W.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:()=>M(Ge),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:()=>M(He),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:()=>M(Ze),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:()=>M(qe),children:"→"}),we.map(e=>t.jsx("button",{type:"button",className:"cli-terminal-key cli-terminal-key--custom","data-testid":`cli-terminal-custom-shortcut-${e.id}`,title:e.label,"aria-label":e.label,onPointerDown:c,onMouseDown:c,onClick:()=>{D(!1),b(Oe(e.value))},children:e.label},e.id))]}),t.jsxs("form",{className:"cli-session-terminal__input-row",onSubmit:_e,children:[t.jsx("input",{ref:he,type:"text",className:"cli-session-terminal__mobile-input","data-testid":"cli-terminal-mobile-input",value:v,placeholder:r("cliTerminal.mobileInputPlaceholder","Type to send to the session…"),autoCapitalize:"off",autoCorrect:"off",autoComplete:"off",spellCheck:!1,onChange:e=>ke(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{ut as SessionTerminal};