@forsion/unit 2.13.1 → 2.13.3

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 (187) hide show
  1. package/main.mjs +21 -3
  2. package/package.json +1 -1
  3. package/release.json +5 -5
  4. package/web/assets/{ArtificialView-XwHMLUFb.js → ArtificialView-DS97zlMg.js} +1 -1
  5. package/web/assets/{AutomationBuilder-hqs0QhMt.js → AutomationBuilder-BsJc8wuC.js} +1 -1
  6. package/web/assets/CalendarConfigView-BN8mraSo.js +1 -0
  7. package/web/assets/CalendarView-D55PA1vn.js +1 -0
  8. package/web/assets/{CapabilityMenu-SwVlZ06x.js → CapabilityMenu-BVrokPpT.js} +1 -1
  9. package/web/assets/{CheckboxInput-BC-5a_C9.js → CheckboxInput-BuJ3HPm_.js} +1 -1
  10. package/web/assets/{Chrome-HdfyYV3i.js → Chrome-amTcZNE4.js} +1 -1
  11. package/web/assets/{CodeView-CFL6yQ-6.js → CodeView-DRVh13k9.js} +3 -3
  12. package/web/assets/DashboardGridView-D9s9pez_.css +1 -0
  13. package/web/assets/DashboardGridView-DlFyYfUh.js +17 -0
  14. package/web/assets/{EventCard-B_ndpqH_.js → EventCard-DUrn2krw.js} +1 -1
  15. package/web/assets/ExcalidrawCanvas-TpbzBF-J.js +1 -0
  16. package/web/assets/{FloatingToc-Ce9GamvH.js → FloatingToc-B1d4-5EL.js} +1 -1
  17. package/web/assets/HomepageView-DnQ_5Obe.css +1 -0
  18. package/web/assets/HomepageView-nzKfbHM-.js +1 -0
  19. package/web/assets/ImageStudioPanels-B2PTq6Yb.js +3 -0
  20. package/web/assets/{ImageStudioView-UPv52acl.js → ImageStudioView-Cawr6pGW.js} +1 -1
  21. package/web/assets/InlineFiles-DKPH5JHz.js +1 -0
  22. package/web/assets/MarkdownBlock-BHpDy2qQ.js +58 -0
  23. package/web/assets/ModelPill-ChzAM3z1.js +2 -0
  24. package/web/assets/MuseLibraryView-DLuQ_jyV.js +2 -0
  25. package/web/assets/{MuseView-CC2A7MBs.js → MuseView-CDDwV6SR.js} +2 -2
  26. package/web/assets/{PageHistoryPanel-KhKT1DLy.js → PageHistoryPanel-BbdXpjJM.js} +2 -2
  27. package/web/assets/{PdfAnnotator-DUyrgY-t.js → PdfAnnotator-CW0wPWRB.js} +1 -1
  28. package/web/assets/PenRow-BY-MZLDQ.js +1 -0
  29. package/web/assets/{ProductView-CgsIYZqD.js → ProductView-0ieVL3rY.js} +1 -1
  30. package/web/assets/{RightPanel-BHDgqTFs.js → RightPanel-BRexwQ3W.js} +3 -3
  31. package/web/assets/RunLocationPicker-BrDfOu8-.css +1 -0
  32. package/web/assets/RunLocationPicker-CadYiE7C.js +43 -0
  33. package/web/assets/{SketchCard-BGYz-bXP.js → SketchCard-BcXCdBAs.js} +212 -8
  34. package/web/assets/{StudioGuestSurface-lt6znmkl.js → StudioGuestSurface-ZJFKnNYF.js} +1 -1
  35. package/web/assets/TodoListView-DuRdVFgB.js +1 -0
  36. package/web/assets/{Tooltip-ZxrDqN4p.js → Tooltip-DtDUL18W.js} +1 -1
  37. package/web/assets/UnifiedPage-D7JTfABH.js +68 -0
  38. package/web/assets/{amadeus-manual.en-DzRWr4BL.js → amadeus-manual.en-B8J-svqq.js} +1 -1
  39. package/web/assets/{amadeus-manual.zh-DW32DkL7.js → amadeus-manual.zh-CkCOFnrg.js} +1 -1
  40. package/web/assets/appStore-ClD7vq5L.css +1 -0
  41. package/web/assets/appStore-affnJoin.js +3292 -0
  42. package/web/assets/{arrow-up-right-DrCXuWS7.js → arrow-up-right-R4P9Mmxz.js} +1 -1
  43. package/web/assets/{astryxBridge-D-m4_kYt.js → astryxBridge-CT2wZJXs.js} +3 -3
  44. package/web/assets/{automationListSource-C8BNy6RY.js → automationListSource-JVBMsMbC.js} +1 -1
  45. package/web/assets/boardSurface-Ce0_vf9f.js +1 -0
  46. package/web/assets/{book-open-OLNm7OaB.js → book-open-CcXCToyx.js} +1 -1
  47. package/web/assets/{calendarNavStore-Cylfvv3s.js → calendarNavStore-tQJRVpum.js} +1 -1
  48. package/web/assets/{canvasPrefs-8taQ42Cz.js → canvasPrefs-CSuX9aLF.js} +1 -1
  49. package/web/assets/{chatBoxSurface-CIlzs45H.js → chatBoxSurface-IG6Vu4Dz.js} +1 -1
  50. package/web/assets/{circle-question-mark-XbAFplz1.js → circle-question-mark-O8AhUz35.js} +1 -1
  51. package/web/assets/{circle-x-fcReAZaE.js → circle-x-AV2ZWulM.js} +1 -1
  52. package/web/assets/{client-0MPbodA6.js → client-BqhpYbYL.js} +1 -1
  53. package/web/assets/{code-xml-Cuna8Kh4.js → code-xml-DdR58F83.js} +1 -1
  54. package/web/assets/{codeStudioStore-BBU62GTy.js → codeStudioStore-Dq5i8nbE.js} +1 -1
  55. package/web/assets/codingNavigation-CxdCK78-.js +53 -0
  56. package/web/assets/codingNavigation-_tOR0ell.css +1 -0
  57. package/web/assets/{create-BGtEfCcg.js → create-BgJN5qsj.js} +2 -2
  58. package/web/assets/dashboardSurface-BY-AFB-r.js +1 -0
  59. package/web/assets/{deskCapture-BiUCmqfc.js → deskCapture-BD2qD6NI.js} +1 -1
  60. package/web/assets/{diff2html-BNp2FTbk.js → diff2html-OoRdHZ_O.js} +1 -1
  61. package/web/assets/{docx-preview-CFznGVOU.js → docx-preview-B43XC8Cn.js} +1 -1
  62. package/web/assets/{emoji-6zl4yfOS.js → emoji-BPdA62d7.js} +1 -1
  63. package/web/assets/{floatingTocSurface-DreXPCa6.js → floatingTocSurface-BM2SYE_u.js} +1 -1
  64. package/web/assets/{foldActions-05QcQziQ.js → foldActions-BcyvNVBs.js} +1 -1
  65. package/web/assets/{folder-BpsfOHD4.js → folder-CCZqnwRc.js} +1 -1
  66. package/web/assets/{folder-plus-BeQHr4AZ.js → folder-plus-BJKT1Pqg.js} +1 -1
  67. package/web/assets/{gestures-DQBCcK4y.js → gestures-BwPbZDkU.js} +1 -1
  68. package/web/assets/{hand-Bko7ms15.js → hand-DRu7IJdU.js} +1 -1
  69. package/web/assets/{hard-drive-BpuI5ebj.js → hard-drive-CXNJUCXw.js} +1 -1
  70. package/web/assets/i18n-BMo19xaR.css +1 -0
  71. package/web/assets/i18n.generated-DvY59Zq3.js +15 -0
  72. package/web/assets/{imageStudio-BLVNKmEG.js → imageStudio-Axwmd4GW.js} +2 -2
  73. package/web/assets/imageStudio-DZ0qGU2s.css +1 -0
  74. package/web/assets/{index-C4L6vjd_.js → index-B1rE_NwA.js} +1 -1
  75. package/web/assets/{index-OD1gSX3h.js → index-BFTY79aq.js} +1 -1
  76. package/web/assets/{index-D6AycQIz.js → index-BGEkZBs2.js} +1 -1
  77. package/web/assets/{index-Cff42k7q.js → index-BO2XJc36.js} +1 -1
  78. package/web/assets/index-BYUntVIZ.js +297 -0
  79. package/web/assets/{index-C1doZp5H.js → index-C65u4fXd.js} +1 -1
  80. package/web/assets/{index-D7gVhvNY.js → index-C_Ohi-I3.js} +1 -1
  81. package/web/assets/{index-rggq2czF.js → index-CkMhazev.js} +1 -1
  82. package/web/assets/{index-D9UZQy42.js → index-CobUnTcv.js} +1 -1
  83. package/web/assets/{index-BgnNNv3e.js → index-D102FOuM.js} +1 -1
  84. package/web/assets/{index-DuBQ0j2g.js → index-D3CYvMpl.js} +1 -1
  85. package/web/assets/{index-BHm6K743.js → index-D78izbLA.js} +1 -1
  86. package/web/assets/{index-CwcOeZdT.js → index-DDMXVG0h.js} +1 -1
  87. package/web/assets/{index-Ck_O3Jdd.js → index-DY0M_dpd.js} +1 -1
  88. package/web/assets/{index-CLHoq1w-.js → index-DcbZwhpE.js} +1 -1
  89. package/web/assets/{index-CJeUgjPU.js → index-Dlkq7gkE.js} +1 -1
  90. package/web/assets/{index-o8cj0pRH.js → index-HqmJW2np.js} +1 -1
  91. package/web/assets/{index-sCXThwqZ.js → index-LxlyPm0_.js} +1 -1
  92. package/web/assets/{index-CD3yIkOA.js → index-Uq4J2aoW.js} +1 -1
  93. package/web/assets/{index-rHjhbwvm.js → index-WbVt2P8R.js} +1 -1
  94. package/web/assets/{index-CUZI62qU.js → index-XyjIhkPw.js} +1 -1
  95. package/web/assets/index-Y2kzYlZq.js +1 -0
  96. package/web/assets/{index-C0Gy2NQ6.js → index-mB0EQkyZ.js} +1 -1
  97. package/web/assets/{index-Uo5tswys.js → index-pJh7JN7_.js} +1 -1
  98. package/web/assets/{index-BF10xp_K.js → index-taRxNsbp.js} +1 -1
  99. package/web/assets/{invitePage-b0HGvMj6.js → invitePage-BW0BH8Ac.js} +1 -1
  100. package/web/assets/{ipc-CxAyeo8q.js → ipc-D7yENkjV.js} +1 -1
  101. package/web/assets/{jszip.min-B94KpE21.js → jszip.min-UE5d5vPJ.js} +1 -1
  102. package/web/assets/{layout-grid-BBVuEdWG.js → layout-grid-Hs3eDA07.js} +1 -1
  103. package/web/assets/linkFollow-Msu1XH9v.js +8 -0
  104. package/web/assets/{list-tree-4-0QDbLu.js → list-tree-DmuRb-p9.js} +1 -1
  105. package/web/assets/{listFold-DLuxXiIj.js → listFold-CKxjyY5_.js} +1 -1
  106. package/web/assets/{lock-CnbZm4vo.js → lock-kffGfeHt.js} +1 -1
  107. package/web/assets/{log-out-BEynWaHa.js → log-out-B5gEP0tF.js} +1 -1
  108. package/web/assets/main-DIyFlyfK.js +20 -0
  109. package/web/assets/markdownEditorSurface-Cx2rqFAY.js +3 -0
  110. package/web/assets/{message-square-plus-CpiKDvle.js → message-square-plus-DxBPIhPS.js} +1 -1
  111. package/web/assets/{messages-_jta1lSI.js → messages-4w1Khzm1.js} +1 -1
  112. package/web/assets/minus-CfoZ4oxr.js +1 -0
  113. package/web/assets/mobileEntry-B8JwR53-.js +13 -0
  114. package/web/assets/{nativeDownload-BYT082bY.js → nativeDownload-Udrv_tmU.js} +1 -1
  115. package/web/assets/{pageChrome-D3Niv1JM.js → pageChrome-D-9npbUE.js} +1 -1
  116. package/web/assets/pageChrome-eO9pb2fH.css +1 -0
  117. package/web/assets/{pageTree-CgfvpzIj.js → pageTree-CIXFRCLk.js} +4 -4
  118. package/web/assets/{pen-tool-BXEFnU2i.js → pen-tool-D_Y9We9x.js} +1 -1
  119. package/web/assets/{pencil-cqvCkekG.js → pencil-DGiTRzW1.js} +1 -1
  120. package/web/assets/phoneList-BQfCJwKF.css +1 -0
  121. package/web/assets/phoneList-DHUia6HT.js +9 -0
  122. package/web/assets/pluginChat-BXuJiMYi.js +2 -0
  123. package/web/assets/{redo-2-BO7wCDwy.js → redo-2-QgiKEg9T.js} +1 -1
  124. package/web/assets/{rotate-ccw-BvipPIjC.js → rotate-ccw-BLoH5er1.js} +1 -1
  125. package/web/assets/{sharePage-XbN50US7.js → sharePage-DYYN5usb.js} +2 -2
  126. package/web/assets/{shareViewer-BaYogetW.js → shareViewer-BzuSyJv_.js} +2 -2
  127. package/web/assets/{star-BQWMXnn7.js → star-BmywYD3u.js} +1 -1
  128. package/web/assets/tableSurface-21LDYY_G.js +1 -0
  129. package/web/assets/{terminal-l9k6RDrH.js → terminal-BlmA_Z1C.js} +1 -1
  130. package/web/assets/{terminalView-Cpnt5_0P.js → terminalView-SAxITnRW.js} +1 -1
  131. package/web/assets/{theme-C6D3tMGV.css → theme-Dgqst5S9.css} +1 -1
  132. package/web/assets/{type-CFoaj2eD.js → type-DmIL6FB-.js} +1 -1
  133. package/web/assets/{undo-2-DusxpdLa.js → undo-2-yMeXc8Wi.js} +1 -1
  134. package/web/assets/{unitAccount-DwutFPPw.js → unitAccount-BPYRAa3m.js} +1 -1
  135. package/web/assets/unitBridge-BNVzai6X.js +1 -0
  136. package/web/assets/{unitCloudTransport-vA7cLDts.js → unitCloudTransport-iFweA1xk.js} +1 -1
  137. package/web/assets/{unitOwnerAccess-LBlJ1YfA.js → unitOwnerAccess-Bggl7bDP.js} +1 -1
  138. package/web/assets/{unitShim-B_M9IrbC.js → unitShim-BP2nBO_k.js} +3 -3
  139. package/web/assets/{upload-ZrOj6tXA.js → upload-D20PZHXc.js} +1 -1
  140. package/web/assets/userSpaces-CrLrKklx.js +1 -0
  141. package/web/assets/viewportLock-DO1lzA2N.css +1 -0
  142. package/web/assets/viewportLock-tlT6H_Hc.js +629 -0
  143. package/web/assets/{workflow-DPoG4QE2.js → workflow-Bd6xBHiT.js} +1 -1
  144. package/web/assets/{zoom-in-lbTgzdQP.js → zoom-in-_TgFOpyv.js} +1 -1
  145. package/web/index.html +24 -27
  146. package/web/assets/CalendarConfigView-DKib8Oed.js +0 -1
  147. package/web/assets/CalendarView-DJ5iOzvu.js +0 -1
  148. package/web/assets/DashboardGridView-B9DCWYVb.js +0 -17
  149. package/web/assets/DashboardGridView-Ck3LKkOb.css +0 -1
  150. package/web/assets/ExcalidrawCanvas-BQ4KKLJP.js +0 -1
  151. package/web/assets/HomepageView-BNabJQfP.css +0 -1
  152. package/web/assets/HomepageView-RCOfcVbE.js +0 -1
  153. package/web/assets/ImageStudioPanels-lkS_y2uM.js +0 -3
  154. package/web/assets/InlineFiles-CQbQumkf.js +0 -1
  155. package/web/assets/MarkdownBlock-CkqiwPXa.js +0 -58
  156. package/web/assets/ModelPill-CY-rU1RU.js +0 -2
  157. package/web/assets/MuseLibraryView-CtTHlVnT.js +0 -2
  158. package/web/assets/RunLocationPicker-BE5mxnab.css +0 -1
  159. package/web/assets/RunLocationPicker-DBnXYV5B.js +0 -38
  160. package/web/assets/SidebarRow-BAJxbMcx.js +0 -9
  161. package/web/assets/SidebarRow-CsWEqPKX.css +0 -1
  162. package/web/assets/TodoListView-DPKhee6i.js +0 -1
  163. package/web/assets/UnifiedPage-BX6ZQL0h.js +0 -68
  164. package/web/assets/appStore-DWP8UET9.js +0 -3166
  165. package/web/assets/appStore-wtOILggO.css +0 -1
  166. package/web/assets/codingNavigation-CZB4v1ZW.css +0 -1
  167. package/web/assets/codingNavigation-DDlPpPk5.js +0 -47
  168. package/web/assets/dashboardSurface-BYM3C7WG.js +0 -1
  169. package/web/assets/i18n-ecQQxiMQ.css +0 -1
  170. package/web/assets/i18n.generated-BuLjnmY8.js +0 -15
  171. package/web/assets/imageStudio--KF9gwHA.css +0 -1
  172. package/web/assets/index-BM2o7PeV.js +0 -298
  173. package/web/assets/index-CuiYK18N.js +0 -1
  174. package/web/assets/linkFollow-B7ivDZMM.js +0 -8
  175. package/web/assets/main-sIq2N9Z5.js +0 -20
  176. package/web/assets/markdownEditorSurface-ZSJ3RHAv.js +0 -3
  177. package/web/assets/mdMarkStore-DQHDjG7s.js +0 -2
  178. package/web/assets/mdMarks-DbIcRa0O.js +0 -1
  179. package/web/assets/minus-C9ndHJ9O.js +0 -1
  180. package/web/assets/mobileEntry-CPmU_c4m.js +0 -13
  181. package/web/assets/pageChrome-CovzZPdb.css +0 -1
  182. package/web/assets/pluginChat-BbBukMuN.js +0 -2
  183. package/web/assets/tableSurface-BXqqidd1.js +0 -1
  184. package/web/assets/unitBridge-CcgQpkqV.js +0 -1
  185. package/web/assets/userSpaces-uJOnsedR.js +0 -1
  186. package/web/assets/viewportLock-D3SNkwS2.js +0 -631
  187. package/web/assets/viewportLock-IP1zaVkz.css +0 -1
@@ -0,0 +1,43 @@
1
+ import{d,t as Re,r as xe,j as t,u as Ce,T as Gn,R as sn,N as Xr,O as Jr,P as Qr,v as As}from"./index-BYUntVIZ.js";import{G as Oe,u as I,ma as Zr,t as ft,mb as ec,mc as tc,md as nc,N as ko,me as sc,i8 as xo,aN as an,cP as wo,bI as ac,bq as fa,fo as bo,U as Gs,aF as ht,aK as gt,bK as Xn,ar as ns,ln as ic,mf as oc,mg as rc,mh as cc,lo as lc,lv as uc,lw as dc,mi as mc,mj as hc,mk as pc,fD as on,q as Jn,b as Cn,ej as ss,ap as Mi,aC as Ts,bg as fc,Y as gc,Z as vc,at as In,aQ as tn,c6 as Ft,T as jo,ah as So,ml as No,iF as yc,_ as ga,I as Rs,mm as kc,aJ as ls,b1 as xc,mn as wc,mo as bc,cM as jc,iu as Sc,iq as Ei,cq as Nc,mp as Ai,mq as Ct,mr as Cc,ms as zc,lu as Mc,mt as Ec,mu as Is,h as Ac,bG as Tc,e0 as Rc,ea as Ic,er as $c,lh as Ti,eo as Lc,mv as $s,cO as Pc,a3 as Dc,mw as _c,mx as Fc,my as Oc,lX as Wc,cQ as Uc,mz as Co,mA as Bc,mB as qc,mC as Hc,mD as Vc,cj as Ri,mE as Kc,kQ as Yc,ci as Gc,as,mF as Xc,aT as Jc,mG as Qc,hA as Zc,mH as el,V as zo,hK as Ii,cs as nn,cr as tl,H as nl,mI as sl,hD as Ot,mJ as al,mK as il,mL as rn,l$ as $n,bC as ol,mM as $i,n as Ls,mN as Ln,lZ as An,mO as Mo,mP as va,kX as rl,a6 as is,ab as Eo,bD as Ao,ig as cl,id as ll,mQ as ul,mR as dl,h0 as ya,o as ml,f as hl,mS as To,c as pl,g as fl,lH as Ro,mT as gl,iB as vl,dm as Li,l as yl,h1 as Ps,ai as Xs,ce as kl,e4 as xl,mU as wl,mV as bl,hH as jl,a5 as Sl,am as Nl,f6 as Io,eb as $o,lU as Pi,lV as Cl}from"./appStore-affnJoin.js";import{u as Di,n as _i}from"./codeStudioStore-Dq5i8nbE.js";import{a as zl,u as Fi,C as Ml,j as El}from"./RightPanel-BRexwQ3W.js";import{c as us,n as qn}from"./nativeDownload-Udrv_tmU.js";import"./client-BqhpYbYL.js";import{h as Al,o as ka,C as Tl,k as Rl,t as Lo,u as Il,A as $l,m as Ll,l as Pl,i as Dl,a as Js,p as _l,S as Fl,q as Ol,w as Wl,s as Ul,v as Bl,P as Hn,f as ql,g as Po,d as Qs,e as Do,x as Hl}from"./phoneList-DHUia6HT.js";import{t as Zs,c as Vl,g as Kl,a as Yl}from"./ModelPill-ChzAM3z1.js";import{P as Mn}from"./pencil-DGiTRzW1.js";import{c as Gl,D as Xl}from"./create-BgJN5qsj.js";import{S as Jl,W as Ql}from"./approvalText-Cy2UAUAQ.js";import{M as Zl}from"./message-square-plus-DxBPIhPS.js";import{F as os}from"./folder-CCZqnwRc.js";import{H as eu}from"./hand-DRu7IJdU.js";import{F as _o}from"./folder-plus-BJKT1Pqg.js";import{i as tu}from"./ipc-D7yENkjV.js";import{a as nu,S as Fo,I as su}from"./pageChrome-D-9npbUE.js";const au=[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h2",key:"tvwodi"}],["path",{d:"M20 8v11a2 2 0 0 1-2 2h-2",key:"1gkqxj"}],["path",{d:"m9 15 3-3 3 3",key:"1pd0qc"}],["path",{d:"M12 12v9",key:"192myk"}]],Oi=Oe("archive-restore",au);const iu=[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8",key:"1s80jp"}],["path",{d:"M10 12h4",key:"a56b0p"}]],Qn=Oe("archive",iu);const ou=[["path",{d:"M2 10v3",key:"1fnikh"}],["path",{d:"M6 6v11",key:"11sgs0"}],["path",{d:"M10 3v18",key:"yhl04a"}],["path",{d:"M14 8v7",key:"3a1oy3"}],["path",{d:"M18 5v13",key:"123xd1"}],["path",{d:"M22 10v3",key:"154ddg"}]],ru=Oe("audio-lines",ou);const cu=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}],["path",{d:"m9.5 10.5 5 5",key:"ra9qjz"}],["path",{d:"m14.5 10.5-5 5",key:"l2rkpq"}]],Wi=Oe("folder-x",cu);const lu=[["path",{d:"M13.4 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7.4",key:"re6nr2"}],["path",{d:"M2 6h4",key:"aawbzj"}],["path",{d:"M2 10h4",key:"l0bgd4"}],["path",{d:"M2 14h4",key:"1gsvsf"}],["path",{d:"M2 18h4",key:"1bu2t1"}],["path",{d:"M21.378 5.626a1 1 0 1 0-3.004-3.004l-5.01 5.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z",key:"pqwjuv"}]],uu=Oe("notebook-pen",lu);const du=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]],Zn=Oe("panels-top-left",du);const mu=[["circle",{cx:"11",cy:"4",r:"2",key:"vol9p0"}],["circle",{cx:"18",cy:"8",r:"2",key:"17gozi"}],["circle",{cx:"20",cy:"16",r:"2",key:"1v9bxh"}],["path",{d:"M9 10a5 5 0 0 1 5 5v3.5a3.5 3.5 0 0 1-6.84 1.045Q6.52 17.48 4.46 16.84A3.5 3.5 0 0 1 5.5 10Z",key:"1ydw1z"}]],hu=Oe("paw-print",mu);const pu=[["line",{x1:"9",x2:"9",y1:"4",y2:"20",key:"ovs5a5"}],["path",{d:"M4 7c0-1.7 1.3-3 3-3h13",key:"10pag4"}],["path",{d:"M18 20c-1.7 0-3-1.3-3-3V4",key:"1gaosr"}]],fu=Oe("pi",pu);const gu=[["path",{d:"M12 17v5",key:"bb1du9"}],["path",{d:"M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89",key:"znwnzq"}],["path",{d:"m2 2 20 20",key:"1ooewy"}],["path",{d:"M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11",key:"c9qhm2"}]],Ui=Oe("pin-off",gu);const vu=[["path",{d:"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"rib7q0"}],["path",{d:"M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z",key:"1ymkrd"}]],yu=Oe("quote",vu);const ku=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3",key:"mhlwft"}],["path",{d:"M12 17h.01",key:"p32p05"}]],xu=Oe("shield-question-mark",ku);const wu=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]],Oo=Oe("user-plus",wu);const bu=[["path",{d:"M2 12q2.5 2 5 0t5 0 5 0 5 0",key:"8ddzzs"}],["path",{d:"M2 19q2.5 2 5 0t5 0 5 0 5 0",key:"1wj4st"}],["path",{d:"M2 5q2.5 2 5 0t5 0 5 0 5 0",key:"69x50u"}]],ju=Oe("waves-horizontal",bu);let bn=null,Ds=null;function Su(e){const n=I.getState().tr;return n(`channel.name.${e}`)}function Nu(e){const n=e.filter(o=>o.enabled&&o.workspace).map(o=>({key:o.workspace,name:Su(o.kind),kind:"channel",channel:o.kind,path:o.workspace,system:!0})),a=I.getState().channelWorkspaces;a.length===n.length&&a.every((o,r)=>o.key===n[r].key&&o.name===n[r].name&&o.channel===n[r].channel)||I.setState({channelWorkspaces:n})}const Cu=us((e,n)=>({channels:[],available:!1,loaded:!1,refresh:async()=>{if(window.tangu?.backendStatus)try{const a=await nc(ft()),i=Array.isArray(a.channels)?a.channels:[];e({channels:i,available:!!a.available,loaded:!0}),Nu(i)}catch{}},save:async(a,i)=>{await tc(ft(),a,i),await n().refresh()},connect:async a=>{const i=await ec(ft(),a);return await n().refresh(),I.getState().refreshSessions(I.getState().cfg),i},disconnect:async(a,i)=>{await Zr(ft(),a,i),await n().refresh()},startPolling:()=>{if(bn!=null)return;const a=()=>{I.getState().connState==="ok"&&n().refresh()};bn=window.setInterval(a,15e3);let i=I.getState().connState;Ds=I.subscribe(o=>{o.connState==="ok"&&i!=="ok"&&n().refresh(),i=o.connState}),a()},stopPolling:()=>{bn!=null&&(window.clearInterval(bn),bn=null),Ds?.(),Ds=null}}));xe({"voiceinput.silent":{zh:"没采集到声音(输入电平≈0):检查系统输入设备是否选对、麦克风没被静音",en:"No audio captured (input level ≈ 0): check that the right input device is selected and that the microphone is not muted"},"voiceinput.unsupported":{zh:"此环境不支持语音输入",en:"Voice input is not supported in this environment"},"voiceinput.denied":{zh:"麦克风权限被拒绝(打开 系统设置 › 隐私与安全 › 麦克风,允许本 App)",en:"Microphone access was denied (open System Settings › Privacy & Security › Microphone and allow this app)"},"voiceinput.silentPhone":{zh:"没录到声音,再试一次",en:"No sound was recorded — try again"},"voiceinput.deniedPhone":{zh:"麦克风权限被拒绝(到系统设置 › 应用 › 权限里允许麦克风)",en:"Microphone access was denied (allow it in system Settings › Apps › Permissions)"},"voiceinput.noDevice":{zh:"没检测到麦克风设备",en:"No microphone found"},"voiceinput.openFailed":{zh:"麦克风打不开:{e}",en:"Could not open the microphone: {e}"},"voiceinput.unclear":{zh:"没听清,再试一次",en:"Didn't catch that — try again"}});async function zu(e){const n=await e.arrayBuffer(),a=new AudioContext,i=await a.decodeAudioData(n);await a.close();const o=Math.max(1,Math.round(i.duration*16e3)),r=new OfflineAudioContext(1,o,16e3),c=r.createBufferSource();c.buffer=i,c.connect(r.destination),c.start();const u=(await r.startRendering()).getChannelData(0);let m=0,h=0;for(let f=0;f<u.length;f++){const v=Math.abs(u[f]);v>m&&(m=v),h+=u[f]*u[f]}if(console.warn(`[voice] captured ${u.length} samples @16k, ${(u.length/16e3).toFixed(2)}s, peak=${m.toFixed(4)} rms=${Math.sqrt(h/(u.length||1)).toFixed(4)}`),m<.005)throw new Error(window.tangu?.mobile?Re("voiceinput.silentPhone"):Re("voiceinput.silent"));return Mu(u,16e3)}function Mu(e,n){const a=e.length,i=new ArrayBuffer(44+a*2),o=new DataView(i),r=(h,f)=>{for(let v=0;v<f.length;v++)o.setUint8(h+v,f.charCodeAt(v))};r(0,"RIFF"),o.setUint32(4,36+a*2,!0),r(8,"WAVE"),r(12,"fmt "),o.setUint32(16,16,!0),o.setUint16(20,1,!0),o.setUint16(22,1,!0),o.setUint32(24,n,!0),o.setUint32(28,n*2,!0),o.setUint16(32,2,!0),o.setUint16(34,16,!0),r(36,"data"),o.setUint32(40,a*2,!0);for(let h=0;h<a;h++){const f=Math.max(-1,Math.min(1,e[h]));o.setInt16(44+h*2,f<0?f*32768:f*32767,!0)}const c=new Uint8Array(i);let u="";const m=32768;for(let h=0;h<c.length;h+=m)u+=String.fromCharCode(...c.subarray(h,h+m));return btoa(u)}function Eu(e,n){const[a,i]=d.useState(!1),[o,r]=d.useState(!1),[c,u]=d.useState(null),m=d.useRef(null),h=d.useRef([]),f=d.useRef(!1),[v,w]=d.useState(null),E=d.useRef(null),T=d.useCallback(()=>{w(null),E.current?.close().catch(()=>{}),E.current=null},[]);d.useEffect(()=>T,[T]);const C=typeof navigator<"u"&&!!navigator.mediaDevices?.getUserMedia&&typeof MediaRecorder<"u"&&!!window.tangu?.transcribeAudio,z=d.useCallback(B=>{f.current=B,m.current?.stop()},[]),U=d.useCallback(async()=>{if(u(null),!C){u(Re("voiceinput.unsupported"));return}let B;try{B=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(A){console.warn("[voice] getUserMedia failed:",A?.name,A?.message||A),u(A?.name==="NotAllowedError"?window.tangu?.mobile?Re("voiceinput.deniedPhone"):Re("voiceinput.denied"):A?.name==="NotFoundError"?Re("voiceinput.noDevice"):Re("voiceinput.openFailed",{e:A?.name||A?.message||A}));return}try{const A=new AudioContext,g=A.createAnalyser();g.fftSize=128,g.smoothingTimeConstant=.7,A.createMediaStreamSource(B).connect(g),E.current=A,w(g)}catch{}const J=new MediaRecorder(B);m.current=J,h.current=[],f.current=!1,J.ondataavailable=A=>{A.data.size&&h.current.push(A.data)},J.onstop=async()=>{if(B.getTracks().forEach(g=>g.stop()),T(),i(!1),m.current=null,f.current||!h.current.length)return;const A=new Blob(h.current,{type:J.mimeType||"audio/webm"});r(!0);try{const g=await window.tangu.transcribeAudio({audioBase64:await zu(A),mime:"audio/wav",modelId:n});g?e(g):u(Re("voiceinput.unclear"))}catch(g){console.warn("[voice] transcribe failed:",g?.message||g),u(g?.message||String(g))}finally{r(!1)}},J.start(),i(!0)},[C,n,e,T]),_=d.useCallback(()=>{o||(a?z(!1):U())},[o,a,U,z]),$=d.useCallback(()=>{a&&z(!0)},[a,z]);return{recording:a,busy:o,error:c,toggle:_,cancel:$,supported:C,analyser:v}}const Au=({size:e})=>t.jsx("svg",{width:e,height:e,viewBox:"0 0 14 14",fill:"currentColor","aria-hidden":"true",children:t.jsx("path",{d:"M10.931 3.34a.112.112 0 0 0-.069-.104l-.038-.007c-1.537.05-2.45.318-3.714 1.002v6.683c.48-.248.936-.44 1.414-.58.695-.203 1.417-.292 2.303-.305l.038-.008a.113.113 0 0 0 .066-.104V3.341ZM2.363 9.919c0 .064.051.11.105.111l.33.008c1.162.046 2.042.243 2.975.662-.403-.585-1.008-1.075-1.654-1.292a.991.991 0 0 1-.674-.941v-5.14a6.36 6.36 0 0 0-.59-.076l-.37-.02a.115.115 0 0 0-.122.111v6.577Zm9.455-.001a.998.998 0 0 1-.877.992l-.101.007c-.832.012-1.47.095-2.066.27-.599.174-1.176.448-1.883.863a.444.444 0 0 1-.449 0c-1.299-.763-2.229-1.07-3.689-1.125l-.299-.008a.997.997 0 0 1-.977-.998V3.342c0-.573.478-1.017 1.038-.999l.417.023c.188.015.35.037.513.062v-.754c0-.708.749-1.244 1.429-.903.984.492 1.836 1.449 2.15 2.505 1.216-.617 2.222-.884 3.771-.934l.105.003a.998.998 0 0 1 .918.996v6.576ZM4.332 8.466c0 .049.03.087.07.1l.24.091a4.319 4.319 0 0 1 1.581 1.176V3.721c-.164-.803-.799-1.617-1.584-2.07l-.162-.088c-.025-.012-.054-.013-.088.009a.12.12 0 0 0-.057.102v6.792Z"})}),Tu=({size:e})=>t.jsx("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",children:t.jsx("path",{d:"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z"})}),Bi=({engineId:e,size:n=16})=>{const a=e.toLowerCase();return a.includes("claude")?t.jsx(Tu,{size:n}):a.includes("codex")||a.includes("openai")?t.jsx(Au,{size:n}):a.includes("claw")?t.jsx(hu,{size:n}):a==="pi"||a.startsWith("pi-")?t.jsx(fu,{size:n}):a.includes("dsh")||a.includes("deepseek")?t.jsx(ju,{size:n}):t.jsx(ko,{size:n})},Ru=e=>/(^|\/)qwen-audio-/i.test(e);function Iu(e,n){return n&&e===n.id?n.apiModelId||n.id:e}const $u=(e,n)=>Ru(Iu(e,n)),Lu=(e,n)=>$u(e,n)?"longanqian":"Tina";function Pu(e,n){const a=e.realtimeModelId?.trim()||"";return a||!e.realtimeModelUnset?a:n.signedIn&&n.model?.id?n.model.id:""}function Du(e,n){const a=Pu(e,n),i=e.realtimeVoice?.trim()||"";return{model:a,voice:i||(a&&n.model&&a===n.model.id?Lu(a,n.model):"")}}const ea="forsion_voice_call_voice",_u=50,Fu=1e3,Ou=300,Wu=2500;function qi(e){try{e?localStorage.setItem(ea,JSON.stringify({...e,t:Date.now()})):localStorage.removeItem(ea)}catch{}}let ct=null,Wo=0,Hi,Vi=!1;const ta=new Set;function Uo(e){clearTimeout(Hi);let n=null;try{n=e?JSON.parse(e):null}catch{n=null}const a=ct;if(n&&typeof n.sessionId=="string"&&typeof n.phase=="string"){const i=a?.sessionId===n.sessionId&&a.phase===n.phase;ct={sessionId:n.sessionId,phase:n.phase,level:Math.min(1,Math.max(0,Number(n.level)||0)),since:i?a.since:Date.now()},Wo=Date.now(),Hi=setTimeout(()=>Uo(null),Wu)}else ct=null;(a?.sessionId!==ct?.sessionId||a?.phase!==ct?.phase)&&ta.forEach(i=>i())}function Bo(){Vi||typeof window>"u"||typeof window.addEventListener!="function"||(Vi=!0,window.addEventListener("storage",e=>{(e.key===ea||e.key===null)&&Uo(e.key?e.newValue:null)}))}function dh(){return Bo(),ct&&ct.level>0&&Date.now()-Wo>Ou&&(ct={...ct,level:0}),ct}function mh(e){return Bo(),ta.add(e),()=>{ta.delete(e)}}const Uu="forsion_realtime_cfg_rev";let zn={realtimeModelId:"",realtimeModelUnset:!1,realtimeVoice:""},Ki=!1;const na=new Set;function _s(){window.tangu?.getConfig?.().then(e=>{const n={realtimeModelId:e.realtimeModelId?.trim()||"",realtimeModelUnset:!!e.realtimeModelUnset,realtimeVoice:e.realtimeVoice?.trim()||""};n.realtimeModelId===zn.realtimeModelId&&n.realtimeModelUnset===zn.realtimeModelUnset&&n.realtimeVoice===zn.realtimeVoice||(zn=n,na.forEach(a=>a()))}).catch(()=>{})}function Bu(){return d.useSyncExternalStore(e=>(Ki||(Ki=!0,_s(),window.addEventListener("storage",n=>{n.key===Uu&&_s()}),window.addEventListener("focus",_s)),na.add(e),()=>{na.delete(e)}),()=>zn)}const qo="forsion_voice_call_evt",sa=new Set;function qu(e){try{localStorage.setItem(qo,JSON.stringify({...e,n:`${Date.now()}-${Math.random()}`}))}catch{}sa.forEach(n=>{try{n(e)}catch{}})}let Ho=null,Yi=0;const aa=new Set;function Hu(e){e&&!ke&&Yi++,Ho=e?{...e,dial:Yi}:null,aa.forEach(n=>n())}const hh=()=>Ho;function ph(e){return aa.add(e),()=>{aa.delete(e)}}const rs="forsion_voice_call_active",es=new Set;let Gi=!1;function Vu(e){try{e?localStorage.setItem(rs,e):localStorage.removeItem(rs)}catch{}es.forEach(n=>n())}function Vo(){try{return localStorage.getItem(rs)}catch{return null}}function Ku(e){return Gi||(Gi=!0,window.addEventListener("storage",n=>{(n.key===rs||n.key===null)&&es.forEach(a=>a())})),es.add(e),()=>{es.delete(e)}}const Yu=4e3,fh=1500;function Gu(e,n,a=2e3){const i=`${Date.now()}-${Math.random()}`;return new Promise(o=>{const r=Ko(u=>{u.kind==="text-ack"&&u.id===i&&(r(),clearTimeout(c),o(!0))}),c=setTimeout(()=>{r(),Vo()===e&&Vu(null),o(!1)},a);qu({kind:"text",sessionId:e,text:n,id:i,at:Date.now()})})}function Ko(e){const n=a=>{if(!(a.key!==qo||!a.newValue))try{e(JSON.parse(a.newValue))}catch{}};return window.addEventListener("storage",n),sa.add(e),()=>{window.removeEventListener("storage",n),sa.delete(e)}}const Xu=.04,Ju="backgrounded",Xi=24e3;let ke=null,ia=null;const oa=new Set;let ts=null,cn=null;const ra=()=>oa.forEach(e=>e()),Yo=e=>{ke&&(ke={...ke,...e},ra())};function gh(e){return oa.add(e),()=>{oa.delete(e)}}const vh=()=>ke,yh=()=>ia;function Qu(e){ts?.(e)}function kh(){ke&&Yo({muted:!ke.muted})}const xh=e=>cn?.mic(e)??Promise.resolve(),wh=e=>cn?.speaker(e)??Promise.resolve(),bh=e=>cn?.run(e),jh=e=>cn?.text(e)??!1;async function Sh(e){ke&&Qu(),ia=null,ke={sessionId:e.sessionId,phase:"connecting",muted:!1,working:null,analyser:null,connectedAt:null},ra();let n=null,a=null;const i=new AudioContext({sampleRate:16e3}),o=new AudioContext({sampleRate:Xi}),r=i.createAnalyser(),c=o.createAnalyser();c.connect(o.destination);const u=new Set;let m=0,h=!1,f=null,v=null;const w=N=>({echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,channelCount:1,...N?{deviceId:N}:{}}),E=()=>{f=i.createMediaStreamSource(n),f.connect(r),v&&f.connect(v)},T=N=>(o.setSinkId?.(N)??Promise.resolve()).catch(P=>console.warn("[realtime] setSinkId failed:",P)),C=N=>{h||Yo(N)},z=(N=500)=>{e.onActivity&&window.setTimeout(e.onActivity,N)},U=()=>{u.forEach(N=>{try{N.stop()}catch{}}),u.clear(),m=0},_=N=>{const P=new Int16Array(N,0,N.byteLength>>1);if(!P.length)return;const H=o.createBuffer(1,P.length,Xi),Q=H.getChannelData(0);for(let y=0;y<P.length;y++)Q[y]=P[y]/32768;const R=o.createBufferSource();R.buffer=H,R.connect(c);const Z=Math.max(o.currentTime+.05,m);R.start(Z),m=Z+H.duration,u.add(R),R.onended=()=>{u.delete(R),!u.size&&ke?.phase==="speaking"&&C({phase:"listening",analyser:r})},ke?.phase!=="speaking"&&C({phase:"speaking",analyser:c})},$=new Uint8Array(c.fftSize);let B="",J=0;const A=window.setInterval(()=>{if(h||!ke)return;const N=u.size>0,P=N?"speaking":ke.phase,H=Date.now();if(!N&&P===B&&H-J<Fu)return;let Q=0;if(N){c.getByteTimeDomainData($);const R=$.length>>1;let Z=0;for(let y=R;y<$.length;y++){const F=($[y]-128)/128;Z+=F*F}Q=Math.min(1,Math.sqrt(Z/($.length-R))*4)}B=P,J=H,qi({sessionId:e.sessionId,phase:P,level:Q})},_u),g=()=>qi(null);window.addEventListener("pagehide",g);const O=!!window.tangu?.mobile,X=()=>{document.hidden&&Y(Ju)};let ee=null;O&&(document.addEventListener("visibilitychange",X),navigator.wakeLock?.request("screen").then(N=>{h?N.release().catch(()=>{}):ee=N}).catch(()=>{}));const Y=N=>{if(h)return;h=!0;const P=ts===Y;P&&(ts=null),window.clearInterval(A),window.removeEventListener("pagehide",g),document.removeEventListener("visibilitychange",X),ee?.release().catch(()=>{}),P&&g(),U();try{a?.close()}catch{}n?.getTracks().forEach(H=>H.stop()),i.close().catch(()=>{}),o.close().catch(()=>{}),P&&(cn=null,ia=N||null,ke=null,ra()),z(300)};ts=Y,cn={mic:async N=>{const P=await navigator.mediaDevices.getUserMedia({audio:w(N)});if(h){P.getTracks().forEach(H=>H.stop());return}f?.disconnect(),n?.getTracks().forEach(H=>H.stop()),n=P,f&&E()},speaker:T,run:N=>{e.run=N,a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify({type:"run",run:N}))},text:N=>h||!ke?.connectedAt||ke.phase==="reconnecting"||a?.readyState!==WebSocket.OPEN?!1:(U(),C({phase:"thinking",analyser:r}),a.send(JSON.stringify({type:"text",text:N})),z(),!0)};try{if(n=await navigator.mediaDevices.getUserMedia({audio:w(e.micId)}),h){n.getTracks().forEach(P=>P.stop());return}e.speakerId&&await T(e.speakerId);const N=await sc(e.target);if(h)return;a=N.protocols?new WebSocket(N.url,N.protocols):new WebSocket(N.url),a.binaryType="arraybuffer"}catch(N){Y(N?.message||String(N));return}const W=a;W.onopen=()=>W.send(JSON.stringify({type:"start",session_id:e.sessionId,model:e.model,voice:e.voice||void 0,title:e.title,run:{...e.run,app_id:xo}})),W.onclose=N=>Y(N.reason||(N.code===1e3?void 0:`connection closed (${N.code})`)),W.onmessage=N=>{if(h)return;if(N.data instanceof ArrayBuffer){_(N.data);return}let P;try{P=JSON.parse(String(N.data))}catch{return}switch(P.type){case"ready":{if(v){C(u.size?{phase:"speaking",analyser:c}:{phase:"listening",analyser:r});break}v=i.createScriptProcessor(1024,1,1),v.connect(i.destination),v.onaudioprocess=H=>{if(h||!ke||ke.muted||W.readyState!==WebSocket.OPEN)return;const Q=H.inputBuffer.getChannelData(0);let R=0;for(let F=0;F<Q.length;F++)R+=Q[F]*Q[F];const Z=u.size>0&&Math.sqrt(R/Q.length)<Xu,y=new Int16Array(Q.length);if(!Z)for(let F=0;F<Q.length;F++)y[F]=Math.max(-32768,Math.min(32767,Math.round(Q[F]*32767)));W.send(y.buffer)},E(),C({phase:"listening",analyser:r,connectedAt:Date.now()});break}case"input_audio_buffer.speech_started":U(),C({phase:"hearing",analyser:r});break;case"input_audio_buffer.speech_stopped":C({phase:"thinking"});break;case"conversation.item.input_audio_transcription.completed":case"response.audio_transcript.done":z();break;case"response.done":!u.size&&ke?.phase==="thinking"&&P.response?.status!=="completed"&&C({phase:"listening",analyser:r});break;case"transcript.corrected":typeof P.message_id=="string"&&typeof P.text=="string"&&e.onTranscriptFix?.(P.message_id,P.text);break;case"tangu.run":C({working:P.status==="started"?String(P.task||""):null}),z(P.status==="started"?300:800);break;case"error":console.warn("[realtime] upstream error:",P.error?.message||P.error);break;case"reconnecting":P.replay&&U(),C({phase:"reconnecting"});break;case"end":Y(P.reason&&P.reason!=="client closed"?String(P.reason):void 0);break}}}const ca=e=>Array.from((e||"").trim());function Zu(e,n){const a=e.map(c=>c.toLowerCase()),i=a.join("");let o=0;for(const c of n){if(!c.length||c.join("")===i||c[0]!==a[0])continue;let u=0;for(;u<a.length&&u<c.length&&a[u]===c[u];)u++;o=Math.max(o,u)}const r=[];for(let c=o;o&&c<e.length;c++)e[c].trim()&&r.push(e[c]);return{first:e[0],picks:r,collides:o>0}}function ed(e){const n=e.map(u=>ca(u)),a=n.map(u=>u.map(m=>m.toLowerCase())),i=n.map(()=>"?"),o=new Set,r=[];n.forEach((u,m)=>{if(!u.length)return;const{first:h,picks:f,collides:v}=Zu(u,a);if(!v||!f.length){i[m]=h.toUpperCase(),o.add(h.toLowerCase());return}r.push({index:m,key:a[m].join(""),picks:f,first:h})}),r.sort((u,m)=>u.key<m.key?-1:u.key>m.key?1:u.index-m.index);const c=new Map;for(const u of r){const m=c.get(u.key);if(m){i[u.index]=m;continue}const f=(u.picks.find(v=>!o.has(v.toLowerCase()))??u.first).toUpperCase();o.add(f.toLowerCase()),c.set(u.key,f),i[u.index]=f}return i}function td(e,n=[]){const a=ca(e);if(!a.length)return"?";const i=a.join("").toLowerCase();let o=n.findIndex(c=>ca(c).join("").toLowerCase()===i);const r=o>=0?n:[e,...n];return o<0&&(o=0),ed(r)[o]}const Ji=(...e)=>e.filter(Boolean).join(" ")||void 0;function nd({name:e,url:n,siblings:a,className:i,imgClassName:o,initialClassName:r,size:c,fill:u,title:m,style:h,...f}){return n?t.jsx("img",{...f,className:Ji(i,o),src:n,alt:"",title:m,draggable:!1,width:c,height:c,style:h}):t.jsx("span",{...f,className:Ji("agent-avatar-initial",u&&"agent-avatar-fill",i,r),title:m,"aria-hidden":"true",style:h,children:t.jsx("span",{className:"agent-avatar-glyph",children:td(e,a)})})}const Qi=us((e,n)=>({pending:[],queue:(a,i)=>e(o=>({pending:[...o.pending,{sessionId:a,text:i}]})),take:a=>{const i=n().pending.filter(o=>o.sessionId===a);return i.length&&e(o=>({pending:o.pending.filter(r=>r.sessionId!==a)})),i.map(o=>o.text)}})),Zi=40,eo=.1,sd=3.2;function ad({analyser:e,recording:n,busy:a,onStop:i,onSend:o,status:r,stopTitle:c,t:u}){const m=d.useRef(null),[h,f]=d.useState(0),v=d.useRef(0);d.useEffect(()=>{if(!n)return;v.current=Date.now(),f(0);const E=window.setInterval(()=>f(Math.floor((Date.now()-v.current)/1e3)),250);return()=>window.clearInterval(E)},[n]),d.useEffect(()=>{const E=m.current;if(!e||!n||!E)return;const T=E.getContext("2d");if(!T)return;const C=window.devicePixelRatio||1;E.width=Math.max(1,E.clientWidth)*C,E.height=Math.max(1,E.clientHeight)*C,T.setTransform(C,0,0,C,0,0);const z=getComputedStyle(document.documentElement),U=(z.getPropertyValue("--accent-ink")||z.getPropertyValue("--accent")||"#7c3aed").trim(),_=(z.getPropertyValue("--border")||"rgba(127,127,127,0.4)").trim(),$=new Uint8Array(e.fftSize),B=[];let J=Date.now(),A=0;const g=()=>{A=requestAnimationFrame(g);const O=Date.now();e.getByteTimeDomainData($);let X=0;for(let P=0;P<$.length;P++){const H=($[P]-128)/128;X+=H*H}const ee=Math.min(1,Math.sqrt(X/$.length)*sd);for(;O-J>=Zi;)B.push({t:J,level:ee}),J+=Zi;const Y=E.clientWidth,W=E.clientHeight,N=W/2;for(T.clearRect(0,0,Y,W),T.strokeStyle=_,T.lineWidth=1,T.setLineDash([2,3]),T.beginPath(),T.moveTo(0,N),T.lineTo(Y,N),T.stroke(),T.setLineDash([]);B.length&&Y-(O-B[0].t)*eo<-4;)B.shift();T.fillStyle=U;for(const P of B){const H=Y-(O-P.t)*eo;if(H<-4||H>Y)continue;const Q=Math.max(2,P.level*(W-4));T.globalAlpha=H<Y*.15?Math.max(0,H/(Y*.15)):1,T.beginPath(),T.roundRect(H-1.1,N-Q/2,2.2,Q,1.1),T.fill()}T.globalAlpha=1};return g(),()=>cancelAnimationFrame(A)},[e,n]);const w=`${Math.floor(h/60)}:${String(h%60).padStart(2,"0")}`;return a?t.jsxs("div",{className:"t2c-voicebar",children:[t.jsx(an,{size:14,className:"spin"}),t.jsx("span",{className:"t2c-voicelabel",children:u("input.micBusy")}),t.jsx("span",{className:"t2c-grow"})]}):t.jsxs("div",{className:"t2c-voicebar",children:[t.jsx("canvas",{ref:m,className:"t2c-voicewave"}),t.jsx("span",{className:"t2c-voicetime",children:r??w}),t.jsx("button",{className:"t2c-voicestop",title:c??u("input.micStop"),onClick:i,children:t.jsx(wo,{size:12})}),o&&t.jsx("button",{className:"t2c-send",title:u("input.send"),onClick:o,children:t.jsx(ac,{size:16})})]})}xe({"ultraConfirm.title":{zh:"开启 Ultra?",en:"Turn on Ultra?"},"ultraConfirm.msg":{zh:"Ultra 会把思考拉满、上下文用到模型支持的上限,并主动把能并行的活拆给多个子代理同时做。一次任务的 token 消耗可能是平时的数倍,适合大任务。",en:"Ultra maxes out thinking, uses the model's full context window, and proactively splits parallelizable work across several subagents. One task can use several times the usual tokens, so it suits big jobs."},"ultraConfirm.recommend":{zh:"推荐配合「完全放行」使用:多个子代理并行时,每个需要确认的操作都会停下来等你批准。",en:"Full access is recommended: with several subagents running in parallel, every action that needs approval stops and waits for you."},"ultraConfirm.fullAccess":{zh:"同时把本会话切到「完全放行」",en:"Also switch this session to Full access"},"ultraConfirm.skip":{zh:"以后不再显示",en:"Don't show this again"},"ultraConfirm.confirm":{zh:"开启 Ultra",en:"Turn on Ultra"}});const Go="forsion_ultra_confirm_off";function id(){try{return localStorage.getItem(Go)==="1"}catch{return!1}}function od({offerFullAccess:e,onConfirm:n,onClose:a}){const{t:i}=Ce(),[o,r]=d.useState(!1),[c,u]=d.useState(!1),m=d.useRef(typeof document<"u"?document.activeElement:null);d.useEffect(()=>()=>{const f=m.current;f?.isConnected&&typeof f.focus=="function"&&f.focus({preventScroll:!0})},[]);const h=f=>{if(f.key!=="Tab")return;const v=f.currentTarget.querySelector(".dialog"),w=v?[...v.querySelectorAll('button, input, [tabindex]:not([tabindex="-1"])')].filter(C=>!C.disabled):[];if(!w.length)return;const E=w[0],T=w[w.length-1];f.shiftKey&&document.activeElement===E?(f.preventDefault(),T.focus()):!f.shiftKey&&document.activeElement===T&&(f.preventDefault(),E.focus())};return fa.createPortal(t.jsx("div",{className:"am-app tangu-lovable",style:{display:"contents"},"data-ultra-confirm":!0,"data-keep-menus":!0,onKeyDown:h,children:t.jsxs(bo,{title:i("ultraConfirm.title"),message:i("ultraConfirm.msg"),confirmLabel:i("ultraConfirm.confirm"),danger:!1,onConfirm:()=>{if(c)try{localStorage.setItem(Go,"1")}catch{}n({fullAccess:e&&o})},onClose:a,children:[e&&t.jsx("div",{className:"dialog-msg",children:i("ultraConfirm.recommend")}),e&&t.jsxs("label",{className:"dialog-check","data-ultra-full-access":!0,children:[t.jsx("input",{type:"checkbox",checked:o,onChange:f=>r(f.target.checked)}),t.jsx("span",{children:i("ultraConfirm.fullAccess")})]}),t.jsxs("label",{className:"dialog-check","data-ultra-skip":!0,children:[t.jsx("input",{type:"checkbox",checked:c,onChange:f=>u(f.target.checked)}),t.jsx("span",{children:i("ultraConfirm.skip")})]})]})}),document.body)}xe({"session.untitled":{zh:"新会话",en:"New session"},"session.rootlessGroup":{zh:"无项目会话",en:"No project"}});const rd="New Chat";function pt(e,n){const a=(e||"").trim();return!a||a===rd?n("session.untitled"):e}function jn(e,n){return e.kind==="rootless"?n("session.rootlessGroup"):e.name}xe({"group.setup.selfPacedHint":{zh:"发消息后成员同时开工,可相互 @ 交接;每位成员自己决定何时收尾,全员完成即结束,没有轮数上限。",en:"After you send, members work in parallel and can @-mention each other; each decides when they are done, and the team stops once everyone is — no round limit."}});const cd=()=>({name:"",description:"",model:"",systemPrompt:"",thinkingLevel:"",maxIterations:"",approvalMode:""}),ld=()=>`temp-${Date.now().toString(36)}-${Math.floor(Math.random()*46656).toString(36)}`,ud=({agents:e,models:n,initialAgents:a,initialTempAgents:i,active:o,hideDisable:r,onConfirm:c,onDisable:u,onClose:m})=>{const{t:h}=Ce(),f=d.useMemo(()=>new Set(e.map(g=>g.slug)),[e]),[v,w]=d.useState(()=>a.filter(g=>f.has(g))),[E,T]=d.useState(i||[]),[C,z]=d.useState(null),U=d.useMemo(()=>(n||[]).map(g=>({id:g.id,label:g.name||g.id})),[n]),$=v.length+E.length>=2,B=g=>w(O=>O.includes(g)?O.filter(X=>X!==g):[...O,g]),J=()=>{if(!C||!C.name.trim()||!C.systemPrompt.trim())return;const g=C.slug||ld(),O={slug:g,name:C.name.trim(),description:C.description.trim(),model:C.model,tools:[],thinkingLevel:C.thinkingLevel,maxIterations:C.maxIterations?Number(C.maxIterations):null,approvalMode:C.approvalMode,createdBy:"user",createdAt:"",systemPrompt:C.systemPrompt.trim()};T(X=>{const ee=X.findIndex(Y=>Y.slug===g);if(ee>=0){const Y=X.slice();return Y[ee]=O,Y}return[...X,O]}),z(null)},A=()=>{$&&c({groupAgents:[...v,...E.map(g=>g.slug)],groupTempAgents:E})};return t.jsx("div",{onClick:m,style:{position:"fixed",inset:0,background:"var(--overlay-scrim)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e3},children:t.jsxs("div",{"data-team-setup":!0,onClick:g=>g.stopPropagation(),style:{width:480,maxWidth:"92vw",maxHeight:"86vh",overflow:"auto",borderRadius:"var(--radius-md, 12px)",background:"var(--bg)",color:"var(--text)",border:"1px solid var(--border)",boxShadow:"var(--card-shadow)",padding:18},children:[t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:6},children:[t.jsx(Gs,{size:18}),t.jsx("strong",{style:{fontSize:"var(--ui-font-heading, 14px)",flex:1},children:h("group.setup.title")}),t.jsx("button",{className:"icon-btn",onClick:m,title:h("group.setup.close"),children:t.jsx(ht,{size:16})})]}),C?t.jsxs("div",{className:"field",children:[t.jsx("div",{className:"hint",style:{marginBottom:8},children:h("group.setup.tempFormHint")}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:h("settings.agents.name")}),t.jsx("input",{type:"text",value:C.name,placeholder:h("settings.agents.namePlaceholder"),onChange:g=>z({...C,name:g.target.value})})]}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:h("settings.agents.desc")}),t.jsx("input",{type:"text",value:C.description,onChange:g=>z({...C,description:g.target.value})})]}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:h("settings.agents.model")}),t.jsxs("select",{value:C.model,onChange:g=>z({...C,model:g.target.value}),children:[t.jsx("option",{value:"",children:h("settings.agents.modelDefault")}),U.map(g=>t.jsx("option",{value:g.id,children:g.label},g.id))]})]}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:h("settings.agents.systemPrompt")}),t.jsx("textarea",{rows:6,value:C.systemPrompt,placeholder:h("settings.agents.systemPromptPlaceholder"),onChange:g=>z({...C,systemPrompt:g.target.value})})]}),t.jsxs("div",{className:"field-row",children:[t.jsxs("div",{className:"field",children:[t.jsx("label",{children:h("settings.agents.thinking")}),t.jsxs("select",{value:C.thinkingLevel,onChange:g=>z({...C,thinkingLevel:g.target.value}),children:[t.jsx("option",{value:"",children:h("settings.agents.inherit")}),Gn.map(g=>t.jsx("option",{value:g,children:Zs(g,h)},g))]})]}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:h("settings.agents.maxIter")}),t.jsx("input",{type:"number",min:10,max:200,value:C.maxIterations,onChange:g=>z({...C,maxIterations:g.target.value})})]}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:h("settings.agents.approval")}),t.jsxs("select",{value:C.approvalMode,onChange:g=>z({...C,approvalMode:g.target.value}),children:[t.jsx("option",{value:"",children:h("settings.agents.inherit")}),t.jsx("option",{value:"readonly",children:"readonly"}),t.jsx("option",{value:"auto-edit",children:"auto-edit"}),t.jsx("option",{value:"full-auto",children:"full-auto"}),t.jsx("option",{value:"custom",children:"custom"})]})]})]}),t.jsxs("div",{style:{display:"flex",gap:8},children:[t.jsxs("button",{className:"btn primary sm",disabled:!C.name.trim()||!C.systemPrompt.trim(),onClick:J,children:[t.jsx(gt,{size:13})," ",h("group.setup.tempSave")]}),t.jsx("button",{className:"btn ghost sm",onClick:()=>z(null),children:h("group.setup.close")})]})]}):t.jsxs(t.Fragment,{children:[e.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{style:{fontSize:"var(--ui-font-meta, 12px)",fontWeight:600,margin:"8px 0 6px",color:"var(--text-dim)"},children:h("group.setup.savedAgents")}),t.jsx("div",{style:{display:"flex",flexDirection:"column",gap:4,marginBottom:12},children:e.map(g=>{const O=v.includes(g.slug);return t.jsxs("button",{onClick:()=>B(g.slug),style:{display:"flex",alignItems:"center",gap:10,textAlign:"left",padding:"8px 10px",borderRadius:"var(--radius-sm, 6px)",border:`1px solid ${O?"var(--accent-ink)":"var(--border)"}`,background:O?"var(--accent-soft)":"transparent",color:"inherit",cursor:"pointer"},children:[t.jsx("span",{style:{width:16,height:16,borderRadius:4,flexShrink:0,display:"inline-flex",alignItems:"center",justifyContent:"center",border:`1px solid ${O?"var(--accent-ink)":"var(--border)"}`,background:O?"var(--accent-ink)":"transparent"},children:O&&t.jsx(gt,{size:12,color:"var(--on-accent-ink, var(--on-accent))"})}),t.jsxs("span",{style:{flex:1,minWidth:0},children:[t.jsx("div",{style:{fontSize:"var(--ui-font-body, 13px)",fontWeight:600},children:g.name}),g.description&&t.jsx("div",{style:{fontSize:"var(--ui-font-caption, 11px)",color:"var(--text-dim)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:g.description})]})]},g.slug)})})]}),t.jsx("div",{style:{fontSize:"var(--ui-font-meta, 12px)",fontWeight:600,margin:"8px 0 6px",color:"var(--text-dim)"},children:h("group.setup.tempAgents")}),E.length>0&&t.jsx("div",{style:{display:"flex",flexDirection:"column",gap:4,marginBottom:8},children:E.map(g=>t.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,padding:"8px 10px",borderRadius:"var(--radius-sm, 6px)",border:"1px solid var(--accent-ink)",background:"var(--accent-soft)"},children:[t.jsx(Oo,{size:14,style:{flexShrink:0,opacity:.8}}),t.jsxs("span",{style:{flex:1,minWidth:0},children:[t.jsx("span",{style:{fontSize:"var(--ui-font-body, 13px)",fontWeight:600},children:g.name}),t.jsx("span",{style:{fontSize:"var(--ui-font-caption, 11px)",color:"var(--text-dim)",marginLeft:6},children:h("group.setup.tempBadge")})]}),t.jsx("button",{className:"icon-btn",title:h("common.edit"),onClick:()=>z({slug:g.slug,name:g.name,description:g.description,model:g.model,systemPrompt:g.systemPrompt,thinkingLevel:g.thinkingLevel,maxIterations:g.maxIterations!=null?String(g.maxIterations):"",approvalMode:g.approvalMode}),children:t.jsx(Mn,{size:13})}),t.jsx("button",{className:"icon-btn",title:h("common.delete"),onClick:()=>T(O=>O.filter(X=>X.slug!==g.slug)),children:t.jsx(Xn,{size:13})})]},g.slug))}),t.jsxs("button",{className:"btn ghost sm",style:{marginBottom:14},onClick:()=>z(cd()),children:[t.jsx(ns,{size:13})," ",h("group.setup.addTemp")]}),t.jsx("div",{style:{fontSize:"var(--ui-font-meta, 12px)",color:"var(--text-dim)",margin:"6px 0 14px"},children:h("group.setup.selfPacedHint")}),t.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end"},children:[o&&!r&&t.jsx("button",{className:"btn sm",onClick:()=>{u(),m()},children:h("group.setup.disable")}),t.jsx("button",{className:"btn primary sm",onClick:A,disabled:!$,children:h(o?"group.setup.update":"group.setup.start")})]}),!$&&t.jsx("div",{style:{fontSize:"var(--ui-font-caption, 11px)",color:"var(--danger)",textAlign:"right",marginTop:6},children:h("group.setup.needTwo")})]})]})})},Vn=2e5,Fs=(e,n,a)=>Gl(e,e,n,a,void 0,void 0,{context:3});function dd(e){if(!/^\*\*\* (Begin Patch|(Add|Update|Delete) File:)/m.test(e))return null;const n=e.replace(/\r\n/g,`
2
+ `).split(`
3
+ `),a=/^\*\*\* (Add|Update|Delete) File: (.+)$/,i=c=>a.test(c)||/^\*\*\* (Begin|End) Patch$/.test(c.trim()),o=[];let r=0;for(;r<n.length;){const c=a.exec(n[r]);if(!c){r++;continue}const u=c[1],m=c[2].trim();r++;let h="";const f=u==="Update"?/^\*\*\* Move to: (.+)$/.exec(n[r]??""):null;f&&(h=f[1].trim(),r++);const v=[];for(;r<n.length&&!i(n[r]);)v.push(n[r]),r++;if(u==="Delete"){o.push(`--- ${m}`,"+++ /dev/null","@@ -1,1 +0,0 @@","-(deleted)");continue}if(u==="Add"){const z=v.filter(U=>U.startsWith("+")).map(U=>U.slice(1));if(!z.length)continue;o.push("--- /dev/null",`+++ ${m}`,`@@ -0,0 +1,${z.length} @@`,...z.map(U=>"+"+U));continue}const w=[`--- ${m}`,`+++ ${h||m}`];let E=[],T="";const C=()=>{if(!E.length)return;const z=E.filter(_=>_[0]!=="+").length,U=E.filter(_=>_[0]!=="-").length;w.push(`@@ -1,${z} +1,${U} @@${T?" "+T:""}`,...E),E=[]};for(const z of v){const U=/^@@ ?(.*)$/.exec(z);if(U){C(),T=U[1]||"";continue}z.startsWith("+")||z.startsWith("-")||z.startsWith(" ")?E.push(z):E.push(" "+z)}C(),w.length>2&&o.push(...w)}return o.length?o.join(`
4
+ `)+`
5
+ `:null}function md(e,n){if(!n)return null;let a;try{a=JSON.parse(n)}catch{return null}if(!a||typeof a!="object")return null;const i=typeof a.path=="string"&&a.path?a.path:"file";try{switch(e){case"edit_file":{const o=String(a.old_string??""),r=String(a.new_string??"");return!o&&!r||o.length+r.length>Vn?null:Fs(i,o,r)}case"multi_edit":{if(!Array.isArray(a.edits)||!a.edits.length)return null;let o=0;const r=[];for(let c=0;c<a.edits.length;c++){const u=a.edits[c],m=String(u?.old_string??""),h=String(u?.new_string??"");if(o+=m.length+h.length,o>Vn)return null;r.push(Fs(a.edits.length>1?`${i} · #${c+1}`:i,m,h))}return r.join(`
6
+ `)}case"write_file":{const o=String(a.content??"");return!o||o.length>Vn?null:Fs(i,"",o)}case"apply_patch":{const o=String(a.patch??a.input??a.diff??"");return o.length>Vn?null:/^@@[ -]/m.test(o)&&/^(--- |\+\+\+ )/m.test(o)?o:dd(o)}default:return null}}catch{return null}}xe({"approval.remoteReadOnly":{zh:"远程连接下只能原样批准或拒绝,要改命令请在那台设备本机上操作",en:"Over a remote connection you can only approve or reject as is. To change the command, use that device itself"},"approval.remote.caller":{zh:"来自远程会话 · {name}",en:"From a remote session · {name}"},"approval.remote.device":{zh:"来自远程会话 · 已登记设备",en:"From a remote session · a registered device"},"approval.remote.account":{zh:"来自远程会话 · 账号下未识别的客户端",en:"From a remote session · an unidentified client on your account"},"approval.remote.lan":{zh:"来自远程会话 · 局域网配对设备",en:"From a remote session · a LAN-paired device"},"approval.remote.p2p":{zh:"来自远程会话 · 点对点直连",en:"From a remote session · a peer-to-peer connection"},"approval.remote.unknown":{zh:"来自远程会话",en:"From a remote session"},"approval.localOnly":{zh:"这项操作涉及受保护的配置,只能在执行它的电脑上批准",en:"This touches protected configuration and can only be approved on the computer running it"},"approval.byHost":{zh:"在执行的电脑上",en:"on the host computer"},"approval.byHostNamed":{zh:"在执行的电脑上({device})",en:"on the host computer ({device})"},"approval.byDevice":{zh:"在 {device} 上",en:"on {device}"},"approval.byRegisteredDevice":{zh:"在已登记设备上",en:"on a registered device"},"approval.byOther":{zh:"在另一台设备上",en:"on another device"},"approval.byChannel":{zh:"经消息通道",en:"via a messaging channel"}});const la=new Set,Nh=e=>la.has(e),hd=e=>uc(dc(e)).remoteApprover,to=480,Ch=({req:e,onDecide:n,sessionId:a})=>{const{t:i}=Ce(),o=hd(a),r=ic(a),c=e.name==="run_bash",u=(()=>{if(!c||!e.arguments)return"";try{return String(JSON.parse(e.arguments).command??"")}catch{return""}})(),[m,h]=d.useState(u),f=d.useRef(null),[v,w]=d.useState(!1);d.useLayoutEffect(()=>{const g=f.current;if(!g)return;g.style.height="auto";const O=g.scrollHeight;g.style.height=`${Math.min(O,to)}px`,w(O>to)},[m]);const E=Jl.test(m),T=Ql.test(m),C=e.status!=="pending",z=d.useMemo(()=>c?null:md(e.name,e.arguments),[c,e.name,e.arguments]),U=oc(e.reason)&&!o,_=rc(e.reason,i),$=cc(e.remote,i),B=!(e.localOnly&&o),J=C?lc(e.answeredBy,{remotePage:o,answeredHere:la.has(e.approvalId),hostName:r},i):"",A=g=>{if(C||g!=="reject"&&!B)return;la.add(e.approvalId);const O=c&&!o&&m.trim()&&m!==u?{command:m}:void 0;n(g,g==="reject"?void 0:O)};return t.jsxs("div",{className:`approval-card${C?" resolved":""}`,children:[t.jsxs("div",{className:"approval-title",children:[t.jsx(xu,{size:15,style:{color:"var(--accent-ink)"}}),i("approval.requestExec",{name:e.name}),C&&t.jsxs("span",{style:{fontWeight:400,fontSize:"var(--ui-font-meta, 12px)",color:"var(--text-faint)"},children:[e.status==="approved"?i("approval.statusApproved"):e.status==="rejected"?i("approval.statusRejected"):i("approval.statusExpired"),J&&t.jsxs("span",{"data-answered-by":!0,children:[" · ",J]})]})]}),$&&t.jsx("div",{className:"approval-why","data-approval-remote":!0,children:$}),_&&t.jsx("div",{className:"approval-why",children:_}),c&&!C&&!o?t.jsx("textarea",{className:"approval-edit",value:m,onChange:g=>h(g.target.value),ref:f,rows:1,spellCheck:!1}):null,c&&!C&&(v||E||T)&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"approval-why",children:[v&&t.jsx("div",{children:i("approval.cmdOverflow")}),E&&t.jsx("div",{children:i("approval.cmdHiddenChars")}),T&&t.jsx("div",{children:i("approval.cmdWideBlank")})]}),(E||T)&&t.jsx("div",{className:"approval-preview",children:e.preview})]}),c&&!C&&!o?null:t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"approval-preview",children:e.preview}),z&&t.jsx("div",{className:"approval-diff",children:t.jsx(Xl,{text:z,side:!1})}),o&&!C&&B&&t.jsx("div",{className:"approval-why","data-remote-readonly":!0,children:i("approval.remoteReadOnly")}),!C&&!B&&t.jsx("div",{className:"approval-why","data-local-only":!0,children:i("approval.localOnly")})]}),!C&&t.jsxs("div",{className:"approval-actions",children:[B&&t.jsxs("button",{className:"btn primary sm",onClick:()=>A("approve"),children:[t.jsx(gt,{size:13})," ",i("approval.approve")]}),U&&B&&t.jsxs("button",{className:"btn ghost sm",onClick:()=>A("approve_always"),children:[t.jsx(zl,{size:13})," ",i("approval.approveAlways")]}),t.jsxs("button",{className:"btn danger sm",onClick:()=>A("reject"),children:[t.jsx(ht,{size:13})," ",i("approval.reject")]})]})]})},pd=["readonly","auto-edit","full-auto"],fd={base:"auto-edit"},Os=e=>e.join(`
7
+ `),Ws=e=>e.split(`
8
+ `).map(n=>n.trim()).filter(Boolean),gd=({cfg:e,onClose:n})=>{const{t:a}=Ce(),[i,o]=d.useState(fd.base),[r,c]=d.useState({deny:"",ask:"",allow:""}),[u,m]=d.useState(!0),[h,f]=d.useState(!1),[v,w]=d.useState(!1),[E,T]=d.useState(""),C=sn.useRef(e);C.current=e;const z=sn.useCallback(()=>{m(!0),T(""),mc(ft()).then($=>{o($.base),c({deny:Os($.deny),ask:Os($.ask),allow:Os($.allow)}),f(!0),m(!1)}).catch($=>{T(String($?.message||$)),f(!1),m(!1)})},[]);d.useEffect(()=>{z()},[z]);const U=async()=>{if(h){w(!0),T("");try{await pc(ft(),{base:i,deny:Ws(r.deny),ask:Ws(r.ask),allow:Ws(r.allow)}),n()}catch($){T(String($?.message||$)),w(!1)}}},_=$=>t.jsxs("div",{className:"field",children:[t.jsx("label",{children:t.jsx("b",{children:a(`approvalRules.${$}`)})}),t.jsx("div",{className:"hint",children:a(`approvalRules.${$}Hint`)}),t.jsx("textarea",{value:r[$],onChange:B=>c(J=>({...J,[$]:B.target.value})),rows:3,spellCheck:!1,placeholder:a(`approvalRules.${$}Ph`),style:{width:"100%",fontFamily:"var(--font-mono)",fontSize:"var(--ui-font-meta, 12px)"}})]},$);return t.jsx("div",{className:"apvr-modal",onClick:n,style:{position:"fixed",inset:0,background:"var(--overlay-scrim)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e3},children:t.jsxs("div",{onClick:$=>$.stopPropagation(),style:{background:"var(--bg-card)",border:"var(--border-width) solid var(--border)",borderRadius:"var(--radius-lg, 12px)",padding:18,width:"min(620px, 92vw)",maxHeight:"86vh",overflow:"auto",boxShadow:"var(--card-shadow)"},children:[t.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:10},children:[t.jsx("b",{children:a("approvalRules.title")}),t.jsx("button",{className:"icon-btn",onClick:n,children:t.jsx(ht,{size:15})})]}),u?t.jsx("div",{className:"field",children:t.jsxs("div",{className:"hint",children:[t.jsx(an,{size:14,className:"spin"})," ",a("common.loading")]})}):h?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"field",children:[t.jsx("div",{className:"hint",children:a("approvalRules.scopeNote")}),t.jsx("div",{className:"hint",style:{marginTop:4},children:a("approvalRules.syntax")})]}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:t.jsx("b",{children:a("approvalRules.base")})}),t.jsx("div",{className:"hint",children:a("approvalRules.baseHint")}),t.jsx("div",{style:{display:"flex",gap:6,marginTop:6},children:pd.map($=>t.jsx("button",{className:`btn sm${i===$?" primary":" ghost"}`,onClick:()=>o($),children:a(hc[$])},$))})]}),["deny","ask","allow"].map(_),E&&t.jsx("div",{className:"field",children:t.jsx("div",{className:"hint",style:{color:"var(--danger)"},children:E})})]}):t.jsxs("div",{className:"field",children:[t.jsx("div",{className:"hint",style:{color:"var(--danger)"},children:a("approvalRules.loadFailed")}),t.jsx("div",{className:"hint",children:E}),t.jsx("div",{style:{marginTop:8},children:t.jsx("button",{className:"btn sm ghost",onClick:z,children:a("common.retry")})})]}),t.jsxs("div",{style:{display:"flex",gap:6,justifyContent:"flex-end",marginTop:14},children:[t.jsx("button",{className:"btn ghost sm",onClick:n,children:a("common.cancel")}),t.jsxs("button",{className:"btn primary sm",disabled:!h||v,onClick:()=>{U()},children:[v?t.jsx(an,{size:13,className:"spin"}):null," ",a("common.save")]})]})]})})},vd=[{name:"/help",key:"help",zh:"显示帮助与命令列表",en:"Show help and the command list",surfaces:["tui","desktop","channel"]},{name:"/feedback",key:"feedback",zh:"提交问题或建议,可在命令后填写反馈内容",en:"Report an issue or suggestion; optionally add your feedback after the command",surfaces:["desktop"]},{name:"/new",key:"new",zh:"开始新会话",en:"Start a new session",surfaces:["tui","desktop","channel"]},{name:"/clear",key:"clear",zh:"清屏(保留会话历史)",en:"Clear the screen (history is kept)",surfaces:["tui"]},{name:"/sessions",key:"sessions",aliases:["/list"],zh:"列出最近会话",en:"List recent sessions",surfaces:["tui","desktop","channel"]},{name:"/resume",key:"resume",aliases:["/switch"],zh:"恢复会话并续聊",en:"Resume a session and continue",arg:"<id|序号>",surfaces:["tui","channel"]},{name:"/rename",key:"rename",arg:"<标题>",zh:"重命名本会话",en:"Rename this session",surfaces:["tui"]},{name:"/branch",key:"branch",arg:"[序号]",aliases:["/fork"],zh:"从某条回复后分支新会话(继承历史),缺省最近",en:"Branch a new session from a reply (inherits history); defaults to the latest",surfaces:["tui","desktop"]},{name:"/btw",key:"btw",arg:"[问题]",aliases:["/side"],zh:"顺便问一句:带着本会话上下文旁聊,不进主对话、不打断正在跑的任务",en:"Ask a side question with this session as context; not added to the conversation and never interrupts a running task",surfaces:["desktop"]},{name:"/compact",key:"compact",arg:"[关注点]",zh:"压缩上下文:总结后精简续接(同会话;可附本次摘要的关注点)",en:"Compact context: summarize, then continue compactly (optional focus for this summary)",surfaces:["tui","desktop","channel"]},{name:"/status",key:"status",zh:"本会话概况:模型 / 思考档 / 审批档 / 工作目录 / 用量",en:"Session overview: model, thinking level, approval mode, cwd, usage",surfaces:["tui","desktop","channel"]},{name:"/export",key:"export",zh:"导出本会话为 Markdown",en:"Export this session as Markdown",surfaces:["tui","desktop"]},{name:"/cost",key:"cost",zh:"本会话 token 用量与费用",en:"Token usage and cost for this session",surfaces:["tui","desktop","channel"]},{name:"/diff",key:"diff",zh:"查看工作目录的 git 改动(含未跟踪文件)",en:"Show git changes in the working directory (including untracked files)",surfaces:["tui"]},{name:"/copy",key:"copy",zh:"复制上一条回复到剪贴板",en:"Copy the last reply to the clipboard",surfaces:["tui","desktop"]},{name:"/retry",key:"retry",zh:"重跑上一条用户消息",en:"Re-run the last user message",surfaces:["tui","desktop"]},{name:"/edit",key:"edit",zh:"编辑最近一条消息并重跑($EDITOR)",en:"Edit the last message and re-run ($EDITOR)",surfaces:["tui"]},{name:"/delete",key:"delete",zh:"删除最近一轮对话",en:"Delete the last turn",surfaces:["tui"]},{name:"/queue",key:"queue",arg:"[clear]",zh:"查看排队项:运行中发的消息与 /compact 等命令排到本轮结束后依次执行(/queue clear 清空)",en:"Show queued items: messages and commands like /compact sent while running run in order after this turn (/queue clear to empty)",surfaces:["tui"]},{name:"/stop",key:"stop",zh:"停止当前运行",en:"Stop the current run",surfaces:["desktop","channel"]},{name:"/model",key:"model",arg:"[名称|序号]",zh:"切换模型(不带参数列出可选模型)",en:"Switch model (no argument lists the available models)",surfaces:["tui","desktop","channel"]},{name:"/think",key:"think",arg:"<档位>",aliases:["/effort"],zh:"思考强度:off|minimal|low|medium|high|xhigh|max(模型不支持的档自动降档)",en:"Thinking level: off|minimal|low|medium|high|xhigh|max (auto-clamped to what the model supports)",surfaces:["tui","desktop","channel"]},{name:"/approval",key:"approval",arg:"<档位>",aliases:["/permissions"],zh:"查看或切换审批档:readonly|auto-edit|full-auto|custom",en:"Show or switch the approval mode: readonly|auto-edit|full-auto|custom",surfaces:["tui","desktop","channel"]},{name:"/loop",key:"loop",arg:"<1-200>",zh:"最大循环轮数(默认 90;耗尽会提示)",en:"Max loop iterations (default 90; you get a prompt when exhausted)",surfaces:["tui","desktop","channel"]},{name:"/verify",key:"verify",arg:"<命令|off>",zh:"本会话验证命令:收尾前自动跑,不绿不许收(off 关闭)",en:"Session verify command — runs before the turn may end; must pass (off to clear)",surfaces:["desktop"]},{name:"/plan",key:"plan",zh:"切换计划模式:只读调研 → 提交计划求批准",en:"Toggle plan mode: read-only research, then submit a plan for approval",surfaces:["tui","desktop"]},{name:"/chat",key:"chat",zh:"切到 Chat 模式(轻量:答完即停、临时工作区、不写笔记;侧栏只列聊天会话,新会话按此模式创建,已创建的会话不可切换)",en:"Switch to Chat mode (light: answers and stops, temporary workspace, never writes your notes; the sidebar lists chat sessions only, new sessions use it, existing sessions are fixed)",surfaces:["desktop"]},{name:"/work",key:"work",zh:"切到 Work 模式(完整工具面:文件、命令、技能、子代理;侧栏列出全部项目)",en:"Switch to Work mode (full toolset: files, commands, skills, subagents; the sidebar lists all projects)",surfaces:["desktop"]},{name:"/voice",key:"voice",zh:"切到语音消息(该 Agent 回复变语音)",en:"Switch to voice messages (this agent replies as voice)",surfaces:["desktop","channel"]},{name:"/text",key:"text",zh:"切回文字消息",en:"Switch back to text messages",surfaces:["channel"]},{name:"/cwd",key:"cwd",arg:"[path]",zh:"查看或切换工作目录",en:"Show or change the working directory",surfaces:["tui"]},{name:"/config",key:"config",zh:"查看当前设置",en:"Show current settings",surfaces:["tui","desktop"]},{name:"/login",key:"login",zh:"重新登录 Forsion",en:"Sign in to Forsion again",surfaces:["tui","desktop"]},{name:"/hotkeys",key:"hotkeys",zh:"查看快捷键",en:"Show keyboard shortcuts",surfaces:["tui"]},{name:"/exit",key:"exit",zh:"退出 Tangu",en:"Quit Tangu",surfaces:["tui"]},{name:"/tools",key:"tools",zh:"列出当前模式可用工具",en:"List tools available in the current mode",surfaces:["tui","desktop"]},{name:"/skills",key:"skills",zh:"列出可用技能(✓=本会话启用)",en:"List available skills (✓ = enabled for this session)",surfaces:["tui","desktop"]},{name:"/skill",key:"skill",arg:"<id>",zh:"启用/停用技能",en:"Enable or disable a skill",surfaces:["tui"]},{name:"/agents",key:"agents",zh:"列出本地 Normal Agent(自定义人格)",en:"List local normal agents (custom personas)",surfaces:["tui","desktop","channel"]},{name:"/agent",key:"agent",arg:"<slug>",zh:"启用 Agent;管理:/agent new|edit|rm <slug>",en:"Activate an agent; manage with /agent new|edit|rm <slug>",surfaces:["tui","desktop","channel"]},{name:"/groupchat",key:"groupchat",arg:"<slug…>",zh:"团队模式(/groupchat off 退出)",en:"Team mode (/groupchat off to leave)",surfaces:["tui","desktop"]},{name:"/historian",key:"historian",zh:"Historian 状态/活动;/historian on|off 开关",en:"Historian status/activity; /historian on|off to toggle",surfaces:["tui","desktop"]},{name:"/muse",key:"muse",zh:"Muse 状态/TODO;/muse on|off 开关",en:"Muse status/TODOs; /muse on|off to toggle",surfaces:["tui","desktop"]},{name:"/memory",key:"memory",arg:"[edit]",zh:"查看/编辑长期记忆",en:"View or edit long-term memory",surfaces:["tui","desktop"]},{name:"/refine",key:"refine",arg:"[focus]",zh:"复盘本会话,沉淀 Agent 的进化记录(可回滚)",en:"Reflect on this conversation and refine the agent's evolution record (reversible)",surfaces:["tui","desktop"]},{name:"/log",key:"log",arg:"[YYYY-MM-DD]",zh:"查看每日日志",en:"View the daily log",surfaces:["tui"]},{name:"/mcp",key:"mcp",zh:"列出 MCP server 状态",en:"List MCP server status",surfaces:["tui","desktop"]},{name:"/plugins",key:"plugins",zh:"列出已发现插件",en:"List discovered plugins",surfaces:["tui","desktop"]}];function no(e){return vd.filter(n=>n.surfaces.includes(e))}xe({"addMenu.label":{zh:"添加",en:"Add"},"addMenu.newChat":{zh:"新会话",en:"New session"},"addMenu.agent":{zh:"添加 Agent",en:"Add agent"},"addMenu.files":{zh:"添加文件或文件夹",en:"Add files or folders"},"addMenu.camera":{zh:"拍照",en:"Take photo"},"addMenu.photos":{zh:"相册",en:"Photos"},"addMenu.file":{zh:"文件",en:"Files"},"addMenu.conversation":{zh:"添加会话",en:"Add session"},"addMenu.view":{zh:"添加正在使用的 View",en:"Add an active View"},"addMenu.searchChats":{zh:"搜索全部会话",en:"Search all sessions"},"addMenu.searchViews":{zh:"搜索全部 View",en:"Search all Views"},"addMenu.recent":{zh:"最近使用",en:"Recent"},"addMenu.allChats":{zh:"全部会话",en:"All sessions"},"addMenu.inUse":{zh:"正在使用",en:"In use"},"addMenu.allViews":{zh:"全部 View",en:"All Views"},"addMenu.noMatches":{zh:"没有匹配项",en:"No matches"}});const Us=new Set(["chat","chat-panel","home","launcher","sidebar-empty"]),yd=300;function kd(e,n,a=yd){const i=new Set(e.map(r=>r.id)),o=n.filter(r=>!i.has(r.id));return o.length>a?null:{recent:[...e],rest:o}}function Kn(e){const n=new Set;return e.filter(a=>n.has(a.key)?!1:(n.add(a.key),!0))}const xd=({open:e,disabled:n,activeSessionId:a,canUsePathPicker:i,onOpenChange:o,onNewSession:r,onAddAgent:c,onPickPaths:u,onPickFiles:m,onAddReference:h})=>{const{t:f}=Ce(),[v,w]=d.useState(null),[E,T]=d.useState(""),[C,z]=d.useState("right"),[U,_]=d.useState(0),$=d.useRef(null),B=d.useRef(null),J=d.useRef(null),A=d.useRef(null),g=on(e,{boundary:".t2-chat-view"}),O=on(v?`${v}:${C}`:"",{boundary:".t2-chat-view"}),X=I(j=>j.sessions),ee=I(j=>j.archivedSessions),Y=Al(j=>j.items),W=Jn(j=>j.mainTabs),N=Jn(j=>j.leftTabs),P=Jn(j=>j.rightTabs),H=Cn(j=>j.vaultRoot);d.useEffect(()=>{e||(w(null),T(""))},[e]),d.useEffect(()=>{T(""),v&&requestAnimationFrame(()=>J.current?.focus())},[v]),d.useLayoutEffect(()=>{const j=$.current,V=B.current;if(!v||!j||!V)return;const q=()=>{const Ze=j.getBoundingClientRect(),et=(j.closest(".t2c-card")||j.closest(".t2-chat-view"))?.getBoundingClientRect(),Wt=So(V),We=et?No(Ze.left,Ze.right,V.offsetWidth,et.left,et.right,Wt):"right";z(Ue=>Ue===We?Ue:We),_(Ue=>Ue===j.offsetHeight+6?Ue:j.offsetHeight+6)};q(),window.addEventListener("resize",q),window.addEventListener(ss,q);const re=new ResizeObserver(q);re.observe(j),re.observe(V);const Me=j.closest(".t2c-card")||j.closest(".t2-chat-view");return Me&&re.observe(Me),()=>{window.removeEventListener("resize",q),window.removeEventListener(ss,q),re.disconnect()}},[v]);const Q=d.useMemo(()=>{const j=new Set;return[...X,...ee].filter(V=>V.id===a||j.has(V.id)?!1:(j.add(V.id),!0))},[X,ee,a]),R=d.useMemo(()=>{const j=new Map(Q.map(q=>[q.id,q])),V=Y.filter(q=>q.kind==="chat").map(q=>j.get(q.id)).filter(Boolean);return(V.length?V:Q).slice(0,6)},[Q,Y]),Z=d.useMemo(()=>{const j=E.trim().toLocaleLowerCase();return j?Q.filter(V=>`${V.title||""}
9
+ ${V.summary||""}`.toLocaleLowerCase().includes(j)).slice(0,12):R},[E,R,Q]),y=d.useMemo(()=>{const j=W.flatMap(q=>{if(Us.has(q.type))return[];const re=q.title||Mi(Ts(q.type)?.displayName||q.type);if(q.filePath){const Me=q.type==="amadeus-editor"&&!!H;return[{key:`${Me?"note":"file"}:${q.filePath}`,type:q.type,title:re,ref:Me?{kind:"note",path:q.filePath}:{kind:"file",path:q.filePath},meta:q.filePath}]}return[{key:`view:${q.type}`,type:q.type,title:re,ref:{kind:"view",type:q.type,title:re}}]}),V=[...N,...P].flatMap(q=>Us.has(q.type)?[]:[{key:`view:${q.type}`,type:q.type,title:q.title,ref:{kind:"view",type:q.type,title:q.title}}]);return Kn([...j,...V]).slice(0,8)},[W,N,P,H]),F=d.useMemo(()=>Kn(Y.flatMap(j=>j.kind==="chat"?[]:j.kind==="note"?[{key:j.key,type:"amadeus-editor",title:j.title,ref:{kind:"note",path:j.id},meta:j.id}]:j.kind==="file"&&j.viewType?[{key:j.key,type:j.viewType,title:j.title,ref:{kind:"file",path:j.id},meta:j.id}]:j.kind==="view"&&j.viewType&&Ts(j.viewType)?[{key:j.key,type:j.viewType,title:j.title,ref:{kind:"view",type:j.viewType,title:j.title}}]:[])).slice(0,6),[Y]),ne=fc().filter(j=>!Us.has(j.type)).map(j=>{const V=Mi(j.displayName);return{key:`view:${j.type}`,type:j.type,title:V,ref:{kind:"view",type:j.type,title:V}}}),we=(()=>{const j=E.trim().toLocaleLowerCase();return j?Kn([...y,...F,...ne]).filter(V=>`${V.title}
10
+ ${V.type}
11
+ ${V.meta||""}`.toLocaleLowerCase().includes(j)).slice(0,12):[]})(),be=j=>{h(j),o(!1)},je=async j=>{o(!1);const V=await j();if(!V.length)return;const q=new DataTransfer;V.forEach(re=>q.items.add(re)),await m(q.files)},Le=async()=>{if(i&&window.tangu?.pickPaths){o(!1);const j=await window.tangu.pickPaths();j.length&&await u(j);return}if(window.tangu?.pickFiles)return je(()=>window.tangu.pickFiles());A.current?.click()},Te=j=>Ts(j)?.icon||Zn,ze=j=>{const V=j.ref.kind==="file"||j.ref.kind==="note"?ga:Te(j.type);return{id:`ref:${j.key}`,label:j.title,detail:j.meta,icon:t.jsx(V,{size:14}),run:()=>be(j.ref)}},Ve=j=>({id:`session:${j.id}`,label:j.title||"Chat",detail:j.summary||void 0,icon:t.jsx(tn,{size:14}),run:()=>be({kind:"session",id:j.id,title:j.title||"Chat"})}),Ie={id:"new-chat",label:f("addMenu.newChat"),icon:t.jsx(Zl,{size:14}),run:()=>{r?.(),o(!1)}},Pe=c?{id:"add-agent",act:"add-agent",label:f("addMenu.agent"),icon:t.jsx(Oo,{size:14}),run:()=>{c(),o(!1)}}:null,Ke={id:"files",label:f("addMenu.files"),icon:t.jsx(yc,{size:14}),run:()=>{Le()}},De=window.tangu,Ye=De?.takePhoto&&De.pickPhotos&&De.pickFiles?[{id:"camera",label:f("addMenu.camera"),icon:t.jsx(gc,{size:14}),run:()=>{je(()=>De.takePhoto())}},{id:"photos",label:f("addMenu.photos"),icon:t.jsx(vc,{size:14}),run:()=>{je(()=>De.pickPhotos())}},{...Ke,label:f("addMenu.file")}]:[Ke],yt=()=>{const j=kd(R,Q),V=Kn([...y,...F]),q=new Set(V.map(Me=>Me.key)),re=f("addMenu.noMatches");return{title:f("addMenu.label"),back:f("common.back"),sections:[{items:[Ie,...Pe?[Pe]:[],...Ye,j?{id:"conversation",label:f("addMenu.conversation"),icon:t.jsx(tn,{size:14}),search:{placeholder:f("addMenu.searchChats"),empty:re},children:[{title:f("addMenu.recent"),items:j.recent.map(Ve)},{title:f("addMenu.allChats"),items:j.rest.map(Ve)}]}:{id:"conversation",label:f("addMenu.conversation"),icon:t.jsx(tn,{size:14}),run:()=>{o(!0),w("conversation")}},{id:"view",label:f("addMenu.view"),icon:t.jsx(Zn,{size:14}),search:{placeholder:f("addMenu.searchViews"),empty:re},children:[{title:f("addMenu.inUse"),items:y.map(ze)},{title:f("addMenu.recent"),items:F.filter(Me=>!y.some(Ze=>Ze.key===Me.key)).map(ze)},{title:f("addMenu.allViews"),items:ne.filter(Me=>!q.has(Me.key)).map(ze)}]}]}]}},zt=j=>j.map(V=>{const q=ze(V);return t.jsxs("button",{className:"menu-item add-menu-result",title:V.meta||V.title,onClick:q.run,children:[q.icon,t.jsxs("span",{className:"grow add-menu-result-main",children:[t.jsx("span",{className:"add-menu-result-title",children:q.label}),q.detail&&t.jsx("span",{className:"add-menu-result-meta",children:q.detail})]})]},V.key)});return t.jsxs("span",{className:`add-pill-wrap t2c-capsule-peer${e?" is-open":""}`,"data-cmenu":!0,children:[t.jsxs("button",{className:`t2c-pill add-pill-btn${e?" is-open":""}`,title:f("input.addContent"),"aria-expanded":e,disabled:n,onClick:()=>{!e&&ka(yt,{})||o(!e)},children:[t.jsx(ns,{size:16,className:"add-pill-plus"}),t.jsx("span",{className:"add-pill-label",children:f("addMenu.label")}),t.jsx(In,{size:10,className:"add-pill-chevron"})]}),e&&t.jsxs("div",{ref:j=>{$.current=j,g.ref.current=j},className:"composer-menu composer-menu--add",style:g.style,children:[t.jsxs("button",{className:"menu-item",onClick:Ie.run,children:[Ie.icon,t.jsx("span",{className:"grow",children:Ie.label})]}),Pe&&t.jsxs("button",{className:"menu-item","data-add-agent":!0,onClick:Pe.run,children:[Pe.icon,t.jsx("span",{className:"grow",children:Pe.label})]}),t.jsxs("button",{className:"menu-item",onClick:Ke.run,children:[Ke.icon,t.jsx("span",{className:"grow",children:Ke.label})]}),t.jsxs("button",{className:`menu-item add-menu-parent${v==="conversation"?" active":""}`,"aria-expanded":v==="conversation",onPointerEnter:()=>w("conversation"),onFocus:()=>w("conversation"),onClick:()=>w("conversation"),children:[t.jsx(tn,{size:14}),t.jsx("span",{className:"grow",children:f("addMenu.conversation")}),t.jsx(Ft,{size:13})]}),t.jsxs("button",{className:`menu-item add-menu-parent${v==="view"?" active":""}`,"aria-expanded":v==="view",onPointerEnter:()=>w("view"),onFocus:()=>w("view"),onClick:()=>w("view"),children:[t.jsx(Zn,{size:14}),t.jsx("span",{className:"grow",children:f("addMenu.view")}),t.jsx(Ft,{size:13})]})]}),e&&v&&t.jsxs("div",{ref:j=>{B.current=j,O.ref.current=j},className:`composer-menu add-menu-sub ${C}`,"data-pane":v,style:{...O.style,bottom:C==="stacked"?`calc(100% + ${U}px)`:void 0},children:[t.jsxs("label",{className:"add-menu-search",children:[t.jsx(jo,{size:13}),t.jsx("input",{ref:J,value:E,onChange:j=>T(j.currentTarget.value),placeholder:f(v==="conversation"?"addMenu.searchChats":"addMenu.searchViews")})]}),t.jsx("div",{className:"add-menu-sub-scroll",children:v==="conversation"?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"menu-section",children:f(E.trim()?"addMenu.allChats":"addMenu.recent")}),Z.map(j=>{const V=Ve(j);return t.jsxs("button",{className:"menu-item add-menu-result",title:j.summary||j.title||"",onClick:V.run,children:[V.icon,t.jsxs("span",{className:"grow add-menu-result-main",children:[t.jsx("span",{className:"add-menu-result-title",children:V.label}),V.detail&&t.jsx("span",{className:"add-menu-result-meta",children:V.detail})]})]},j.id)}),!Z.length&&t.jsx("div",{className:"add-menu-empty",children:f("addMenu.noMatches")})]}):E.trim()?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"menu-section",children:f("addMenu.allViews")}),zt(we),!we.length&&t.jsx("div",{className:"add-menu-empty",children:f("addMenu.noMatches")})]}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"menu-section",children:f("addMenu.inUse")}),zt(y),!y.length&&t.jsx("div",{className:"add-menu-empty",children:f("addMenu.noMatches")}),!!F.length&&t.jsx("div",{className:"menu-section add-menu-section-gap",children:f("addMenu.recent")}),zt(F)]})})]}),t.jsx("input",{ref:A,type:"file",multiple:!0,hidden:!0,onChange:j=>{m(j.currentTarget.files),j.currentTarget.value="",o(!1)}})]})};function Xo(e,n){const a=e.agents.filter(u=>u.createdBy!=="system"),i=e.agents.find(u=>u.slug===e.currentAgentSlug),o={id:"normal-work",label:n("input.normalWork"),icon:t.jsx(Rs,{size:14}),checked:e.active,disabled:e.disabled,run:()=>{e.onNormalWork(),e.onClose()}},r=e.onAgentSwitch?a.map(u=>({id:`agent:${u.slug}`,label:u.name,icon:t.jsx(Rs,{size:14}),checked:e.currentAgentSlug===u.slug,run:()=>{e.onAgentSwitch(u.slug),e.onClose()}})):[],c=r.length?{id:"agent-switch",label:n("input.agentSwitch.section"),detail:i?.name,icon:t.jsx(Rs,{size:14}),children:[{items:r}]}:null;return{normal:o,agentSwitch:c,agents:r}}function wd(e){const{currentAgentSlug:n,agents:a}=e,{t:i}=Ce(),[o,r]=d.useState(!1),[c,u]=d.useState("right"),[m,h]=d.useState(0),f=d.useRef(null),v=d.useRef(null),w=on(o?c:"",{boundary:".t2-chat-view"}),E=Xo(e,i),T=E.agentSwitch?()=>r(!0):void 0,C=a.find(z=>z.slug===n);return d.useLayoutEffect(()=>{const z=f.current,U=v.current,_=z?.closest(".composer-menu");if(!o||!z||!U||!_)return;const $=()=>{const A=_.getBoundingClientRect(),g=(_.closest(".t2c-card")||_.closest(".t2-chat-view"))?.getBoundingClientRect(),O=_.closest(".t2-chat-view")?.getBoundingClientRect(),X=So(U),ee=g?No(A.left,A.right,U.offsetWidth,g.left,g.right,X):"right";u(W=>W===ee?W:ee);const Y=kc(z.getBoundingClientRect().top,U.offsetHeight,A.top,A.bottom,O?.top??0,O?.bottom??window.innerHeight,X);h(W=>Math.abs(W-Y)<.5?W:Y)};$(),window.addEventListener("resize",$),window.addEventListener(ss,$);const B=new ResizeObserver($);B.observe(_),B.observe(U);const J=_.closest(".t2c-card")||_.closest(".t2-chat-view");return J&&B.observe(J),()=>{window.removeEventListener("resize",$),window.removeEventListener(ss,$),B.disconnect()}},[o]),d.useEffect(()=>{const z=f.current?.closest(".composer-menu");if(!o||!z)return;const U=_=>{const $=_.target?.closest?.(".menu-item");$&&!f.current?.contains($)&&r(!1)};return z.addEventListener("pointerover",U),z.addEventListener("focusin",U),()=>{z.removeEventListener("pointerover",U),z.removeEventListener("focusin",U)}},[o]),t.jsxs("div",{ref:f,className:"mode-normal-row",onPointerEnter:T,children:[t.jsxs("button",{className:`menu-item${E.normal.checked?" active":""}`,"data-normal-work":!0,disabled:E.normal.disabled,onClick:E.normal.run,children:[E.normal.icon,t.jsx("span",{className:"grow",children:E.normal.label}),E.normal.checked&&t.jsx(gt,{size:13})]}),T&&t.jsxs("button",{className:"menu-item mode-agent-trigger","data-agent-switch":!0,"aria-haspopup":"menu","aria-expanded":o,title:i("input.agentSwitch.section"),onFocus:T,onClick:T,children:[C&&t.jsx("span",{className:"mode-agent-name",children:C.name}),t.jsx(Ft,{size:13})]}),o&&T&&t.jsxs("div",{ref:z=>{v.current=z,w.ref.current=z},className:`cm-sub ${c}`,"data-pane":"agents",role:"menu",style:{...w.style,"--cm-sub-top":`${m}px`},children:[t.jsx("div",{className:"menu-section",children:i("input.agentSwitch.section")}),E.agents.map(z=>t.jsxs("button",{role:"menuitemradio","aria-checked":!!z.checked,className:`menu-item${z.checked?" active":""}`,onClick:z.run,children:[z.icon,t.jsx("span",{className:"grow",children:z.label}),z.checked&&t.jsx(gt,{size:13})]},z.id))]})]})}function bd(e){const n=e.find(i=>i.active),a=(n?.filePath?n:void 0)??e.find(i=>i.front&&i.filePath)??e.find(i=>i.type==="amadeus-editor"&&i.filePath)??e.find(i=>i.filePath);return a?a.type==="amadeus-editor"?a.filePath?`note:${a.filePath}`:"note":a.filePath?`file:${a.filePath}`:"":""}const Sn={color:"var(--accent-ink)",flexShrink:0};function jd({chip:e,onRemove:n,removeTitle:a,children:i}){return t.jsxs("span",{className:"attach-chip",title:e.token,"data-ref-kind":e.kind,children:[e.kind==="session"?t.jsx(ls,{size:13,style:Sn}):e.kind==="folder"?t.jsx(os,{size:13,style:Sn}):e.kind==="view"?t.jsx(Zn,{size:13,style:Sn}):e.kind==="app"?t.jsx(xc,{size:13,style:Sn}):t.jsx(ga,{size:13,style:Sn}),t.jsx("span",{children:i??e.name}),n&&t.jsx("button",{type:"button",title:a,"aria-label":a,onClick:n,children:t.jsx(ht,{size:12})})]})}const Bs=e=>e.replace(/[\\/]+$/,"").split(/[\\/]/).pop()||e,so=e=>e.replace(/&quot;/g,'"').replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&");function Sd(e){if(/[\s"<>[\]]/.test(e)||e.includes("://"))return!1;const n=/^(~?\/|[A-Za-z]:[\\/])/.test(e),a=e.split(/[\\/]/).filter(Boolean);return n?a.length>=(/^[A-Za-z]:/.test(e)?3:2):a.length>=2&&/\.[A-Za-z0-9]{1,10}$/.test(a[a.length-1])}const Nd=/^\[\[([^[\]\n]+)\]\]/,Cd=/^"([^"\n]+)"/,zd=/^<forsion-view type="([^"\n]*)" title="([^"\n]*)" \/>/,Md=/^<forsion-app app="([^"\n]*)"[^>\n]* \/>/,Ed=/^[^\s]+/;function Ad(e,n){const a=e.slice(n);let i=Nd.exec(a);if(i){const o=i[1],r=o.indexOf("|"),c=(r===-1?o:o.slice(0,r)).trim(),u=(r===-1?"":o.slice(r+1)).trim();return c?{ref:wc(c)?{token:i[0],name:u||"Chat",kind:"session",wiki:o}:{token:i[0],name:u||Bs(c).replace(/\.md$/i,""),kind:"note",wiki:o},end:n+i[0].length,strong:!0}:null}if(i=zd.exec(a),i)return{ref:{token:i[0],name:so(i[2]),kind:"view"},end:n+i[0].length,strong:!0};if(i=Md.exec(a),i)return{ref:{token:i[0],name:so(i[1]),kind:"app"},end:n+i[0].length,strong:!0};if(i=Cd.exec(a),i){const o=i[1];return!/\s/.test(o)||!/[\\/]/.test(o)?null:{ref:{token:i[0],name:Bs(o),kind:"file"},end:n+i[0].length,strong:!0}}return i=Ed.exec(a),i&&Sd(i[0])?{ref:{token:i[0],name:Bs(i[0]),kind:"file"},end:n+i[0].length,strong:!1}:null}function zh(e){if(!e)return null;const n=e.indexOf(`
12
+ `),a=n===-1?e:e.slice(0,n),i=[];let o=!0,r=0;for(;r<a.length;){const c=Ad(a,r);if(!c)return null;if(i.push(c.ref),o=o&&c.strong,r=c.end,r===a.length)break;if(a[r]!==" "||(r+=1,r===a.length))return null}return!i.length||n===-1&&!o?null:{refs:i,body:n===-1?"":e.slice(n+1)}}const ao=e=>(e.note?e.p.replace(/\.md$/i,""):e.p).split("/").pop();function Td(e,n,a=10){const i=n.toLowerCase(),o=i?e.filter(h=>h.p.toLowerCase().includes(i)):e,r=h=>{const f=ao(h).toLowerCase();return(f.startsWith(i)?0:f.includes(i)?1:2)*1e4+h.p.length},c=[...o].sort((h,f)=>r(h)-r(f)).slice(0,a);if(!i.replace(/[\s\-_/.]+/g,"")||c.length>=a)return c;const u=new Set(c),m=[];for(const h of e){if(u.has(h))continue;const f=bc(i,ao(h));f!==null&&m.push({c:h,s:f})}return m.sort((h,f)=>f.s-h.s),[...c,...m.slice(0,a-c.length).map(h=>h.c)]}function Rd(e,n){const a=n.trim();return!a||e.includes(a)?[...e]:[...e,a]}const Mh={sid:null,list:[]},Id=[],$d=(e,n)=>e.sid===n?e.list:Id,Eh=(e,n,a)=>({sid:n,list:Rd($d(e,n),a)});function Ld(e){return e.map(n=>`${n.split(`
13
+ `).map(a=>`> ${a}`).join(`
14
+ `)}
15
+
16
+ `).join("")}function Ah(e){const n=e.split(`
17
+ `),a=[];let i=0;const o=r=>r!==void 0&&/^>(?: |$)/.test(r);for(;o(n[i]);){const r=[];for(;o(n[i]);i++)r.push(n[i].replace(/^> ?/,""));for(a.push(r.join(`
18
+ `));n[i]==="";)i++}return a.length?{quotes:a,body:n.slice(i).join(`
19
+ `)}:null}const Pd=({tier:e})=>{const n=(e||"free").toLowerCase();if(n==="free"||!n)return null;const a=n==="pro"?{background:"linear-gradient(135deg, #8B5CF6, #A855F7)",color:"#fff",border:"none"}:{background:"linear-gradient(135deg, #F59E0B, #F97316)",color:"#fff",border:"none"};return t.jsx("span",{className:"tier-badge",style:a,children:n})};xe({"ctx.pop.title":{zh:"上下文窗口",en:"Context window"},"ctx.pop.compact":{zh:"立即压缩",en:"Compact now"},"ctx.grp.tools":{zh:"工具与本轮",en:"Tools & this run"},"ctx.grp.system":{zh:"系统提示",en:"System prompt"},"ctx.sec.human":{zh:"协作说明",en:"Collaboration handbook"},"ctx.grp.memory":{zh:"记忆",en:"Memory"},"ctx.grp.project":{zh:"项目与资料",en:"Project & files"},"ctx.grp.skills":{zh:"技能",en:"Skills"},"ctx.grp.used":{zh:"已用",en:"Used"},"ctx.grp.buffer":{zh:"自动压缩预留",en:"Auto-compact buffer"},"ctx.grp.free":{zh:"剩余可用",en:"Free space"},"ctx.untilCompact":{zh:"还剩 {left} 触发自动压缩({n},{pct}%)",en:"{left} until auto-compact ({n}, {pct}%)"},"ctx.limit.title":{zh:"Forsion 额度",en:"Forsion usage limits"},"ctx.limit.resetsIn":{zh:"{h} 小时 {m} 分钟后重置",en:"Resets in {h} hr {m} min"},"ctx.limit.resetsAt":{zh:"{when} 重置",en:"Resets {when}"},"ctx.limit.used":{zh:"已用 {pct}%",en:"{pct}% used"}});const Je=e=>e>=1e6?`${Math.floor(e/1e5)/10}M`:e>=1e3?`${Math.floor(e/100)/10}k`:String(e),io=new Set(["persona","harness","human","guidance","profile","project","agentFolder","memory","skills","environment","hooks","plan"]),oo="var(--model-tag-blue)",Dd=[{id:"system",keys:["persona","guidance","environment","hooks","plan"],color:"var(--warning)"},{id:"memory",keys:["memory","profile","harness","human"],color:"var(--green)"},{id:"project",keys:["project","agentFolder"],color:"color-mix(in srgb, var(--accent-ink) 55%, transparent)"},{id:"skills",keys:["skills"],color:"color-mix(in srgb, var(--model-tag-blue) 45%, var(--green))"}];function _d(e,n,a){if(!n)return e>0?[{id:"used",label:a("ctx.grp.used"),tokens:e,color:oo}]:[];let i=Math.max(0,e);const o=m=>{const h=Math.min(i,Math.max(0,m));return i-=h,h},r=Dd.map(m=>{const h=n.sections.filter(w=>m.keys.includes(w.k)||m.id==="system"&&!io.has(w.k)),f=h.reduce((w,E)=>w+E.tokens,0),v=o(f);return{id:m.id,label:a(`ctx.grp.${m.id}`),color:m.color,tokens:v,parts:v===f?h.map(w=>({label:io.has(w.k)?a(`ctx.sec.${w.k}`):w.k,tokens:w.tokens})):void 0}}),c={id:"messages",label:a("ctx.sec.history",{n:n.historyCount}),tokens:o(n.historyTokens),color:oo},u={id:"tools",label:a("ctx.grp.tools"),tokens:i,color:"var(--model-tag-purple)"};return[c,u,...r].filter(m=>m.tokens>0)}const Jo=8*36e5,Fd=e=>864e5-(e+Jo)%864e5;function Od(e){const n=/^(\d{4})-(\d{2})-(\d{2})/.exec(e||"");return n?new Date(Date.UTC(Number(n[1]),Number(n[2])-1,Number(n[3]))-Jo):null}function Wd({open:e,contextWindow:n,ctxTokens:a,sessionTokens:i,runCost:o,costLimit:r,ctxInfo:c,onCompact:u}){const{t:m}=Ce(),[h,f]=d.useState(!1),v=a||0,w=_=>_/n*100,E=_=>`${Math.round(w(_)*10)/10}%`,T=_d(Math.min(v,n),c??null,m),C=c?.compactAt&&c.compactAt<n?c.compactAt:0,z=C?Math.max(0,n-Math.max(C,v)):0,U=Math.max(0,n-v-z);return t.jsxs(t.Fragment,{children:[t.jsxs("button",{type:"button",className:"t2c-cu-head","aria-expanded":h,onClick:()=>f(_=>!_),children:[t.jsx("span",{className:"t2c-cu-title",children:m("ctx.pop.title")}),t.jsxs("span",{className:"t2c-cu-num",children:[Je(v)," / ",Je(n)," tokens (",Math.min(100,Math.round(w(v))),"%)"]}),t.jsx(Ft,{size:13,className:"t2c-cu-chev","aria-hidden":"true"})]}),t.jsxs("span",{className:"t2c-cu-bar","aria-hidden":"true",children:[T.map(_=>t.jsx("span",{style:{width:`${w(_.tokens)}%`,background:_.color}},_.id)),z>0&&t.jsx("span",{className:"t2c-cu-buffer",style:{width:`${w(z)}%`}})]}),c&&c.ctxWindowSource!=="override"&&(c.ctxWindowMax??0)>c.ctxWindow&&t.jsx("span",{className:"t2c-ctxinfo-src",children:m("ctx.windowCapped",{max:Je(c.ctxWindowMax),n:Je(c.ctxWindow)})}),h&&t.jsxs("span",{className:"t2c-cu-detail",children:[t.jsxs("span",{className:"t2c-cu-legend",children:[T.map(_=>t.jsxs(d.Fragment,{children:[t.jsxs("span",{className:"t2c-cu-row",children:[t.jsx("i",{style:{background:_.color}}),t.jsx("span",{children:_.label}),t.jsx("span",{children:Je(_.tokens)}),t.jsx("span",{children:E(_.tokens)})]}),_.parts&&_.parts.length>1&&_.parts.map($=>t.jsxs("span",{className:"t2c-cu-row is-sub",children:[t.jsx("i",{}),t.jsx("span",{children:$.label}),t.jsxs("span",{children:["~",Je($.tokens)]}),t.jsx("span",{})]},$.label))]},_.id)),z>0&&t.jsxs("span",{className:"t2c-cu-row",children:[t.jsx("i",{className:"t2c-cu-buffer"}),t.jsx("span",{children:m("ctx.grp.buffer")}),t.jsx("span",{children:Je(z)}),t.jsx("span",{children:E(z)})]}),t.jsxs("span",{className:"t2c-cu-row",children:[t.jsx("i",{className:"is-free"}),t.jsx("span",{children:m("ctx.grp.free")}),t.jsx("span",{children:Je(U)}),t.jsx("span",{children:E(U)})]})]}),c&&t.jsx("span",{className:"t2c-ctxinfo-src",children:m(`ctx.windowSource.${["override","model","learned","family","default"].includes(c.ctxWindowSource)?c.ctxWindowSource:"default"}`)}),!!i&&i>0&&t.jsx("span",{className:"t2c-ctxinfo-src",children:m("input.sessionTokens",{n:Je(i)})}),c&&t.jsxs("span",{className:"t2c-ctxinfo-files",children:[t.jsxs("span",{className:"t2c-ctxinfo-label",children:[m("ctx.files.label"),c.filesTruncated?` ${m("ctx.files.truncated")}`:""]}),c.files.length>0?c.files.map(_=>t.jsx("span",{className:"t2c-ctxinfo-file",title:_,children:_.split(/[/\\]/).slice(-2).join("/")},_)):t.jsx("span",{className:"t2c-ctxinfo-file dim",children:m("ctx.files.none")})]})]}),t.jsxs("span",{className:"t2c-cu-foot",children:[C>0&&t.jsx("span",{children:m("ctx.untilCompact",{left:Je(Math.max(0,C-v)),n:Je(C),pct:Math.round(w(C))})}),u&&t.jsx("button",{type:"button",className:"t2c-ctxring-compact",onClick:u,title:m("input.slash.compact"),children:m("ctx.pop.compact")})]}),o!=null&&r!=null&&r>0&&t.jsx("span",{className:"t2c-ctxinfo-src","data-warn":o>=r*.8||void 0,children:m("input.runCost",{used:Math.round(o).toLocaleString(),limit:r.toLocaleString()})}),t.jsx(Ud,{open:e})]})}function Ud({open:e}){const{t:n,locale:a}=Ce(),i=I(w=>w.authInfo?.loggedIn&&w.authInfo.tokenValid!==!1?`${w.authInfo.accountId??""}:${w.authInfo.username??""}`:null),o=i!==null&&!!window.tangu?.accountQuota,r=I(w=>w.authInfo?.membershipTier),[c,u]=d.useState(null),m=d.useRef(0);if(d.useEffect(()=>jc(w=>{m.current++,u(w)}),[]),d.useEffect(()=>{u(null)},[i]),d.useEffect(()=>{if(!o||!e)return;let w=!0;const E=++m.current;return window.tangu.accountQuota().then(T=>{!w||E!==m.current||T?.status!==200||!T.json||(u(T.json),Sc(T.json))}).catch(()=>{}),()=>{w=!1}},[e,i,o]),!o||!c)return null;const h=Fd(Date.now()),f=Od(c.weeklyResetAt),v=[{key:"daily",label:n("sidebar.account.menu.daily"),limit:Number(c.dailyLimit),rem:Ei(c.dailyLimit,c.dailyRemaining,c.dailyPercent),reset:n("ctx.limit.resetsIn",{h:Math.floor(h/36e5),m:Math.floor(h%36e5/6e4)})},{key:"weekly",label:n("sidebar.account.menu.weekly"),limit:Number(c.weeklyLimit),rem:Ei(c.weeklyLimit,c.weeklyRemaining,c.weeklyPercent),reset:f?n("ctx.limit.resetsAt",{when:Nc(f,{locale:a})}):""}].filter(w=>w.limit<0||w.rem!==null);return v.length?t.jsxs("span",{className:"t2c-cu-limits",children:[t.jsxs("span",{className:"t2c-cu-limits-title",children:[n("ctx.limit.title"),t.jsx(Pd,{tier:r})]}),v.map(w=>t.jsxs("span",{className:"t2c-cu-limit","data-limit":w.key,children:[t.jsxs("span",{className:"t2c-cu-limit-line",children:[t.jsx("span",{className:"t2c-cu-limit-name",children:w.label}),w.rem!==null&&t.jsx("span",{className:"t2c-cu-limit-reset",children:w.reset}),t.jsx("span",{children:w.rem===null?n("sidebar.account.menu.unlimited"):n("ctx.limit.used",{pct:Math.round(100-w.rem)})})]}),w.rem!==null&&t.jsx("span",{className:"t2c-cu-bar","data-warn":w.rem<=15||void 0,"aria-hidden":"true",children:t.jsx("span",{style:{width:`${100-w.rem}%`}})})]},w.key))]}):null}xe({"livecall.start":{zh:"语音通话",en:"Voice call"},"livecall.return":{zh:"回到通话",en:"Back to the call"},"livecall.localOnly":{zh:"语音通话只能在本机的会话里用",en:"Voice calls only work in sessions on this computer"},"livecall.cloudOnly":{zh:"这个会话在你的电脑上,语音通话暂时只能在云端的会话里用",en:"This session lives on your computer. For now, voice calls only work in cloud sessions"},"livecall.typeHint":{zh:"通话中:打的字会直接送进电话",en:"In a call: typed messages go straight into the call"},"livecall.textFallback":{zh:"通话没接上,这条改发给 Tangu 了",en:"The call did not pick this up, so it was sent to Tangu instead"}});xe({"input.modeSheetTitle":{zh:"模式",en:"Mode"},"input.hubSheetTitle":{zh:"模型与模式",en:"Model and mode"},"input.agentSwitch.section":{zh:"切换 Agent",en:"Switch agent"},"input.mention.projectNote":{zh:"派往项目 · 在该项目新建会话开工",en:"Dispatch to project · starts a new session there"},"input.normalWork":{zh:"普通模式",en:"Normal mode"},"input.presetChat":{zh:"Chat",en:"Chat"},"input.presetWork":{zh:"Work",en:"Work"},"input.presetLocked":{zh:"模式在创建会话时确定;换模式请新建会话",en:"Mode is fixed when the session is created; start a new session to change it"},"input.approvalSection.team":{zh:"团队审批档 · 改动对全队生效",en:"Approval mode for the whole team"},"input.planModeTeamOff":{zh:"团队模式下不可用",en:"Not available in team mode"},"composer2.exportRoleUser":{zh:"我",en:"Me"},"composer2.listSep":{zh:"、",en:", "}});const Bd=8e3,qd=[],xa="input.tip.steer",ro=[xa,"input.tip.switchChat","input.tip.quote","input.tip.dropFiles","input.tip.wikiRef","input.tip.dragSession","input.tip.branch","input.tip.newTab","input.tip.palette","input.tip.quickFind","input.tip.findInChat","input.tip.toc"],Hd=[xa,"input.tip.wikiRef"];xe({"input.quote.group":{zh:"引用",en:"Quotes"},"input.tip":{zh:"小贴士:{tip}",en:"Tip: {tip}"},"input.runningPlaceholder":{zh:"运行中,可继续输入…",en:"Working… You can keep typing"},"input.steer.queuedHint":{zh:"排队项在本轮结束后依次执行 · ↑ 取回编辑",en:"Queued items run in order after this turn · ↑ to recall"},"input.tip.steer":{zh:"运行中也能继续发消息,会在下一步交给 Agent",en:"You can send while it runs: the agent reads it at the next step"},"input.tip.switchChat":{zh:"可以先切去别的会话,运行不会中断,侧栏圆点标出运行中",en:"Switch chats meanwhile; this run keeps going, marked by a sidebar dot"},"input.tip.quote":{zh:"划选回复里的文字,点「引用」即可带进下一条消息,可以连着引用好几段",en:"Select text in a reply and click Quote to cite it in your next message. You can quote several passages"},"input.tip.dropFiles":{zh:"文件可拖到聊天区任意位置,截图可直接粘贴进输入框",en:"Drop files anywhere in the chat, or paste a screenshot into the box"},"input.tip.wikiRef":{zh:"输入 [[ 可引用历史会话,本机项目里还能引用笔记和文件",en:"Type [[ to reference past chats, or notes and files in local projects"},"input.tip.dragSession":{zh:"把侧栏的会话拖进对话区,即可挂为引用随消息发送",en:"Drag a chat from the sidebar into the conversation to cite it"},"input.tip.branch":{zh:"悬停已完成的回复,点分支图标即可从此处开出新会话",en:"Hover a finished reply and click the branch icon to fork a new chat"},"input.tip.newTab":{zh:"⌘/Ctrl 点击侧栏里的会话,会在新标签页打开",en:"⌘/Ctrl-click a session in the sidebar to open it in a new tab"},"input.tip.palette":{zh:"按 ⌘/Ctrl+K 打开命令面板,搜索并执行命令",en:"Press ⌘/Ctrl+K to open the command palette and run commands"},"input.tip.quickFind":{zh:"⌘/Ctrl+P 快速查找,按名称跳到会话",en:"⌘/Ctrl+P opens quick find: jump to a session by name"},"input.tip.findInChat":{zh:"⌘/Ctrl+F 在当前对话里查找文字",en:"Press ⌘/Ctrl+F to find text in the current conversation"},"input.tip.toc":{zh:"悬停对话左侧的短横线展开目录,点击即可跳回任意一轮提问",en:"Hover the bars on the chat's left edge, then click to jump to a turn"}});const qs=5*1024*1024,co=15e4,Hs=25*1024*1024,Vs=[{id:"readonly",Icon:eu,key:"input.approval.readonly",desc:"input.approval.readonlyDesc"},{id:"auto-edit",Icon:Rc,key:"input.approval.autoEdit",desc:"input.approval.autoEditDesc"},{id:"full-auto",Icon:Ic,key:"input.approval.fullAuto",desc:"input.approval.fullAutoDesc",danger:!0},{id:"custom",Icon:$c,key:"input.approval.custom",desc:"input.approval.customDesc"}],Tn=e=>e.split(/[\\/]/).pop()||e,Vd=".t2-chat-view";function Kd(e,n,a){const i=e.closest(Vd)??e,o=v=>Array.from(v.dataTransfer?.types??[]).includes("Files"),r=v=>{i===e?a(v):i.toggleAttribute("data-filedrop",v)},c=v=>{o(v)&&(v.preventDefault(),v.dataTransfer&&(v.dataTransfer.dropEffect="copy"),r(!0))},u=v=>{i.contains(v.relatedTarget)||r(!1)},m=v=>{o(v)&&(v.preventDefault(),r(!1),v.dataTransfer?.files?.length&&n(v.dataTransfer.files))},h=i.ownerDocument?.defaultView,f=()=>r(!1);return i.addEventListener("dragover",c),i.addEventListener("dragleave",u),i.addEventListener("drop",m),h?.addEventListener("dragend",f),h?.addEventListener("drop",f,!0),h?.addEventListener("blur",f),()=>{i.removeEventListener("dragover",c),i.removeEventListener("dragleave",u),i.removeEventListener("drop",m),h?.removeEventListener("dragend",f),h?.removeEventListener("drop",f,!0),h?.removeEventListener("blur",f),r(!1)}}const _t=e=>({token:/\s/.test(e)?`"${e}"`:e,name:Tn(e),kind:"file"}),Yd=e=>({token:/\s/.test(e)?`"${e}"`:e,name:Tn(e),kind:"folder"}),Gd=(e,n)=>{const a=i=>String(i).replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");return{token:`<forsion-view type="${a(e)}" title="${a(n)}" />`,name:n,kind:"view"}},Xd=e=>{const n=a=>String(a).replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g," ");return{token:`<forsion-app app="${n(e.app)}" bundleId="${n(e.bundleId||"")}" pid="${e.pid}" windowId="${e.windowId}" title="${n(e.title)}" />`,name:e.app,kind:"app"}};function Ks(e,n){const a=Co(e,n).trim();return e.kind==="session"?{token:a,name:e.title||"Chat",kind:"session"}:e.kind==="note"?{token:a,name:Tn(e.path),kind:"note"}:_t(e.path)}function Jd(e,n,a,i){if(a){if(n>=e.length)return null;const r=n+1;return{pos:r,val:e[e.length-r]}}if(n===0)return null;const o=n-1;return{pos:o,val:o===0?i:e[e.length-o]}}function Qd(e,n,a){return/^\/refine(\s|$)/i.test(a)&&(a="/refine"+a.slice(7)),/^\/refine(\s|$)/.test(a)&&(e||n)?`${a}
20
+
21
+ ${e}${n}`.trimEnd():e+n+a}function Zd(e,n=200){return e>0?`${Math.min(e,n)}px`:"auto"}function em(e,n){const a=/(?:^|\s)(\/\S*)$/.exec(e.slice(0,n));return a?{start:n-a[1].length,token:a[1]}:null}const Th=({sessionId:e,advisory:n,approvalTray:a,autoFocus:i,disabled:o,disabledPlaceholder:r,running:c,execConfig:u,teamApproval:m,models:h,modelsResponse:f,modelId:v,onModelChange:w,engines:E,engineId:T,engineModels:C,engineModelId:z,onEngineModelChange:U,engineCommands:_,thinkingLevel:$,onThinkingChange:B,ultra:J,defaultModelIds:A,onDefaultModelChange:g,onContextWindowChange:O,maxIterations:X,onMaxIterationsChange:ee,verifyCommand:Y,onVerifyCommandChange:W,preset:N,onPresetChange:P,planMode:H,onPlanModeChange:Q,voiceMode:R,onVoiceModeChange:Z,liveOwner:y,liveSessionKey:F,prepareLiveSession:ne,skills:we,groupChat:be,groupAgents:je,groupTempAgents:Le,onGroupChange:Te,onAddAgent:ze,onNormalWork:Ve,agents:Ie,onAgentSwitch:Pe,currentAgentSlug:Ke,mentionProjects:De,onNewSession:Ye,onBranch:yt,onOpenSettings:zt,onExecConfigChange:j,onSend:V,onStop:q,quotes:re=qd,onRemoveQuote:Me,onClearQuote:Ze,onBtw:et,contextWindow:Wt,ctxTokens:We,sessionTokens:Ue,runCost:Ge,costLimit:_e,ctxInfo:fe,onCompact:tt,seedText:p,onSeedConsumed:D,seedShare:x,takeSeedShare:K,appendRefs:se,onAppendRefsConsumed:ae,autoRefFromMain:$e,appRef:nt,sentHistory:Mt,pendingSteer:lt,onCancelSteer:ce,onWithdrawSteer:kt,onSteerNow:ja})=>{const{t:S,locale:ds}=Ce(),pr=I(s=>s.activeId),pe=e===void 0?pr:e,fr=d.useId(),Fe=e===void 0?`preview:${fr}`:e??Ai,Sa=d.useRef(Fe);Sa.current=Fe;const[ue,he]=Ct(Fe,"text"),[Na,Ca]=d.useState(0),[ms]=d.useState(()=>!!window.tangu?.mobile||!!window.matchMedia?.("(hover: none)").matches),za=(ms?Hd:ro).filter(s=>!T||s!==xa),[gr,hs]=d.useState(!1),[Et,vr]=d.useState(!1),[ps,Ma]=d.useState(!1);d.useEffect(()=>{if(!c||Et)return;Ca(Math.floor(Math.random()*ro.length));let s=0;const l=window.setInterval(()=>{hs(!0),s=window.setTimeout(()=>{Ca(k=>k+1),hs(!1)},300)},Bd);return()=>{window.clearInterval(l),window.clearTimeout(s),hs(!1),Ma(!1)}},[c,Et]);const[fs,yr]=d.useState([]),[Ut,Pn]=Ct(Fe,"attachments"),[Bt,gs]=Ct(Fe,"wsFiles"),[ln,Ea]=Ct(Fe,"refChips"),[vs,kr]=d.useState(null),qt=s=>Ea(l=>{const k=new Set(l.map(M=>M.token)),b=[];for(const M of s)k.has(M.token)||(k.add(M.token),b.push(M));return b.length?[...l,...b]:l}),[Ht,Aa]=Ct(Fe,"pinnedSkills"),[Ta,Ee]=d.useState(null),[Ra,Be]=d.useState(0),[un,dn]=d.useState(null),[Ia,$a]=d.useState(!1),La=d.useRef(null),[Ae,Xe]=d.useState(null),[xr,mn]=d.useState(!1),[qe,ut]=d.useState(0),[Pa,Dn]=d.useState(0),[Da,_a]=d.useState(!1),[wr,Fa]=Ct(Fe,"mentionedSlug"),[Oa,Wa]=Ct(Fe,"mentionAgents"),[Ua,_n]=d.useState(0),[Ba,qa]=d.useState(!1),[Ha,Va]=d.useState(null),ys=d.useRef(""),[br,jr]=d.useState(!1),[At,Vt]=d.useState(0),ks=d.useRef(""),Ka=d.useRef(At);Ka.current=At,d.useLayoutEffect(()=>(Vt(0),ut(0),dn(null),()=>{Ka.current>0&&Cc(Fe,"text",ks.current)}),[Fe]);const ve=d.useRef(null),Tt=d.useRef(null);d.useLayoutEffect(()=>{const s=Tt.current;if(!s)return;const l=new ResizeObserver(([k])=>vr(k.contentRect.width<=360));return l.observe(s),()=>l.disconnect()},[]);const hn=d.useMemo(()=>{const s=new Map(no("desktop").map(l=>[l.name,l]));return l=>{const k=s.get(l);return k?ds==="en"?k.en:k.zh:l}},[ds]);d.useEffect(()=>{let s=!0;return zc(ft()).then(l=>{s&&yr(l)}),()=>{s=!1}},[]);const Sr=async()=>{const s=I.getState(),l=pe,M=([...l?s.messagesBySession[l]||[]:[]].reverse().find(L=>L.role==="assistant")?.content||"").trim();if(!M){s.toast(S("input.slash.nothingToCopy"),!0);return}try{await navigator.clipboard.writeText(M),s.toast(S("input.slash.copied"))}catch{s.toast(S("input.slash.nothingToCopy"),!0)}},Nr=async()=>{const s=I.getState(),l=pe;if(![...l?s.messagesBySession[l]||[]:[]].reverse().find(M=>M.role==="user")){s.toast(S("input.slash.nothingToRetry"),!0);return}await s.retry(l)},Cr=async()=>{const s=I.getState(),l=pe;if(!l){s.toast(S("input.slash.nothingToExport"),!0);return}const k=s.sessions.find(ge=>ge.id===l);let b=[];try{b=(await Gc(Ri(l),l)).messages}catch{}if(b.length||(b=s.messagesBySession[l]||[]),!b.length){s.toast(S("input.slash.nothingToExport"),!0);return}const M=k?.title||"Tangu Session",L=["---",`id: ${l}`,`title: ${JSON.stringify(M)}`,...k?.summary?[`summary: ${JSON.stringify(k.summary)}`]:[],...k?.model_id?[`model: ${k.model_id}`]:[],`exported_at: ${new Date().toISOString()}`,"---","",`# ${M}`,""];for(const ge of b){const Ne=ge.role==="model"?"assistant":ge.role;if(Ne!=="user"&&Ne!=="assistant")continue;const xn=(ge.content||"").trim(),wn=Array.isArray(ge.tool_calls)?ge.tool_calls:[];if(!xn&&!wn.length)continue;L.push(Ne==="user"?`## ${S("composer2.exportRoleUser")}`:"## Tangu",""),xn&&L.push(xn,"");for(const Dt of wn){const Jt=Dt?.function?.name||Dt?.name||"tool";let He="";try{He=String(typeof Dt?.function?.arguments=="string"?Dt.function.arguments:JSON.stringify(Dt?.function?.arguments??""))}catch{He=""}He=He.replace(/\s+/g," ").trim(),L.push(`> 🔧 \`${Jt}\`${He&&He!=="{}"?` ${He.length>200?He.slice(0,200)+"…":He}`:""}`)}wn.length&&L.push("");const Pt=Array.isArray(ge.attachments)?ge.attachments:[];Pt.length&&L.push(`> 📎 ${Pt.length} attachment(s)`,"")}const G=new Blob([L.join(`
22
+ `)],{type:"text/markdown"}),oe=document.createElement("a");oe.href=URL.createObjectURL(G),oe.download=`tangu-${String(l).slice(0,8)}.md`,oe.click(),setTimeout(()=>URL.revokeObjectURL(oe.href),1e3)},de=Eu(s=>{he(l=>l?l.replace(/\s+$/,"")+" "+s:s),Vt(0),requestAnimationFrame(ie)}),Ya=de.recording||de.busy,xs=d.useRef(!1),zr=()=>{xs.current=!0,de.toggle()};d.useEffect(()=>{!xs.current||de.recording||de.busy||(xs.current=!1,ue.trim()&&Wn())},[de.recording,de.busy]);const Mr=Mc(pe),Fn=y??e===null,Ga=Bu(),Xa=I(s=>s.modelsResp?.realtimeModel??null),Ja=I(s=>!!s.authInfo?.loggedIn&&s.authInfo.tokenValid!==!1)&&!!window.tangu?.forsionLogin,{model:Qa,voice:Er}=d.useMemo(()=>Du(Ga,{model:Xa,signedIn:Ja}),[Ga,Xa,Ja]),[ws,Za]=d.useState(!1),[ei,ti]=d.useState(""),ni=!!window.tangu?.mobile,Ar=d.useSyncExternalStore(Ku,Vo),pn=!!pe&&Ar===pe,bs=Ec(s=>(e?s.bySession[e]:void 0)||""),js=!!bs&&!ue&&!c&&!o&&!pn&&!ms;d.useEffect(()=>{c&&e&&Is(e)},[c,e]),d.useEffect(()=>{if(Fn)return Ko(s=>{if(s.kind==="activity"){I.getState().pollSession(s.sessionId);return}if(s.kind==="transcript"){const l=()=>{const M=I.getState().messagesBySession[s.sessionId]?.find(L=>L.id===s.messageId);return M?(M.content!==s.text&&I.setState(L=>({messagesBySession:{...L.messagesBySession,[s.sessionId]:(L.messagesBySession[s.sessionId]||[]).map(G=>G.id===s.messageId?{...G,content:s.text}:G)}})),!0):!1};if(l())return;const k=I.subscribe(()=>{l()&&(k(),clearTimeout(b))}),b=setTimeout(k,3e4);return}s.kind==="effort"&&I.setState(l=>l.configBySession[s.sessionId]?{configBySession:{...l.configBySession,[s.sessionId]:{...l.configBySession[s.sessionId],thinkingLevel:s.level,...s.level!=="max"?{ultra:void 0}:{}}}}:{})})},[Fn]);const Tr=async()=>{if(!ws){Za(!0),ti("");try{let s=F!==void 0?F:pe;if(!s){const L=I.getState().activeId;s=ne?await ne():await I.getState().newSession().then(()=>I.getState().activeId),s===L&&(s=null)}if(!s)return;if(Ri(s).key!=="home"){ti(S(ni?"livecall.cloudOnly":"livecall.localOnly"));return}const{modelId:k,agentConfig:b}=I.getState().voiceRunParams(s),M={type:"voice-call",params:{sessionId:s,model:Qa,voice:Er,title:S("livecall.title"),agentSlug:b.agentSlug,run:{model_id:k,agent_config:b}}};window.tangu?.openMini?window.tangu.openMini({view:M,mainView:{type:"chat",params:{sessionId:s}},title:S("livecall.title")}):Hu(M.params)}finally{Za(!1)}}},me=u.execMode==="host",ye=N==="chat",fn=T?void 0:Ie?.find(s=>s.slug===Ke),gn=u.approvalMode||fn?.approvalMode||"auto-edit",Rt=$||(be?void 0:fn?.thinkingLevel)||void 0,xt=me&&!ye&&!T&&!be,Kt=xt&&!!J&&Rt==="max",{window:It,stale:Rr}=Vl({ctxInfo:fe,contextWindow:Wt,running:c,ultra:Kt,model:f?.models.find(s=>s.id===v),engineUncapped:f?.ultraUncapped}),Ss=Rr&&fe?{...fe,ctxWindow:It||fe.ctxWindow,compactAt:void 0}:fe,[Ir,si]=d.useState(!1),vn=(s,l)=>B?l===!0&&!Kt&&!id()?(si(!0),!1):(B(s,l),!0):!1,ai=on(Ae==="mode",{boundary:".t2-chat-view"}),ii=on(Ae==="ctx",{boundary:".t2-chat-view"});d.useEffect(()=>{if(!Ae)return;const s=k=>{k.target?.closest?.("[data-cmenu], [data-keep-menus]")||Xe(null)},l=k=>{k.key==="Escape"&&!document.querySelector("[data-keep-menus]")&&Xe(null)};return document.addEventListener("mousedown",s),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",s),document.removeEventListener("keydown",l)}},[Ae]);const ie=()=>{const s=ve.current;if(s){if(!s.value){s.style.height="";return}s.style.height="auto",s.style.height=Zd(s.scrollHeight)}};d.useEffect(()=>{const s=ve.current;if(!s||typeof ResizeObserver>"u")return;let l=s.clientWidth;const k=new ResizeObserver(()=>{s.clientWidth!==l&&(l=s.clientWidth,ie())});return k.observe(s),()=>k.disconnect()},[]),d.useLayoutEffect(ie,[ue]),d.useLayoutEffect(()=>{const s=ve.current;c&&!Et&&!ps&&s&&!s.value&&s.scrollHeight>s.clientHeight+2&&Ma(!0)},[c,Na,ds,ps,ue,Et]);const oi=s=>{s&&At===0&&(ks.current=ue);const l=Jd(Mt||[],At,s,ks.current);l&&(Vt(l.pos),he(l.val),requestAnimationFrame(()=>{const k=ve.current;k&&(k.focus(),k.selectionStart=k.selectionEnd=l.val.length,ut(l.val.length)),ie()}))};d.useEffect(()=>{p&&(he(p),D?.(),requestAnimationFrame(()=>{ve.current?.focus(),ie()}))},[p]),d.useEffect(()=>{re.length&&requestAnimationFrame(()=>ve.current?.focus())},[re.length]),d.useEffect(()=>{se?.refs.length&&(qt(se.refs.map(s=>Ks(s,St||""))),ae?.(),requestAnimationFrame(()=>{ve.current?.focus(),ie()}))},[se?.seq]);const st=s=>{const l=La.current,k=l?.start??0,b=l?.end??1/0;he(L=>L.slice(0,k)+s+L.slice(b));const M=k+s.length;return requestAnimationFrame(()=>{const L=ve.current;L&&(!I.getState().feedbackOpen&&!document.querySelector("[data-keep-menus]")&&L.focus(),L.selectionStart=L.selectionEnd=M,ut(M)),ie()}),k},ri=d.useMemo(()=>{const s=()=>{st(""),dn(null)},l=I.getState,k={"/stop":c?()=>{q(),s()}:void 0,"/new":Ye?()=>{Ye(),s()}:void 0,"/branch":yt?()=>{yt(),s()}:void 0,"/compact":tt?()=>{tt(),s()}:void 0,"/plan":Q&&!ye?()=>{Q(!H),s()}:void 0,"/chat":P?()=>{P("chat"),s()}:()=>{l().toast(S("input.presetLocked")),s()},"/work":P?()=>{P("work"),s()}:()=>{l().toast(S("input.presetLocked")),s()},"/voice":Z?()=>{Z(!R),s()}:void 0,"/model":w&&h?.length?()=>{dn({start:st("/model ")}),Be(0)}:void 0,"/loop":ee?()=>{st("/loop "),Be(0)}:void 0,"/verify":me&&W?()=>{st("/verify "),Be(0)}:void 0,"/think":B?()=>{st("/think"),Be(0)}:void 0,"/refine":me?()=>{st("/refine "),Be(0)}:void 0,"/approval":()=>{Xe("mode"),s()},"/help":()=>{l().openSettings("about"),s()},"/feedback":window.tangu?.submitFeedback?()=>{l().openFeedback()&&s()}:void 0,"/btw":et?()=>{st("/btw "),Be(0)}:void 0,"/skills":()=>{l().openSettings("skills"),s()},"/tools":()=>{l().openSettings("agents"),s()},"/agents":()=>{l().openSettings("agents"),s()},"/agent":()=>{l().openSettings("agents"),s()},"/mcp":()=>{l().openSettings("mcp"),s()},"/plugins":()=>{l().openSettings("plugins"),s()},"/memory":()=>{l().openSettings("forsion/f-sync"),s()},"/config":()=>{l().openSettings("general"),s()},"/login":window.tangu?.forsionLogin?()=>{l().openSettings("forsion"),s()}:void 0,"/historian":()=>{l().setActiveSpecial("agents"),s()},"/muse":()=>{l().setActiveSpecial("agents"),s()},"/groupchat":Te&&!ye?()=>{mn(!0),s()}:void 0,"/sessions":()=>{l().setActiveId(null),s()},"/cost":()=>{l().pushNotice(`${(Ue??0).toLocaleString()} tokens · ${S("input.ctxLabel")} ${(We??0).toLocaleString()}/${(It??0).toLocaleString()}`+(Ge!=null&&_e!=null&&_e>0?` · ${S("input.runCost",{used:Math.round(Ge).toLocaleString(),limit:_e.toLocaleString()})}`:"")),s()},"/status":()=>{l().pushNotice([`${S("input.slash.status")}`,`model=${v||"-"}`,`think=${Rt||"medium"}${fe?.thinkingRequested===(Rt||"medium")&&fe.thinkingEffective&&fe.thinkingEffective!==fe.thinkingRequested?`→${fe.thinkingEffective}`:""}`,`approval=${u.approvalMode||fn?.approvalMode||(u.execMode==="host"?"auto-edit":"full-auto")} (${u.approvalMode?"session":fn?.approvalMode?"agent":"default"})`,`cwd=${u.cwd||"-"}`,`loop=${X||fe?.maxIterations||90} (${X?"session":fe?.maxIterationsSource||"default"})`,`verify=${Y||"-"}`,`tokens=${(Ue??0).toLocaleString()}`,`cost=${Ge!=null?Math.round(Ge).toLocaleString():"-"}${_e!=null&&_e>0?`/${_e.toLocaleString()}`:""}`].join(`
23
+ `)),s()},"/copy":()=>{Sr(),s()},"/retry":()=>{Nr(),s()},"/export":()=>{Cr(),s()}},b=[];if(c){const M=k["/stop"];M&&b.push({cmd:"/stop",desc:hn("/stop"),run:M})}if(T){Ye&&b.push({cmd:"/new",desc:hn("/new"),run:()=>{Ye(),s()}}),k["/feedback"]&&b.push({cmd:"/feedback",desc:hn("/feedback"),run:k["/feedback"]});for(const M of _||[])M.name.replace(/^\//,"").toLowerCase()==="feedback"&&k["/feedback"]||b.push({cmd:`/${M.name}`,desc:M.hint?`${M.description} · ${M.hint}`:M.description,run:()=>{st(`/${M.name} `),Be(0)}});return b}if(B){const M=T?void 0:h?.find(L=>L.id===v)?.thinkingLevels;for(const L of Gn){const G=!!M&&!M.includes(L);b.push({cmd:`/think ${L}`,desc:`${S("input.slash.thinkDesc",{level:Zs(L,S)})}${G?` ${S("pill.thinkUnsupported")}`:""}${!Kt&&Rt===L?S("input.slash.current"):""}`,run:()=>{vn(L,xt?!1:void 0),s()}})}xt&&b.push({cmd:"/think ultra",desc:`${S("pill.ultraTitle")}${Kt?S("input.slash.current"):""}`,run:()=>{vn("max",!0),s()}})}for(const M of no("desktop")){if(M.name==="/stop")continue;const L=k[M.name];L&&b.push({cmd:M.arg?`${M.name} ${M.arg}`:M.name,desc:hn(M.name),run:L})}for(const M of fs)b.push({cmd:M.argHint?`/${M.name} ${M.argHint}`:`/${M.name}`,desc:M.description,run:()=>{st(`/${M.name} `),Be(0)}});if(we?.length)for(const M of we)b.push({cmd:`/skill:${M.id}`,desc:S("input.slash.skillUse",{name:M.name}),run:()=>{Aa(L=>L.some(G=>G.id===M.id)?L:[...L,M]),s()}});return b},[c,q,H,R,Z,Rt,X,ee,Y,W,h,v,we,Q,B,w,Ye,yt,tt,Te,ye,P,T,_,fs,hn,u,fn,Ue,We,It,Ge,_e,fe,!!et,xt,Kt]),at=d.useMemo(()=>{if(o||Ia)return null;const s=ue.slice(0,qe);if(un&&s.startsWith("/model ",un.start))return{start:un.start,token:s.slice(un.start),sub:"model"};const l=em(ue,qe);return l?{...l,sub:null}:null},[ue,qe,o,Ia,un]);La.current=at?{start:at.start,end:qe}:null;const wt=d.useMemo(()=>{if(!at)return[];if(at.sub==="model"){const k=at.token.slice(7).toLowerCase();return(h||[]).filter(b=>!k||b.id.toLowerCase().includes(k)||b.name.toLowerCase().includes(k)).slice(0,12).map(b=>({cmd:b.id===v?`● ${b.name}`:b.name,desc:`${b.source==="direct"?S("input.directPrefix"):""}${b.provider} · ${b.id}`,run:()=>{w?.(b.id),st(""),dn(null)}}))}const s=at.token.toLowerCase(),l=s.startsWith("/th");return ri.filter(k=>(l||!k.cmd.startsWith("/think "))&&(k.cmd.toLowerCase().startsWith(s)||s.length>1&&k.desc.toLowerCase().includes(s.slice(1)))).slice(0,10)},[at,ri,h,v]),Yt=!!at&&wt.length>0;d.useEffect(()=>{Be(0)},[at?.start,at?.token]);const yn=!!be&&(je?.length||0)>=2,[$r,Lr]=Ct(Fe,"mentionedProjects"),kn=!!De?.length,ci=d.useMemo(()=>{if(kn)return(De||[]).map(k=>({slug:k.path,name:k.name,description:k.path}));if(!yn)return Ie||[];const s=(Ie||[]).filter(k=>je.includes(k.slug)),l=new Set(s.map(k=>k.slug));return[...s,...(Le||[]).filter(k=>!l.has(k.slug))]},[yn,Ie,je,Le,kn,De]),bt=d.useMemo(()=>{if(o||Yt||Da)return null;const s=/(?:^|\s)@([^\s@]*)$/.exec(ue.slice(0,qe));return s?{query:s[1],start:qe-s[1].length-1}:null},[ue,qe,o,Yt,Da]),jt=d.useMemo(()=>{if(!bt)return[];const s=bt.query.toLowerCase();return ci.filter(l=>!s||l.name.toLowerCase().includes(s)||l.slug.toLowerCase().includes(s)).slice(0,10)},[bt,ci]),li=!!bt&&jt.length>0;d.useEffect(()=>{Dn(0)},[bt?.start,bt?.query]);const ui=s=>{if(!bt)return;const l=ue.slice(0,bt.start),k=`@${s.name} `,b=l+k+ue.slice(qe);he(b),kn?Lr(L=>L.some(G=>G.path===s.slug)?L:[...L,{name:s.name,path:s.slug}]):yn?Fa(s.slug):Wa(L=>L.includes(s.slug)?L:[...L,s.slug]);const M=l.length+k.length;requestAnimationFrame(()=>{const L=ve.current;L&&(L.focus(),L.selectionStart=L.selectionEnd=M,ut(M)),ie()})},it=d.useMemo(()=>{if(o||Yt||Ba)return null;const s=/\[\[([^\]\n]*)$/.exec(ue.slice(0,qe));return s?{query:s[1],start:qe-s[1].length-2}:null},[ue,qe,o,Yt,Ba]);d.useEffect(()=>{if(!it||!me)return;window.amadeus&&Ac();const s=u.cwd;if(!s||ys.current===s)return;ys.current=s,Va(null);const l=new Set(["node_modules","dist","build","out","target",".git",".venv","venv","__pycache__"]);(async()=>{const b=[],M=[{dir:s,rel:"",depth:0}];for(;M.length&&b.length<2e3;){const{dir:L,rel:G,depth:oe}=M.shift();let ge=[];try{ge=await window.tangu?.listDir?.(L)||[]}catch{continue}for(const Ne of ge)if(!Ne.name.startsWith(".")){if(Ne.isDir)oe<8&&!l.has(Ne.name)&&M.push({dir:Ne.path,rel:G?`${G}/${Ne.name}`:Ne.name,depth:oe+1});else if(b.push(G?`${G}/${Ne.name}`:Ne.name),b.length>=2e3)break}}return b})().then(b=>{ys.current===s&&Va(b)}).catch(()=>{})},[it,u.cwd,me]);const di=Cn(s=>s.pages),St=Cn(s=>s.vaultRoot),mi=Cn(s=>s.icons),hi=I(s=>s.sessions),Gt=Di(s=>s.pendingPrompt),$t=Fi(s=>s.pending);d.useEffect(()=>{!$t||$t.sessionId!==pe||!Tt.current?.closest("[data-image-studio-chat]")||!Tt.current.getClientRects().length||Fi.getState().consume($t.seq)&&(he(s=>s.trim()?`${s}
24
+
25
+ ${$t.text}`:$t.text),Pn(s=>[...s,...$t.attachments]),requestAnimationFrame(()=>{ve.current?.focus(),ie()}))},[$t,pe]);const pi=Qi(s=>s.pending);d.useEffect(()=>{if(!pe||!pi.some(l=>l.sessionId===pe)||!Tt.current?.closest("[data-plugin-chat]"))return;const s=Qi.getState().take(pe);s.length&&(he(l=>[...l.trim()?[l]:[],...s].join(`
26
+
27
+ `)),requestAnimationFrame(()=>{ve.current?.focus(),ie()}))},[pi,pe]),d.useEffect(()=>{if(!Gt||!Tt.current?.getClientRects().length)return;const s=I.getState(),l=pe?s.sessions.find(k=>k.id===pe)?.project_path:s.newChatWs?.path;_i(l||"")!==_i(Gt.project)||!Di.getState().consumePrompt(Gt.seq)||(he(k=>k.trim()?`${k}
28
+
29
+ ${Gt.text}`:Gt.text),requestAnimationFrame(()=>{ve.current?.focus(),ie()}))},[Gt,pe]);const Nt=d.useMemo(()=>{if(!it)return[];const s=[...me?di.map(l=>({p:l,note:!0})):[],...me?(Ha??[]).map(l=>({p:l})):[],...hi.filter(l=>l.id!==pe).slice(0,300).map(l=>({p:pt(l.title,S),session:{id:l.id,title:pt(l.title,S),summary:l.summary}}))];return Td(s,it.query)},[it,Ha,di,hi,pe,me,S]),Ns=!!it&&Nt.length>0;d.useEffect(()=>{_n(0)},[it?.start,it?.query]);const fi=s=>{if(!it)return;const l=(s.session?Co({kind:"session",id:s.session.id,title:s.session.title},St||""):s.note&&St?Kc(St,s.p):/\s/.test(s.p)?`"${s.p}"`:s.p).trim();qt([{token:l,name:s.session?s.session.title:Tn(s.p),kind:s.session?"session":s.note?"note":"file"}]);const k=ue.slice(0,it.start);he(k+ue.slice(qe)),requestAnimationFrame(()=>{const b=ve.current;b&&(b.focus(),b.selectionStart=b.selectionEnd=k.length,ut(k.length)),ie()})},gi=Cn(s=>s.activePage??s.activeNotePath),Xt=Jn(s=>bd(s.mainTabs)),On=d.useMemo(()=>{if(nt){const k=Xd(nt);return vs===k.token||ln.some(b=>b.token===k.token)?null:k}if(!me||!$e||!Xt)return null;const s=Xt==="note"?gi:Xt.startsWith("note:")?Xt.slice(5):"",l=s?St?Ks({kind:"note",path:s},St):null:_t(Xt.slice(5));return!l||vs===l.token||ln.some(k=>k.token===l.token)?null:l},[nt,me,$e,Xt,gi,St,vs,ln]),dt=On?[On,...ln]:ln,vi=s=>{const l=(s??ue).trim(),k=s==null?l:"",b=/^\/feedback(?:\s+([\s\S]*))?$/i.exec(k);if(b&&window.tangu?.submitFeedback){I.getState().openFeedback(b[1]?.trim())&&(he(""),requestAnimationFrame(ie));return}const M=/^\/(?:btw|side)(?:\s+([\s\S]*))?$/i.exec(k);if(M&&et){et(M[1]?.trim()||void 0,re.join(`
30
+
31
+ `)||void 0),re.length&&Ze?.(),he(""),requestAnimationFrame(ie);return}if(!l&&!dt.length)return;const L=/^\/compact(?:\s+([\s\S]+))?$/i.exec(k);if(L&&tt){tt((L[1]||"").trim()||void 0),he(""),requestAnimationFrame(ie);return}const G=/^\/loop(?:\s+(\d+))?$/i.exec(k);if(G&&ee){if(G[1]){const te=Math.min(Math.max(1,parseInt(G[1],10)),200);ee(te),Ee(S("input.slash.loopSet",{n:te}))}else Ee(S("input.slash.loop",{current:X||fe?.maxIterations||90}));he(""),requestAnimationFrame(ie);return}const oe=/^\/verify(?:\s+([\s\S]+))?$/i.exec(k);if(oe&&me&&W){const te=(oe[1]||"").trim();te?/^(off|clear|关闭)$/i.test(te)?(W(""),Ee(S("input.slash.verifyCleared"))):(W(te),Ee(S("input.slash.verifySet",{cmd:te}))):Ee(S("input.slash.verifyUsage",{current:Y||S("input.slash.verifyNone")})),he(""),requestAnimationFrame(ie);return}if(Z&&/^\/(voice|text)$/i.test(k)){const te=/^\/voice$/i.test(l);Z(te),Ee(S(te?"input.slash.voiceOnHint":"input.slash.voiceOffHint")),he(""),requestAnimationFrame(ie);return}const ge=/^\/(?:think|effort)(?:\s+(\S+))?$/i.exec(k);if(ge&&B){const te=(ge[1]||"").toLowerCase();xt&&te==="ultra"?vn("max",!0)&&Ee(S("input.slash.thinkSet",{level:S("pill.ultra")})):Gn.includes(te)?(vn(te,xt?!1:void 0),Ee(S("input.slash.thinkSet",{level:Zs(te,S)}))):Ee(S("input.slash.thinkUsage",{levels:[...Gn,...xt?["ultra"]:[]].join("|")})),he(""),requestAnimationFrame(ie);return}const Ne=/^\/([a-z0-9][a-z0-9-]*)(?:\s+([\s\S]*))?$/i.exec(k);if(Ne&&fs.some(te=>te.name===Ne[1].toLowerCase())){const te=Ne[1].toLowerCase(),ot=Ne[2]||"";he(""),requestAnimationFrame(ie),Bc(ft(),te,ot).then(Qt=>V(Qt,[],[],void 0,void 0)).catch(Qt=>Ee(String(Qt?.message||Qt)));return}if(o)return;if(pn&&!s&&l&&l.length<=Yu&&!Ut.length&&!Bt.length&&!dt.length&&!re.length&&!Ht.length)return he(""),Vt(0),Ee(null),requestAnimationFrame(ie),Gu(pe,l).then(async te=>{if(te)return!0;const ot=await Promise.resolve(vi(l)).catch(()=>!1)??!1;return ot?Ee(S("livecall.textFallback")):he(Qt=>Qt||l),ot});const xn=Ld(re),wn=dt.length?dt.map(te=>te.token).join(" ")+`
32
+ `:"",Pt=Qd(wn,xn,l);if(Pt.length>co){Ee(S("input.tooLong",{len:Pt.length.toLocaleString(),max:co.toLocaleString()}));return}Ee(null);const Dt=kn?{mentionProjects:(()=>{const te=$r.filter(ot=>Pt.includes(`@${ot.name}`));return te.length?te:void 0})()}:yn?{priorityAgent:wr||void 0}:{mentionAgents:Oa.length?Oa:void 0},Jt=Fe,He=Jt===Ai?new Set(I.getState().sessions.map(te=>te.id)):null;return V(Pt,Ut,Bt,Ht.map(te=>te.id),Dt).then(te=>{if(!te){const ot=Sa.current;return He&&ot!==Jt&&!He.has(ot)&&qc(Jt,ot),!1}return Hc(Jt,!!s),s||(Vt(0),Vc("tick")),Ze?.(),requestAnimationFrame(ie),!0})},Wn=()=>{vi()},yi=async s=>{if(!s)return;const l=[],k=[];for(const b of Array.from(s)){if(!b.type.startsWith("image/")){k.push(S("input.skip.notImage",{name:b.name}));continue}if(b.size>qs){k.push(S("input.skip.tooBig",{name:b.name,mb:String(Math.round(qs/1024/1024))}));continue}const M=await b.arrayBuffer();let L="";const G=new Uint8Array(M);for(let oe=0;oe<G.length;oe+=32768)L+=String.fromCharCode(...G.subarray(oe,oe+32768));l.push({name:b.name,mimeType:b.type,data:btoa(L),size:b.size})}Ee(k.length?S("input.skip.imageHint",{items:k.join(S("composer2.listSep"))}):null),Pn(b=>[...b,...l])},Cs=async s=>{if(!s)return;const l=[],k=[];for(const b of Array.from(s)){if(b.size>Hs){k.push(S("input.skip.tooBig",{name:b.name,mb:String(Math.round(Hs/1024/1024))}));continue}const M=await b.arrayBuffer();let L="";const G=new Uint8Array(M);for(let oe=0;oe<G.length;oe+=32768)L+=String.fromCharCode(...G.subarray(oe,oe+32768));l.push({name:b.name,mimeType:b.type||"application/octet-stream",data:btoa(L),size:b.size})}Ee(k.length?S("input.skip.simple",{items:k.join(S("composer2.listSep"))}):null),gs(b=>[...b,...l])},ki=s=>{if(s.length){if(me&&window.tangu?.getPathForFile){const l=Array.from(s).map(k=>{try{return window.tangu.getPathForFile(k)}catch{return""}}).filter(Boolean);if(l.length){qt(l.map(_t)),requestAnimationFrame(()=>{ve.current?.focus(),ie()});return}}Cs(s)}},xi=d.useRef(ki);xi.current=ki,d.useEffect(()=>{const s=Tt.current;return s?Kd(s,l=>xi.current(l),jr):void 0},[]);const wi=async s=>{if(!s?.length)return;const l=Array.from(s).filter(b=>b.type.startsWith("image/")),k=Array.from(s).filter(b=>!b.type.startsWith("image/"));if(l.length){const b=new DataTransfer;l.forEach(M=>b.items.add(M)),await yi(b.files)}if(k.length){const b=new DataTransfer;k.forEach(M=>b.items.add(M)),await Cs(b.files)}};d.useEffect(()=>{if(!x)return;const s=K?.();if(s&&(s.text&&(he(l=>l.trim()?`${l.replace(/\s+$/,"")}
33
+
34
+ ${s.text}`:s.text),requestAnimationFrame(()=>ie())),s.files.length)){const l=new DataTransfer;s.files.forEach(k=>l.items.add(k)),wi(l.files)}},[x]);const Pr=async s=>{const l=[],k=[],b=[];for(const M of s){if(M.isDirectory){b.push(Yd(M.path));continue}try{const L=await window.tangu?.readHostFile?.(M.path);if(!L||L.tooLarge){b.push(_t(M.path));continue}const G={name:Tn(M.path),mimeType:L.mimeType,data:L.content,size:L.size};L.mimeType.startsWith("image/")&&L.size<=qs?l.push(G):L.size<=Hs?k.push(G):b.push(_t(M.path))}catch{b.push(_t(M.path))}}l.length&&Pn(M=>[...M,...l]),k.length&&gs(M=>[...M,...k]),b.length&&qt(b)},Dr=s=>{qt([s.kind==="view"?Gd(s.type,s.title):Ks(s,St||"")]),requestAnimationFrame(()=>ve.current?.focus())},[_r,bi]=d.useState(!1),Fr=I(s=>s.cfg),Or=s=>{j({execMode:"host",approvalMode:s,cwd:u.cwd}),Xe(null)},ji=Tc(),Wr=d.useMemo(()=>Kl(h||[],ji),[h,ji]),mt=!!be&&(je?.length||0)>=2,Ur=!!Qa&&Fn&&(!!window.tangu?.openMini||ni)&&!(H&&!ye)&&!mt&&!ye&&!T,zs=Vs.find(s=>s.id===gn)||Vs[1],Br=mt?S("group.modeLabel",{n:je.length}):S(H&&!ye?"input.planMode":ye?"input.presetChat":me?zs.key:"input.normal"),qr=mt?Gs:H&&!ye?Ti:me?zs.Icon:ls,Si=!mt&&!(H&&!ye)&&!ye&&me&&zs.id==="full-auto",Hr=!ye&&(!!Q||me||!!Te||!!Pe),Vr=(E||[]).find(s=>s.id===T)?.name||S("input.engineDefault"),Se=!!T,Kr=Se?[{label:Vr,options:C||[]}]:Wr.map(s=>({key:s.key,label:s.provider,source:s.source,options:s.models.map(l=>({...l,description:`${l.provider} · ${l.id}`}))})),Yr=Se||!!w||!!B,Un=Lc(),[Vm,Km]=d.useState(!1),Bn=()=>Xe(null),Ni={active:!H&&!mt&&gn==="auto-edit",disabled:c,agents:Ie||[],currentAgentSlug:Ke,onNormalWork:Ve||(()=>{}),onAgentSwitch:!Se&&!mt?Pe:void 0,onClose:Bn},Ms=Q&&!ye?{title:S("input.planMode"),items:[{id:"plan-mode",icon:t.jsx(Ti,{size:14}),label:S(be?"input.planModeTeamOff":H?"input.planModeOn":"input.planModeEnable"),checked:!!H&&!be,disabled:!!be,run:()=>{Q(!H),Bn()}}]}:null,Es=Te&&!Se&&!ye?{title:S("group.menu.section"),items:[{id:"group-chat",label:mt?S("group.menu.configured",{n:je.length}):S("group.menu.enable"),icon:t.jsx(Gs,{size:14}),checked:mt,run:()=>{mn(!0),Bn()}}]}:null,Ci=me?Vs.map(({id:s,Icon:l,key:k,desc:b,...M})=>({id:`approval:${s}`,approvalId:s,label:S(k),detail:S(b),icon:t.jsx(l,{size:15,className:"approval-ic"}),checked:gn===s,danger:"danger"in M,run:()=>Or(s)})):[],Lt=me&&gn==="custom"?{id:"approval-rules",label:S("input.approval.editRules"),detail:S("input.approval.editRulesDesc"),icon:t.jsx(Yc,{size:15,className:"approval-ic"}),run:()=>{bi(!0),Bn()}}:null,Gr=()=>{const s=Ve&&!ye?Xo(Ni,S):null;return{title:S("input.modeSheetTitle"),back:S("common.back"),sections:[{items:s?[s.normal,...s.agentSwitch?[s.agentSwitch]:[]]:[]},...Ms?[Ms]:[],...Es?[Es]:[],...me?[{title:S(m?"input.approvalSection.team":"input.approvalSection"),items:[...Ci,...Lt?[Lt]:[]]}]:[]]}},zi=c?t.jsxs(t.Fragment,{children:[(!!ue.trim()||dt.length>0)&&t.jsx($s,{onClick:Wn,disabled:o,title:S("input.send"),"aria-label":S("input.send")}),t.jsxs("button",{className:"t2c-stop",onClick:q,title:S("input.stop"),"aria-label":S("input.stop"),children:[t.jsx(wo,{size:10}),t.jsx("span",{className:"t2c-stop-label",children:S("input.stop")})]})]}):Ur&&!ue.trim()&&!dt.length&&!Ut.length&&!Bt.length&&!re.length&&!Ht.length?t.jsx($s,{className:"t2c-live-control",onClick:()=>{Tr()},disabled:!!o||ws,title:S(pn?"livecall.return":"livecall.start"),"aria-label":S(pn?"livecall.return":"livecall.start"),children:ws?t.jsx(an,{size:16,className:"spin"}):t.jsx(ru,{size:16})}):t.jsx($s,{onClick:Wn,disabled:o||!ue.trim()&&!dt.length,title:S("input.send"),"aria-label":S("input.send")});return t.jsxs("div",{className:"t2c",children:[xr&&t.jsx(ud,{agents:Ie||[],models:h,initialAgents:je||[],initialTempAgents:Le,active:mt,hideDisable:!0,onConfirm:s=>{Te?.({groupChat:!0,...s}),mn(!1),Pc("chat.group")},onDisable:()=>Te?.({groupChat:!1}),onClose:()=>mn(!1)}),t.jsxs("div",{className:"t2c-inner",children:[!!lt?.length&&t.jsxs("div",{className:"t2c-steer",role:"status","aria-label":S("input.steer.waiting"),children:[lt.map(s=>t.jsxs("div",{className:"t2c-steer-item",children:[t.jsx(Tl,{size:12,className:"t2c-steer-ic"}),t.jsx("span",{className:"t2c-steer-text",title:s.text,children:s.text}),t.jsx("button",{className:"t2c-steer-x",title:S("input.steer.remove"),onClick:()=>ce?.(s.id),children:t.jsx(ht,{size:12})})]},s.id)),t.jsxs("div",{className:"t2c-steer-foot",children:[t.jsx("span",{className:"t2c-steer-hint",children:S(lt.some(s=>s.localOnly)?"input.steer.queuedHint":"input.steer.hint")}),ja&&lt.some(s=>!s.localOnly)&&t.jsxs("button",{className:"t2c-steer-now",onClick:ja,children:[t.jsx(Dc,{size:11})," ",S("input.steer.now")]})]})]}),a,t.jsxs(_c,{ref:Tt,className:`${Un?"t2c-card--phone":""}${br?" dragover":""}`,children:[n,Ta&&t.jsx("div",{className:"t2c-hint",children:Ta}),re.length>0&&t.jsx("div",{className:"t2c-quotes",role:"group","aria-label":S("input.quote.group"),children:re.map((s,l)=>t.jsxs("div",{className:"t2c-quote",children:[t.jsx(yu,{size:13,className:"t2c-quote-mark","aria-hidden":!0}),t.jsx("span",{className:"t2c-quote-text",children:s.length>280?`${s.slice(0,280)}…`:s}),t.jsx("button",{title:S("input.remove"),"aria-label":S("input.remove"),onClick:()=>Me?Me(l):Ze?.(),className:"t2c-quote-x",children:t.jsx(ht,{size:12})})]},s))}),dt.length>0&&t.jsxs("div",{className:"t2c-chiprow t2c-refrow",role:"group","aria-label":S("input.ref.selected"),children:[t.jsx("span",{className:"t2c-reflabel",children:S("input.ref.selected")}),dt.map(s=>t.jsx(jd,{chip:s,removeTitle:S("input.remove"),onRemove:()=>{On&&s.token===On.token?kr(s.token):Ea(l=>l.filter(k=>k.token!==s.token))}},s.token))]}),Ut.length>0&&t.jsx("div",{className:"t2c-chiprow",children:Ut.map((s,l)=>t.jsxs("span",{className:"attach-chip",children:[s.mimeType.startsWith("image/")&&t.jsx("img",{src:`data:${s.mimeType};base64,${s.data}`,alt:s.name}),t.jsx("span",{children:s.name}),t.jsx("button",{title:S("input.remove"),onClick:()=>Pn(Ut.filter((k,b)=>b!==l)),children:t.jsx(ht,{size:12})})]},`${s.name}-${l}`))}),Bt.length>0&&t.jsx("div",{className:"t2c-chiprow",children:Bt.map((s,l)=>t.jsxs("span",{className:"attach-chip",title:S("input.wsUploadTitle",{name:s.name}),children:[s.mimeType.startsWith("image/")?t.jsx("img",{src:`data:${s.mimeType};base64,${s.data}`,alt:s.name}):t.jsx(ga,{size:14,style:{color:"var(--accent-ink)",flexShrink:0}}),t.jsx("span",{children:s.name}),t.jsx("span",{style:{fontSize:"var(--ui-font-caption, 11px)",color:"var(--text-faint)",flexShrink:0},children:S("input.toWorkspace")}),t.jsx("button",{title:S("input.remove"),onClick:()=>gs(Bt.filter((k,b)=>b!==l)),children:t.jsx(ht,{size:12})})]},`ws-${s.name}-${l}`))}),Ht.length>0&&t.jsx("div",{className:"t2c-chiprow",children:Ht.map(s=>t.jsxs("span",{className:"attach-chip",title:S("input.skillChipTitle"),children:[t.jsx(ko,{size:13,style:{color:"var(--accent-ink)",flexShrink:0}}),t.jsx("span",{children:s.name}),t.jsx("button",{title:S("input.remove"),onClick:()=>Aa(Ht.filter(l=>l.id!==s.id)),children:t.jsx(ht,{size:12})})]},`skill-${s.id}`))}),(s=>Un?t.jsxs("div",{className:"t2c-field",children:[s,!Ya&&zi]}):s)(t.jsx(Fc,{autoSize:!1,ref:ve,className:"t2c-ta",rows:1,autoFocus:i,value:ue,placeholder:js?bs:o?r||S("input.placeholderDisabled"):pn?S("livecall.typeHint"):c?Et?S("input.runningPlaceholder"):S("input.tip",{tip:S(za[Na%za.length])}):S(ms?"input.placeholderTouch":"input.placeholder"),"data-suggestion":js||void 0,"data-tip-fade":c&&!Et&&gr||void 0,"data-tip-tall":c&&!Et&&ps||void 0,disabled:o,onChange:s=>{he(s.target.value),ut(s.target.selectionStart||0),$a(!1),_a(!1),qa(!1),At&&Vt(0),e&&s.target.value&&Is(e),s.target.value.includes("@")||(Fa(""),Wa([])),ie()},onSelect:s=>ut(s.target.selectionStart||0),onPaste:s=>{const l=s.clipboardData?.files;if(!l?.length)return;s.preventDefault();const k=Array.from(l),b=k.filter(G=>G.type.startsWith("image/")),M=k.filter(G=>!G.type.startsWith("image/")),L=[];if(M.length){const G=[];for(const oe of M){let ge="";if(me)try{ge=window.tangu?.getPathForFile?.(oe)||""}catch{ge=""}ge?G.push(ge):L.push(oe)}G.length&&(qt(G.map(_t)),requestAnimationFrame(()=>{ve.current?.focus(),ie()}))}if(b.length){const G=new DataTransfer;b.forEach(oe=>G.items.add(oe)),yi(G.files)}if(L.length){const G=new DataTransfer;L.forEach(oe=>G.items.add(oe)),Cs(G.files)}},onKeyDown:s=>{if(Ns){if(s.key==="ArrowDown"){s.preventDefault(),_n(l=>(l+1)%Nt.length);return}if(s.key==="ArrowUp"){s.preventDefault(),_n(l=>(l-1+Nt.length)%Nt.length);return}if((s.key==="Enter"||s.key==="Tab")&&!s.nativeEvent.isComposing){s.preventDefault(),fi(Nt[Math.min(Ua,Nt.length-1)]);return}if(s.key==="Escape"){s.preventDefault(),qa(!0);return}}if(li){if(s.key==="ArrowDown"){s.preventDefault(),Dn(l=>(l+1)%jt.length);return}if(s.key==="ArrowUp"){s.preventDefault(),Dn(l=>(l-1+jt.length)%jt.length);return}if((s.key==="Enter"||s.key==="Tab")&&!s.nativeEvent.isComposing){s.preventDefault(),ui(jt[Math.min(Pa,jt.length-1)]);return}if(s.key==="Escape"){s.preventDefault(),_a(!0);return}}if(Yt){if(s.key==="ArrowDown"){s.preventDefault(),Be(l=>(l+1)%wt.length);return}if(s.key==="ArrowUp"){s.preventDefault(),Be(l=>(l-1+wt.length)%wt.length);return}if((s.key==="Enter"||s.key==="Tab")&&!s.nativeEvent.isComposing){s.preventDefault(),wt[Math.min(Ra,wt.length-1)]?.run();return}if(s.key==="Escape"){s.preventDefault(),$a(!0),dn(null);return}}if(s.key==="Tab"&&!s.shiftKey&&js&&!Ae&&!s.nativeEvent.isComposing){s.preventDefault();const l=bs;he(l),e&&Is(e),requestAnimationFrame(()=>{const k=ve.current;k&&(k.selectionStart=k.selectionEnd=l.length,ut(l.length)),ie()});return}if(s.key==="ArrowUp"&&lt?.length&&kt&&At===0&&s.currentTarget.selectionStart===s.currentTarget.selectionEnd&&ue.slice(0,s.currentTarget.selectionStart).indexOf(`
35
+ `)===-1){s.preventDefault();const l=lt[lt.length-1];kt(l.id).then(k=>{k&&(he(b=>b.trim()?`${k}
36
+
37
+ ${b}`:k),requestAnimationFrame(()=>{const b=ve.current;b&&(b.focus(),b.selectionStart=b.selectionEnd=k.length,ut(k.length)),ie()}))});return}if(s.key==="ArrowUp"&&s.currentTarget.selectionStart===s.currentTarget.selectionEnd&&ue.slice(0,s.currentTarget.selectionStart).indexOf(`
38
+ `)===-1&&Mt?.length){s.preventDefault(),oi(!0);return}if(s.key==="ArrowDown"&&At>0&&s.currentTarget.selectionStart===s.currentTarget.selectionEnd&&ue.slice(s.currentTarget.selectionStart).indexOf(`
39
+ `)===-1){s.preventDefault(),oi(!1);return}s.key==="Enter"&&!s.shiftKey&&!s.nativeEvent.isComposing&&(s.preventDefault(),Wn())}})),Yt&&t.jsx("div",{className:"t2c-menu",children:wt.map((s,l)=>t.jsxs("button",{className:"t2c-menu-item","data-active":l===Math.min(Ra,wt.length-1)||void 0,onMouseEnter:()=>Be(l),onClick:()=>s.run(),children:[t.jsx("span",{className:"t2c-menu-cmd",children:s.cmd}),t.jsx("span",{className:"t2c-menu-desc",children:s.desc})]},`${s.cmd}-${l}`))}),li&&!Ns&&t.jsxs("div",{className:"t2c-menu",children:[t.jsx("div",{className:"t2c-menu-sec",children:S(kn?"input.mention.projectNote":yn?"input.mention.groupNote":"input.mention.delegateNote")}),jt.map((s,l)=>t.jsxs("button",{className:"t2c-menu-item","data-active":l===Math.min(Pa,jt.length-1)||void 0,onMouseEnter:()=>Dn(l),onClick:()=>ui(s),children:[t.jsxs("span",{className:"t2c-menu-cmd",children:["@",s.name]}),t.jsx("span",{className:"t2c-menu-desc",children:s.description||s.slug})]},s.slug))]}),Ns&&t.jsxs("div",{className:"t2c-menu",children:[t.jsx("div",{className:"t2c-menu-sec",children:S("input.fileref.note")}),Nt.map((s,l)=>t.jsxs("button",{className:"t2c-menu-item","data-active":l===Math.min(Ua,Nt.length-1)||void 0,onMouseEnter:()=>_n(l),onClick:()=>fi(s),children:[t.jsx("span",{className:"t2c-menu-cmd",children:s.session?`💬 ${s.session.title}`:s.note?`${mi[s.p]?`${mi[s.p]} `:""}${s.p.split("/").pop().replace(/\.md$/i,"")}`:s.p.split("/").pop()}),t.jsx("span",{className:"t2c-menu-desc",children:s.session?s.session.summary||S("input.fileref.session"):s.p})]},s.session?`s:${s.session.id}`:(s.note?"n:":"f:")+s.p))]}),t.jsxs(Oc,{children:[t.jsx(xd,{open:Ae==="add",disabled:o,activeSessionId:pe,canUsePathPicker:me,onOpenChange:s=>Xe(s?"add":null),onNewSession:Ye,onAddAgent:!c&&!ye&&!Se?ze||(Te?()=>mn(!0):void 0):void 0,onPickPaths:Pr,onPickFiles:wi,onAddReference:Dr}),Ya?t.jsx(ad,{analyser:de.analyser,recording:de.recording,busy:de.busy,onStop:de.toggle,onSend:zr,t:S}):t.jsxs(t.Fragment,{children:[Hr&&!0&&t.jsxs("span",{className:`mode-pill-wrap t2c-capsule-peer${Ae==="mode"?" is-open":""}`,"data-cmenu":!0,children:[t.jsxs("button",{className:`t2c-pill mode-pill-btn${Ae==="mode"?" is-open":""}${H&&!ye?" active":""}`,"data-danger":Si||void 0,title:S(Si?"input.approval.fullAutoDesc":"input.modeChipTitle"),"aria-expanded":Ae==="mode",onClick:()=>{if(Ae!=="mode"&&ka(Gr,{})){Xe(null);return}Xe(s=>s==="mode"?null:"mode")},children:[t.jsx(qr,{size:13}),t.jsx("span",{className:"t2c-pill-label",children:Br}),t.jsx(In,{size:10})]}),Ae==="mode"&&t.jsxs("div",{ref:ai.ref,className:"composer-menu composer-menu--mode",style:ai.style,children:[Ve&&!ye&&t.jsx(wd,{...Ni}),[Ms,Es].map(s=>s&&t.jsxs(sn.Fragment,{children:[t.jsx("div",{className:"menu-section",children:s.title}),s.items.map(l=>t.jsxs("button",{className:`menu-item${l.checked?" active":""}`,disabled:l.disabled,onClick:l.run,children:[l.icon,t.jsx("span",{className:"grow",children:l.label}),l.checked&&t.jsx(gt,{size:13})]},l.id))]},s.items[0].id)),me&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"menu-section",children:S(m?"input.approvalSection.team":"input.approvalSection")}),Ci.map(s=>t.jsxs("button",{className:`menu-item approval-item${s.checked?" active":""}${s.danger?" danger":""}`,"aria-describedby":`approval-mode-desc-${s.approvalId}`,onClick:s.run,children:[s.icon,t.jsx("span",{className:"grow approval-title",children:s.label}),s.checked&&t.jsx(gt,{size:13,className:"approval-ck"}),t.jsx("span",{id:`approval-mode-desc-${s.approvalId}`,role:"tooltip",className:"approval-hover-desc",children:s.detail})]},s.approvalId)),Lt&&t.jsxs("button",{className:"menu-item approval-item","aria-describedby":"approval-edit-rules-desc",onClick:Lt.run,children:[Lt.icon,t.jsx("span",{className:"grow approval-title",children:Lt.label}),t.jsx("span",{id:"approval-edit-rules-desc",role:"tooltip",className:"approval-hover-desc",children:Lt.detail})]})]})]})]}),t.jsx("span",{className:"t2c-grow"}),!ye&&!!It&&It>0&&(()=>{const s=Math.min(100,Math.round((We||0)/It*100)),l=Ss?.compactAt?(We||0)>=Ss.compactAt*.8:s>=80,k=9,b=2*Math.PI*k;return t.jsxs("span",{className:`t2c-ctxring t2c-collapse-on-capsule-open${Ae==="ctx"?" is-open":""}`,"data-warn":l||void 0,"data-cmenu":!0,children:[t.jsx("button",{type:"button",className:"t2c-ctxring-btn","aria-expanded":Ae==="ctx","aria-label":`${S("input.ctxLabel")} ${s}%`,...Lo(()=>Ae==="ctx"?null:[`${S("input.ctxLabel")} ${s}%`]),onClick:()=>{Rl(),Xe(M=>M==="ctx"?null:"ctx")},children:t.jsxs("svg",{viewBox:"0 0 24 24",width:"20",height:"20","aria-hidden":"true",children:[t.jsx("circle",{className:"t2c-ctxring-track",cx:"12",cy:"12",r:k}),t.jsx("circle",{className:"t2c-ctxring-fill",cx:"12",cy:"12",r:k,style:{strokeDasharray:b,strokeDashoffset:b*(1-s/100)}})]})}),t.jsx("span",{ref:ii.ref,className:"t2c-ctxring-pop",style:ii.style,children:t.jsx(Wd,{open:Ae==="ctx",contextWindow:It,ctxTokens:We,sessionTokens:Ue,runCost:Ge,costLimit:_e,ctxInfo:Ss,onCompact:tt?()=>{tt(),Xe(null)}:void 0})})]})})(),Yr&&t.jsx(Yl,{scopeKey:`${pe??"draft"}:${Wc(Mr)}:${Se?"engine":"tangu"}`,className:"t2c-capsule-peer",icon:Un?null:void 0,hub:void 0,open:Ae==="model",onOpenChange:s=>Xe(s?"model":null),disabled:o,modelId:Se?z:v,groups:Kr,onSelect:Se?s=>U?.(s):s=>w?.(s),thinkingLevel:Se?void 0:Rt,onThinkingChange:Se||!B?void 0:(s,l)=>{vn(s,l)},allowUltra:xt,ultra:Kt,running:c,supportedThinking:Se?void 0:h?.find(s=>s.id===v)?.thinkingLevels,effectiveThinking:Se?void 0:fe?.thinkingRequested===(Rt||"medium")?fe?.thinkingEffective:void 0,modelsResponse:Se?void 0:f,defaultModelIds:Se?void 0:A,onDefaultModelChange:Se?void 0:g,onContextWindowChange:Se?void 0:O,emptyLabel:Se?S("input.engineModelDefault"):void 0,footnote:!Se&&!me&&!h?.some(s=>s.source==="direct")?S("input.cloudModelHint"):void 0}),t.jsx("button",{className:`t2c-iconbtn t2c-mic-control t2c-collapse-on-capsule-open${de.recording?" recording":""}`,title:de.busy?S("input.micBusy"):de.recording?S("input.micStop"):de.error||S("input.micStart"),disabled:o||de.busy||!de.supported,onClick:de.toggle,children:de.busy?t.jsx(an,{size:14,className:"spin"}):t.jsx(Uc,{size:14})}),!Un&&zi]})]}),de.error&&!de.recording&&!de.busy&&t.jsx("div",{className:"t2c-hint",style:{marginTop:6,marginBottom:0},children:de.error}),ei&&Fn&&!de.error&&t.jsx("div",{className:"t2c-hint",style:{marginTop:6,marginBottom:0},children:ei})]})]}),_r&&t.jsx(gd,{cfg:Fr,onClose:()=>bi(!1)}),Ir&&t.jsx(od,{offerFullAccess:me&&!m&&gn!=="full-auto",onConfirm:({fullAccess:s})=>{s&&j({execMode:"host",approvalMode:"full-auto",cwd:u.cwd}),B?.("max",!0)},onClose:()=>si(!1)})]})};function tm(e,n){const a=Math.max(0,e.content-e.width);if(e.left>=a-1)return 0;const i=e.left+e.width,o=n.find(c=>c.end>i+1),r=o?Math.min(o.start,a):a;return r>e.left+1?r:Math.min(i,a)}function nm(e,n){return e-n>1}xe({"chatPicker.engine":{zh:"引擎",en:"Engine"},"chatPicker.agent":{zh:"Agent",en:"Agent"}});function sm({label:e,value:n,icon:a,options:i,onChange:o,busy:r=!1}){const c=i.find(u=>u.value===n);return t.jsxs("label",{className:"compact-chat-picker","aria-busy":r||void 0,title:c?.name,children:[t.jsx("span",{className:"compact-chat-picker-kind",children:e}),t.jsx("span",{className:"compact-chat-picker-icon",children:a}),t.jsx("span",{className:"compact-chat-picker-name",children:c?.name||e}),t.jsx(In,{size:13}),t.jsxs("select",{"aria-label":e,value:c?n:"",onChange:u=>o(u.target.value),children:[!c&&t.jsx("option",{value:"",disabled:!0,children:e}),i.map(u=>t.jsx("option",{value:u.value,disabled:u.disabled,children:u.description?`${u.name} — ${u.description}`:u.name},u.value))]})]})}const am=({label:e,children:n,role:a="radiogroup"})=>{const{t:i}=Ce(),o=d.useRef(null),[r,c]=d.useState(!1);d.useLayoutEffect(()=>{const m=o.current;if(!m)return;const h=()=>{const v=m.parentElement,w=v&&getComputedStyle(v),E=v&&w?v.clientWidth-parseFloat(w.paddingLeft)-parseFloat(w.paddingRight):m.clientWidth;c(nm(m.scrollWidth,E))};h();const f=new ResizeObserver(h);f.observe(m);for(const v of Array.from(m.children))f.observe(v);return()=>f.disconnect()},[n]),d.useEffect(()=>{const m=o.current,h=m?.querySelector('[aria-checked="true"],[aria-pressed="true"]');if(!m||!h)return;const f=m.getBoundingClientRect(),v=h.getBoundingClientRect();v.right>f.right?m.scrollLeft+=v.right-f.right+6:v.left<f.left&&(m.scrollLeft-=f.left-v.left+6)},[]);const u=d.useCallback(()=>{const m=o.current;if(!m)return;const h=m.getBoundingClientRect(),f=Array.from(m.children).map(v=>{const w=v.getBoundingClientRect();return{start:w.left-h.left+m.scrollLeft,end:w.right-h.left+m.scrollLeft}});m.scrollTo({left:tm({left:m.scrollLeft,width:m.clientWidth,content:m.scrollWidth},f),behavior:"smooth"})},[]);return t.jsxs("div",{className:"engine-picker-bar","data-more":r||void 0,children:[t.jsx("div",{className:"engine-picker-scroll",ref:o,role:a,"aria-label":e,children:n}),r&&t.jsx("button",{type:"button",className:"engine-picker-more",onClick:u,title:i("pill.more"),"aria-label":i("pill.more"),children:t.jsx(as,{size:16})})]})};function im(e,n,a){const i=Xc(e,n),o=i.groupAgents??[];return i.groupChat&&o.length>=2?{kind:"team",count:o.length}:{kind:"agent",slug:i.agentSlug||a||null}}xe({"agentSelect.title":{zh:"选择 Agent",en:"Pick agents"},"agentSelect.hintDefault":{zh:"由默认 Agent {name} 处理",en:"Handled by the default agent, {name}"},"agentSelect.hintDefaultAnon":{zh:"由默认 Agent 处理",en:"Handled by the default agent"},"agentSelect.hintOne":{zh:"{name} 将处理这条消息",en:"{name} will handle this message"},"agentSelect.removeHint":{zh:"再次点击移除",en:"Click again to remove"},"agentSelect.team":{zh:"团队模式 · {n} 人",en:"Team mode · {n} people"},"agentSelect.picked":{zh:"已选",en:"Picked"},"agentSelect.default":{zh:"默认 Agent",en:"Default agent"},"agentSelect.defaultTag":{zh:"默认",en:"Default"},"agentSelect.direct":{zh:"私聊",en:"Direct chat"}});const Zt=2,en=e=>`agent:${e}`,Nn=e=>`engine:${e}`,om=(e,n)=>e.length===n.length&&e.every((a,i)=>a===n[i]);function rm(e){if(e.engineId)return[];const n=e.groupAgents??[];return e.groupChat&&n.length>=2?[...n]:e.agentSlug?[e.agentSlug]:[]}function Rh({sessionId:e,cfg:n}){const{t:a}=Ce(),[i,o]=d.useState(null),r=I(Jc(y=>({agentDefs:y.agentDefs,agentAvatars:y.agentAvatars,defaultAgentSlug:y.defaultAgentSlug,engines:y.engines,engineCaps:y.engineCaps,teams:y.teams}))),c=I(y=>e?null:Qc(y,Zc())),u=I(y=>c?y.projectSettingsByPath[c]??null:null),m=I(y=>!c||c in y.projectSettingsByPath);d.useEffect(()=>{c&&!m&&I.getState().ensureProjectSettings(c).catch(()=>null)},[c,m]);const h=n.engineId||"",f=rm(n),v=h?[Nn(h)]:f.map(en),w=h&&!r.engineCaps[h]?h:"",E=d.useMemo(()=>{const y=r.agentDefs.map(F=>({id:en(F.slug),kind:"agent",slug:F.slug,name:F.name,description:F.description,system:F.createdBy==="system"}));for(const F of n.groupAgents??[]){if(y.some(we=>we.id===en(F)))continue;const ne=n.groupTempAgents?.find(we=>we.slug===F);y.push({id:en(F),kind:"agent",slug:F,name:ne?.name||F,description:ne?.description})}if(n.agentSlug&&!y.some(F=>F.id===en(n.agentSlug))&&y.push({id:en(n.agentSlug),kind:"agent",slug:n.agentSlug,name:n.agentSlug}),n.execMode==="host")for(const F of r.engines)F.available&&y.push({id:Nn(F.id),kind:"engine",engineId:F.id,name:F.name});return h&&!y.some(F=>F.id===Nn(h))&&y.push({id:Nn(h),kind:"engine",engineId:h,name:r.engines.find(F=>F.id===h)?.name||h}),y},[r.agentDefs,r.engines,h,n.execMode,n.groupAgents,n.groupTempAgents,n.agentSlug]),T=d.useMemo(()=>new Map(E.map(y=>[y.id,y])),[E]),C=d.useMemo(()=>E.filter(y=>y.kind==="agent").map(y=>y.name),[E]),z=v.map(y=>T.get(y)).filter(y=>!!y),U=E.filter(y=>!v.includes(y.id)),_=n.groupChat?f.length:0,$=y=>{const F=!!n.groupChat&&f.length<Zt;if(!h&&!F&&om(f,y))return;const ne=I.getState(),we=!!h,be=(n.groupTempAgents||[]).filter(ze=>y.includes(ze.slug)),je=we?{engineId:void 0,engineModelId:void 0}:{};if(y.length>=Zt){const ze={groupChat:!0,groupAgents:y,groupTempAgents:be.length?be:void 0,...je};e?ne.patchSessionConfig(ze,e):ne.setNewChatCfg(Ve=>({...Ve,...ze}));return}const Le=y[0]||"",Te={groupChat:!1,groupAgents:void 0,groupTempAgents:void 0,...je};e?ne.selectSessionAgent(Le,e,Te):(ne.setNewChatCfg(ze=>({...ze,...Te})),ne.selectNewChatAgent(Le))},B=y=>{const F=I.getState();e?F.setSessionEngine(y,e):F.setNewChatCfg(ne=>({...ne,engineId:y||void 0,engineModelId:void 0,...y?{groupChat:!1,groupAgents:void 0,agentSlug:void 0}:{}}))},J=d.useRef(null),A=d.useRef(null);d.useEffect(()=>{const y=J.current;if(!y)return;J.current=null,A.current?.querySelector(`[data-pill-id="${CSS.escape(y)}"]`)?.focus()});const g=y=>{if(J.current=y.id,y.kind==="engine"){B(y.engineId===h?"":y.engineId);return}const F=f.includes(y.slug)?f.filter(ne=>ne!==y.slug):[...f,y.slug];$(F)},O=()=>{h?B(""):$([])},X=y=>{y.kind==="agent"?Ii("agent",y.slug):Ii("engine",y.engineId)},ee=y=>y.kind==="engine"?w===y.engineId?t.jsx(an,{size:16,className:"spin"}):t.jsx(Bi,{engineId:y.engineId,size:16}):t.jsx(nd,{name:y.name,url:r.agentAvatars[y.slug],siblings:C,imgClassName:"agent-pill-avatar",initialClassName:"agent-pill-initial"}),Y=(y,F)=>{const ne=y.kind==="agent"&&y.description?`${y.name} — ${y.description}`:y.name;return F?`${ne} · ${a("agentSelect.removeHint")}`:y.kind==="agent"&&y.slug===r.defaultAgentSlug?`${ne} · ${a("agentSelect.defaultTag")}`:ne},W=(y,F)=>{const ne=F!==null,we=y.kind==="engine"&&w===y.engineId;return t.jsxs("button",{type:"button","aria-pressed":ne,"data-pill-id":y.id,className:`engine-pill agent-pill${ne?" selected":""}`,"data-agent-slug":y.kind==="agent"?y.slug:void 0,"data-engine-id":y.kind==="engine"?y.engineId:void 0,title:Y(y,ne),disabled:!!w&&!we,onClick:()=>{(!w||we)&&g(y)},onContextMenu:be=>{be.preventDefault(),o({...El(be),items:[{label:a("agentSelect.direct"),icon:t.jsx(zo,{size:13}),run:()=>X(y)}]})},children:[ne&&z.length>=Zt&&t.jsx("span",{className:"agent-pill-index",children:F+1}),t.jsx("span",{className:"engine-pill-icon",children:ee(y)}),t.jsx("span",{className:"engine-pill-label",children:y.name}),y.kind==="agent"&&y.system&&t.jsx("span",{className:"agent-badge-system",children:a("agent.badge.system")})]},y.id)};if(n.preset==="chat"||!E.length)return null;const N=im(n,e?{}:el(u,Array.isArray(r.teams)?r.teams:[]).config,r.defaultAgentSlug),P=N.kind==="agent"&&N.slug?r.agentDefs.find(y=>y.slug===N.slug)?.name:void 0,H=_>=Zt?a("agentSelect.team",{n:_}):z.length===1?a("agentSelect.hintOne",{name:z[0].name}):N.kind==="team"?a("agentSelect.team",{n:N.count}):P?a("agentSelect.hintDefault",{name:P}):a("agentSelect.hintDefaultAnon"),Q=_<Zt&&z.length!==1&&N.kind!=="team",R=v[0]||"",Z=z[0]?ee(z[0]):t.jsx(Bi,{engineId:"",size:16});return t.jsxs("div",{ref:A,className:"engine-picker agent-picker agent-select-strip",role:"group","aria-label":a("agentSelect.title"),children:[t.jsx(sm,{label:a("chatPicker.agent"),value:R,icon:Z,options:[{value:"",name:a("agentSelect.default")},...E.map(y=>({value:y.id,name:y.name,description:v.includes(y.id)?a("agentSelect.picked"):y.kind==="agent"?y.description:void 0,disabled:!!w&&y.id!==Nn(w)}))],onChange:y=>{if(!y){O();return}const F=T.get(y);F&&g(F)},busy:!!w}),t.jsx(am,{label:a("agentSelect.title"),role:"group",children:[...z.map((y,F)=>W(y,F)),...z.length>0?[t.jsx("span",{className:"agent-select-sep","aria-hidden":"true"},"sep")]:[],...U.map(y=>W(y,null))]}),t.jsx("div",{className:`engine-picker-hint${_>=Zt?" agent-select-team":""}${Q?" is-default":""}`,children:H}),i&&t.jsx(Ml,{menu:i,onClose:()=>o(null)})]})}const cm=e=>`${e.name} ${e.path||""} ${e.project||""}`,lm=e=>[e.path,e.project].filter(n=>!!n&&n!==e.name).join(" · ")||void 0,Ih=({workspaces:e,value:n,onChange:a,onAddProject:i,onAddCloudProject:o})=>{const{t:r}=Ce(),[c,u]=d.useState(!1),[m,h]=d.useState(""),[f,v]=d.useState(!1),[w,E]=d.useState(""),T=d.useRef(null),C=d.useRef(null),z=on(c);d.useEffect(()=>{if(!c)return;const R=y=>{T.current&&!T.current.contains(y.target)&&(u(!1),h(""),v(!1),E(""))},Z=y=>{y.key==="Escape"&&(u(!1),h(""),v(!1),E(""),T.current?.querySelector(".project-pill")?.focus())};return window.addEventListener("mousedown",R),window.addEventListener("keydown",Z),()=>{window.removeEventListener("mousedown",R),window.removeEventListener("keydown",Z)}},[c]);const U=e.filter(R=>R.kind!=="channel"),_=U.find(R=>R.key===n||!!n&&R.sessionKeys?.includes(n))||U.find(R=>R.kind==="local"&&R.system)||U[0]||null,$=U.find(R=>R.kind==="rootless")||null,B=U.filter(R=>R.kind!=="rootless"),J=m.trim().toLowerCase(),A=B.filter(R=>!J||cm(R).toLowerCase().includes(J)),g=B.length>=6,O=_?.kind==="cloud"?nn:_?.kind==="rootless"?Wi:os,X=()=>{u(!1),h(""),v(!1),E("")},ee=R=>{a(R),X()},Y=R=>({id:`ws:${R.key}`,label:R.name,detail:lm(R),icon:R.kind==="cloud"?t.jsx(nn,{size:14}):t.jsx(os,{size:14}),checked:R.key===_?.key,run:()=>ee(R)}),W=$?{id:`ws:${$.key}`,label:r("input.project.dontWork"),icon:t.jsx(Wi,{size:14}),checked:$.key===_?.key,run:()=>ee($)}:null,N=o?{id:"add-cloud",label:r("input.project.addCloud"),icon:t.jsx(nn,{size:14}),run:()=>{{v(!0);return}}}:null,P=i?{id:"add-local",label:r("input.project.add"),icon:t.jsx(_o,{size:14}),run:()=>{i(),X()}}:null,H=()=>({title:r("input.project.label"),back:r("common.back"),...g?{search:{placeholder:r("input.project.search"),empty:r("input.project.noMatches")}}:{},sections:[{items:B.map(Y)},{items:W?[W]:[]},{items:[N,P].filter(R=>!!R)}]});d.useEffect(()=>{if(!c||tl())return;const R=requestAnimationFrame(()=>{(g?C.current?.querySelector(".project-menu-search input"):C.current?.querySelector(".project-menu-item.active"))?.focus()});return()=>cancelAnimationFrame(R)},[c,g]);const Q=R=>{if(!["ArrowDown","ArrowUp","Home","End"].includes(R.key))return;const Z=[...C.current?.querySelectorAll(".project-menu-item:not(:disabled)")||[]];if(!Z.length)return;R.preventDefault();const y=Z.indexOf(document.activeElement),F=R.key==="Home"?0:R.key==="End"?Z.length-1:y<0?R.key==="ArrowDown"?0:Z.length-1:R.key==="ArrowDown"?(y+1)%Z.length:(y-1+Z.length)%Z.length;Z[F]?.focus()};return t.jsxs("div",{className:`project-selector${c?" is-open":""}`,ref:T,children:[t.jsxs("button",{className:`composer-chip project-pill${c?" is-open":""}`,onClick:()=>{if(c){X();return}ka(H,{})||u(!0)},title:r("input.project.label"),"aria-haspopup":"menu","aria-expanded":c,children:[t.jsx(O,{size:13}),t.jsx("span",{className:"project-pill-name",children:_?.name||r("input.project.none")}),t.jsx(In,{size:12})]}),c&&t.jsxs("div",{ref:R=>{C.current=R,z.ref.current=R},className:"composer-menu project-menu",style:z.style,role:"menu","aria-label":r("input.project.label"),onKeyDown:Q,children:[g&&t.jsxs("label",{className:"project-menu-search",children:[t.jsx(jo,{size:13}),t.jsx("input",{value:m,onChange:R=>h(R.target.value),placeholder:r("input.project.search")})]}),t.jsxs("div",{className:"project-menu-list",children:[A.map(Y).map(R=>t.jsxs("button",{className:`menu-item project-menu-item${R.checked?" active":""}`,role:"menuitemradio","aria-checked":!!R.checked,onClick:R.run,children:[R.icon,t.jsx("span",{className:"grow project-menu-name",children:R.label}),t.jsx("span",{className:"project-menu-check",children:R.checked?t.jsx(gt,{size:13}):null})]},R.id)),!A.length&&t.jsx("div",{className:"project-menu-empty",children:r("input.project.noMatches")})]}),W&&t.jsx("div",{className:"project-menu-section project-menu-projectless-section",role:"group",children:t.jsxs("button",{className:`menu-item project-menu-item project-menu-projectless${W.checked?" active":""}`,role:"menuitemradio","aria-checked":W.checked,onClick:W.run,children:[W.icon,t.jsx("span",{className:"grow project-menu-name",children:W.label}),t.jsx("span",{className:"project-menu-check",children:W.checked?t.jsx(gt,{size:13}):null})]})}),(N||P)&&t.jsxs("div",{className:"project-menu-section project-menu-actions",role:"group",children:[o&&N&&(f?t.jsxs("label",{className:"project-menu-search project-menu-naming",children:[t.jsx(nn,{size:13}),t.jsx("input",{autoFocus:!0,value:w,onChange:R=>E(R.target.value),placeholder:r("input.project.cloudName"),onKeyDown:R=>{R.key==="Enter"&&w.trim()&&(o(w.trim()),X()),R.key==="Escape"&&(R.stopPropagation(),E(""),v(!1))}})]}):t.jsxs("button",{className:"menu-item project-menu-item project-menu-add",role:"menuitem",onClick:N.run,children:[N.icon,t.jsx("span",{className:"grow",children:N.label})]})),P&&t.jsxs("button",{className:"menu-item project-menu-item project-menu-add",role:"menuitem",onClick:P.run,children:[P.icon,t.jsx("span",{className:"grow",children:P.label})]})]})]})]})},ua=nl,lo=/^[0-9a-zA-Z-]{8,64}$/;function Qo(e){return e.kind==="unit"?`unit:${e.unitId.toLowerCase()}`:""}function um(e){if(typeof e=="string"){const a=/^unit:(.+)$/.exec(e);return a&&lo.test(a[1])?Object.freeze({kind:"unit",unitId:a[1].toLowerCase()}):ua}const n=e;return n&&typeof n=="object"&&n.kind==="unit"&&typeof n.unitId=="string"&&lo.test(n.unitId)?Object.freeze({kind:"unit",unitId:n.unitId.toLowerCase()}):ua}const dm=5*6e4,uo=new Set(["remoteOff","awaitingConfirm","denied","callerBlocked"]);function da(e){if(e==null)return null;const n=typeof e=="object"?e:{},a=typeof n.code=="string"?n.code:"",i=typeof n.status=="number"?n.status:NaN;switch(a){case"ENGINE_NOT_READY":return"starting";case"UNIT_OFFLINE":case"UNIT_DISCONNECTED":return"offline";case"UNIT_TIMEOUT":return"unreachable";case"REMOTE_SESSIONS_OFF":return"remoteOff";case"REMOTE_CALLER_UNCONFIRMED":return tu(n.reason)?"callerBlocked":n.state==="denied"?"denied":"awaitingConfirm";case"CALLER_UNAVAILABLE":case"CALLER_UNSUPPORTED":case"UNIT_CALLER_INVALID":case"UNIT_CALLER_EXPIRED":return"unreachable"}return a?i>=500?"unreachable":null:n.name==="TypeError"||n.name==="AbortError"||i===0||i>=500?"unreachable":null}const mo=e=>e.state||e.reason?{...e.state?{state:e.state}:{},...e.reason?{reason:e.reason}:{}}:void 0;function mm(e,n,a,i=Date.now()){if(!e.online)return{status:"offline"};if(e.capsLive&&e.caps){const o=e.caps.engine;if(o==="external")return{status:"noEngine"};if(o==="stopped")return{status:"engineStopped"};if(o==="starting")return{status:"starting"}}if(n&&!n.ok){const o=da(n)??"unreachable",r=uo.has(o)?mo(n):void 0;return r?{status:o,refusal:r}:{status:o}}if(a&&i-a.at>=0&&i-a.at<dm){const o=da({status:403,code:a.code,state:a.state,reason:a.reason});if(o&&uo.has(o)){const r=mo(a);return r?{status:o,refusal:r}:{status:o}}}return n?.ok?{status:"ready"}:{status:"checking"}}function hm(e){return!!(e.online&&e.capsLive&&e.caps?.engine==="ready")}const pm=1e4,fm=8e3,gm=50,vm={sessions:[],fetchedAt:null,loading:!1};async function ym(){if(typeof window.tangu?.unitSelf=="function")try{const e=await window.tangu.unitSelf();return{id:e?.unitId?e.unitId.toLowerCase():null,registered:!!e?.registered}}catch{}try{const e=await window.tangu?.unitHostStatus?.();if(e?.unitId)return{id:e.unitId.toLowerCase(),registered:null}}catch{}return{id:null,registered:null}}function km(e,n){return e.filter(a=>!!a&&typeof a.id=="string"&&va(a.id)&&(a.kind??"desktop")==="desktop"&&a.id.toLowerCase()!==n)}function xm(e){const n=e?.sessions;if(!Array.isArray(n))return[];const a=[];for(const i of n){if(!i||typeof i!="object")continue;const o=i;if(typeof o.id!="string"||!o.id||o.id.length>200||o.archived)continue;const{location:r,...c}=o;a.push({...c,title:typeof c.title=="string"?c.title:""})}return a}function vt(e){return{kind:"unit",unitId:e.toLowerCase()}}const le=us((e,n)=>({gen:0,units:null,byUnit:{},refreshedAt:0,selfRegistered:null,refreshRoster:async()=>{if(!al()||!window.tangu?.unitsList)return null;const a=n().gen;let i=null;try{const c=await window.tangu.unitsList();c?.status===200&&Array.isArray(c.json?.units)&&(i=c.json.units)}catch{}if(a!==n().gen)return null;if(!i)return n().units;const o=await ym(),r=km(i,o.id);if(a!==n().gen)return null;for(const c of r)il(vt(c.id),c.name);return e({units:r,selfRegistered:o.registered}),r},refresh:async(a={})=>{if(!Ot())return;const i=n().gen,o=await n().refreshRoster();if(!o||i!==n().gen||(await Promise.all(o.map(u=>wm(u,i,!!a.force,!!a.periodic))),i!==n().gen))return;const r=new Set(o.map(u=>u.id.toLowerCase())),c=Object.fromEntries(Object.entries(n().byUnit).filter(([u])=>r.has(u)));e({byUnit:c,refreshedAt:Date.now()}),jm()},reset:()=>{e(a=>({gen:a.gen+1,units:null,byUnit:{},refreshedAt:0,selfRegistered:null})),sl()}}));function rt(e,n){const a=e.toLowerCase();le.setState(i=>({byUnit:{...i.byUnit,[a]:{...i.byUnit[a]??vm,...n}}}))}async function wm(e,n,a,i=!1){const o=e.id.toLowerCase(),r=le.getState().byUnit[o];if(i&&bm(rn.getState().probes[o]))return;if(!e.online){rt(o,{sessions:[],loading:!1});return}if(le.getState().selfRegistered===!1){rt(o,{sessions:[],loading:!1});return}if(e.capsLive&&e.caps?.engine&&e.caps.engine!=="ready"){rt(o,{sessions:[],loading:!1});return}if(!a&&r?.fetchedAt&&Date.now()-r.fetchedAt<pm)return;const c=$n(vt(o));if(c){rt(o,{loading:!0});try{const u=await ol(c,`/agent/sessions?archived=false&limit=${gm}&app_id=${encodeURIComponent(xo)}`,{},{timeoutMs:fm});let m=null;try{m=await u.json()}catch{}if(n!==le.getState().gen)return;if(!u.ok){const v=m??{},w=$i({status:u.status,code:v.code,state:v.state,reason:v.reason});Ls(o,w),rt(o,{sessions:ho(o,w),fetchedAt:Date.now(),loading:!1});return}const h=vt(o),f=xm(m).filter(v=>Ln(v.id,h)?(console.warn(`[device-sessions] dropped session ${v.id} listed by ${o}: that id already belongs to another location`),!1):!0);Ls(o,{ok:!0}),rt(o,{sessions:f,fetchedAt:Date.now(),loading:!1})}catch(u){if(n!==le.getState().gen)return;const m=$i(u);Ls(o,m),rt(o,{sessions:ho(o,m),fetchedAt:Date.now(),loading:!1})}}}function bm(e){if(!e||e.ok)return!1;const n=rl(e.status,{code:e.code});return n==="caller-unavailable"||n==="gone"||n==="account-auth?"}function ho(e,n){return da(n)==="unreachable"?le.getState().byUnit[e]?.sessions??[]:[]}function jm(){const e=le.getState().byUnit,n=new Map;for(const[r,c]of Object.entries(e))for(const u of c.sessions)An(Mo(u.id),vt(r))&&n.set(u.id,u);if(!n.size)return;const a=I.getState();let i=!1;const o=a.sessions.map(r=>{const c=r.location?.kind==="unit"?n.get(r.id):void 0;return!c||c.title===r.title&&c.updated_at===r.updated_at&&c.summary===r.summary?r:(i=!0,{...r,title:c.title,updated_at:c.updated_at,summary:c.summary})});i&&I.setState({sessions:o})}function wa(e,n=Date.now()){const a=rn.getState(),i=e.id.toLowerCase(),o=mm(e,a.probes[i]??null,a.sticky[i]??null,n);return o.status==="checking"&&le.getState().selfRegistered===!1&&hm(e)?{status:"ready"}:o}function Zo(e){const n=e.toLowerCase();return le.getState().units?.find(a=>a.id.toLowerCase()===n)??null}function ma(e,n){if(!e?.id||!va(n.unitId))return!1;const a=vt(n.unitId);if(ll(e.id,a)==="conflict")return console.warn(`[device-sessions] refused to open ${e.id} on ${a.unitId}: that id already belongs to another location`),!1;const{location:i,...o}=e,r=ul(o);return I.setState(c=>({sessions:[r,...c.sessions.filter(u=>u.id!==e.id)],configBySession:c.configBySession[e.id]||!e.agent_config?c.configBySession:{...c.configBySession,[e.id]:e.agent_config}})),(is.getState().activeSpaceId==="home"||is.getState().activeSpaceId==="inbox")&&Eo("tangu"),Ao(e.id),!0}async function $h(e,n){if(!Ot()||!va(e)||!n)return!1;const a=vt(e);if(Ln(n,a))return!1;const i=I.getState();if((i.sessions.find(u=>u.id===n)??i.archivedSessions.find(u=>u.id===n))&&An(Mo(n),a))return(is.getState().activeSpaceId==="home"||is.getState().activeSpaceId==="inbox")&&Eo("tangu"),Ao(n),!0;const r=le.getState().byUnit[a.unitId]?.sessions.find(u=>u.id===n);if(r)return ma(r,a);const c=$n(a);if(!c)return!1;try{const u=await cl(c,n);return!u||u.id!==n?!1:ma(u,a)}catch{return!1}}async function Sm(e,n,a){const i=vt(e),o=$n(i);if(!o||Ln(n,i))return;const r=u=>u.id===n?{...u,title:a}:u,c=le.getState().byUnit[i.unitId];c&&rt(i.unitId,{sessions:c.sessions.map(r)}),I.setState(u=>({sessions:u.sessions.map(m=>m.location?.kind==="unit"?r(m):m)}));try{await ya(o,n,{title:a})}catch(u){I.getState().toast(I.getState().tr("app.renameFail",{e:u?.message||u}),!0)}}async function Nm(e,n,a){const i=vt(e),o=$n(i);if(!o||Ln(n,i))return!1;const r=dl(a);if(a!==null&&!r)return I.getState().toast(I.getState().tr("session.icon.invalid"),!0),!1;try{const c=await ya(o,n,{emoji:r}),u=h=>h.id===n?{...h,emoji:c.emoji}:h,m=le.getState().byUnit[i.unitId];return m&&rt(i.unitId,{sessions:m.sessions.map(u)}),I.setState(h=>({sessions:h.sessions.map(f=>f.location&&An(f.location,i)?u(f):f),archivedSessions:h.archivedSessions.map(f=>f.location&&An(f.location,i)?u(f):f)})),!0}catch(c){return I.getState().toast(I.getState().tr("session.icon.saveFail",{e:c?.message||c}),!0),!1}}async function Cm(e,n){const a=vt(e),i=$n(a);if(!i||Ln(n,a))return;try{await ya(i,n,{archived:!0})}catch(r){I.getState().toast(r?.message||String(r),!0);return}const o=le.getState().byUnit[a.unitId];o&&rt(a.unitId,{sessions:o.sessions.filter(r=>r.id!==n)}),I.setState(r=>({sessions:r.sessions.filter(c=>!(c.id===n&&c.location?.kind==="unit"))})),I.getState().activeId===n&&I.getState().setActiveId(null)}let po=I.getState().cfg?.token??"";I.subscribe(e=>{const n=e.cfg?.token??"";n!==po&&(po=n,le.getState().reset())});const Qe=us(()=>({draftSeq:0,explicitSeq:null,reconciledSeq:null,explicitPending:!1,chooser:null}));function Lh(e){return Qe.setState({chooser:e}),()=>{Qe.getState().chooser===e&&Qe.setState({chooser:null})}}const zm="forsion_run_location:";function er(){const e=Xr(pl(),I.getState().cfg?.token||"");return e?`${zm}${e}`:null}function Mm(){const e=er();if(!e)return null;try{const n=localStorage.getItem(e);return n===null?null:um(n)}catch{return null}}function tr(e){const n=er();if(n)try{localStorage.setItem(n,Qo(e))}catch{}}async function Ph(e,n){tr(e),Qe.setState({explicitPending:!0});try{await To(e,{name:n.name??null})}finally{Qe.setState(a=>({explicitSeq:a.draftSeq,explicitPending:!1}))}}let fo=!1,ha=!1;function nr(){if(!Ot())return!1;const e=Qe.getState();if(I.getState().activeId||e.explicitPending||e.explicitSeq===e.draftSeq||e.reconciledSeq===e.draftSeq)return!1;const n=hl();let a=Mm();fo||(fo=!0,a===null&&n.kind==="unit"&&(a=n,tr(n)));let i=ua,o=null;if(a?.kind==="unit"){if(le.getState().units===null)return!1;const r=Zo(a.unitId);if(r){const c=wa(r).status;if(c==="checking")return!1;c==="ready"&&(i=a,o=r.name)}}if(Qe.setState({reconciledSeq:e.draftSeq}),!An(i,n)){ha=!0;let r;try{r=To(i,{name:o})}finally{ha=!1}r.catch(()=>{})}return!0}ml(()=>{if(ha)return;const e=Qe.getState();Qe.setState({explicitSeq:I.getState().activeId?e.draftSeq+1:e.draftSeq})});const Em=1e4;let Ys=I.getState().activeId;I.subscribe(e=>{if(e.activeId===Ys)return;const n=Ys;if(Ys=e.activeId,n&&!e.activeId){Qe.setState(i=>({draftSeq:i.draftSeq+1}));const a=le.getState();Date.now()-a.refreshedAt<Em?nr():a.refresh().catch(()=>{})}});le.subscribe((e,n)=>{e.refreshedAt!==n.refreshedAt&&nr()});xe({"session.icon.set":{zh:"设置图标",en:"Set icon"},"session.icon.invalid":{zh:"请选择一个 Emoji 作为会话图标",en:"Choose one emoji for the session icon"},"session.icon.saveFail":{zh:"图标未能保存:{e}",en:"Could not save the icon: {e}"}});function ba({emoji:e,fallback:n,size:a=17}){return e?t.jsx("span",{"data-session-emoji":e,"aria-hidden":"true",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:a,height:a,flexShrink:0,fontSize:a,lineHeight:1},children:e}):t.jsx(t.Fragment,{children:n??t.jsx(zo,{size:a})})}function Dh({params:e,size:n}){const a=I(i=>{const o=e.followActive!==!1?i.activeId:e.sessionId;return i.sessions.find(r=>r.id===o)?.emoji??i.archivedSessions.find(r=>r.id===o)?.emoji});return t.jsx(ba,{emoji:a,size:n})}function sr({sessionId:e,current:n,x:a,y:i,onClose:o,onSave:r}){const c=d.useRef(!1),u=async m=>{if(!c.current){c.current=!0;try{await(r?r(m):I.getState().setSessionEmoji(e,m))&&o()}finally{c.current=!1}}};return fa.createPortal(t.jsx(nu,{x:a,y:i,current:n,onPick:m=>{u(m)},onClose:o}),document.body)}const ar=({open:e,children:n})=>{const a=Il();return t.jsx($l,{initial:!1,children:e&&t.jsx(Ll.div,{initial:{height:0,opacity:0},animate:{height:"auto",opacity:1},exit:{height:0,opacity:0},transition:{duration:a?0:.24,ease:[.2,.8,.3,1]},style:{overflow:"hidden"},children:n})})};function Am({path:e,fallback:n,className:a}){const i=I(u=>u.projectSettingsByPath[e]?.icon),o=I(u=>u.projectIconUrls[e]),r=I(u=>u.connState==="ok"),c=Jr(i);return d.useEffect(()=>{r&&I.getState().ensureProjectSettings(e)},[e,r]),d.useEffect(()=>{r&&c&&I.getState().loadProjectIcon(e)},[e,r,c]),c?o?t.jsx("img",{className:a,src:o,alt:"",draggable:!1}):t.jsx(t.Fragment,{children:n}):i?t.jsx("span",{className:a,"aria-hidden":"true",children:i}):t.jsx(t.Fragment,{children:n})}xe({"agentRemove.title":{zh:"删除 Agent「{name}」?",en:'Delete agent "{name}"?'},"agentRemove.msg":{zh:"会从 Agent 名册和侧栏移除,历史私聊保留(只读)。它的记忆与 Library 默认保留在 Tangu 数据目录的 agents/.removed/ 里。",en:"It is removed from the agent roster and the sidebar; past direct chats are kept (read-only). By default its memory and Library are kept in agents/.removed/ in the Tangu data folder."},"agentRemove.msgCloud":{zh:"会从 Agent 名册移除,历史会话保留(只读)。",en:"It is removed from the agent roster; past sessions are kept (read-only)."},"agentRemove.files":{zh:"同时删除相关文件:它的记忆、Library 等,移到废纸篓",en:"Also delete related files: its memory, Library and the rest, moved to the Trash"},"agentRemove.confirm":{zh:"删除",en:"Delete"},"agentRemove.done":{zh:"已删除 Agent「{name}」",en:'Agent "{name}" deleted'}});function ir({title:e,message:n,confirmLabel:a,filesLabel:i,onConfirm:o,onClose:r}){const[c,u]=d.useState(!1);return fa.createPortal(t.jsx("div",{className:"am-app tangu-lovable",style:{display:"contents"},"data-remove-dialog":!0,children:t.jsx(bo,{title:e,message:n,confirmLabel:a,onConfirm:()=>o(!!i&&c),onClose:r,children:i&&t.jsxs("label",{className:"dialog-check",children:[t.jsx("input",{type:"checkbox",checked:c,onChange:m=>u(m.target.checked)}),t.jsx("span",{children:i})]})})}),document.body)}function _h({agent:e,onDone:n,onClose:a}){const{t:i}=Ce(),o=!!e.libraryDir,r=e.name||e.slug;return t.jsx(ir,{title:i("agentRemove.title",{name:r}),message:i(o?"agentRemove.msg":"agentRemove.msgCloud"),confirmLabel:i("agentRemove.confirm"),filesLabel:o&&window.tangu?.trashHostPath?i("agentRemove.files"):void 0,onConfirm:c=>{const u=I.getState();u.removeAgent(e,c).then(()=>{u.toast(i("agentRemove.done",{name:r})),n?.()}).catch(m=>u.toast(String(m?.message||m),!0))},onClose:a})}const or="forsion_orbits_pinned_entries_v1",Rn=(e,n)=>Object.prototype.hasOwnProperty.call(e,n);function Yn(e,n){return Rn(e,n)}function rr(e,n){let a=0;for(const i of Object.values(e))Number.isFinite(i)&&(a=Math.max(a,i));return Math.max(n,a+1)}function Fh(e,n,a=Date.now()){if(Rn(e,n)){const i={...e};return delete i[n],i}return{...e,[n]:rr(e,a)}}function Oh(e,n,a=Date.now()){return Rn(e,n)?{...e,[n]:rr(e,a)}:e}function Wh(e=typeof localStorage>"u"?null:localStorage){if(!e)return{};try{const n=JSON.parse(e.getItem(or)||"{}");if(!n||typeof n!="object"||Array.isArray(n))return{};const a={};for(const[i,o]of Object.entries(n))i&&Number.isFinite(o)&&Number(o)>0&&(a[i]=Number(o));return a}catch{return{}}}function Uh(e,n=typeof localStorage>"u"?null:localStorage){try{n?.setItem(or,JSON.stringify(e))}catch{}}function go(e,n){return e.map((a,i)=>({entry:a,index:i})).sort((a,i)=>{const o=Rn(n,a.entry.key),r=Rn(n,i.entry.key);return o!==r?o?-1:1:o&&r?n[i.entry.key]-n[a.entry.key]||a.index-i.index:i.entry.at-a.entry.at||a.index-i.index}).map(({entry:a})=>a)}xe({"sidebar.attention":{zh:"{n} 项等你处理",en:"{n} waiting for you"},"sidebar.attentionLocalOnly":{zh:"{n} 项等你处理 · 含只能在那台电脑上批准的操作",en:"{n} waiting for you · includes actions that can only be approved on that computer"}});const cr=({n:e,localOnly:n})=>{const{t:a}=Ce();return t.jsx("span",{className:"t2s-dot attention","data-attention":e,title:a(n?"sidebar.attentionLocalOnly":"sidebar.attention",{n:e})})};xe({"chat.toNote.action":{zh:"整理成笔记",en:"Turn into note"},"chat.toNote.working":{zh:"正在把对话整理成笔记…",en:"Turning the chat into a note…"},"chat.toNote.empty":{zh:"这段对话还没有可整理的内容",en:"This chat has nothing to turn into a note yet"},"chat.toNote.done":{zh:"已整理成笔记「{name}」",en:"Saved as the note “{name}”"},"chat.toNote.failed":{zh:"没能整理成笔记:{reason}",en:"Couldn’t turn the chat into a note: {reason}"},"chat.toNote.workingTail":{zh:"对话较长,只整理最近的部分…",en:"This chat is long; only the most recent part will be turned into a note…"},"chat.toNote.emptyAnswer":{zh:"模型没有返回内容",en:"the model returned nothing"},"chat.toNote.nameTaken":{zh:"同名笔记太多(已试到 -20)",en:"too many notes with that name (tried up to -20)"}});const Tm=["The text in <selection> is a chat transcript between a user and an AI assistant.","Turn it into a standalone, well-organized note that someone can reread later without the chat.",'Start with exactly one "# " heading that names the topic.',"Keep the conclusions, decisions, facts, numbers, code and step-by-step instructions; drop greetings, filler, retries and back-and-forth.","Use headings, lists and tables where they help. Do not mention that it came from a chat.","Write in the language the user wrote in."].join(" "),pa=2e4;function lr(e){const n=[];for(const a of e){if(a.role!=="user"&&a.role!=="assistant")continue;const i=(a.role==="assistant"?vl(a.content).text:a.content).trim();i&&n.push(`${a.role==="user"?"User":"Assistant"}:
40
+ ${i}`)}return n.join(`
41
+
42
+ `)}function Rm(e){const n=lr(e);return n.length>pa?n.slice(-pa):n}function Im(e,n){const a=/^\s*#[ \t]+(.+?)[ \t]*#*[ \t]*(?:\r?\n|$)/.exec(e);return{title:(a?a[1]:n).replace(/[\\/:*?"<>|#^[\]]/g," ").replace(/\s+/g," ").trim().slice(0,80)||n,body:(a?e.slice(a[0].length):e).replace(/^\s*\n/,"")}}function $m(){return fl()&&!!Ro()?.complete}async function Lm(e,n){for(let a=1;a<=20;a++){const i=`${a===1?e:`${e}-${a}`}.md`;if(await Li.readTextFile?.(i)?.catch(()=>null)!=null)continue;const o=await Li.writeTextFile(i,n,{create:!0,base:Qr("")});if(!(o&&o.ok===!1))return i}return null}async function Pm(e){const n=Ro()?.complete;if(!n)return!1;const a=I.getState(),i=[...a.sessions,...a.archivedSessions].find(o=>o.id===e);try{a.messagesBySession[e]?.length||await a.loadSessionHistory(e);const o=I.getState().messagesBySession[e]||[],r=Rm(o);if(!r)return qn({text:Re("chat.toNote.empty"),level:"info",inAppOnly:!0}),!1;qn({text:Re(lr(o).length>pa?"chat.toNote.workingTail":"chat.toNote.working"),level:"info",inAppOnly:!0});const c=await n({action:"custom",instruction:Tm,selection:r,title:i?.title||void 0});if(!c.text.trim())throw new Error(Re("chat.toNote.emptyAnswer"));const{title:u,body:m}=Im(c.text,i?.title?.trim()||Re("amadeus.default.note")),h=await Lm(u,m.trimEnd()+`
43
+ `);if(!h)throw new Error(Re("chat.toNote.nameTaken"));return qn({text:Re("chat.toNote.done",{name:u}),level:"success",receipt:!0}),gl(h),!0}catch(o){return qn({text:Re("chat.toNote.failed",{reason:o instanceof Error?o.message:String(o)}),level:"error",inAppOnly:!0}),!1}}const vo={wechat:xl,telegram:kl,qq:tn};xe({"sidebar.openInNewTab":{zh:"在新标签页打开",en:"Open in new tab"},"sidebar.archiveN":{zh:"归档 {n} 项",en:"Archive {n}"},"sidebar.unarchiveN":{zh:"取消归档 {n} 项",en:"Unarchive {n}"},"sidebar.deleteN":{zh:"删除 {n} 项",en:"Delete {n}"},"sidebar.deleteConfirmN":{zh:"删除选中的 {n} 个会话?不可撤销。",en:"Delete {n} selected chats? This cannot be undone."},"sidebar.mode.chat":{zh:"Chat",en:"Chat"},"sidebar.mode.work":{zh:"Work",en:"Work"},"sidebar.mode.tip":{zh:"Chat:轻聊天,只列聊天会话;Work:完整工具面,列出全部项目",en:"Chat: light conversations, chat sessions only. Work: full toolset, all projects"},"sidebar.pin":{zh:"置顶",en:"Pin to top"},"sidebar.unpin":{zh:"取消置顶",en:"Unpin"},"sidebar.ws.details":{zh:"查看详情",en:"View details"},"sidebar.ws.removeTitle":{zh:"移除项目「{name}」?",en:'Remove project "{name}"?'},"sidebar.ws.removeMsg":{zh:"会从侧栏移除它,并删除其中的 {count} 个会话,不可撤销。磁盘上的项目文件夹不会删除。",en:"It is removed from the sidebar and its {count} session(s) are deleted. This cannot be undone. The project folder on disk is not deleted."},"sidebar.ws.removeFiles":{zh:"同时删除相关文件:项目里的 .tangu 文件夹(Tangu 的指令、技能、计划),移到废纸篓",en:"Also delete related files: the project's .tangu folder (Tangu instructions, skills and plans), moved to the Trash"},"sidebar.ws.removeAction":{zh:"移除",en:"Remove"}});const ur="forsion_tangu_collapsed_projects",dr="forsion_tangu_workspace_order";function Dm(){try{return new Set(JSON.parse(localStorage.getItem(ur)||"[]"))}catch{return new Set}}function yo(e){try{localStorage.setItem(ur,JSON.stringify([...e]))}catch{}}function _m(){try{const e=JSON.parse(localStorage.getItem(dr)||"[]");return Array.isArray(e)?e.filter(n=>typeof n=="string"):[]}catch{return[]}}function Fm(e){try{localStorage.setItem(dr,JSON.stringify(e))}catch{}}function cs(e){const n=String(e||"").trim();if(!n)return 0;const a=Date.parse(n.includes("T")?n:n.replace(" ","T"));return Number.isFinite(a)?a:0}const Om=({icon:e,title:n,active:a,onClick:i,onExpand:o,act:r})=>t.jsxs("button",{className:`t2s-special${a?" active":""}`,"data-act":r,onClick:i,children:[t.jsx("span",{className:"t2s-special-ic",children:e}),t.jsx("span",{className:"t2s-special-title",children:n}),o&&t.jsx("span",{className:"t2s-special-go",onClick:c=>{c.stopPropagation(),o()},children:t.jsx(Ft,{size:14})})]}),Bh=e=>{const{t:n}=Ce(),a=d.useRef(null),i=d.useRef(null);Pl(i,e.timeline?e.onSearch:void 0);const o=e.allSessions??e.sessions,r=e.allArchived??e.archivedSessions,c=Dl(a),[u,m]=d.useState(null),[h,f]=d.useState(null),[v,w]=d.useState(null),[E,T]=d.useState(""),[C,z]=d.useState(()=>{try{return Math.max(1,Number(localStorage.getItem("tangu_ws_session_limit"))||5)}catch{return 5}});d.useEffect(()=>{const p=()=>{try{z(Math.max(1,Number(localStorage.getItem("tangu_ws_session_limit"))||5))}catch{}};return window.addEventListener("tangu:wslimit",p),()=>window.removeEventListener("tangu:wslimit",p)},[]);const[U,_]=d.useState(!1),[$,B]=d.useState(Dm),[J,A]=d.useState(_m),[g,O]=d.useState(null),[X,ee]=d.useState(null),Y=d.useRef(null),W=d.useRef(!1),[N,P]=d.useState(null),[H,Q]=d.useState(null),[R,Z]=d.useState(null),[y,F]=d.useState(""),ne=d.useRef(null),we=Cu(p=>p.channels),be=d.useMemo(()=>{const p=new Map;for(const D of we)p.set(D.kind,D.runtime.some(x=>x.running));return p},[we]),je=d.useMemo(()=>{const p=new Map;for(const D of e.workspaces)p.set(D.key,[]);for(const D of e.sessions){const x=As(D,e.workspaces);p.has(x)||p.set(x,[]),p.get(x).push(D)}return p},[e.workspaces,e.sessions]),Le=d.useMemo(()=>{const p=new Map(e.workspaces.map(K=>[K.key,K])),D=[];for(const K of J){const se=p.get(K);se&&(D.push(se),p.delete(K))}const x=[...p.values()].sort((K,se)=>(K.kind==="channel"?-1:0)-(se.kind==="channel"?-1:0));return[...D,...x]},[e.workspaces,J]),Te=g?Le.findIndex(p=>p.key===g):-1,ze=d.useMemo(()=>{if(e.timeline)return go([...(e.extraRows||[]).map(x=>({key:`row:${x.key}`,at:x.at,node:x.node})),...e.sessions.map(x=>({key:`ses:${x.id}`,at:cs(x.updated_at),session:x}))],e.pinnedEntries||{});const p=Le.map(x=>({key:`ws:${x.key}`,ws:x,at:(je.get(x.key)||[]).reduce((K,se)=>Math.max(K,cs(se.updated_at)),0)}));if(e.orderBy!=="activity")return p;const D=(e.extraRows||[]).map(x=>({key:`row:${x.key}`,at:x.at,node:x.node}));return go([...D,...p],e.pinnedEntries||{})},[Le,je,e.orderBy,e.extraRows,e.pinnedEntries,e.timeline,e.sessions]),Ve=e.orderBy!=="activity",Ie=p=>{const D=g;if(O(null),ee(null),!D||D===p)return;const x=Le.map(ae=>ae.key),K=x.indexOf(p);if(K<0||!x.includes(D))return;const se=Nl(x,D,K);A(se),Fm(se)},Pe=p=>{B(D=>{const x=new Set(D);return x.has(p)?x.delete(p):x.add(p),yo(x),x})},Ke=p=>{B(D=>{if(!D.has(p))return D;const x=new Set(D);return x.delete(p),yo(x),x})},De=p=>{e.onEnterWorkspace?.(p),Ke(p)};d.useEffect(()=>{if(!W.current){W.current=!0;return}e.activeWorkspaceKey!=null&&Ke(e.activeWorkspaceKey)},[e.activeWorkspaceKey]),d.useEffect(()=>{v&&Y.current?.select()},[v]),d.useEffect(()=>{R&&ne.current?.select()},[R]),d.useEffect(()=>{if(!u&&!N)return;const p=()=>{m(null),P(null)};return window.addEventListener("click",p),window.addEventListener("contextmenu",p),()=>{window.removeEventListener("click",p),window.removeEventListener("contextmenu",p)}},[u,N]);const Ye=(p,D)=>{p.preventDefault(),p.stopPropagation(),P(null);const x=c.batch(D.id);x.length===1&&c.only(D.id),m({id:D.id,ids:x,x:p.clientX,y:p.clientY,archived:!!D.archived})},yt=(p,D)=>{p.preventDefault(),p.stopPropagation(),m(null),P({ws:D,x:p.clientX,y:p.clientY})},zt=()=>{v&&E.trim()&&e.onRename(v,E.trim()),w(null)},j=p=>{const D=[...o,...r].find(K=>K.id===p),x=()=>{T(D?.title||""),w(p)};{x();return}},V=p=>{const D=()=>{F(p.name),Z(p.key)};{D();return}},q=p=>{const D=[],x=p.ids.length===1,K=x?[...o,...r].find(ae=>ae.id===p.id):void 0;x&&D.push({id:"open-new-tab",label:n("sidebar.openInNewTab"),icon:t.jsx(ns,{size:13}),run:()=>{e.onSelect(p.id,{newTab:!0}),m(null)}}),x&&D.push({id:"set-icon",label:n("session.icon.set"),icon:t.jsx(Fo,{size:13}),run:()=>{f({id:p.id,current:K?.emoji??null,x:p.x,y:p.y}),m(null)}}),x&&D.push({id:"rename",label:n("sidebar.rename"),icon:t.jsx(Mn,{size:13}),run:()=>{m(null),j(p.id)}}),x&&$m()&&D.push({id:"to-note",label:n("chat.toNote.action"),icon:t.jsx(uu,{size:13}),run:()=>{Pm(p.id),m(null)}}),D.push({id:p.archived?"unarchive":"archive",label:p.ids.length>1?n(p.archived?"sidebar.unarchiveN":"sidebar.archiveN",{n:String(p.ids.length)}):p.archived?n("sidebar.unarchive"):n("sidebar.archive"),icon:p.archived?t.jsx(Oi,{size:13}):t.jsx(Qn,{size:13}),run:()=>{for(const ae of p.ids)e.onArchive(ae,!p.archived);c.clear(),m(null)}});const se=K?.project_path?e.workspaces.find(ae=>ae.kind==="channel"&&ae.key===K.project_path):null;if(K&&se?.channel){const ae=vo[se.channel];D.push({id:"channel-connect",label:n("sidebar.channel.setAsConnected"),icon:t.jsx(ae,{size:13}),run:()=>{m(null),wl(ft(),se.channel,p.id).then(()=>e.onToast?.(n("sidebar.wechat.setConnectedOk"))).catch($e=>e.onToast?.(n("sidebar.wechat.setConnectedFail",{e:$e?.message||$e}),!0))}})}return p.ids.every(ae=>e.archivedSessions.some($e=>$e.id===ae))&&D.push({id:"delete",danger:!0,icon:t.jsx(Xn,{size:13}),label:p.ids.length>1?n("sidebar.deleteN",{n:String(p.ids.length)}):n("sidebar.delete"),run:()=>{const ae=p.ids;if(m(null),!!(ae.length>1?window.confirm(n("sidebar.deleteConfirmN",{n:String(ae.length)})):window.confirm(n("sidebar.deleteConfirm",{name:pt(K?.title,n)})))){for(const nt of ae)e.onDelete(nt);c.clear()}}}),D},re=p=>{const D=[];if(e.onTogglePinned){const x=`ws:${p.ws.key}`,K=Yn(e.pinnedEntries||{},x);D.push({id:K?"unpin":"pin",label:n(K?"sidebar.unpin":"sidebar.pin"),icon:K?t.jsx(Ui,{size:13}):t.jsx(Hn,{size:13}),run:()=>{P(null),e.onTogglePinned?.(x)}})}return e.onShowWorkspaceDetails&&Ps(p.ws)&&[...o,...r].some(x=>x.project_path===p.ws.path&&!x.projectless)&&D.push({id:"ws-details",act:"ws-details",label:n("sidebar.ws.details"),icon:t.jsx(su,{size:13}),run:()=>{const x=p.ws;P(null),e.onShowWorkspaceDetails?.(x)}}),p.ws.system||(D.push({id:"ws-rename",label:n("sidebar.ws.rename"),icon:t.jsx(Mn,{size:13}),run:()=>{const x=p.ws;P(null),V(x)}}),D.push({id:"ws-remove",act:"ws-remove",danger:!0,label:n("sidebar.ws.remove"),icon:t.jsx(Xn,{size:13}),run:()=>{Q(p.ws),P(null)}})),D},Me=p=>{if(p.ids.length!==1)return;const D=[...o,...r].find(x=>x.id===p.id);return pt(D?.title,n)},Ze=Js(u,()=>u&&{title:Me(u),sections:[{items:q(u)}]},()=>m(null)),et=Js(N,()=>N&&{title:jn(N.ws,n),sections:[{items:re(N)}]},()=>P(null)),Wt=()=>{if(R&&y.trim()){const p=e.workspaces.find(D=>D.key===R);p&&e.onRenameWorkspace(p,y.trim())}Z(null)},We=(p,D)=>{const x=p.kind==="channel"?vo[p.channel||"wechat"]:p.kind==="cloud"?nn:p.kind==="rootless"?tn:D?os:Sl;return t.jsxs("span",{className:"t2s-lead",children:[Ps(p)?t.jsx(Am,{path:p.path,className:"amx-page-emoji t2s-project-icon",fallback:t.jsx(x,{className:"t2s-lead-icon"})}):t.jsx(x,{className:"t2s-lead-icon"}),t.jsx("span",{className:`t2s-chev t2s-lead-chev${D?"":" open"}`,onClick:K=>{K.stopPropagation(),Pe(p.key)},children:t.jsx(Ft,{size:12})})]})},Ue=p=>{const D=[];if(!p.archived&&e.onTogglePinned){const K=Yn(e.pinnedEntries||{},`ses:${p.id}`);D.push({id:K?"unpin":"pin",label:n(K?"sidebar.unpin":"sidebar.pin"),icon:K?t.jsx(Ui,{}):t.jsx(Hn,{}),run:()=>e.onTogglePinned?.(`ses:${p.id}`)})}p.archived||D.push({id:"rename",label:n("sidebar.rename"),icon:t.jsx(Mn,{}),run:()=>j(p.id)}),D.push({id:p.archived?"unarchive":"archive",label:n(p.archived?"sidebar.unarchive":"sidebar.archive"),icon:p.archived?t.jsx(Oi,{}):t.jsx(Qn,{}),tone:"accent",run:()=>e.onArchive(p.id,!p.archived)});const x=p.archived?q({id:p.id,ids:[p.id],x:0,y:0,archived:!0}).find(K=>K.id==="delete"):void 0;return x&&D.push({id:"delete",label:n("sidebar.delete"),icon:t.jsx(Xn,{}),tone:"danger",run:()=>x.run?.()}),D},Ge=p=>{const D=As(p,e.workspaces),x=e.workspaces.find(K=>K.key===D);return x&&x.kind!=="rootless"&&!x.system?jn(x,n):""},_e=p=>{const D=t.jsx(Do,{as:"button",className:`${p.id===e.activeId?"active":""}${c.has(p.id)?" sel":""}`.trim()||void 0,selId:p.id,title:p.summary||p.title||void 0,depth:e.flat?0:1,style:e.timeline?{paddingLeft:void 0}:void 0,lead:t.jsxs(t.Fragment,{children:[t.jsx(ba,{emoji:p.emoji,fallback:e.rowIcon?.(p)??t.jsx(ls,{className:"t2s-lead-icon t2s-dim"})}),e.attentionIds?.get(p.id)?t.jsx(cr,{n:e.attentionIds.get(p.id).n,localOnly:e.attentionIds.get(p.id).localOnly}):e.runningIds.has(p.id)?t.jsx("span",{className:"t2s-dot running",title:n("sidebar.running")}):e.unreadIds.has(p.id)?t.jsx("span",{className:"t2s-dot unread",title:n("sidebar.unread")}):null]}),trailing:t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"t2s-srow-time",children:jl(p.updated_at)}),t.jsx("span",{className:"t2s-srow-menu",onClick:x=>Ye(x,p),children:t.jsx(as,{size:14})})]}),onClick:x=>{const K=c.click(p.id,x);if(K.open==="none")return;e.onSelect(p.id,K.open==="new"?{newTab:!0}:void 0);const se=e.sessionWorkspaceKeyOf?e.sessionWorkspaceKeyOf(p):As(p,e.workspaces);se&&(e.onActivateEntry?.(`ws:${se}`),De(se))},onContextMenu:x=>Ye(x,p),draggable:!e.timeline&&v!==p.id,onDragStart:x=>{const K=x.currentTarget.getBoundingClientRect();x.dataTransfer.setDragImage(x.currentTarget,x.clientX-K.left,x.clientY-K.top),x.dataTransfer.effectAllowed="copy";const se=[...o,...r],ae=c.batch(p.id).map($e=>{const nt=se.find(Mt=>Mt.id===$e);return{kind:"session",id:$e,title:pt(nt?.title,n)}});bl(x.dataTransfer,ae)},children:v===p.id?t.jsx("input",{ref:Y,className:"t2s-rename",value:E,onChange:x=>T(x.target.value),onBlur:zt,onKeyDown:x=>{x.key==="Enter"&&zt(),x.key==="Escape"&&w(null)},onClick:x=>x.stopPropagation()}):e.timeline?t.jsxs("span",{className:"t2s-srow-text",children:[t.jsx("span",{className:"t2s-srow-title",children:pt(p.title,n)}),(Ge(p)||p.summary)&&t.jsxs("span",{className:"t2s-srow-sub",children:[Ge(p)&&t.jsx("span",{className:"t2s-srow-tag",children:Ge(p)}),Ge(p)&&p.summary?" · ":"",p.summary]})]}):t.jsx("span",{className:"t2s-srow-title",children:pt(p.title,n)})},p.id);return e.timeline?t.jsx(Hl,{actions:Ue(p),children:D},p.id):D},fe=yl(),tt=(window.tangu?.pickDirectory&&!e.flat||e.archivedSessions.length>0)&&t.jsxs("div",{className:"t2s-foot",children:[window.tangu?.pickDirectory&&!e.flat&&t.jsxs("button",{className:"t2s-add-ws",onClick:e.onAddWorkspace,children:[t.jsx(_o,{size:14})," ",n("sidebar.addLocalWorkspace")]}),e.archivedSessions.length>0&&t.jsxs(t.Fragment,{children:[t.jsxs("button",{className:"t2s-srow t2s-archived-toggle",onClick:()=>_(!U),children:[t.jsx("span",{className:"t2s-chev",children:t.jsx(Qn,{size:13})}),t.jsx("span",{className:"t2s-srow-title t2s-faint",children:n("sidebar.archived")}),t.jsx("span",{className:"t2s-count",children:e.archivedSessions.length})]}),U&&e.archivedSessions.map(_e)]})]});return t.jsxs("aside",{className:"t2s-side",ref:a,"data-timeline":e.timeline?"":void 0,children:[t.jsxs("div",{className:"t2s-scroll",ref:i,"data-under-dock":fe?"":void 0,onTouchStart:e.timeline?_l:void 0,onDragOver:p=>{g&&(p.preventDefault(),p.dataTransfer.dropEffect="move")},onDrop:p=>{g&&X&&(p.preventDefault(),Ie(X))},children:[e.showSpecial&&t.jsx("div",{className:"t2s-special-group",children:t.jsxs("div",{className:"t2s-special-row",children:[t.jsx(Om,{icon:t.jsx(Fl,{}),title:n("sidebar.newChat"),active:!1,onClick:e.onNewChat,act:"new-chat"}),e.mode&&e.onModeChange&&t.jsxs("div",{className:"t2s-vaultseg t2s-mode",role:"tablist","aria-label":n("sidebar.mode.tip"),title:n("sidebar.mode.tip"),children:[t.jsx("div",{className:"t2s-vaultseg-thumb","data-side":e.mode}),["chat","work"].map(p=>t.jsx("button",{type:"button",role:"tab","aria-selected":e.mode===p,"data-mode":p,className:e.mode===p?"on":void 0,onClick:()=>e.onModeChange(p),children:n(p==="chat"?"sidebar.mode.chat":"sidebar.mode.work")},p))]})]})}),e.timeline&&e.onSearch&&t.jsx(Ol,{}),e.timeline&&e.timelineHead,e.timeline&&Wl(ze,p=>Yn(e.pinnedEntries||{},p.key)?"pinned":Ul(p.at)).map(p=>"section"in p?t.jsx(Bl,{bucket:p.section},`sec:${p.section}`):p.item.session?_e(p.item.session):t.jsx(sn.Fragment,{children:p.item.node},p.item.key)),!e.timeline&&ze.map((p,D)=>{if(p.node)return t.jsx(sn.Fragment,{children:p.node},p.key);const x=p.ws,K=Yn(e.pinnedEntries||{},p.key),se=je.get(x.key)||[];if(e.flat)return t.jsx("div",{className:"t2s-group-sessions t2s-flat",children:se.map(_e)},x.key);const ae=$.has(x.key),$e={onDragOver:ce=>{if(!g)return;ce.preventDefault(),ce.dataTransfer.dropEffect="move";const kt=g===x.key?null:x.key;X!==kt&&ee(kt)},onDrop:ce=>{g&&(ce.preventDefault(),ce.stopPropagation(),Ie(x.key))}},nt=!!g&&X===x.key&&g!==x.key,Mt=nt&&Te>=0&&Te<D,lt=Mt?ae?" drag-over below":"":nt?" drag-over":"";return t.jsxs(sn.Fragment,{children:[t.jsxs("div",{className:`t2s-group${lt}${g===x.key?" dragging":""}`,"data-workspace-key":x.key,"data-pinned":K?"true":void 0,"data-active":e.activeWorkspaceKey===x.key?"true":void 0,style:{paddingLeft:Po(0)},...Lo(()=>[x.path||"",ql("tip.sessions",{count:se.length})].filter(Boolean)),draggable:Ve&&R!==x.key,onContextMenu:ce=>yt(ce,x),onDragStart:ce=>{const kt=ce.currentTarget.getBoundingClientRect();ce.dataTransfer.setDragImage(ce.currentTarget,ce.clientX-kt.left,ce.clientY-kt.top),ce.dataTransfer.effectAllowed="move",O(x.key)},...$e,onDragEnd:()=>{O(null),ee(null)},children:[R===x.key?t.jsxs("div",{className:"t2s-group-toggle t2s-folder-row",style:{cursor:"default"},children:[We(x,ae),t.jsx("input",{ref:ne,className:"t2s-rename",value:y,onChange:ce=>F(ce.target.value),onBlur:Wt,onKeyDown:ce=>{ce.key==="Enter"&&Wt(),ce.key==="Escape"&&Z(null)},onClick:ce=>ce.stopPropagation()})]}):x.kind==="channel"?t.jsxs("button",{className:"t2s-group-toggle t2s-folder-row",onClick:()=>{e.onActivateEntry?.(p.key),ae?De(x.key):Pe(x.key)},children:[We(x,ae),t.jsx("span",{className:"t2s-group-label",children:jn(x,n)}),K&&t.jsx(Hn,{className:"t2o-pin-mark","aria-hidden":"true"}),t.jsx("span",{className:`t2s-mini-dot${be.get(x.channel||"wechat")?" ok":""}`})]}):t.jsxs("button",{className:"t2s-group-toggle t2s-folder-row",onClick:()=>{e.onActivateEntry?.(p.key),ae?De(x.key):Pe(x.key)},children:[We(x,ae),t.jsx("span",{className:"t2s-group-label",children:jn(x,n)}),K&&t.jsx(Hn,{className:"t2o-pin-mark","aria-hidden":"true"})]}),(!x.system||e.onTogglePinned||e.onShowWorkspaceDetails&&Ps(x))&&t.jsx("button",{type:"button",className:"t2s-group-add",title:n("sidebar.ws.menu"),onClick:ce=>yt(ce,x),children:t.jsx(as,{size:14})}),t.jsx("button",{type:"button",className:"t2s-group-add",title:n("sidebar.newChatIn",{name:jn(x,n)}),onClick:()=>e.onNewInWorkspace(x),children:t.jsx(ns,{size:14})})]}),t.jsx(ar,{open:!ae,children:t.jsxs("div",{className:`t2s-group-sessions${Mt&&!ae?" drag-over-end":""}`,...$e,children:[se.slice(0,C).map(_e),se.length>C&&t.jsxs("button",{className:"t2s-viewmore",onClick:()=>e.onOpenWorkspace(x.key),children:[n("sidebar.viewMore")," · ",se.length-C]})]})})]},x.key)}),e.deviceSections,fe&&tt]}),!fe&&tt,u&&Ze&&t.jsx(Xs,{className:"ctx-menu",x:u.x,y:u.y,onClick:p=>p.stopPropagation(),children:t.jsx(Qs,{items:q(u)})}),h&&t.jsx(sr,{sessionId:h.id,current:h.current,x:h.x,y:h.y,onClose:()=>f(null)}),N&&et&&t.jsx(Xs,{className:"ctx-menu",x:N.x,y:N.y,onClick:p=>p.stopPropagation(),children:t.jsx(Qs,{items:re(N)})}),H&&t.jsx(ir,{title:n("sidebar.ws.removeTitle",{name:H.name}),message:n("sidebar.ws.removeMsg",{count:[...o,...r].filter(p=>p.project_path===H.key).length}),confirmLabel:n("sidebar.ws.removeAction"),filesLabel:H.kind==="local"&&window.tangu?.trashHostPath?n("sidebar.ws.removeFiles"):void 0,onConfirm:p=>e.onRemoveWorkspace(H,{deleteFiles:p}),onClose:()=>Q(null)})]})};xe({"devstatus.checking":{zh:"正在连接…",en:"Connecting…"},"devstatus.ready":{zh:"在线",en:"Online"},"devstatus.starting":{zh:"引擎正在启动",en:"Engine is starting"},"devstatus.engineStopped":{zh:"引擎没有运行",en:"Engine isn't running"},"devstatus.noEngine":{zh:"没有 Agent 引擎",en:"No agent engine"},"devstatus.offline":{zh:"离线",en:"Offline"},"devstatus.unreachable":{zh:"暂时连不上",en:"Can't reach it"},"devstatus.remoteOff":{zh:"未开启远程会话",en:"Remote sessions off"},"devstatus.awaitingConfirm":{zh:"等待那台电脑允许",en:"Waiting for approval there"},"devstatus.denied":{zh:"拒绝了这台手机",en:"Declined this phone"},"devstatus.callerBlocked":{zh:"不允许这台手机运行",en:"Doesn't allow this phone"},"devstatus.long.checking":{zh:"正在连接这台电脑…",en:"Connecting to this computer…"},"devstatus.long.ready":{zh:"在线,可以在上面运行会话",en:"Online. Sessions can run here"},"devstatus.long.starting":{zh:"这台电脑在线,Agent 引擎正在启动",en:"This computer is online and its agent engine is starting"},"devstatus.long.engineStopped":{zh:"Forsion 已打开,但 Agent 引擎没有运行",en:"Forsion is open, but its agent engine isn't running"},"devstatus.long.noEngine":{zh:"这台设备上的 Forsion 没有 Agent 引擎",en:"Forsion on this device has no agent engine"},"devstatus.long.offline":{zh:"离线,重新上线后这里会显示它的会话",en:"Offline. Its sessions show up here when it's back"},"devstatus.long.unreachable":{zh:"暂时连不上,稍后重试",en:"Can't reach it right now. Try again shortly"},"devstatus.long.remoteOff":{zh:"这台电脑没有开启「允许远程会话」",en:"Remote sessions are turned off on this computer"},"devstatus.long.awaitingConfirm":{zh:"请在那台电脑上允许这台手机",en:"Allow this phone on that computer to continue"},"devstatus.long.denied":{zh:"那台电脑拒绝了这台手机",en:"That computer declined this phone"},"devstatus.long.callerBlocked":{zh:"那台电脑不允许这台手机运行会话,请在它的「设置 › 远程会话」中调整",en:"That computer doesn't let this phone run sessions. Change it in Settings › Remote sessions there"},"sidebar.device.label":{zh:"{name} 上的会话",en:"Sessions on {name}"},"sidebar.device.empty":{zh:"还没有会话",en:"No sessions yet"},"sidebar.device.pickFirst":{zh:"在「在哪运行」里选过这台电脑后,这里会显示它的会话",en:"Pick this computer under Run on to see its sessions here"},"sidebar.device.menu":{zh:"更多操作",en:"More actions"}});function En(e,n){const a=typeof e=="string"?e.trim():"";return a.length>n?`${a.slice(0,n-1)}…`:a}const mr="forsion_device_sections_collapsed";function Wm(){try{const e=JSON.parse(localStorage.getItem(mr)||"[]");return new Set(Array.isArray(e)?e.filter(n=>typeof n=="string").slice(0,200):[])}catch{return new Set}}function Um(e){try{localStorage.setItem(mr,JSON.stringify([...e]))}catch{}}function Bm({u:e}){return e.icon?t.jsx("span",{className:"t2d-emoji","aria-hidden":!0,children:En(e.icon,4)}):e.platform==="win32"||e.platform==="linux"?t.jsx(Io,{className:"t2s-lead-icon"}):t.jsx($o,{className:"t2s-lead-icon"})}function qh(e,n){const a=e?.get(n);return a?t.jsx(cr,{n:a.n,localOnly:a.localOnly}):null}function hr(){const e=I(n=>n.connState);d.useEffect(()=>{if(!Ot())return;const n=()=>{le.getState().refresh()},a=()=>{le.getState().refresh({periodic:!0})};n();let i=null;const o=()=>{i&&(clearInterval(i),i=null),(typeof document>"u"||document.visibilityState==="visible")&&(i=setInterval(a,3e4))},r=()=>{document.visibilityState==="visible"&&n(),o()};return o(),document.addEventListener("visibilitychange",r),()=>{document.removeEventListener("visibilitychange",r),i&&clearInterval(i)}},[]),d.useEffect(()=>{e==="ok"&&Ot()&&le.getState().refresh()},[e])}function Hh(e){const{t:n}=Ce();hr();const a=le(A=>A.units),i=le(A=>A.byUnit);rn(A=>A.probes),rn(A=>A.sticky);const o=I(A=>A.sessions),r=le(A=>A.selfRegistered),[c,u]=d.useState(Wm),[m,h]=d.useState(null),[f,v]=d.useState(null),[w,E]=d.useState(null),[T,C]=d.useState(""),z=d.useRef(null);d.useEffect(()=>{w&&z.current?.select()},[w]),d.useEffect(()=>{if(!m)return;const A=()=>h(null),g=O=>{O.key==="Escape"&&h(null)};return window.addEventListener("click",A),window.addEventListener("contextmenu",A),window.addEventListener("keydown",g),()=>{window.removeEventListener("click",A),window.removeEventListener("contextmenu",A),window.removeEventListener("keydown",g)}},[m]);const U=d.useMemo(()=>{const A={};for(const g of a||[]){const O=g.id.toLowerCase();if(!g.online){A[O]=[];continue}const X=i[O]?.sessions??[],ee=new Set(X.map(N=>N.id)),W=[...o.filter(N=>N.location?.kind==="unit"&&N.location.unitId===O&&!ee.has(N.id)&&!N.archived),...X].sort((N,P)=>cs(P.updated_at)-cs(N.updated_at));A[O]=e.filter?e.filter(W):W}return A},[a,i,o,e.filter]),_=A=>{const g=U[A.unitId]?.find(O=>O.id===A.id);return[{id:"set-icon",label:n("session.icon.set"),icon:t.jsx(Fo,{size:13}),run:()=>{v({...A,current:g?.emoji??null}),h(null)}},{id:"rename",label:n("sidebar.rename"),icon:t.jsx(Mn,{size:13}),run:()=>{h(null);const O=()=>{C(g?.title||""),E({unitId:A.unitId,id:A.id})};{O();return}}},{id:"archive",label:n("sidebar.archive"),icon:t.jsx(Qn,{size:13}),run:()=>{h(null),Cm(A.unitId,A.id)}}]},$=Js(m,()=>m&&{title:pt(En(U[m.unitId]?.find(A=>A.id===m.id)?.title,200),n),sections:[{items:_(m)}]},()=>h(null));if(!Ot()||!a?.length)return null;const B=A=>{u(g=>{const O=new Set(g);return O.has(A)?O.delete(A):O.add(A),Um(O),O})},J=()=>{w&&T.trim()&&Sm(w.unitId,w.id,T.trim()),E(null)};return t.jsxs("div",{className:"t2d-sections","data-device-sections":!0,children:[a.map(A=>{const g=A.id.toLowerCase(),O=wa(A).status,X=U[g]??[],ee=c.has(g),Y=En(A.name,60)||n("engine.target.defaultName");return t.jsxs("div",{className:"t2d-section","data-device-section":g,"data-device-status":O,children:[t.jsx("div",{className:"t2s-group t2d-head",style:{paddingLeft:Po(0)},title:n(`devstatus.long.${O}`),children:t.jsxs("button",{type:"button",className:"t2s-group-toggle t2s-folder-row t2d-toggle","aria-expanded":!ee,"aria-label":n("sidebar.device.label",{name:Y}),onClick:()=>B(g),children:[t.jsxs("span",{className:"t2s-lead",children:[t.jsx(Bm,{u:A}),t.jsx("span",{className:`t2s-chev t2s-lead-chev${ee?"":" open"}`,children:t.jsx(Ft,{size:12})})]}),t.jsx("span",{className:"t2s-group-label t2d-name",children:Y}),t.jsx("span",{className:"t2d-status","data-tone":O==="ready"?"ok":O==="checking"?"wait":"warn",role:"status",children:n(`devstatus.${O}`)})]})}),t.jsx(ar,{open:!ee,children:t.jsxs("div",{className:"t2s-group-sessions",children:[X.map(W=>t.jsx(Do,{as:w?.id===W.id?"div":"button",className:W.id===e.activeId?"active":void 0,depth:1,title:W.summary||W.title||void 0,lead:t.jsxs(t.Fragment,{children:[t.jsx(ba,{emoji:W.emoji,fallback:t.jsx(ls,{className:"t2s-lead-icon t2s-dim"})}),e.rowBadge?.(W)??(e.runningIds.has(W.id)?t.jsx("span",{className:"t2s-dot running"}):e.unreadIds.has(W.id)?t.jsx("span",{className:"t2s-dot unread"}):null)]}),trailing:w?.id===W.id?void 0:t.jsx("span",{className:"t2s-srow-menu",role:"button","aria-label":n("sidebar.device.menu"),onClick:N=>{N.stopPropagation(),h({unitId:g,id:W.id,x:N.clientX,y:N.clientY})},children:t.jsx(as,{size:14})}),onClick:()=>{w?.id!==W.id&&ma(W,{unitId:g})},onContextMenu:N=>{N.preventDefault(),N.stopPropagation(),h({unitId:g,id:W.id,x:N.clientX,y:N.clientY})},children:w?.id===W.id?t.jsx("input",{ref:z,className:"t2s-rename",value:T,onChange:N=>C(N.target.value),onBlur:J,onKeyDown:N=>{N.key==="Enter"&&J(),N.key==="Escape"&&E(null)},onClick:N=>N.stopPropagation()}):t.jsx("span",{className:"t2s-srow-title","data-remote-session":W.id,children:pt(En(W.title,200),n)})},W.id)),O==="ready"&&!X.length&&t.jsx("div",{className:"t2d-empty",children:n(r===!1?"sidebar.device.pickFirst":"sidebar.device.empty")})]})})]},g)}),m&&$&&t.jsx(Xs,{className:"ctx-menu",x:m.x,y:m.y,onClick:A=>A.stopPropagation(),children:t.jsx(Qs,{items:_(m)})}),f&&t.jsx(sr,{sessionId:f.id,current:f.current,x:f.x,y:f.y,onSave:A=>Nm(f.unitId,f.id,A),onClose:()=>v(null)})]})}xe({"runloc.label":{zh:"运行位置",en:"Run on"},"runloc.cloud":{zh:"云端",en:"Cloud"},"runloc.thisDevice":{zh:"这台电脑",en:"This computer"},"runloc.pillTitle":{zh:"新会话在哪运行:{where}",en:"New sessions run on: {where}"}});function qm(){const e=le(n=>n.units);return Ot()&&!!e?.length}function Vh(){const{t:e}=Ce();hr();const n=qm(),a=Pi(m=>m.ref);Pi(m=>m.name),le(m=>m.units),rn(m=>m.probes),rn(m=>m.sticky);const i=Qe(m=>m.chooser);if(!n)return null;const o=a.kind==="unit"?Zo(a.unitId):null,r=o?wa(o).status:null,c=a.kind==="unit"?En(Cl(a)||o?.name,60)||e("engine.target.defaultName"):e("runloc.cloud"),u=a.kind==="home"?nn:o?.platform==="win32"||o?.platform==="linux"?Io:$o;return t.jsx("div",{className:"project-selector runloc","data-run-location-picker":!0,"data-run-location":Qo(a)||"home","data-device-status":r??void 0,children:t.jsxs("button",{type:"button",className:"composer-chip project-pill runloc-pill",title:e("runloc.pillTitle",{where:c}),"aria-label":e("runloc.pillTitle",{where:c}),"aria-haspopup":"dialog",disabled:!i,onClick:()=>i?.(),children:[t.jsx(u,{size:13}),t.jsx("span",{className:"project-pill-name",children:c}),r&&r!=="ready"&&t.jsx("span",{className:"runloc-status","data-tone":r==="checking"?"wait":"warn",children:e(`devstatus.${r}`)}),i&&t.jsx(In,{size:12})]})})}export{Oh as $,nd as A,wh as B,Th as C,jn as D,Bi as E,Qn as F,Oi as G,pt as H,sr as I,ba as J,td as K,_h as L,Dh as M,uu as N,Hh as O,Am as P,yu as Q,Uu as R,Bh as S,qh as T,Wh as U,cs as V,Yn as W,Oo as X,Ui as Y,Uh as Z,Fh as _,ph as a,Qi as a0,mh as a1,dh as a2,Pd as a3,$h as a4,Rh as a5,Vh as a6,Ih as a7,ar as a8,md as a9,zh as aa,Ah as ab,jd as ac,xu as ad,Nh as ae,hd as af,Ch as ag,Je as ah,qm as ai,Mh as aj,$d as ak,Eh as al,$u as b,Lu as c,mm as d,Pu as e,gh as f,hh as g,vh as h,Lh as i,yh as j,Sh as k,Qu as l,bh as m,Vu as n,Hu as o,Ko as p,fh as q,jh as r,Ph as s,qu as t,Cu as u,kh as v,Mu as w,Vo as x,Ju as y,xh as z};