@zythum02/fello-server 0.1.46 → 0.1.48

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 (213) hide show
  1. package/README.md +11 -2
  2. package/out/renderer/assets/{_baseUniq-JI50qq3v.js → _baseUniq-D023PlQD.js} +1 -1
  3. package/out/renderer/assets/_baseUniq-D023PlQD.js.br +0 -0
  4. package/out/renderer/assets/_baseUniq-D023PlQD.js.gz +0 -0
  5. package/out/renderer/assets/{arc-D82BffDI.js → arc-Bgp6YWjh.js} +1 -1
  6. package/out/renderer/assets/arc-Bgp6YWjh.js.br +0 -0
  7. package/out/renderer/assets/arc-Bgp6YWjh.js.gz +0 -0
  8. package/out/renderer/assets/{architectureDiagram-Q4EWVU46-BBRMDHvv.js → architectureDiagram-Q4EWVU46-B40mk-XJ.js} +5 -5
  9. package/out/renderer/assets/architectureDiagram-Q4EWVU46-B40mk-XJ.js.br +0 -0
  10. package/out/renderer/assets/{architectureDiagram-Q4EWVU46-BBRMDHvv.js.gz → architectureDiagram-Q4EWVU46-B40mk-XJ.js.gz} +0 -0
  11. package/out/renderer/assets/{blockDiagram-DXYQGD6D-CiCuaiyL.js → blockDiagram-DXYQGD6D-BBdankH4.js} +6 -6
  12. package/out/renderer/assets/blockDiagram-DXYQGD6D-BBdankH4.js.br +0 -0
  13. package/out/renderer/assets/blockDiagram-DXYQGD6D-BBdankH4.js.gz +0 -0
  14. package/out/renderer/assets/{c4Diagram-AHTNJAMY-D9PM_R8p.js → c4Diagram-AHTNJAMY-BfRmGEJy.js} +2 -2
  15. package/out/renderer/assets/c4Diagram-AHTNJAMY-BfRmGEJy.js.br +0 -0
  16. package/out/renderer/assets/{c4Diagram-AHTNJAMY-D9PM_R8p.js.gz → c4Diagram-AHTNJAMY-BfRmGEJy.js.gz} +0 -0
  17. package/out/renderer/assets/{channel-CklIgqOK.js → channel-CHGPt1xL.js} +1 -1
  18. package/out/renderer/assets/{chunk-4BX2VUAB-DK0KQU1M.js → chunk-4BX2VUAB-Dbg5pk8D.js} +1 -1
  19. package/out/renderer/assets/{chunk-4TB4RGXK-CxHdBbdg.js → chunk-4TB4RGXK-CBjV8oAS.js} +5 -5
  20. package/out/renderer/assets/chunk-4TB4RGXK-CBjV8oAS.js.br +0 -0
  21. package/out/renderer/assets/chunk-4TB4RGXK-CBjV8oAS.js.gz +0 -0
  22. package/out/renderer/assets/{chunk-55IACEB6-ykIH_AN3.js → chunk-55IACEB6-_eYsto3b.js} +1 -1
  23. package/out/renderer/assets/{chunk-EDXVE4YY-DUOS0pBH.js → chunk-EDXVE4YY-DaXCRd0a.js} +1 -1
  24. package/out/renderer/assets/chunk-EDXVE4YY-DaXCRd0a.js.br +0 -0
  25. package/out/renderer/assets/chunk-EDXVE4YY-DaXCRd0a.js.gz +0 -0
  26. package/out/renderer/assets/{chunk-FMBD7UC4-Bm3BHCuh.js → chunk-FMBD7UC4-BwtLRaQu.js} +1 -1
  27. package/out/renderer/assets/{chunk-OYMX7WX6-DH9JMSMI.js → chunk-OYMX7WX6-h3hRYV_y.js} +3 -3
  28. package/out/renderer/assets/chunk-OYMX7WX6-h3hRYV_y.js.br +0 -0
  29. package/out/renderer/assets/chunk-OYMX7WX6-h3hRYV_y.js.gz +0 -0
  30. package/out/renderer/assets/{chunk-QZHKN3VN-LffrA1jF.js → chunk-QZHKN3VN-DUU1c_qe.js} +1 -1
  31. package/out/renderer/assets/{chunk-YZCP3GAM-B1pm_POM.js → chunk-YZCP3GAM-fw4tpwlW.js} +1 -1
  32. package/out/renderer/assets/chunk-YZCP3GAM-fw4tpwlW.js.br +0 -0
  33. package/out/renderer/assets/chunk-YZCP3GAM-fw4tpwlW.js.gz +0 -0
  34. package/out/renderer/assets/{classDiagram-6PBFFD2Q-O6uMquiH.js → classDiagram-6PBFFD2Q-ql_64jJs.js} +6 -6
  35. package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-O6uMquiH.js → classDiagram-v2-HSJHXN6E-ql_64jJs.js} +6 -6
  36. package/out/renderer/assets/{clone-BhlnPWG5.js → clone-DZQhm3qm.js} +1 -1
  37. package/out/renderer/assets/{cose-bilkent-S5V4N54A-ljZi9cz-.js → cose-bilkent-S5V4N54A-Bjtibz95.js} +1 -1
  38. package/out/renderer/assets/cose-bilkent-S5V4N54A-Bjtibz95.js.br +0 -0
  39. package/out/renderer/assets/{cose-bilkent-S5V4N54A-ljZi9cz-.js.gz → cose-bilkent-S5V4N54A-Bjtibz95.js.gz} +0 -0
  40. package/out/renderer/assets/{dagre-KV5264BT-DqnNoP69.js → dagre-KV5264BT-DW9CSFRI.js} +6 -6
  41. package/out/renderer/assets/dagre-KV5264BT-DW9CSFRI.js.br +0 -0
  42. package/out/renderer/assets/dagre-KV5264BT-DW9CSFRI.js.gz +0 -0
  43. package/out/renderer/assets/{diagram-5BDNPKRD-pBYJseHI.js → diagram-5BDNPKRD-Dptg-C7O.js} +6 -6
  44. package/out/renderer/assets/diagram-5BDNPKRD-Dptg-C7O.js.br +0 -0
  45. package/out/renderer/assets/diagram-5BDNPKRD-Dptg-C7O.js.gz +0 -0
  46. package/out/renderer/assets/{diagram-G4DWMVQ6-IPm9zWeG.js → diagram-G4DWMVQ6-CX-JVWk7.js} +6 -6
  47. package/out/renderer/assets/diagram-G4DWMVQ6-CX-JVWk7.js.br +0 -0
  48. package/out/renderer/assets/diagram-G4DWMVQ6-CX-JVWk7.js.gz +0 -0
  49. package/out/renderer/assets/{diagram-MMDJMWI5-DSH58P_m.js → diagram-MMDJMWI5-DUDbXS-d.js} +5 -5
  50. package/out/renderer/assets/diagram-MMDJMWI5-DUDbXS-d.js.br +0 -0
  51. package/out/renderer/assets/diagram-MMDJMWI5-DUDbXS-d.js.gz +0 -0
  52. package/out/renderer/assets/{diagram-TYMM5635-Czl-GGCp.js → diagram-TYMM5635-9K0cZf20.js} +5 -5
  53. package/out/renderer/assets/diagram-TYMM5635-9K0cZf20.js.br +0 -0
  54. package/out/renderer/assets/diagram-TYMM5635-9K0cZf20.js.gz +0 -0
  55. package/out/renderer/assets/{erDiagram-SMLLAGMA-BENPNKae.js → erDiagram-SMLLAGMA-DaVqqCcL.js} +4 -4
  56. package/out/renderer/assets/erDiagram-SMLLAGMA-DaVqqCcL.js.br +0 -0
  57. package/out/renderer/assets/erDiagram-SMLLAGMA-DaVqqCcL.js.gz +0 -0
  58. package/out/renderer/assets/{flowDiagram-DWJPFMVM-T3H9Pqwa.js → flowDiagram-DWJPFMVM-BrHGujcg.js} +6 -6
  59. package/out/renderer/assets/flowDiagram-DWJPFMVM-BrHGujcg.js.br +0 -0
  60. package/out/renderer/assets/flowDiagram-DWJPFMVM-BrHGujcg.js.gz +0 -0
  61. package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-Hh-AJvLC.js → ganttDiagram-T4ZO3ILL-D9tlSXpr.js} +2 -2
  62. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-D9tlSXpr.js.br +0 -0
  63. package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-Hh-AJvLC.js.gz → ganttDiagram-T4ZO3ILL-D9tlSXpr.js.gz} +0 -0
  64. package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-BDXB9jT_.js → gitGraphDiagram-UUTBAWPF-dFtBMZmH.js} +6 -6
  65. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-dFtBMZmH.js.br +0 -0
  66. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-dFtBMZmH.js.gz +0 -0
  67. package/out/renderer/assets/{graph-MWvZ47Hf.js → graph-CNmSjTZd.js} +2 -2
  68. package/out/renderer/assets/graph-CNmSjTZd.js.br +0 -0
  69. package/out/renderer/assets/graph-CNmSjTZd.js.gz +0 -0
  70. package/out/renderer/assets/{highlighted-body-OFNGDK62-Bvl34wyh.js → highlighted-body-OFNGDK62-EglK-D82.js} +1 -1
  71. package/out/renderer/assets/{index-BpPCAjGn.js → index-BuO0MTa-.js} +1490 -945
  72. package/out/renderer/assets/index-BuO0MTa-.js.br +0 -0
  73. package/out/renderer/assets/index-BuO0MTa-.js.gz +0 -0
  74. package/out/renderer/assets/{index-BTEKdfpj.css → index-BwSaFLCv.css} +1 -1
  75. package/out/renderer/assets/index-BwSaFLCv.css.br +0 -0
  76. package/out/renderer/assets/index-BwSaFLCv.css.gz +0 -0
  77. package/out/renderer/assets/{infoDiagram-42DDH7IO-Ca_9-363.js → infoDiagram-42DDH7IO-CwoWvadJ.js} +4 -4
  78. package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-D3GtyA4e.js → ishikawaDiagram-UXIWVN3A-9MhN_EF5.js} +1 -1
  79. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-9MhN_EF5.js.br +0 -0
  80. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-9MhN_EF5.js.gz +0 -0
  81. package/out/renderer/assets/{journeyDiagram-VCZTEJTY-DkQAlc0b.js → journeyDiagram-VCZTEJTY-BwKJh5pl.js} +4 -4
  82. package/out/renderer/assets/journeyDiagram-VCZTEJTY-BwKJh5pl.js.br +0 -0
  83. package/out/renderer/assets/journeyDiagram-VCZTEJTY-BwKJh5pl.js.gz +0 -0
  84. package/out/renderer/assets/{kanban-definition-6JOO6SKY-DamLzi6S.js → kanban-definition-6JOO6SKY-uDhuFOXv.js} +2 -2
  85. package/out/renderer/assets/kanban-definition-6JOO6SKY-uDhuFOXv.js.br +0 -0
  86. package/out/renderer/assets/kanban-definition-6JOO6SKY-uDhuFOXv.js.gz +0 -0
  87. package/out/renderer/assets/{layout-Dw_ZcO_L.js → layout-C7Mg2ajy.js} +4 -4
  88. package/out/renderer/assets/layout-C7Mg2ajy.js.br +0 -0
  89. package/out/renderer/assets/layout-C7Mg2ajy.js.gz +0 -0
  90. package/out/renderer/assets/{linear-Dh5vwFy4.js → linear-CkQXAw4A.js} +1 -1
  91. package/out/renderer/assets/linear-CkQXAw4A.js.br +0 -0
  92. package/out/renderer/assets/linear-CkQXAw4A.js.gz +0 -0
  93. package/out/renderer/assets/{min-DDCW5FhP.js → min-DRTvcNIL.js} +2 -2
  94. package/out/renderer/assets/min-DRTvcNIL.js.br +0 -0
  95. package/out/renderer/assets/min-DRTvcNIL.js.gz +0 -0
  96. package/out/renderer/assets/{mindmap-definition-QFDTVHPH-B3rcYXPK.js → mindmap-definition-QFDTVHPH-_8DjK16S.js} +3 -3
  97. package/out/renderer/assets/mindmap-definition-QFDTVHPH-_8DjK16S.js.br +0 -0
  98. package/out/renderer/assets/mindmap-definition-QFDTVHPH-_8DjK16S.js.gz +0 -0
  99. package/out/renderer/assets/{pieDiagram-DEJITSTG-CsCXUSKq.js → pieDiagram-DEJITSTG-owvRXepN.js} +6 -6
  100. package/out/renderer/assets/pieDiagram-DEJITSTG-owvRXepN.js.br +0 -0
  101. package/out/renderer/assets/pieDiagram-DEJITSTG-owvRXepN.js.gz +0 -0
  102. package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-B91qjO1u.js → quadrantDiagram-34T5L4WZ-C9LRroTe.js} +2 -2
  103. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-C9LRroTe.js.br +0 -0
  104. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-C9LRroTe.js.gz +0 -0
  105. package/out/renderer/assets/{requirementDiagram-MS252O5E-oDcN7qN5.js → requirementDiagram-MS252O5E-Ds_36REQ.js} +3 -3
  106. package/out/renderer/assets/requirementDiagram-MS252O5E-Ds_36REQ.js.br +0 -0
  107. package/out/renderer/assets/requirementDiagram-MS252O5E-Ds_36REQ.js.gz +0 -0
  108. package/out/renderer/assets/{sankeyDiagram-XADWPNL6-DNQO_6oX.js → sankeyDiagram-XADWPNL6-6HuBoz3Q.js} +1 -1
  109. package/out/renderer/assets/sankeyDiagram-XADWPNL6-6HuBoz3Q.js.br +0 -0
  110. package/out/renderer/assets/sankeyDiagram-XADWPNL6-6HuBoz3Q.js.gz +0 -0
  111. package/out/renderer/assets/{sequenceDiagram-FGHM5R23-DCh5u6wY.js → sequenceDiagram-FGHM5R23-BdGUPHNX.js} +3 -3
  112. package/out/renderer/assets/sequenceDiagram-FGHM5R23-BdGUPHNX.js.br +0 -0
  113. package/out/renderer/assets/sequenceDiagram-FGHM5R23-BdGUPHNX.js.gz +0 -0
  114. package/out/renderer/assets/{stateDiagram-FHFEXIEX-DV0gaxkj.js → stateDiagram-FHFEXIEX-CruNLY-0.js} +8 -8
  115. package/out/renderer/assets/stateDiagram-FHFEXIEX-CruNLY-0.js.br +0 -0
  116. package/out/renderer/assets/stateDiagram-FHFEXIEX-CruNLY-0.js.gz +0 -0
  117. package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-D1Sk_TKE.js → stateDiagram-v2-QKLJ7IA2-CfBaNTRC.js} +4 -4
  118. package/out/renderer/assets/{timeline-definition-GMOUNBTQ-Nq47TkPV.js → timeline-definition-GMOUNBTQ-CHPlJ2ZI.js} +2 -2
  119. package/out/renderer/assets/timeline-definition-GMOUNBTQ-CHPlJ2ZI.js.br +0 -0
  120. package/out/renderer/assets/timeline-definition-GMOUNBTQ-CHPlJ2ZI.js.gz +0 -0
  121. package/out/renderer/assets/{vennDiagram-DHZGUBPP-CMbmY-R_.js → vennDiagram-DHZGUBPP-DMdQtt7i.js} +1 -1
  122. package/out/renderer/assets/vennDiagram-DHZGUBPP-DMdQtt7i.js.br +0 -0
  123. package/out/renderer/assets/vennDiagram-DHZGUBPP-DMdQtt7i.js.gz +0 -0
  124. package/out/renderer/assets/{wardley-RL74JXVD-aLLqbf8o.js → wardley-RL74JXVD-HjjY3yRY.js} +3 -3
  125. package/out/renderer/assets/wardley-RL74JXVD-HjjY3yRY.js.br +0 -0
  126. package/out/renderer/assets/wardley-RL74JXVD-HjjY3yRY.js.gz +0 -0
  127. package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-8Kc4VQIw.js → wardleyDiagram-NUSXRM2D-BI-3rQpv.js} +5 -5
  128. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-BI-3rQpv.js.br +0 -0
  129. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-BI-3rQpv.js.gz +0 -0
  130. package/out/renderer/assets/{xychartDiagram-5P7HB3ND-YtEoXmYf.js → xychartDiagram-5P7HB3ND-Bzj4rKGX.js} +2 -2
  131. package/out/renderer/assets/xychartDiagram-5P7HB3ND-Bzj4rKGX.js.br +0 -0
  132. package/out/renderer/assets/xychartDiagram-5P7HB3ND-Bzj4rKGX.js.gz +0 -0
  133. package/out/renderer/index.html +2 -2
  134. package/out/renderer/index.html.br +0 -0
  135. package/out/renderer/index.html.gz +0 -0
  136. package/out/server/main.js +874 -226
  137. package/package.json +3 -1
  138. package/out/renderer/assets/_baseUniq-JI50qq3v.js.br +0 -0
  139. package/out/renderer/assets/_baseUniq-JI50qq3v.js.gz +0 -0
  140. package/out/renderer/assets/arc-D82BffDI.js.br +0 -0
  141. package/out/renderer/assets/arc-D82BffDI.js.gz +0 -0
  142. package/out/renderer/assets/architectureDiagram-Q4EWVU46-BBRMDHvv.js.br +0 -0
  143. package/out/renderer/assets/blockDiagram-DXYQGD6D-CiCuaiyL.js.br +0 -0
  144. package/out/renderer/assets/blockDiagram-DXYQGD6D-CiCuaiyL.js.gz +0 -0
  145. package/out/renderer/assets/c4Diagram-AHTNJAMY-D9PM_R8p.js.br +0 -0
  146. package/out/renderer/assets/chunk-4TB4RGXK-CxHdBbdg.js.br +0 -0
  147. package/out/renderer/assets/chunk-4TB4RGXK-CxHdBbdg.js.gz +0 -0
  148. package/out/renderer/assets/chunk-EDXVE4YY-DUOS0pBH.js.br +0 -0
  149. package/out/renderer/assets/chunk-EDXVE4YY-DUOS0pBH.js.gz +0 -0
  150. package/out/renderer/assets/chunk-OYMX7WX6-DH9JMSMI.js.br +0 -0
  151. package/out/renderer/assets/chunk-OYMX7WX6-DH9JMSMI.js.gz +0 -0
  152. package/out/renderer/assets/chunk-YZCP3GAM-B1pm_POM.js.br +0 -0
  153. package/out/renderer/assets/chunk-YZCP3GAM-B1pm_POM.js.gz +0 -0
  154. package/out/renderer/assets/cose-bilkent-S5V4N54A-ljZi9cz-.js.br +0 -0
  155. package/out/renderer/assets/dagre-KV5264BT-DqnNoP69.js.br +0 -0
  156. package/out/renderer/assets/dagre-KV5264BT-DqnNoP69.js.gz +0 -0
  157. package/out/renderer/assets/diagram-5BDNPKRD-pBYJseHI.js.br +0 -0
  158. package/out/renderer/assets/diagram-5BDNPKRD-pBYJseHI.js.gz +0 -0
  159. package/out/renderer/assets/diagram-G4DWMVQ6-IPm9zWeG.js.br +0 -0
  160. package/out/renderer/assets/diagram-G4DWMVQ6-IPm9zWeG.js.gz +0 -0
  161. package/out/renderer/assets/diagram-MMDJMWI5-DSH58P_m.js.br +0 -0
  162. package/out/renderer/assets/diagram-MMDJMWI5-DSH58P_m.js.gz +0 -0
  163. package/out/renderer/assets/diagram-TYMM5635-Czl-GGCp.js.br +0 -0
  164. package/out/renderer/assets/diagram-TYMM5635-Czl-GGCp.js.gz +0 -0
  165. package/out/renderer/assets/erDiagram-SMLLAGMA-BENPNKae.js.br +0 -0
  166. package/out/renderer/assets/erDiagram-SMLLAGMA-BENPNKae.js.gz +0 -0
  167. package/out/renderer/assets/flowDiagram-DWJPFMVM-T3H9Pqwa.js.br +0 -0
  168. package/out/renderer/assets/flowDiagram-DWJPFMVM-T3H9Pqwa.js.gz +0 -0
  169. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-Hh-AJvLC.js.br +0 -0
  170. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-BDXB9jT_.js.br +0 -0
  171. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-BDXB9jT_.js.gz +0 -0
  172. package/out/renderer/assets/graph-MWvZ47Hf.js.br +0 -0
  173. package/out/renderer/assets/graph-MWvZ47Hf.js.gz +0 -0
  174. package/out/renderer/assets/index-BTEKdfpj.css.br +0 -0
  175. package/out/renderer/assets/index-BTEKdfpj.css.gz +0 -0
  176. package/out/renderer/assets/index-BpPCAjGn.js.br +0 -0
  177. package/out/renderer/assets/index-BpPCAjGn.js.gz +0 -0
  178. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-D3GtyA4e.js.br +0 -0
  179. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-D3GtyA4e.js.gz +0 -0
  180. package/out/renderer/assets/journeyDiagram-VCZTEJTY-DkQAlc0b.js.br +0 -0
  181. package/out/renderer/assets/journeyDiagram-VCZTEJTY-DkQAlc0b.js.gz +0 -0
  182. package/out/renderer/assets/kanban-definition-6JOO6SKY-DamLzi6S.js.br +0 -0
  183. package/out/renderer/assets/kanban-definition-6JOO6SKY-DamLzi6S.js.gz +0 -0
  184. package/out/renderer/assets/layout-Dw_ZcO_L.js.br +0 -0
  185. package/out/renderer/assets/layout-Dw_ZcO_L.js.gz +0 -0
  186. package/out/renderer/assets/linear-Dh5vwFy4.js.br +0 -0
  187. package/out/renderer/assets/linear-Dh5vwFy4.js.gz +0 -0
  188. package/out/renderer/assets/min-DDCW5FhP.js.br +0 -0
  189. package/out/renderer/assets/min-DDCW5FhP.js.gz +0 -0
  190. package/out/renderer/assets/mindmap-definition-QFDTVHPH-B3rcYXPK.js.br +0 -0
  191. package/out/renderer/assets/mindmap-definition-QFDTVHPH-B3rcYXPK.js.gz +0 -0
  192. package/out/renderer/assets/pieDiagram-DEJITSTG-CsCXUSKq.js.br +0 -0
  193. package/out/renderer/assets/pieDiagram-DEJITSTG-CsCXUSKq.js.gz +0 -0
  194. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-B91qjO1u.js.br +0 -0
  195. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-B91qjO1u.js.gz +0 -0
  196. package/out/renderer/assets/requirementDiagram-MS252O5E-oDcN7qN5.js.br +0 -0
  197. package/out/renderer/assets/requirementDiagram-MS252O5E-oDcN7qN5.js.gz +0 -0
  198. package/out/renderer/assets/sankeyDiagram-XADWPNL6-DNQO_6oX.js.br +0 -0
  199. package/out/renderer/assets/sankeyDiagram-XADWPNL6-DNQO_6oX.js.gz +0 -0
  200. package/out/renderer/assets/sequenceDiagram-FGHM5R23-DCh5u6wY.js.br +0 -0
  201. package/out/renderer/assets/sequenceDiagram-FGHM5R23-DCh5u6wY.js.gz +0 -0
  202. package/out/renderer/assets/stateDiagram-FHFEXIEX-DV0gaxkj.js.br +0 -0
  203. package/out/renderer/assets/stateDiagram-FHFEXIEX-DV0gaxkj.js.gz +0 -0
  204. package/out/renderer/assets/timeline-definition-GMOUNBTQ-Nq47TkPV.js.br +0 -0
  205. package/out/renderer/assets/timeline-definition-GMOUNBTQ-Nq47TkPV.js.gz +0 -0
  206. package/out/renderer/assets/vennDiagram-DHZGUBPP-CMbmY-R_.js.br +0 -0
  207. package/out/renderer/assets/vennDiagram-DHZGUBPP-CMbmY-R_.js.gz +0 -0
  208. package/out/renderer/assets/wardley-RL74JXVD-aLLqbf8o.js.br +0 -0
  209. package/out/renderer/assets/wardley-RL74JXVD-aLLqbf8o.js.gz +0 -0
  210. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-8Kc4VQIw.js.br +0 -0
  211. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-8Kc4VQIw.js.gz +0 -0
  212. package/out/renderer/assets/xychartDiagram-5P7HB3ND-YtEoXmYf.js.br +0 -0
  213. package/out/renderer/assets/xychartDiagram-5P7HB3ND-YtEoXmYf.js.gz +0 -0
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./dagre-KV5264BT-DqnNoP69.js","./graph-MWvZ47Hf.js","./_baseUniq-JI50qq3v.js","./layout-Dw_ZcO_L.js","./min-DDCW5FhP.js","./clone-BhlnPWG5.js","./cose-bilkent-S5V4N54A-ljZi9cz-.js","./cytoscape.esm-Bm8DJGmZ.js","./c4Diagram-AHTNJAMY-D9PM_R8p.js","./chunk-YZCP3GAM-B1pm_POM.js","./flowDiagram-DWJPFMVM-T3H9Pqwa.js","./chunk-FMBD7UC4-Bm3BHCuh.js","./chunk-55IACEB6-ykIH_AN3.js","./chunk-EDXVE4YY-DUOS0pBH.js","./channel-CklIgqOK.js","./erDiagram-SMLLAGMA-BENPNKae.js","./gitGraphDiagram-UUTBAWPF-BDXB9jT_.js","./chunk-4BX2VUAB-DK0KQU1M.js","./chunk-QZHKN3VN-LffrA1jF.js","./wardley-RL74JXVD-aLLqbf8o.js","./ganttDiagram-T4ZO3ILL-Hh-AJvLC.js","./linear-Dh5vwFy4.js","./init-ZxktEp_H.js","./defaultLocale-B2RvLBDe.js","./infoDiagram-42DDH7IO-Ca_9-363.js","./pieDiagram-DEJITSTG-CsCXUSKq.js","./arc-D82BffDI.js","./ordinal-CxptdPJm.js","./quadrantDiagram-34T5L4WZ-B91qjO1u.js","./xychartDiagram-5P7HB3ND-YtEoXmYf.js","./requirementDiagram-MS252O5E-oDcN7qN5.js","./sequenceDiagram-FGHM5R23-DCh5u6wY.js","./classDiagram-6PBFFD2Q-O6uMquiH.js","./chunk-4TB4RGXK-CxHdBbdg.js","./classDiagram-v2-HSJHXN6E-O6uMquiH.js","./stateDiagram-FHFEXIEX-DV0gaxkj.js","./chunk-OYMX7WX6-DH9JMSMI.js","./stateDiagram-v2-QKLJ7IA2-D1Sk_TKE.js","./journeyDiagram-VCZTEJTY-DkQAlc0b.js","./timeline-definition-GMOUNBTQ-Nq47TkPV.js","./mindmap-definition-QFDTVHPH-B3rcYXPK.js","./kanban-definition-6JOO6SKY-DamLzi6S.js","./sankeyDiagram-XADWPNL6-DNQO_6oX.js","./diagram-TYMM5635-Czl-GGCp.js","./diagram-MMDJMWI5-DSH58P_m.js","./blockDiagram-DXYQGD6D-CiCuaiyL.js","./diagram-5BDNPKRD-pBYJseHI.js","./architectureDiagram-Q4EWVU46-BBRMDHvv.js","./diagram-G4DWMVQ6-IPm9zWeG.js","./wardleyDiagram-NUSXRM2D-8Kc4VQIw.js","./angular-html-BYG42TJr.js","./html-GC16tDh9.js","./javascript-BsAkV7mL.js","./css-BtVcDqlU.js","./angular-ts-BftcHvZ6.js","./scss-Dq-LbI_c.js","./apl-CGZawg-A.js","./xml-BMzZeaqs.js","./java-BfXh-0uJ.js","./json-TjWBGEk1.js","./astro-BxdWOZvM.js","./typescript-CP6ECzON.js","./postcss-kj1IbjVd.js","./tsx-CmGGo4Hm.js","./blade-BbH7YAUi.js","./html-derivative-HU9p64q4.js","./sql-DzUuSofg.js","./bsl-DwPS0BId.js","./sdbl-BBUhycGU.js","./cairo-BtYx2aM5.js","./python-CrdIx4PZ.js","./cobol-B8r1pfPr.js","./coffee-XLjtuEYs.js","./cpp-zh2ePAE_.js","./regexp-BxWeO75u.js","./glsl-CGsiYPcu.js","./c-C4VtT7JA.js","./crystal-BqBRy7Ec.js","./shellscript-CQ8MXh-D.js","./edge-CnHxQ_FD.js","./elixir-B_LIBv5J.js","./elm-BlO7pcFp.js","./erb-Bzn22wO6.js","./ruby-C13Bjepi.js","./haml-DrIklt7F.js","./graphql-CwmtR1ib.js","./jsx-BPmvoin2.js","./lua-BVbbqwZC.js","./yaml-B_vW5iTY.js","./erlang-Ch5kuXHm.js","./markdown-F_EULe_G.js","./fortran-fixed-form-CpmOyvS5.js","./fortran-free-form-5X94ETMi.js","./fsharp-5vtGqRR9.js","./gdresource-B5TLWiFO.js","./gdshader-BEzE4j_3.js","./gdscript-CNW3Aj-d.js","./git-commit-PP9xCApN.js","./diff-BEdzuHlE.js","./git-rebase-D-XQSvDj.js","./glimmer-js-h2QNNiD7.js","./glimmer-ts-Bk3uX6Ae.js","./hack-BTX3ICIE.js","./handlebars-yWFGGD2R.js","./http-DjsOm9E4.js","./hurl-Am2cDU4f.js","./csv-Ba84L8e5.js","./hxml-Jle7oGdm.js","./haxe-BpobLYM9.js","./jinja-FkIlHBgj.js","./jison-BkdOIOd4.js","./julia-CU_UwNb8.js","./r-Dpdc-Kyk.js","./just-tGFryTtU.js","./perl-HITCDkgu.js","./latex-B0gTO9uZ.js","./tex-CGVqF8nD.js","./liquid-QmJ_LYTW.js","./marko-BAWrmNIa.js","./less-BAzLMJNR.js","./mdc-Ca0ft0PS.js","./nextflow-B166B-y1.js","./nextflow-groovy-BOO9s0iq.js","./nginx-BFAkI5_-.js","./nim-B3PAIZ4D.js","./php-C2HieitX.js","./pug-BwQB43qN.js","./qml-jtL8okyu.js","./razor-gBXW6YBJ.js","./csharp-DxX_6tHh.js","./rst-by6KAwTb.js","./cmake-CDfQILeU.js","./sas-BLBgC3TA.js","./shaderlab-C07uO3dL.js","./hlsl-TRzjajlb.js","./shellsession-CkeTp4M1.js","./soy-BHaHgMUy.js","./sparql-DswowMAp.js","./turtle-BnC7StHY.js","./stata-Dl7wDdBE.js","./surrealql-Bs3vUeKA.js","./svelte-fC0HkEkx.js","./templ-CSEiQwNm.js","./go-DRMr3iML.js","./ts-tags-cG2hZuda.js","./twig-CwEEYIBf.js","./vue-K-7Ga-y8.js","./vue-html-DhreShjd.js","./vue-vine-rMIwOpFf.js","./stylus-DXFa_2Jl.js","./xsl-CnwVr_6q.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./dagre-KV5264BT-DW9CSFRI.js","./graph-CNmSjTZd.js","./_baseUniq-D023PlQD.js","./layout-C7Mg2ajy.js","./min-DRTvcNIL.js","./clone-DZQhm3qm.js","./cose-bilkent-S5V4N54A-Bjtibz95.js","./cytoscape.esm-Bm8DJGmZ.js","./c4Diagram-AHTNJAMY-BfRmGEJy.js","./chunk-YZCP3GAM-fw4tpwlW.js","./flowDiagram-DWJPFMVM-BrHGujcg.js","./chunk-FMBD7UC4-BwtLRaQu.js","./chunk-55IACEB6-_eYsto3b.js","./chunk-EDXVE4YY-DaXCRd0a.js","./channel-CHGPt1xL.js","./erDiagram-SMLLAGMA-DaVqqCcL.js","./gitGraphDiagram-UUTBAWPF-dFtBMZmH.js","./chunk-4BX2VUAB-Dbg5pk8D.js","./chunk-QZHKN3VN-DUU1c_qe.js","./wardley-RL74JXVD-HjjY3yRY.js","./ganttDiagram-T4ZO3ILL-D9tlSXpr.js","./linear-CkQXAw4A.js","./init-ZxktEp_H.js","./defaultLocale-B2RvLBDe.js","./infoDiagram-42DDH7IO-CwoWvadJ.js","./pieDiagram-DEJITSTG-owvRXepN.js","./arc-Bgp6YWjh.js","./ordinal-CxptdPJm.js","./quadrantDiagram-34T5L4WZ-C9LRroTe.js","./xychartDiagram-5P7HB3ND-Bzj4rKGX.js","./requirementDiagram-MS252O5E-Ds_36REQ.js","./sequenceDiagram-FGHM5R23-BdGUPHNX.js","./classDiagram-6PBFFD2Q-ql_64jJs.js","./chunk-4TB4RGXK-CBjV8oAS.js","./classDiagram-v2-HSJHXN6E-ql_64jJs.js","./stateDiagram-FHFEXIEX-CruNLY-0.js","./chunk-OYMX7WX6-h3hRYV_y.js","./stateDiagram-v2-QKLJ7IA2-CfBaNTRC.js","./journeyDiagram-VCZTEJTY-BwKJh5pl.js","./timeline-definition-GMOUNBTQ-CHPlJ2ZI.js","./mindmap-definition-QFDTVHPH-_8DjK16S.js","./kanban-definition-6JOO6SKY-uDhuFOXv.js","./sankeyDiagram-XADWPNL6-6HuBoz3Q.js","./diagram-TYMM5635-9K0cZf20.js","./diagram-MMDJMWI5-DUDbXS-d.js","./blockDiagram-DXYQGD6D-BBdankH4.js","./diagram-5BDNPKRD-Dptg-C7O.js","./architectureDiagram-Q4EWVU46-B40mk-XJ.js","./diagram-G4DWMVQ6-CX-JVWk7.js","./wardleyDiagram-NUSXRM2D-BI-3rQpv.js","./angular-html-BYG42TJr.js","./html-GC16tDh9.js","./javascript-BsAkV7mL.js","./css-BtVcDqlU.js","./angular-ts-BftcHvZ6.js","./scss-Dq-LbI_c.js","./apl-CGZawg-A.js","./xml-BMzZeaqs.js","./java-BfXh-0uJ.js","./json-TjWBGEk1.js","./astro-BxdWOZvM.js","./typescript-CP6ECzON.js","./postcss-kj1IbjVd.js","./tsx-CmGGo4Hm.js","./blade-BbH7YAUi.js","./html-derivative-HU9p64q4.js","./sql-DzUuSofg.js","./bsl-DwPS0BId.js","./sdbl-BBUhycGU.js","./cairo-BtYx2aM5.js","./python-CrdIx4PZ.js","./cobol-B8r1pfPr.js","./coffee-XLjtuEYs.js","./cpp-zh2ePAE_.js","./regexp-BxWeO75u.js","./glsl-CGsiYPcu.js","./c-C4VtT7JA.js","./crystal-BqBRy7Ec.js","./shellscript-CQ8MXh-D.js","./edge-CnHxQ_FD.js","./elixir-B_LIBv5J.js","./elm-BlO7pcFp.js","./erb-Bzn22wO6.js","./ruby-C13Bjepi.js","./haml-DrIklt7F.js","./graphql-CwmtR1ib.js","./jsx-BPmvoin2.js","./lua-BVbbqwZC.js","./yaml-B_vW5iTY.js","./erlang-Ch5kuXHm.js","./markdown-F_EULe_G.js","./fortran-fixed-form-CpmOyvS5.js","./fortran-free-form-5X94ETMi.js","./fsharp-5vtGqRR9.js","./gdresource-B5TLWiFO.js","./gdshader-BEzE4j_3.js","./gdscript-CNW3Aj-d.js","./git-commit-PP9xCApN.js","./diff-BEdzuHlE.js","./git-rebase-D-XQSvDj.js","./glimmer-js-h2QNNiD7.js","./glimmer-ts-Bk3uX6Ae.js","./hack-BTX3ICIE.js","./handlebars-yWFGGD2R.js","./http-DjsOm9E4.js","./hurl-Am2cDU4f.js","./csv-Ba84L8e5.js","./hxml-Jle7oGdm.js","./haxe-BpobLYM9.js","./jinja-FkIlHBgj.js","./jison-BkdOIOd4.js","./julia-CU_UwNb8.js","./r-Dpdc-Kyk.js","./just-tGFryTtU.js","./perl-HITCDkgu.js","./latex-B0gTO9uZ.js","./tex-CGVqF8nD.js","./liquid-QmJ_LYTW.js","./marko-BAWrmNIa.js","./less-BAzLMJNR.js","./mdc-Ca0ft0PS.js","./nextflow-B166B-y1.js","./nextflow-groovy-BOO9s0iq.js","./nginx-BFAkI5_-.js","./nim-B3PAIZ4D.js","./php-C2HieitX.js","./pug-BwQB43qN.js","./qml-jtL8okyu.js","./razor-gBXW6YBJ.js","./csharp-DxX_6tHh.js","./rst-by6KAwTb.js","./cmake-CDfQILeU.js","./sas-BLBgC3TA.js","./shaderlab-C07uO3dL.js","./hlsl-TRzjajlb.js","./shellsession-CkeTp4M1.js","./soy-BHaHgMUy.js","./sparql-DswowMAp.js","./turtle-BnC7StHY.js","./stata-Dl7wDdBE.js","./surrealql-Bs3vUeKA.js","./svelte-fC0HkEkx.js","./templ-CSEiQwNm.js","./go-DRMr3iML.js","./ts-tags-cG2hZuda.js","./twig-CwEEYIBf.js","./vue-K-7Ga-y8.js","./vue-html-DhreShjd.js","./vue-vine-rMIwOpFf.js","./stylus-DXFa_2Jl.js","./xsl-CnwVr_6q.js"])))=>i.map(i=>d[i]);
2
2
  function _mergeNamespaces(n2, m2) {
3
3
  for (var i3 = 0; i3 < m2.length; i3++) {
4
4
  const e11 = m2[i3];
@@ -14128,6 +14128,7 @@ const useAppStore = create$3((set2, get2) => ({
14128
14128
  theme: { themeMode: "system" },
14129
14129
  i18n: { language: "en" },
14130
14130
  fileWatcher: { enabled: true },
14131
+ proxy: { mode: "off" },
14131
14132
  ilink: { useOriginalImage: false },
14132
14133
  editor: { name: "code" },
14133
14134
  sound: { volume: 50, muted: false, theme: "soft" },
@@ -14260,6 +14261,7 @@ const useAppStore = create$3((set2, get2) => ({
14260
14261
  setTheme: (theme) => set2({ theme }),
14261
14262
  setI18n: (i18n) => set2({ i18n }),
14262
14263
  setFileWatcher: (fileWatcher) => set2({ fileWatcher }),
14264
+ setProxy: (proxy) => set2({ proxy }),
14263
14265
  setIlink: (ilink) => set2({ ilink }),
14264
14266
  setEditor: (editor) => set2({ editor }),
14265
14267
  setSound: (sound) => set2({ sound }),
@@ -16883,10 +16885,10 @@ const useTranslation = (ns2, props = {}) => {
16883
16885
  }
16884
16886
  return ret;
16885
16887
  };
16886
- const sidebar$1 = { "welcome": "Welcome", "skills": "Skills", "automation": "Automation", "projects": "Projects", "noProjects": "No projects yet", "noProjectsHint": "Add a project folder to get started", "addProject": "Add Project", "noAgentsHint": "Configure an agent first", "configureAgent": "Configure Agent", "revealInFinder": "Reveal in Finder", "rename": "Rename", "delete": "Delete", "renameProject": "Rename Project", "renameChat": "Rename Chat", "deleteChat": "Delete Chat", "enterNewProjectName": "Enter a new project name.", "enterNewChatName": "Enter a new chat name.", "addProjectTitle": "Add Project", "enterProjectPath": "Enter absolute path to project on the server:", "pathCannotBeEmpty": "Path cannot be empty", "webuiEnabled": "WebUI Enabled", "deleteProject": "Delete Project", "deleteProjectConfirm": 'Delete project "{{title}}" and all chats in it?\nThis action cannot be undone.', "deleteChatConfirm": 'Delete chat "{{title}}"?\nThis action cannot be undone.', "cancel": "Cancel", "save": "Save", "settings": "Settings", "agents": "Agents", "addProjectFailed": "Failed to add project.", "newChatFailed": "Failed to create a new chat.", "loadSessionFailed": "Failed to load session.", "revealInFinderFailed": "Failed to reveal in Finder.", "projectExists": "Project already exists.", "projectNameEmpty": "Project name cannot be empty.", "chatNameEmpty": "Chat name cannot be empty.", "newChat": "New Chat", "projectActions": "Project actions for {{title}}", "createChatInProject": "Create chat in {{title}}", "chatActions": "Chat actions for {{title}}", "ilinkSetActive": "Set WeChat Active", "ilinkUnsetActive": "Unset WeChat Active", "collapse": "Collapse sidebar", "expand": "Expand sidebar", "newSessionDialog": { "title": "Create session", "agent": "Agent", "selectAgent": "Select an agent", "mcp": "MCP", "noMcp": "No MCP servers configured", "permission": "Permission", "permissionAsk": "Ask", "permissionAllowAll": "Allow all", "create": "Create" } };
16888
+ const sidebar$1 = { "welcome": "Welcome", "skills": "Skills", "automation": "Automation", "projects": "Projects", "noProjects": "No projects yet", "noProjectsHint": "Add a project folder to get started", "addProject": "Add Project", "noAgentsHint": "Configure an agent first", "configureAgent": "Configure Agent", "revealInFinder": "Reveal in Finder", "rename": "Rename", "delete": "Delete", "renameProject": "Rename Project", "renameChat": "Rename Chat", "deleteChat": "Delete Chat", "enterNewProjectName": "Enter a new project name.", "enterNewChatName": "Enter a new chat name.", "addProjectTitle": "Add Project", "enterProjectPath": "Enter absolute path to project on the server:", "pathCannotBeEmpty": "Path cannot be empty", "webuiEnabled": "WebUI Enabled", "deleteProject": "Delete Project", "deleteProjectConfirm": 'Delete project "{{title}}" and all chats in it?\nThis action cannot be undone.', "deleteChatConfirm": 'Delete chat "{{title}}"?\nThis action cannot be undone.', "cancel": "Cancel", "save": "Save", "settings": "Settings", "agents": "Agents", "addProjectFailed": "Failed to add project.", "newChatFailed": "Failed to create a new chat.", "loadSessionFailed": "Failed to load session.", "revealInFinderFailed": "Failed to reveal in Finder.", "projectExists": "Project already exists.", "projectNameEmpty": "Project name cannot be empty.", "chatNameEmpty": "Chat name cannot be empty.", "newChat": "New Chat", "projectActions": "Project actions for {{title}}", "createChatInProject": "Create chat in {{title}}", "chatActions": "Chat actions for {{title}}", "ilinkSetActive": "Set WeChat Active", "ilinkUnsetActive": "Unset WeChat Active", "collapse": "Collapse sidebar", "expand": "Expand sidebar", "updated": "Updated", "created": "Created", "newSessionDialog": { "title": "Create session", "agent": "Agent", "selectAgent": "Select an agent", "mcp": "MCP", "noMcp": "No MCP servers configured", "permission": "Permission", "permissionAsk": "Ask", "permissionAllowAll": "Allow all", "create": "Create" } };
16887
16889
  const skills$1 = { "title": "Skills", "installed": { "label": "Installed", "noDescription": "No description provided.", "revealInFinder": "Reveal in Finder", "viewSkill": "View SKILL.md", "uninstall": "Uninstall", "uninstallTitle": "Uninstall Skill", "uninstallConfirm": "Are you sure you want to uninstall {{name}}? ", "cancel": "Cancel", "uninstalledSuccess": "Skill {{name}} uninstalled", "uninstallFailed": "Failed to uninstall: {{message}}", "revealFailed": "Failed to reveal in Finder: {{message}}", "loadFailed": "Failed to load skills", "loadContentFailed": "Error loading skill content: {{message}}", "noSkills": "No skills installed." }, "skillsSh": { "label": "skills.sh", "title": "Discover Skills", "desc": "Explore and install community skills to enhance your agents.", "searchPlaceholder": "Search skills (e.g. pr-review, react-best-practices)...", "install": "Install", "installSuccess": "Skill {{name}} installed", "installFailed": "Install failed", "noResults": "No skills found", "installs": "{{count}} installs", "installedStatus": "Installed", "authorPrefix": "by " } };
16888
16890
  const contextMenu$1 = { "cut": "Cut", "copy": "Copy", "paste": "Paste", "selectAll": "Select All" };
16889
- const settings$1 = { "themeDesc": "Customize the appearance of the application", "languageDesc": "Select the display language", "title": "Settings", "general": { "title": "General", "desc": "Manage your application settings.", "theme": "Theme", "light": "Light", "dark": "Dark", "system": "System", "language": "Language", "english": "English", "chinese": "简体中文", "saveThemeFailed": "Failed to save theme setting.", "saveLanguageFailed": "Failed to save language setting.", "groupAppearance": "Appearance", "groupProject": "Project", "autoWatchFiles": "Auto Watch Files", "autoWatchFilesDesc": "Automatically watch project file changes", "saveFileWatcherFailed": "Failed to save file watcher setting.", "groupSound": "Sound", "soundEnabled": "Sound Effects", "soundEnabledDesc": "Play sound effects for notifications", "soundVolume": "Volume", "soundVolumeDesc": "Adjust notification volume", "soundTheme": "Sound Style", "soundThemeDesc": "Select the sound effect style", "soundSoft": "Soft", "soundCrisp": "Crisp", "soundTest": "Test", "soundTestDesc": "Preview the current sound effect", "soundTestPlay": "Play", "saveSoundFailed": "Failed to save sound setting.", "groupEditor": "Editor", "editor": "Open in Editor", "editorDesc": "Choose the editor to open files", "selectEditor": "Select editor", "saveEditorFailed": "Failed to save editor setting." }, "agents": { "desc": "Manage agent configurations and startup commands.", "description": "Configure agents", "title": "Agents", "addAgent": "Add Agent", "addStdioAgent": "Add Stdio Agent", "addApiAgent": "Add API Agent", "editAgent": "Edit Agent", "dialogDesc": "Configure the agent ID, command, arguments and environment variables.", "apiDialogDesc": "Configure provider, endpoint and authentication for API agent.", "agentId": "Agent ID (Name)", "apiProvider": "Provider", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "Headers (JSON)", "contextWindowTokens": "Context Window (tokens)", "modelIdTemplate": "Model Id Template", "models": "Models (one per line)", "modelsHint": "Usually not needed — models are fetched automatically. Only specify if the API doesn't return the models you need", "command": "Command", "args": "Arguments", "envVars": "Environment Variables (JSON)", "envJson": "Environment Variables (JSON)", "cancel": "Cancel", "save": "Save", "edit": "Edit", "delete": "Delete", "dragToReorder": "Drag to reorder", "noAgents": "No agents configured", "errorIdCommand": "ID and Command are required.", "errorDuplicateId": "An agent with this ID already exists.", "errorEnvJson": "Env must be a valid JSON object.", "errorContextWindowTokens": "Context Window must be a positive integer.", "updateFailed": "Failed to update configuration.", "confirmDeleteTitle": "Delete Agent", "confirmDeleteDesc": "Are you sure you want to delete this agent? This action cannot be undone.", "confirmDeleteDescWithSessions": "Are you sure you want to delete this agent? {{count}} session(s) will also be deleted. This action cannot be undone.", "reset": "Reset Agent", "resetSuccess": "Agent reset.", "resetFailed": "Failed to reset agent.", "deleteAllSessions": "Delete All Sessions", "confirmDeleteAllSessionsTitle": "Delete All Sessions", "confirmDeleteAllSessionsDesc": "All sessions for this agent will be permanently deleted. This action cannot be undone.", "deleteAllSessionsSuccess": "{{count}} session(s) deleted.", "deleteAllSessionsFailed": "Failed to delete sessions.", "validation": { "enterId": "Please enter an agent ID.", "idFormat": "Only letters, numbers, _ and - allowed.", "selectProvider": "Please select a provider.", "enterBaseUrl": "Please enter a base URL.", "enterApiKey": "Please enter an API key.", "enterCommand": "Please enter a command.", "jsonObject": "Must be a valid JSON object with string values.", "positiveInteger": "Must be a positive integer." } }, "mcp": { "desc": "Manage MCP server configurations and startup commands.", "description": "Configure MCP Servers", "title": "MCP Servers", "addMcp": "Add MCP Server", "addStdioMcp": "Add Stdio MCP", "addHttpMcp": "Add HTTP MCP", "addSseMcp": "Add SSE MCP", "recommended": { "exa": { "name": "Exa", "desc": "Exa MCP Server — AI Web Search" } }, "editMcp": "Edit MCP Server", "dialogDesc": "Configure the MCP server ID, command, arguments and environment variables.", "mcpId": "MCP Server ID (Name)", "command": "Command", "args": "Arguments", "envVars": "Environment Variables (JSON)", "envJson": "Environment Variables (JSON)", "url": "URL", "headers": "Headers (JSON)", "headersJson": "Headers (JSON)", "httpDialogDesc": "Configure the MCP server ID, HTTP URL and request headers.", "sseDialogDesc": "Configure the MCP server ID, SSE endpoint URL and request headers.", "cancel": "Cancel", "save": "Save", "edit": "Edit", "delete": "Delete", "dragToReorder": "Drag to reorder", "noMcpServers": "No MCP servers configured", "errorIdRequired": "ID is required.", "errorUrlRequired": "URL is required.", "errorIdCommand": "ID and Command are required.", "errorDuplicateId": "An MCP server with this ID already exists.", "errorHeadersJson": "Headers must be a valid JSON object.", "errorEnvJson": "Env must be a valid JSON object.", "updateFailed": "Failed to update configuration.", "confirmDeleteTitle": "Delete MCP Server", "confirmDeleteDesc": "Are you sure you want to delete this MCP server? This action cannot be undone.", "validation": { "enterId": "Please enter a server ID.", "idFormat": "Only letters, numbers, _ and - allowed.", "enterCommand": "Please enter a command.", "enterUrl": "Please enter a URL.", "jsonObject": "Must be a valid JSON object with string values." } }, "webui": { "desc": "Configure remote access to the Fello interface.", "title": "WebUI", "enable": "Enable WebUI", "enableDesc": "Allow remote access to Fello interface via browser", "accessUrl": "Access URL", "accessDesc": "Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.", "enableAccess": "Enable WebUI Access", "port": "Port:", "token": "Token:", "autoGenerated": "Auto-generated", "copy": "Copy", "note": "Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.", "updateFailed": "Failed to update configuration.", "disabledInWebUI": "WebUI configuration is disabled when running inside the browser." }, "ilink": { "title": "WeChat iLink", "description": "Connect Fello to WeChat via iLink Bot API. Once connected, a ClawBot contact will appear in your WeChat, allowing you to chat with your AI agent from anywhere.", "connected": "Connected", "notConnected": "Not Connected", "notConnectedHint": "Scan QR code with WeChat to connect", "login": "Login", "loggingIn": "Waiting...", "disconnect": "Disconnect", "scanPrompt": "Scan with WeChat to login", "qrcodeExpired": "QR code expired, please try again", "scanned": "Scanned! Please confirm on your phone.", "browserOpened": "QR code opened in browser. Scan with WeChat to login.", "activeSession": "Active Session for WeChat", "activeSessionHint": "Messages from WeChat will be routed to this session. Right-click a session in the sidebar to set it as active.", "selectSession": "-- Select a session --", "none": "-- None --", "howItWorks": "How it works", "step1": 'Click "Login" to open the QR code in your browser', "step2": "Scan the QR code with WeChat", "step3": 'A "ClawBot" contact appears in your WeChat', "step4": "Chat with ClawBot — messages are routed to the active session above", "step5": "Right-click any session in the sidebar to set it as active for WeChat", "useOriginalImage": "Use Original Image", "useOriginalImageDesc": "Send full-size images to the model (uses more tokens). When off, thumbnails are used.", "keepaliveMaxCount": "Keepalive Messages", "keepaliveMaxCountDesc": "Max consecutive keepalive messages while thinking." }, "snippets": { "title": "Snippets", "desc": "Manage reusable text snippets for quick insertion.", "description": "Configure Snippets", "add": "Add Snippet", "edit": "Edit Snippet", "delete": "Delete", "save": "Save", "cancel": "Cancel", "empty": "No snippets configured", "saveFailed": "Failed to save snippets.", "titleLabel": "Title", "titlePlaceholder": "Title", "contentLabel": "Content", "contentPlaceholder": "Content", "dialogDesc": "Configure the snippet title and content.", "confirmDeleteTitle": "Delete Snippet", "confirmDeleteDesc": "Are you sure you want to delete this snippet? This action cannot be undone.", "validation": { "enterTitle": "Please enter a title.", "enterContent": "Please enter content." } }, "memory": { "title": "Memory", "desc": "View and manage persistent project-level memory.", "projectMemories": "Project Memories", "refresh": "Refresh", "clear": "Clear", "cleared": "Memory cleared.", "clearFailed": "Failed to clear memory.", "confirmClearTitle": "Clear Memory", "confirmClearDesc": 'Are you sure you want to clear all memory for project "{{title}}"? This cannot be undone.', "revealInFinder": "Reveal in Finder", "revealFailed": "Failed to reveal file.", "noFile": "No memory file found.", "noProjects": "No projects found.", "empty": "No memories stored.", "entries": "Entries" }, "imageGeneration": { "title": "Image Generation", "desc": "Configure image generation providers. The active provider will be available as a tool for agents.", "providers": "Providers", "add": "Add Provider", "addProvider": "Add Provider", "editProvider": "Edit Provider", "dialogDesc": "Configure provider, endpoint and authentication for image generation.", "edit": "Edit", "delete": "Delete", "empty": "No image generation providers configured", "updateFailed": "Failed to update configuration.", "confirmDeleteTitle": "Delete Provider", "confirmDeleteDesc": "Are you sure you want to delete this image generation provider?", "cancel": "Cancel", "save": "Save", "form": { "name": "Name", "provider": "Provider", "baseUrl": "Base URL", "baseUrlHint": "Request → {baseUrl}/images/generations", "apiKey": "API Key", "headers": "Headers (JSON)", "extraBody": "Extra Body (JSON)", "extraBodyHint": "Additional parameters merged into request body (e.g. quality, style).", "model": "Model" }, "validation": { "enterName": "Please enter a name.", "selectProvider": "Please select a provider.", "enterBaseUrl": "Please enter a base URL.", "enterApiKey": "Please enter an API key.", "enterModel": "Please enter the model name.", "jsonObject": "Must be a valid JSON object with string values." } } };
16891
+ const settings$1 = /* @__PURE__ */ JSON.parse(`{"themeDesc":"Customize the appearance of the application","languageDesc":"Select the display language","title":"Settings","general":{"title":"General","desc":"Manage your application settings.","theme":"Theme","light":"Light","dark":"Dark","system":"System","language":"Language","english":"English","chinese":"简体中文","saveThemeFailed":"Failed to save theme setting.","saveLanguageFailed":"Failed to save language setting.","groupAppearance":"Appearance","groupProject":"Project","autoWatchFiles":"Auto Watch Files","autoWatchFilesDesc":"Automatically watch project file changes","saveFileWatcherFailed":"Failed to save file watcher setting.","groupNetwork":"Network","proxy":"Network Proxy","proxyDesc":"Configure the network proxy used by Fello for Node requests, subprocesses and the UI.","proxyEdit":"Edit proxy settings","proxyOff":"Direct","proxySystem":"System","groupSound":"Sound","soundEnabled":"Sound Effects","soundEnabledDesc":"Play sound effects for notifications","soundVolume":"Volume","soundVolumeDesc":"Adjust notification volume","soundTheme":"Sound Style","soundThemeDesc":"Select the sound effect style","soundSoft":"Soft","soundCrisp":"Crisp","soundTest":"Test","soundTestDesc":"Preview the current sound effect","soundTestPlay":"Play","saveSoundFailed":"Failed to save sound setting.","groupEditor":"Editor","editor":"Open in Editor","editorDesc":"Choose the editor to open files","selectEditor":"Select editor","saveEditorFailed":"Failed to save editor setting."},"agents":{"desc":"Manage agent configurations and startup commands.","description":"Configure agents","title":"Agents","addAgent":"Add Agent","addStdioAgent":"Add Stdio Agent","addApiAgent":"Add API Agent","editAgent":"Edit Agent","dialogDesc":"Configure the agent ID, command, arguments and environment variables.","apiDialogDesc":"Configure provider, endpoint and authentication for API agent.","agentId":"Agent ID (Name)","apiProvider":"Provider","apiBaseUrl":"Base URL","apiKey":"API Key","apiHeaders":"Headers (JSON)","contextWindowTokens":"Context Window (tokens)","modelIdTemplate":"Model Id Template","models":"Models (one per line)","modelsHint":"Usually not needed — models are fetched automatically. Only specify if the API doesn't return the models you need","command":"Command","args":"Arguments","envVars":"Environment Variables (JSON)","envJson":"Environment Variables (JSON)","cancel":"Cancel","save":"Save","edit":"Edit","delete":"Delete","dragToReorder":"Drag to reorder","noAgents":"No agents configured","errorIdCommand":"ID and Command are required.","errorDuplicateId":"An agent with this ID already exists.","errorEnvJson":"Env must be a valid JSON object.","errorContextWindowTokens":"Context Window must be a positive integer.","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete Agent","confirmDeleteDesc":"Are you sure you want to delete this agent? This action cannot be undone.","confirmDeleteDescWithSessions":"Are you sure you want to delete this agent? {{count}} session(s) will also be deleted. This action cannot be undone.","reset":"Reset Agent","resetSuccess":"Agent reset.","resetFailed":"Failed to reset agent.","deleteAllSessions":"Delete All Sessions","confirmDeleteAllSessionsTitle":"Delete All Sessions","confirmDeleteAllSessionsDesc":"All sessions for this agent will be permanently deleted. This action cannot be undone.","deleteAllSessionsSuccess":"{{count}} session(s) deleted.","deleteAllSessionsFailed":"Failed to delete sessions.","validation":{"enterId":"Please enter an agent ID.","idFormat":"Only letters, numbers, _ and - allowed.","selectProvider":"Please select a provider.","enterBaseUrl":"Please enter a base URL.","enterApiKey":"Please enter an API key.","enterCommand":"Please enter a command.","jsonObject":"Must be a valid JSON object with string values.","positiveInteger":"Must be a positive integer."}},"mcp":{"desc":"Manage MCP server configurations and startup commands.","description":"Configure MCP Servers","title":"MCP Servers","addMcp":"Add MCP Server","addStdioMcp":"Add Stdio MCP","addHttpMcp":"Add HTTP MCP","addSseMcp":"Add SSE MCP","recommended":{"exa":{"name":"Exa","desc":"Exa MCP Server — AI Web Search"}},"editMcp":"Edit MCP Server","dialogDesc":"Configure the MCP server ID, command, arguments and environment variables.","mcpId":"MCP Server ID (Name)","command":"Command","args":"Arguments","envVars":"Environment Variables (JSON)","envJson":"Environment Variables (JSON)","url":"URL","headers":"Headers (JSON)","headersJson":"Headers (JSON)","httpDialogDesc":"Configure the MCP server ID, HTTP URL and request headers.","sseDialogDesc":"Configure the MCP server ID, SSE endpoint URL and request headers.","cancel":"Cancel","save":"Save","edit":"Edit","delete":"Delete","dragToReorder":"Drag to reorder","noMcpServers":"No MCP servers configured","errorIdRequired":"ID is required.","errorUrlRequired":"URL is required.","errorIdCommand":"ID and Command are required.","errorDuplicateId":"An MCP server with this ID already exists.","errorHeadersJson":"Headers must be a valid JSON object.","errorEnvJson":"Env must be a valid JSON object.","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete MCP Server","confirmDeleteDesc":"Are you sure you want to delete this MCP server? This action cannot be undone.","validation":{"enterId":"Please enter a server ID.","idFormat":"Only letters, numbers, _ and - allowed.","enterCommand":"Please enter a command.","enterUrl":"Please enter a URL.","jsonObject":"Must be a valid JSON object with string values."}},"webui":{"desc":"Configure remote access to the Fello interface.","title":"WebUI","enable":"Enable WebUI","enableDesc":"Allow remote access to Fello interface via browser","accessUrl":"Access URL","accessDesc":"Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.","enableAccess":"Enable WebUI Access","port":"Port:","token":"Token:","autoGenerated":"Auto-generated","copy":"Copy","note":"Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.","updateFailed":"Failed to update configuration.","disabledInWebUI":"WebUI configuration is disabled when running inside the browser."},"ilink":{"title":"WeChat iLink","description":"Connect Fello to WeChat via iLink Bot API. Once connected, a ClawBot contact will appear in your WeChat, allowing you to chat with your AI agent from anywhere.","connected":"Connected","notConnected":"Not Connected","notConnectedHint":"Scan QR code with WeChat to connect","login":"Login","loggingIn":"Waiting...","disconnect":"Disconnect","scanPrompt":"Scan with WeChat to login","qrcodeExpired":"QR code expired, please try again","scanned":"Scanned! Please confirm on your phone.","browserOpened":"QR code opened in browser. Scan with WeChat to login.","activeSession":"Active Session for WeChat","activeSessionHint":"Messages from WeChat will be routed to this session. Right-click a session in the sidebar to set it as active.","selectSession":"-- Select a session --","none":"-- None --","howItWorks":"How it works","step1":"Click \\"Login\\" to open the QR code in your browser","step2":"Scan the QR code with WeChat","step3":"A \\"ClawBot\\" contact appears in your WeChat","step4":"Chat with ClawBot — messages are routed to the active session above","step5":"Right-click any session in the sidebar to set it as active for WeChat","useOriginalImage":"Use Original Image","useOriginalImageDesc":"Send full-size images to the model (uses more tokens). When off, thumbnails are used.","keepaliveMaxCount":"Keepalive Messages","keepaliveMaxCountDesc":"Max consecutive keepalive messages while thinking."},"snippets":{"title":"Snippets","desc":"Manage reusable text snippets for quick insertion.","description":"Configure Snippets","add":"Add Snippet","edit":"Edit Snippet","delete":"Delete","save":"Save","cancel":"Cancel","empty":"No snippets configured","saveFailed":"Failed to save snippets.","titleLabel":"Title","titlePlaceholder":"Title","contentLabel":"Content","contentPlaceholder":"Content","dialogDesc":"Configure the snippet title and content.","confirmDeleteTitle":"Delete Snippet","confirmDeleteDesc":"Are you sure you want to delete this snippet? This action cannot be undone.","validation":{"enterTitle":"Please enter a title.","enterContent":"Please enter content."}},"memory":{"title":"Memory","desc":"View and manage persistent project-level memory.","projectMemories":"Project Memories","refresh":"Refresh","clear":"Clear","cleared":"Memory cleared.","clearFailed":"Failed to clear memory.","delete":"Delete","deleted":"Memory entry deleted.","deleteFailed":"Failed to delete memory entry.","confirmDeleteTitle":"Delete Memory Entry","confirmDeleteDesc":"Are you sure you want to delete this memory entry? This cannot be undone.","confirmClearTitle":"Clear Memory","confirmClearDesc":"Are you sure you want to clear all memory for project \\"{{title}}\\"? This cannot be undone.","revealInFinder":"Reveal in Finder","revealFailed":"Failed to reveal file.","noFile":"No memory file found.","noProjects":"No projects found.","empty":"No memories stored.","entries":"Entries"},"imageGeneration":{"title":"Image Generation","desc":"Configure image generation providers. The active provider will be available as a tool for agents.","providers":"Providers","add":"Add Provider","addProvider":"Add Provider","editProvider":"Edit Provider","dialogDesc":"Configure provider, endpoint and authentication for image generation.","edit":"Edit","delete":"Delete","empty":"No image generation providers configured","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete Provider","confirmDeleteDesc":"Are you sure you want to delete this image generation provider?","cancel":"Cancel","save":"Save","form":{"name":"Name","provider":"Provider","baseUrl":"Base URL","baseUrlHint":"Request → {baseUrl}/images/generations","apiKey":"API Key","headers":"Headers (JSON)","extraBody":"Extra Body (JSON)","extraBodyHint":"Additional parameters merged into request body (e.g. quality, style).","model":"Model"},"validation":{"enterName":"Please enter a name.","selectProvider":"Please select a provider.","enterBaseUrl":"Please enter a base URL.","enterApiKey":"Please enter an API key.","enterModel":"Please enter the model name.","jsonObject":"Must be a valid JSON object with string values."}},"proxy":{"title":"Network Proxy","mode":"Proxy Mode","off":"Direct","offDesc":"Connect directly without a proxy","manual":"Manual","manualDesc":"Specify a proxy server manually for all network requests","system":"System","systemDesc":"Use the system proxy settings (macOS/Windows or environment variables)","httpProxy":"HTTP Proxy","httpProxyPlaceholder":"e.g. http://127.0.0.1:7890","httpsProxy":"HTTPS Proxy (optional)","httpsProxyHint":"Falls back to the HTTP proxy when empty.","noProxy":"No Proxy (optional)","noProxyPlaceholder":"e.g. localhost,127.0.0.1,*.internal","username":"Username (optional)","password":"Password (optional)","cancel":"Cancel","save":"Save","later":"Later","restartNow":"Restart Now","restartTitle":"Restart Required","restartDesc":"Proxy settings saved. Restart Fello to apply the new proxy configuration.","restartManualDesc":"Proxy settings saved. Please manually restart the Fello server process to apply the new configuration.","saveFailed":"Failed to save proxy settings.","validation":{"httpProxyRequired":"HTTP proxy URL is required in manual mode.","invalidProxyUrl":"{{field}} should start with http:// or https://, or use a host:port address (e.g. 127.0.0.1:7890)."}}}`);
16890
16892
  const chat$1 = { "failedToLoadSession": "Failed to load session.", "failedToUpdateMcpServers": "Failed to update MCP servers." };
16891
16893
  const planBubble$1 = { "title": "Plan", "summary": "{{completed}} / {{total}} completed", "status": { "pending": "Pending", "inProgress": "In progress", "completed": "Completed" }, "priority": { "high": "High", "medium": "Medium", "low": "Low" } };
16892
16894
  const constant$5 = { "feature": { "title": "Features", "askUser": "Ask Me", "skills": "Skills", "shareToUser": "Share to User", "search": "Search", "memory": "Memory", "imageGeneration": "Image Generation" } };
@@ -16914,7 +16916,7 @@ const detail$1 = { "noContent": "No content" };
16914
16916
  const fileDetail$1 = { "fileNotFound": "File not found", "fileTooLarge": "File is too large to preview", "fileFormatNotSupported": "File format not supported for preview", "errorLoading": "Error loading file", "loading": "Loading...", "noChanges": "No changes detected", "resetZoom": "Reset", "preview": "Preview", "code": "Code", "compare": "Compare", "fileModifiedNotice": "File modified. Please refresh.", "copyFileContent": "Copy File Content", "addFileToChat": "Add File to Chat", "addSelectionToChat": "Add Selection to Chat", "loadError": "Failed to load", "zoomOut": "Zoom out", "zoomIn": "Zoom in", "previousPage": "Previous page", "nextPage": "Next page", "previousSlide": "Previous slide", "nextSlide": "Next slide", "speakerNotes": "Notes", "closeNotes": "Close" };
16915
16917
  const htmlDetail$1 = { "fileNotFound": "File not found or inaccessible", "errorLoading": "Failed to load", "loadFailed": "Page load failed", "retry": "Retry", "openInBrowser": "Open in browser", "webuiNotEnabled": "Enable WebUI first to open in browser", "open": "Open", "refresh": "Refresh" };
16916
16918
  const welcome$1 = { "title": "Fello", "desc": "Yet another Agent client based on the ACP protocol. Connect with the agent and begin collaborating.", "hint": "Start a new chat from the sidebar", "getStarted": "Get Started", "stepAgent": "Configure Agent", "stepAgentDesc": "Add an AI agent (Stdio or API) to power your conversations", "stepAgentDone": "{{count}} agent(s) configured", "stepProject": "Add Project", "stepProjectDesc": "Select a local project folder as your workspace", "stepProjectDone": "{{count}} project(s) added", "stepChat": "Start Chat", "stepChatDesc": "Create a new AI conversation in your project", "allDone": "All set! Start a new chat from the sidebar" };
16917
- const askUser$1 = { "title": "Request", "other": "Other...", "back": "Back", "inputPlaceholder": "Type your response... (Enter to send)", "submit": "Submit" };
16919
+ const askUser$1 = { "title": "Request", "other": "Other...", "back": "Back", "inputPlaceholder": "Type your response... (Enter to send)", "submit": "Submit", "autoClose": "Auto closes on timeout" };
16918
16920
  const shareToUser$1 = { "copyToProject": "Copy to project", "reveal": "Reveal in Finder", "loadFailed": "Failed to load image", "download": "Download" };
16919
16921
  const imageGeneration$1 = { "copyToProject": "Copy to project", "reveal": "Reveal in Finder", "loadFailed": "Failed to load image", "download": "Download" };
16920
16922
  const automation$1 = { "title": "Automation", "agent": "Agent", "alwaysDisabled": "always disabled", "anyMoment": "Any moment now", "back": "Back", "cancel": "Cancel", "create": "Create", "createFirst": "Create your first schedule", "delete": "Delete", "deleteConfirm": 'Delete "{{name}}" permanently?', "deleteTaskConfirm": "Delete this task permanently?", "deleteTaskTitle": "Delete Task", "deleteTitle": "Delete Schedule", "dialogDesc": "Configure the automated task schedule and prompt.", "editSchedule": "Edit Schedule", "editSettings": "Edit settings", "features": "Features", "files": "Files", "lastRun": "Last", "lessThanMinute": "Less than 1 min", "manual": "Manual", "manualDesc": "Manual trigger only. No automatic scheduling.", "mcpServers": "MCP Servers", "model": "Model", "modelPlaceholder": "Default model", "newSchedule": "New Schedule", "nextRun": "Next", "noFiles": "No files generated", "noSchedules": "No schedules yet", "emptyHint": "Schedule AI tasks to run automatically with cron expressions", "noTasksDesc": 'No runs yet. Click "Trigger now" to start the first run.', "prompt": "Prompt", "promptPlaceholder": "What should the agent do?", "save": "Save", "schedule": "Schedule", "scheduleName": "Schedule Name", "scheduleNamePlaceholder": "e.g. Morning Standup Summary", "scheduleNotFound": "Schedule not found", "schedules": "schedules", "selectFileToPreview": "Select a file to preview", "selectTaskToPreview": "Select a task to preview files", "selectTask": "Select a task", "timedExecution": "Timed (cron)", "triggerNow": "Trigger now", "validation": { "nameRequired": "Name is required", "agentRequired": "Agent is required", "promptRequired": "Prompt is required" }, "cron": { "at": "at", "atMinute": "at min", "custom": "Custom", "daily": "Every day", "hourly": "Every N hours", "weekdays": "Weekdays", "weekly": "Every week", "nextRun": "Next run", "nextRunIn": "Next run in", "lastRun": "Last run", "days": { "0": "Sun", "1": "Mon", "2": "Tue", "3": "Wed", "4": "Thu", "5": "Fri", "6": "Sat" } } };
@@ -16955,10 +16957,10 @@ const en$8 = {
16955
16957
  imageGeneration: imageGeneration$1,
16956
16958
  automation: automation$1
16957
16959
  };
16958
- const sidebar = { "welcome": "欢迎使用", "skills": "技能", "automation": "自动化", "projects": "项目", "noProjects": "暂无项目", "noProjectsHint": "添加一个项目文件夹开始", "addProject": "添加项目", "noAgentsHint": "请先配置 Agent", "configureAgent": "配置 Agent", "revealInFinder": "在访达中显示", "rename": "重命名", "delete": "删除", "renameProject": "重命名项目", "renameChat": "重命名会话", "deleteChat": "删除会话", "enterNewProjectName": "请输入新的项目名称。", "enterNewChatName": "请输入新的会话名称。", "addProjectTitle": "添加项目", "enterProjectPath": "请输入服务器上的项目绝对路径:", "pathCannotBeEmpty": "路径不能为空", "webuiEnabled": "已启用 WebUI", "deleteProject": "删除项目", "deleteProjectConfirm": "是否删除项目“{{title}}”及其所有会话?\n此操作无法撤销。", "deleteChatConfirm": "是否删除会话“{{title}}”?\n此操作无法撤销。", "cancel": "取消", "save": "保存", "settings": "设置", "agents": "智能体", "addProjectFailed": "添加项目失败。", "newChatFailed": "创建新会话失败。", "loadSessionFailed": "加载会话失败。", "revealInFinderFailed": "在访达中显示失败。", "projectExists": "项目已存在。", "projectNameEmpty": "项目名称不能为空。", "chatNameEmpty": "会话名称不能为空。", "newChat": "新会话", "projectActions": "项目操作:{{title}}", "createChatInProject": "在 {{title}} 中创建会话", "chatActions": "会话操作:{{title}}", "ilinkSetActive": "设为微信活跃会话", "ilinkUnsetActive": "取消微信活跃", "collapse": "收起侧边栏", "expand": "展开侧边栏", "newSessionDialog": { "title": "新建会话", "agent": "智能体", "selectAgent": "选择智能体", "mcp": "MCP", "noMcp": "未配置 MCP 服务器", "permission": "权限", "permissionAsk": "每次询问", "permissionAllowAll": "全部允许", "create": "创建" } };
16960
+ const sidebar = { "welcome": "欢迎使用", "skills": "技能", "automation": "自动化", "projects": "项目", "noProjects": "暂无项目", "noProjectsHint": "添加一个项目文件夹开始", "addProject": "添加项目", "noAgentsHint": "请先配置 Agent", "configureAgent": "配置 Agent", "revealInFinder": "在访达中显示", "rename": "重命名", "delete": "删除", "renameProject": "重命名项目", "renameChat": "重命名会话", "deleteChat": "删除会话", "enterNewProjectName": "请输入新的项目名称。", "enterNewChatName": "请输入新的会话名称。", "addProjectTitle": "添加项目", "enterProjectPath": "请输入服务器上的项目绝对路径:", "pathCannotBeEmpty": "路径不能为空", "webuiEnabled": "已启用 WebUI", "deleteProject": "删除项目", "deleteProjectConfirm": "是否删除项目“{{title}}”及其所有会话?\n此操作无法撤销。", "deleteChatConfirm": "是否删除会话“{{title}}”?\n此操作无法撤销。", "cancel": "取消", "save": "保存", "settings": "设置", "agents": "智能体", "addProjectFailed": "添加项目失败。", "newChatFailed": "创建新会话失败。", "loadSessionFailed": "加载会话失败。", "revealInFinderFailed": "在访达中显示失败。", "projectExists": "项目已存在。", "projectNameEmpty": "项目名称不能为空。", "chatNameEmpty": "会话名称不能为空。", "newChat": "新会话", "projectActions": "项目操作:{{title}}", "createChatInProject": "在 {{title}} 中创建会话", "chatActions": "会话操作:{{title}}", "ilinkSetActive": "设为微信活跃会话", "ilinkUnsetActive": "取消微信活跃", "collapse": "收起侧边栏", "expand": "展开侧边栏", "updated": "更新于", "created": "创建于", "newSessionDialog": { "title": "新建会话", "agent": "智能体", "selectAgent": "选择智能体", "mcp": "MCP", "noMcp": "未配置 MCP 服务器", "permission": "权限", "permissionAsk": "每次询问", "permissionAllowAll": "全部允许", "create": "创建" } };
16959
16961
  const skills = { "title": "技能", "installed": { "label": "已安装", "noDescription": "暂无描述。", "revealInFinder": "在访达中显示", "viewSkill": "查看 SKILL.md", "uninstall": "卸载", "uninstallTitle": "卸载技能", "uninstallConfirm": "确定要卸载 {{name}} 吗?", "cancel": "取消", "uninstalledSuccess": "技能 {{name}} 已卸载", "uninstallFailed": "卸载失败:{{message}}", "revealFailed": "在访达中显示失败:{{message}}", "loadFailed": "加载技能失败", "loadContentFailed": "加载技能内容出错:{{message}}", "noSkills": "暂无安装的技能" }, "skillsSh": { "label": "skills.sh", "title": "探索技能", "desc": "浏览并安装社区提供的技能,以增强你的 Agent 能力。", "searchPlaceholder": "搜索技能(例如:pr-review, react-best-practices)...", "install": "安装", "installSuccess": "技能 {{name}} 已安装", "installFailed": "安装失败", "noResults": "未找到相关技能", "installs": "{{count}} 次安装", "installedStatus": "已安装", "authorPrefix": "作者: " } };
16960
16962
  const contextMenu = { "cut": "剪切", "copy": "复制", "paste": "粘贴", "selectAll": "全选" };
16961
- const settings = { "themeDesc": "自定义应用的外观", "languageDesc": "选择应用显示的语言", "title": "设置", "general": { "title": "通用", "desc": "管理应用设置。", "theme": "主题", "light": "浅色", "dark": "深色", "system": "跟随系统", "language": "语言", "english": "English", "chinese": "简体中文", "saveThemeFailed": "保存主题设置失败。", "saveLanguageFailed": "保存语言设置失败。", "groupAppearance": "外观", "groupProject": "项目", "autoWatchFiles": "自动监听文件", "autoWatchFilesDesc": "自动监听项目文件变更", "saveFileWatcherFailed": "保存文件监听设置失败。", "groupSound": "音效", "soundEnabled": "音效", "soundEnabledDesc": "播放通知音效", "soundVolume": "音量", "soundVolumeDesc": "调整通知音量", "soundTheme": "音效风格", "soundThemeDesc": "选择音效风格", "soundSoft": "柔和", "soundCrisp": "清脆", "soundTest": "试听", "soundTestDesc": "预览当前音效效果", "soundTestPlay": "播放", "saveSoundFailed": "保存音效设置失败。", "groupEditor": "编辑器", "editor": "使用编辑器打开", "editorDesc": "选择用于打开文件的编辑器", "selectEditor": "选择编辑器", "saveEditorFailed": "保存编辑器设置失败。" }, "agents": { "desc": "管理智能体的配置和启动命令。", "description": "配置智能体", "title": "智能体", "addAgent": "添加智能体", "addStdioAgent": "添加 Stdio Agent", "addApiAgent": "添加 API Agent", "editAgent": "编辑智能体", "dialogDesc": "配置智能体 ID、命令、参数和环境变量。", "apiDialogDesc": "配置 API 智能体的提供商、端点和认证信息。", "agentId": "智能体 ID (名称)", "apiProvider": "提供商", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "请求头 (JSON)", "contextWindowTokens": "上下文窗口 (token)", "modelIdTemplate": "Model Id 模版", "models": "模型列表 (每行一个)", "modelsHint": "通常无需填写,会自动获取。仅在接口未返回所需模型时手动指定", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noAgents": "未配置任何智能体", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的智能体。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "errorContextWindowTokens": "上下文窗口必须为正整数。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除智能体", "confirmDeleteDesc": "确定要删除此智能体吗?此操作无法撤销。", "confirmDeleteDescWithSessions": "确定要删除此智能体吗?{{count}} 个会话也将被同时删除。此操作无法撤销。", "reset": "重置智能体", "resetSuccess": "智能体已重置。", "resetFailed": "重置智能体失败。", "deleteAllSessions": "删除所有会话", "confirmDeleteAllSessionsTitle": "删除所有会话", "confirmDeleteAllSessionsDesc": "此智能体的所有会话将被永久删除。此操作无法撤销。", "deleteAllSessionsSuccess": "已删除 {{count}} 个会话。", "deleteAllSessionsFailed": "删除会话失败。", "validation": { "enterId": "请输入智能体 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterCommand": "请输入命令。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。", "positiveInteger": "必须为正整数。" } }, "mcp": { "desc": "管理 MCP 服务器的配置和启动命令。", "description": "配置 MCP 服务器", "title": "MCP 服务器", "addMcp": "添加 MCP 服务器", "addStdioMcp": "添加 Stdio MCP", "addHttpMcp": "添加 HTTP MCP", "addSseMcp": "添加 SSE MCP", "recommended": { "exa": { "name": "Exa", "desc": "Exa MCP 服务器 — AI 网络搜索" } }, "editMcp": "编辑 MCP 服务器", "dialogDesc": "配置 MCP 服务器 ID、命令、参数和环境变量。", "mcpId": "MCP 服务器 ID (名称)", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "url": "URL", "headers": "请求头 (JSON)", "headersJson": "请求头 (JSON)", "httpDialogDesc": "配置 MCP 服务器 ID、HTTP URL 和请求头。", "sseDialogDesc": "配置 MCP 服务器 ID、SSE 端点 URL 和请求头。", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noMcpServers": "未配置任何 MCP 服务器", "errorIdRequired": "ID 不能为空。", "errorUrlRequired": "URL 不能为空。", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的 MCP 服务器。", "errorHeadersJson": "请求头必须是有效的 JSON 对象。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除 MCP 服务器", "confirmDeleteDesc": "确定要删除此 MCP 服务器吗?此操作无法撤销。", "validation": { "enterId": "请输入服务器 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "enterCommand": "请输入命令。", "enterUrl": "请输入 URL。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。" } }, "webui": { "desc": "配置对 Fello 界面的远程访问。", "title": "WebUI", "enable": "启用 WebUI", "enableDesc": "允许通过浏览器远程访问 Fello 界面", "enableAccess": "启用 WebUI 访问", "port": "端口:", "token": "Token:", "autoGenerated": "自动生成", "accessUrl": "访问地址", "accessDesc": "注意:此地址包含临时访问令牌,应用重启后将失效。", "copy": "复制", "note": "注意:此地址包含临时访问令牌,应用重启后将失效。", "updateFailed": "更新配置失败。", "disabledInWebUI": "WebUI 配置在浏览器中不可用。" }, "ilink": { "title": "微信 iLink", "description": "通过 iLink Bot API 将 Fello 接入微信。连接后,微信中会出现一个 ClawBot 联系人,你可以随时随地与 AI 智能体对话。", "connected": "已连接", "notConnected": "未连接", "notConnectedHint": "使用微信扫描二维码连接", "login": "登录", "loggingIn": "等待扫码...", "disconnect": "断开连接", "scanPrompt": "使用微信扫描二维码登录", "qrcodeExpired": "二维码已过期,请重新获取", "scanned": "已扫码!请在手机上确认登录。", "browserOpened": "二维码已在浏览器中打开,请使用微信扫码登录。", "activeSession": "微信活跃会话", "activeSessionHint": "微信消息将路由到此会话。可在侧边栏右键会话设为活跃。", "selectSession": "-- 选择一个会话 --", "none": "-- 无 --", "howItWorks": "使用说明", "step1": "点击「登录」在浏览器中打开二维码", "step2": "使用微信扫描二维码", "step3": "微信中出现「ClawBot」联系人", "step4": "与 ClawBot 聊天 — 消息将路由到上方选择的活跃会话", "step5": "在侧边栏右键任意会话即可设为微信活跃会话", "useOriginalImage": "使用原图", "useOriginalImageDesc": "向模型发送原始大小的图片(消耗更多 token)。关闭时使用缩略图。", "keepaliveMaxCount": "保活消息", "keepaliveMaxCountDesc": "AI 思考时最大连续保活消息数。" }, "snippets": { "title": "快捷短语", "desc": "管理可复用的文本片段,快速插入到对话中。", "description": "配置快捷短语", "add": "添加短语", "edit": "编辑短语", "delete": "删除", "save": "保存", "cancel": "取消", "empty": "暂无快捷短语", "saveFailed": "保存快捷短语失败。", "titleLabel": "标题", "titlePlaceholder": "标题", "contentLabel": "内容", "contentPlaceholder": "内容", "dialogDesc": "配置短语的标题和内容。", "confirmDeleteTitle": "删除短语", "confirmDeleteDesc": "确定要删除此短语吗?此操作无法撤销。", "validation": { "enterTitle": "请输入标题。", "enterContent": "请输入内容。" } }, "memory": { "title": "记忆", "desc": "查看和管理项目级持久化记忆。", "projectMemories": "项目记忆", "refresh": "刷新", "clear": "清除", "cleared": "记忆已清除。", "clearFailed": "清除记忆失败。", "confirmClearTitle": "清除记忆", "confirmClearDesc": '确定要清除项目 "{{title}}" 的所有记忆吗?此操作不可撤销。', "revealInFinder": "在访达中显示", "revealFailed": "显示文件失败。", "noFile": "未找到记忆文件。", "noProjects": "未找到项目。", "empty": "暂无记忆。", "entries": "条目" }, "imageGeneration": { "title": "图片生成", "desc": "配置图片生成服务提供商。激活的提供商将作为工具供 Agent 使用。", "providers": "提供商", "add": "添加提供商", "addProvider": "添加提供商", "editProvider": "编辑提供商", "dialogDesc": "配置图片生成的提供商、端点和认证信息。", "edit": "编辑", "delete": "删除", "empty": "尚未配置图片生成提供商", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除提供商", "confirmDeleteDesc": "确定要删除此图片生成提供商吗?", "cancel": "取消", "save": "保存", "form": { "name": "名称", "provider": "提供商", "baseUrl": "Base URL", "baseUrlHint": "请求将发送至 {baseUrl}/images/generations", "apiKey": "API Key", "headers": "请求头 (JSON)", "extraBody": "额外参数 (JSON)", "extraBodyHint": "合并到请求体中的额外参数(如 quality、style 等厂商特有参数)。", "model": "模型" }, "validation": { "enterName": "请输入名称。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterModel": "请输入模型名称。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。" } } };
16963
+ const settings = { "themeDesc": "自定义应用的外观", "languageDesc": "选择应用显示的语言", "title": "设置", "general": { "title": "通用", "desc": "管理应用设置。", "theme": "主题", "light": "浅色", "dark": "深色", "system": "跟随系统", "language": "语言", "english": "English", "chinese": "简体中文", "saveThemeFailed": "保存主题设置失败。", "saveLanguageFailed": "保存语言设置失败。", "groupAppearance": "外观", "groupProject": "项目", "autoWatchFiles": "自动监听文件", "autoWatchFilesDesc": "自动监听项目文件变更", "saveFileWatcherFailed": "保存文件监听设置失败。", "groupNetwork": "网络", "proxy": "网络代理", "proxyDesc": "配置 Fello 的网络代理,应用于 Node 请求、子进程与界面。", "proxyEdit": "修改代理设置", "proxyOff": "直连", "proxySystem": "跟随系统", "groupSound": "音效", "soundEnabled": "音效", "soundEnabledDesc": "播放通知音效", "soundVolume": "音量", "soundVolumeDesc": "调整通知音量", "soundTheme": "音效风格", "soundThemeDesc": "选择音效风格", "soundSoft": "柔和", "soundCrisp": "清脆", "soundTest": "试听", "soundTestDesc": "预览当前音效效果", "soundTestPlay": "播放", "saveSoundFailed": "保存音效设置失败。", "groupEditor": "编辑器", "editor": "使用编辑器打开", "editorDesc": "选择用于打开文件的编辑器", "selectEditor": "选择编辑器", "saveEditorFailed": "保存编辑器设置失败。" }, "agents": { "desc": "管理智能体的配置和启动命令。", "description": "配置智能体", "title": "智能体", "addAgent": "添加智能体", "addStdioAgent": "添加 Stdio Agent", "addApiAgent": "添加 API Agent", "editAgent": "编辑智能体", "dialogDesc": "配置智能体 ID、命令、参数和环境变量。", "apiDialogDesc": "配置 API 智能体的提供商、端点和认证信息。", "agentId": "智能体 ID (名称)", "apiProvider": "提供商", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "请求头 (JSON)", "contextWindowTokens": "上下文窗口 (token)", "modelIdTemplate": "Model Id 模版", "models": "模型列表 (每行一个)", "modelsHint": "通常无需填写,会自动获取。仅在接口未返回所需模型时手动指定", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noAgents": "未配置任何智能体", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的智能体。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "errorContextWindowTokens": "上下文窗口必须为正整数。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除智能体", "confirmDeleteDesc": "确定要删除此智能体吗?此操作无法撤销。", "confirmDeleteDescWithSessions": "确定要删除此智能体吗?{{count}} 个会话也将被同时删除。此操作无法撤销。", "reset": "重置智能体", "resetSuccess": "智能体已重置。", "resetFailed": "重置智能体失败。", "deleteAllSessions": "删除所有会话", "confirmDeleteAllSessionsTitle": "删除所有会话", "confirmDeleteAllSessionsDesc": "此智能体的所有会话将被永久删除。此操作无法撤销。", "deleteAllSessionsSuccess": "已删除 {{count}} 个会话。", "deleteAllSessionsFailed": "删除会话失败。", "validation": { "enterId": "请输入智能体 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterCommand": "请输入命令。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。", "positiveInteger": "必须为正整数。" } }, "mcp": { "desc": "管理 MCP 服务器的配置和启动命令。", "description": "配置 MCP 服务器", "title": "MCP 服务器", "addMcp": "添加 MCP 服务器", "addStdioMcp": "添加 Stdio MCP", "addHttpMcp": "添加 HTTP MCP", "addSseMcp": "添加 SSE MCP", "recommended": { "exa": { "name": "Exa", "desc": "Exa MCP 服务器 — AI 网络搜索" } }, "editMcp": "编辑 MCP 服务器", "dialogDesc": "配置 MCP 服务器 ID、命令、参数和环境变量。", "mcpId": "MCP 服务器 ID (名称)", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "url": "URL", "headers": "请求头 (JSON)", "headersJson": "请求头 (JSON)", "httpDialogDesc": "配置 MCP 服务器 ID、HTTP URL 和请求头。", "sseDialogDesc": "配置 MCP 服务器 ID、SSE 端点 URL 和请求头。", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noMcpServers": "未配置任何 MCP 服务器", "errorIdRequired": "ID 不能为空。", "errorUrlRequired": "URL 不能为空。", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的 MCP 服务器。", "errorHeadersJson": "请求头必须是有效的 JSON 对象。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除 MCP 服务器", "confirmDeleteDesc": "确定要删除此 MCP 服务器吗?此操作无法撤销。", "validation": { "enterId": "请输入服务器 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "enterCommand": "请输入命令。", "enterUrl": "请输入 URL。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。" } }, "webui": { "desc": "配置对 Fello 界面的远程访问。", "title": "WebUI", "enable": "启用 WebUI", "enableDesc": "允许通过浏览器远程访问 Fello 界面", "enableAccess": "启用 WebUI 访问", "port": "端口:", "token": "Token:", "autoGenerated": "自动生成", "accessUrl": "访问地址", "accessDesc": "注意:此地址包含临时访问令牌,应用重启后将失效。", "copy": "复制", "note": "注意:此地址包含临时访问令牌,应用重启后将失效。", "updateFailed": "更新配置失败。", "disabledInWebUI": "WebUI 配置在浏览器中不可用。" }, "ilink": { "title": "微信 iLink", "description": "通过 iLink Bot API 将 Fello 接入微信。连接后,微信中会出现一个 ClawBot 联系人,你可以随时随地与 AI 智能体对话。", "connected": "已连接", "notConnected": "未连接", "notConnectedHint": "使用微信扫描二维码连接", "login": "登录", "loggingIn": "等待扫码...", "disconnect": "断开连接", "scanPrompt": "使用微信扫描二维码登录", "qrcodeExpired": "二维码已过期,请重新获取", "scanned": "已扫码!请在手机上确认登录。", "browserOpened": "二维码已在浏览器中打开,请使用微信扫码登录。", "activeSession": "微信活跃会话", "activeSessionHint": "微信消息将路由到此会话。可在侧边栏右键会话设为活跃。", "selectSession": "-- 选择一个会话 --", "none": "-- 无 --", "howItWorks": "使用说明", "step1": "点击「登录」在浏览器中打开二维码", "step2": "使用微信扫描二维码", "step3": "微信中出现「ClawBot」联系人", "step4": "与 ClawBot 聊天 — 消息将路由到上方选择的活跃会话", "step5": "在侧边栏右键任意会话即可设为微信活跃会话", "useOriginalImage": "使用原图", "useOriginalImageDesc": "向模型发送原始大小的图片(消耗更多 token)。关闭时使用缩略图。", "keepaliveMaxCount": "保活消息", "keepaliveMaxCountDesc": "AI 思考时最大连续保活消息数。" }, "snippets": { "title": "快捷短语", "desc": "管理可复用的文本片段,快速插入到对话中。", "description": "配置快捷短语", "add": "添加短语", "edit": "编辑短语", "delete": "删除", "save": "保存", "cancel": "取消", "empty": "暂无快捷短语", "saveFailed": "保存快捷短语失败。", "titleLabel": "标题", "titlePlaceholder": "标题", "contentLabel": "内容", "contentPlaceholder": "内容", "dialogDesc": "配置短语的标题和内容。", "confirmDeleteTitle": "删除短语", "confirmDeleteDesc": "确定要删除此短语吗?此操作无法撤销。", "validation": { "enterTitle": "请输入标题。", "enterContent": "请输入内容。" } }, "memory": { "title": "记忆", "desc": "查看和管理项目级持久化记忆。", "projectMemories": "项目记忆", "refresh": "刷新", "clear": "清除", "cleared": "记忆已清除。", "clearFailed": "清除记忆失败。", "delete": "删除", "deleted": "记忆条目已删除。", "deleteFailed": "删除记忆条目失败。", "confirmDeleteTitle": "删除记忆条目", "confirmDeleteDesc": "确定要删除此记忆条目吗?此操作不可撤销。", "confirmClearTitle": "清除记忆", "confirmClearDesc": '确定要清除项目 "{{title}}" 的所有记忆吗?此操作不可撤销。', "revealInFinder": "在访达中显示", "revealFailed": "显示文件失败。", "noFile": "未找到记忆文件。", "noProjects": "未找到项目。", "empty": "暂无记忆。", "entries": "条目" }, "imageGeneration": { "title": "图片生成", "desc": "配置图片生成服务提供商。激活的提供商将作为工具供 Agent 使用。", "providers": "提供商", "add": "添加提供商", "addProvider": "添加提供商", "editProvider": "编辑提供商", "dialogDesc": "配置图片生成的提供商、端点和认证信息。", "edit": "编辑", "delete": "删除", "empty": "尚未配置图片生成提供商", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除提供商", "confirmDeleteDesc": "确定要删除此图片生成提供商吗?", "cancel": "取消", "save": "保存", "form": { "name": "名称", "provider": "提供商", "baseUrl": "Base URL", "baseUrlHint": "请求将发送至 {baseUrl}/images/generations", "apiKey": "API Key", "headers": "请求头 (JSON)", "extraBody": "额外参数 (JSON)", "extraBodyHint": "合并到请求体中的额外参数(如 quality、style 等厂商特有参数)。", "model": "模型" }, "validation": { "enterName": "请输入名称。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterModel": "请输入模型名称。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。" } }, "proxy": { "title": "网络代理", "mode": "代理模式", "off": "直连", "offDesc": "不使用代理,直接连接", "manual": "手动", "manualDesc": "手动指定代理服务器,所有网络请求走代理", "system": "跟随系统", "systemDesc": "使用系统代理设置(macOS/Windows 或环境变量)", "httpProxy": "HTTP 代理", "httpProxyPlaceholder": "例如 http://127.0.0.1:7890", "httpsProxy": "HTTPS 代理(可选)", "httpsProxyHint": "留空时回退到 HTTP 代理。", "noProxy": "不使用代理(可选)", "noProxyPlaceholder": "例如 localhost,127.0.0.1,*.internal", "username": "用户名(可选)", "password": "密码(可选)", "cancel": "取消", "save": "保存", "later": "稍后", "restartNow": "立即重启", "restartTitle": "需要重启", "restartDesc": "代理设置已保存,重启 Fello 后新的代理配置才会生效。", "restartManualDesc": "代理设置已保存,请手动重启 Fello 服务端进程后生效。", "saveFailed": "保存代理设置失败。", "validation": { "httpProxyRequired": "手动模式下必须填写 HTTP 代理地址。", "invalidProxyUrl": "{{field}} 应以 http:// 或 https:// 开头,或使用 host:port 形式(例如 127.0.0.1:7890)。" } } };
16962
16964
  const chat = { "failedToLoadSession": "加载会话失败。", "failedToUpdateMcpServers": "更新 MCP 服务器失败。" };
16963
16965
  const planBubble = { "title": "计划", "summary": "已完成 {{completed}} / {{total}}", "status": { "pending": "等待中", "inProgress": "进行中", "completed": "已完成" }, "priority": { "high": "高优先级", "medium": "中优先级", "low": "低优先级" } };
16964
16966
  const constant$4 = { "feature": { "title": "功能", "askUser": "向我提问", "skills": "技能", "shareToUser": "分享给用户", "search": "项目检索", "memory": "记忆", "imageGeneration": "图片生成" } };
@@ -16986,7 +16988,7 @@ const detail = { "noContent": "无内容" };
16986
16988
  const fileDetail = { "fileNotFound": "文件不存在", "fileTooLarge": "该文件过大不支持预览", "fileFormatNotSupported": "该文件格式不支持预览", "errorLoading": "加载文件失败", "loading": "加载中...", "noChanges": "无变更", "resetZoom": "重置", "preview": "预览", "code": "源码", "compare": "对比", "fileModifiedNotice": "文件已被修改,请刷新", "copyFileContent": "复制文件内容", "addFileToChat": "添加文件到会话", "addSelectionToChat": "添加选中内容到会话", "loadError": "加载失败", "zoomOut": "缩小", "zoomIn": "放大", "previousPage": "上一页", "nextPage": "下一页", "previousSlide": "上一张", "nextSlide": "下一张", "speakerNotes": "备注", "closeNotes": "关闭" };
16987
16989
  const htmlDetail = { "fileNotFound": "文件不存在或无法访问", "errorLoading": "加载失败", "loadFailed": "页面加载失败", "retry": "重试", "openInBrowser": "在浏览器中打开", "webuiNotEnabled": "请先启用 WebUI 才能在浏览器中打开", "open": "打开", "refresh": "刷新" };
16988
16990
  const welcome = { "title": "Fello", "desc": "又一个基于 ACP 协议的 Agent 客户端,连接智能体并开始协作。", "hint": "从左侧边栏新建会话开始", "getStarted": "开始使用", "stepAgent": "配置 Agent", "stepAgentDesc": "添加一个 AI 智能体(本地 Stdio 或 API)来驱动对话", "stepAgentDone": "已配置 {{count}} 个 Agent", "stepProject": "添加项目", "stepProjectDesc": "选择一个本地项目文件夹作为工作区", "stepProjectDone": "已添加 {{count}} 个项目", "stepChat": "开始会话", "stepChatDesc": "在项目中创建一个新的 AI 对话", "allDone": "一切就绪!从左侧边栏开始新会话吧" };
16989
- const askUser = { "title": "请求", "other": "其他...", "back": "返回", "inputPlaceholder": "输入你的回复...(回车发送)", "submit": "提交" };
16991
+ const askUser = { "title": "请求", "other": "其他...", "back": "返回", "inputPlaceholder": "输入你的回复...(回车发送)", "submit": "提交", "autoClose": "超时后自动关闭" };
16990
16992
  const shareToUser = { "copyToProject": "复制到项目", "reveal": "在访达中显示", "loadFailed": "图片加载失败" };
16991
16993
  const imageGeneration = { "copyToProject": "复制到项目", "reveal": "在访达中显示", "loadFailed": "图片加载失败", "download": "下载" };
16992
16994
  const automation = { "title": "自动化", "agent": "智能体", "alwaysDisabled": "始终禁用", "anyMoment": "即将执行", "back": "返回", "cancel": "取消", "create": "创建", "createFirst": "创建你的第一个计划", "delete": "删除", "deleteConfirm": "确定永久删除「{{name}}」?", "deleteTaskConfirm": "确定永久删除此任务?", "deleteTaskTitle": "删除任务", "deleteTitle": "删除计划", "dialogDesc": "配置自动化计划的执行规则和 Prompt。", "editSchedule": "编辑计划", "editSettings": "编辑设置", "features": "功能", "files": "文件", "lastRun": "上次", "lessThanMinute": "不到 1 分钟", "manual": "手动", "manualDesc": "仅手动触发,无定时计划。", "mcpServers": "MCP 服务器", "model": "模型", "modelPlaceholder": "默认模型", "newSchedule": "新建计划", "nextRun": "下次", "noFiles": "暂无生成文件", "noSchedules": "暂无计划", "emptyHint": "通过 cron 表达式配置定时 AI 任务,让 Agent 自动执行", "noTasksDesc": "暂无运行记录。点击「立即触发」开始第一次运行。", "prompt": "提示词", "promptPlaceholder": "智能体需要执行什么任务?", "save": "保存", "schedule": "计划", "scheduleName": "计划名称", "scheduleNamePlaceholder": "例如:每日站会摘要", "scheduleNotFound": "计划未找到", "schedules": "计划", "selectFileToPreview": "选择文件预览", "selectTaskToPreview": "选择任务查看文件", "selectTask": "选择一个任务", "timedExecution": "定时(cron)", "triggerNow": "立即触发", "validation": { "nameRequired": "名称不能为空", "agentRequired": "请选择智能体", "promptRequired": "提示词不能为空" }, "cron": { "at": "在", "atMinute": "第", "custom": "自定义", "daily": "每天", "hourly": "每隔 N 小时", "weekdays": "工作日", "weekly": "每周", "nextRun": "下次执行", "nextRunIn": "距离下次执行还有", "lastRun": "上次执行", "days": { "0": "周日", "1": "周一", "2": "周二", "3": "周三", "4": "周四", "5": "周五", "6": "周六" } } };
@@ -20757,6 +20759,14 @@ function calculateToolCallUpdate(state2, subSessionId, update2, displayId, recei
20757
20759
  state22.activeSubagents.set(subSessionId, subagentMessage);
20758
20760
  return subagentMessage.messages;
20759
20761
  })();
20762
+ if (subSessionId) {
20763
+ const mainIdx = state22.messages.findIndex(
20764
+ (m2) => m2.role === "tool_call" && m2.toolCallId === update2.toolCallId
20765
+ );
20766
+ if (mainIdx !== -1) {
20767
+ state22.messages.splice(mainIdx, 1);
20768
+ }
20769
+ }
20760
20770
  const idx = messages.findIndex(
20761
20771
  (m2) => m2.role === "tool_call" && m2.toolCallId === update2.toolCallId
20762
20772
  );
@@ -30983,35 +30993,35 @@ const createLucideIcon = (iconName, iconNode) => {
30983
30993
  Component.displayName = toPascalCase(iconName);
30984
30994
  return Component;
30985
30995
  };
30986
- const __iconNode$1t = [
30996
+ const __iconNode$1u = [
30987
30997
  ["path", { d: "M12 5v14", key: "s699le" }],
30988
30998
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
30989
30999
  ];
30990
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$1t);
30991
- const __iconNode$1s = [
31000
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$1u);
31001
+ const __iconNode$1t = [
30992
31002
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
30993
31003
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
30994
31004
  ];
30995
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1s);
30996
- const __iconNode$1r = [
31005
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1t);
31006
+ const __iconNode$1s = [
30997
31007
  ["path", { d: "m16 3 4 4-4 4", key: "1x1c3m" }],
30998
31008
  ["path", { d: "M20 7H4", key: "zbl0bi" }],
30999
31009
  ["path", { d: "m8 21-4-4 4-4", key: "h9nckh" }],
31000
31010
  ["path", { d: "M4 17h16", key: "g4d7ey" }]
31001
31011
  ];
31002
- const ArrowRightLeft = createLucideIcon("arrow-right-left", __iconNode$1r);
31003
- const __iconNode$1q = [
31012
+ const ArrowRightLeft = createLucideIcon("arrow-right-left", __iconNode$1s);
31013
+ const __iconNode$1r = [
31004
31014
  ["path", { d: "M5 3h14", key: "7usisc" }],
31005
31015
  ["path", { d: "m18 13-6-6-6 6", key: "1kf1n9" }],
31006
31016
  ["path", { d: "M12 7v14", key: "1akyts" }]
31007
31017
  ];
31008
- const ArrowUpToLine = createLucideIcon("arrow-up-to-line", __iconNode$1q);
31009
- const __iconNode$1p = [
31018
+ const ArrowUpToLine = createLucideIcon("arrow-up-to-line", __iconNode$1r);
31019
+ const __iconNode$1q = [
31010
31020
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
31011
31021
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
31012
31022
  ];
31013
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$1p);
31014
- const __iconNode$1o = [
31023
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$1q);
31024
+ const __iconNode$1p = [
31015
31025
  [
31016
31026
  "path",
31017
31027
  {
@@ -31020,13 +31030,13 @@ const __iconNode$1o = [
31020
31030
  }
31021
31031
  ]
31022
31032
  ];
31023
- const Astroid = createLucideIcon("astroid", __iconNode$1o);
31024
- const __iconNode$1n = [
31033
+ const Astroid = createLucideIcon("astroid", __iconNode$1p);
31034
+ const __iconNode$1o = [
31025
31035
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31026
31036
  ["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }]
31027
31037
  ];
31028
- const Ban = createLucideIcon("ban", __iconNode$1n);
31029
- const __iconNode$1m = [
31038
+ const Ban = createLucideIcon("ban", __iconNode$1o);
31039
+ const __iconNode$1n = [
31030
31040
  ["path", { d: "M12 7v6", key: "lw1j43" }],
31031
31041
  ["path", { d: "M15 10H9", key: "o6yqo3" }],
31032
31042
  [
@@ -31037,8 +31047,8 @@ const __iconNode$1m = [
31037
31047
  }
31038
31048
  ]
31039
31049
  ];
31040
- const BookmarkPlus = createLucideIcon("bookmark-plus", __iconNode$1m);
31041
- const __iconNode$1l = [
31050
+ const BookmarkPlus = createLucideIcon("bookmark-plus", __iconNode$1n);
31051
+ const __iconNode$1m = [
31042
31052
  ["path", { d: "M12 8V4H8", key: "hb8ula" }],
31043
31053
  ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
31044
31054
  ["path", { d: "M2 14h2", key: "vft8re" }],
@@ -31046,8 +31056,8 @@ const __iconNode$1l = [
31046
31056
  ["path", { d: "M15 13v2", key: "1xurst" }],
31047
31057
  ["path", { d: "M9 13v2", key: "rq6x2g" }]
31048
31058
  ];
31049
- const Bot = createLucideIcon("bot", __iconNode$1l);
31050
- const __iconNode$1k = [
31059
+ const Bot = createLucideIcon("bot", __iconNode$1m);
31060
+ const __iconNode$1l = [
31051
31061
  ["path", { d: "M12 18V5", key: "adv99a" }],
31052
31062
  ["path", { d: "M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4", key: "1e3is1" }],
31053
31063
  ["path", { d: "M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5", key: "1gqd8o" }],
@@ -31057,7 +31067,20 @@ const __iconNode$1k = [
31057
31067
  ["path", { d: "M6 18a4 4 0 0 1-2-7.464", key: "k1g0md" }],
31058
31068
  ["path", { d: "M6.003 5.125a4 4 0 0 0-2.526 5.77", key: "q97ue3" }]
31059
31069
  ];
31060
- const Brain = createLucideIcon("brain", __iconNode$1k);
31070
+ const Brain = createLucideIcon("brain", __iconNode$1l);
31071
+ const __iconNode$1k = [
31072
+ ["path", { d: "M8 2v3", key: "1ioesn" }],
31073
+ ["path", { d: "M16 2v3", key: "otl347" }],
31074
+ ["rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", key: "h1oib" }],
31075
+ ["path", { d: "M3 9h18", key: "1pudct" }],
31076
+ ["path", { d: "M8 13h.01", key: "1sbv64" }],
31077
+ ["path", { d: "M12 13h.01", key: "y0uutt" }],
31078
+ ["path", { d: "M16 13h.01", key: "wip0gl" }],
31079
+ ["path", { d: "M8 17h.01", key: "p3bg7i" }],
31080
+ ["path", { d: "M12 17h.01", key: "p32p05" }],
31081
+ ["path", { d: "M16 17h.01", key: "ql8jdd" }]
31082
+ ];
31083
+ const CalendarDays = createLucideIcon("calendar-days", __iconNode$1k);
31061
31084
  const __iconNode$1j = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
31062
31085
  const Check = createLucideIcon("check", __iconNode$1j);
31063
31086
  const __iconNode$1i = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
@@ -38398,6 +38421,13 @@ const electron = {
38398
38421
  if (isWebUI) return;
38399
38422
  return window.fello.invoke("installUpdate");
38400
38423
  },
38424
+ restartApp: async () => {
38425
+ if (isWebUI) {
38426
+ console.warn("WebUI mode: restartApp is not supported. Restart the server process manually.");
38427
+ return;
38428
+ }
38429
+ return window.fello.invoke("restartApp");
38430
+ },
38401
38431
  updateTheme: (theme) => {
38402
38432
  if (isWebUI || !window.fello) return;
38403
38433
  return window.fello.updateTheme(theme);
@@ -42844,11 +42874,437 @@ function ScrollBar({
42844
42874
  }
42845
42875
  );
42846
42876
  }
42877
+ const PreviewCardRootContext = /* @__PURE__ */ reactExports.createContext(void 0);
42878
+ function usePreviewCardRootContext(optional2) {
42879
+ const context = reactExports.useContext(PreviewCardRootContext);
42880
+ if (context === void 0 && !optional2) {
42881
+ throw new Error(formatErrorMessage(50));
42882
+ }
42883
+ return context;
42884
+ }
42885
+ const OPEN_DELAY$1 = 600;
42886
+ const CLOSE_DELAY = 300;
42887
+ const selectors$1 = {
42888
+ ...popupStoreSelectors,
42889
+ instantType: (state2) => state2.instantType,
42890
+ adaptiveOrigin: (state2) => state2.adaptiveOrigin,
42891
+ closeDelay: (state2) => state2.closeDelay
42892
+ };
42893
+ class PreviewCardStore extends ReactStore {
42894
+ constructor(initialState2, floatingId, nested) {
42895
+ const triggerElements = new PopupTriggerMap();
42896
+ super(createInitialState$1(initialState2, triggerElements, floatingId, nested), createInitialContext$1(triggerElements), selectors$1);
42897
+ }
42898
+ setOpen = (nextOpen, eventDetails) => {
42899
+ const {
42900
+ inlineRectCoordsRef
42901
+ } = this.context;
42902
+ applyPopupOpenChange(this, nextOpen, eventDetails, {
42903
+ onBeforeDispatch() {
42904
+ const event = eventDetails.event;
42905
+ if (nextOpen && eventDetails.reason === triggerHover && eventDetails.trigger && "clientX" in event && "clientY" in event && inlineRectCoordsRef.current?.element !== eventDetails.trigger) {
42906
+ updateInlineRectCoords(inlineRectCoordsRef, eventDetails.trigger, event.clientX, event.clientY);
42907
+ }
42908
+ }
42909
+ });
42910
+ };
42911
+ }
42912
+ function createInitialState$1(initialState2, triggerElements, floatingId, nested = false) {
42913
+ const state2 = {
42914
+ ...createInitialPopupStoreState(),
42915
+ instantType: void 0,
42916
+ adaptiveOrigin: void 0,
42917
+ closeDelay: CLOSE_DELAY,
42918
+ ...initialState2
42919
+ };
42920
+ state2.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);
42921
+ return state2;
42922
+ }
42923
+ function createInitialContext$1(triggerElements) {
42924
+ return {
42925
+ popupRef: /* @__PURE__ */ reactExports.createRef(),
42926
+ onOpenChange: void 0,
42927
+ onOpenChangeComplete: void 0,
42928
+ triggerElements,
42929
+ inlineRectCoordsRef: {
42930
+ current: void 0
42931
+ }
42932
+ };
42933
+ }
42934
+ function PreviewCardRootComponent(props) {
42935
+ const {
42936
+ open: openProp,
42937
+ defaultOpen = false,
42938
+ onOpenChange,
42939
+ onOpenChangeComplete,
42940
+ actionsRef,
42941
+ handle: handle2,
42942
+ triggerId: triggerIdProp,
42943
+ defaultTriggerId: defaultTriggerIdProp = null,
42944
+ children: children2
42945
+ } = props;
42946
+ const store = usePopupRootStore((floatingId, nested) => new PreviewCardStore({
42947
+ open: defaultOpen,
42948
+ openProp,
42949
+ activeTriggerId: defaultTriggerIdProp,
42950
+ triggerIdProp
42951
+ }, floatingId, nested));
42952
+ store.useControlledProp("openProp", openProp);
42953
+ store.useControlledProp("triggerIdProp", triggerIdProp);
42954
+ store.useContextCallback("onOpenChange", onOpenChange);
42955
+ store.useContextCallback("onOpenChangeComplete", onOpenChangeComplete);
42956
+ const open2 = store.useState("open");
42957
+ const activeTriggerId = store.useState("activeTriggerId");
42958
+ const mounted = store.useState("mounted");
42959
+ const payload = store.useState("payload");
42960
+ useImplicitActiveTrigger(store, {
42961
+ closeOnActiveTriggerUnmount: true
42962
+ });
42963
+ const {
42964
+ forceUnmount
42965
+ } = useOpenStateTransitions(open2, store, () => {
42966
+ store.context.inlineRectCoordsRef.current = void 0;
42967
+ });
42968
+ useIsoLayoutEffect(() => {
42969
+ if (open2) {
42970
+ if (activeTriggerId == null) {
42971
+ store.set("payload", void 0);
42972
+ }
42973
+ }
42974
+ }, [store, activeTriggerId, open2]);
42975
+ reactExports.useImperativeHandle(actionsRef, () => ({
42976
+ unmount: forceUnmount,
42977
+ close: () => store.setOpen(false, createChangeEventDetails(imperativeAction))
42978
+ }), [forceUnmount, store]);
42979
+ const shouldRenderInteractions = open2 || mounted;
42980
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(PreviewCardRootContext.Provider, {
42981
+ value: store,
42982
+ children: [handle2 && /* @__PURE__ */ jsxRuntimeExports.jsx(PopupHandleAttachment, {
42983
+ handle: handle2,
42984
+ store
42985
+ }), shouldRenderInteractions && /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardInteractions, {
42986
+ store
42987
+ }), typeof children2 === "function" ? children2({
42988
+ payload
42989
+ }) : children2]
42990
+ });
42991
+ }
42992
+ function PreviewCardInteractions({
42993
+ store
42994
+ }) {
42995
+ const floatingRootContext = store.useState("floatingRootContext");
42996
+ const dismiss = useDismiss(floatingRootContext);
42997
+ usePopupInteractionProps(store, {
42998
+ activeTriggerProps: dismiss.reference,
42999
+ inactiveTriggerProps: dismiss.trigger,
43000
+ popupProps: dismiss.floating
43001
+ });
43002
+ return null;
43003
+ }
43004
+ const PreviewCardRoot = fastComponent(function PreviewCardRoot2(props) {
43005
+ if (usePreviewCardRootContext(true)) {
43006
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardRootComponent, {
43007
+ ...props
43008
+ });
43009
+ }
43010
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(FloatingTree, {
43011
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardRootComponent, {
43012
+ ...props
43013
+ })
43014
+ });
43015
+ });
43016
+ const PreviewCardPortalContext = /* @__PURE__ */ reactExports.createContext(void 0);
43017
+ function usePreviewCardPortalContext() {
43018
+ const value = reactExports.useContext(PreviewCardPortalContext);
43019
+ if (value === void 0) {
43020
+ throw new Error(formatErrorMessage(48));
43021
+ }
43022
+ return value;
43023
+ }
43024
+ const PreviewCardPortal = /* @__PURE__ */ reactExports.forwardRef(function PreviewCardPortal2(props, forwardedRef) {
43025
+ const {
43026
+ keepMounted = false,
43027
+ ...portalProps
43028
+ } = props;
43029
+ const store = usePreviewCardRootContext();
43030
+ const mounted = store.useState("mounted");
43031
+ const shouldRender = mounted || keepMounted;
43032
+ if (!shouldRender) {
43033
+ return null;
43034
+ }
43035
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardPortalContext.Provider, {
43036
+ value: keepMounted,
43037
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(FloatingPortalLite, {
43038
+ ref: forwardedRef,
43039
+ ...portalProps
43040
+ })
43041
+ });
43042
+ });
43043
+ const PreviewCardTrigger = fastComponentRef(function PreviewCardTrigger2(componentProps, forwardedRef) {
43044
+ const {
43045
+ render: render4,
43046
+ className,
43047
+ delay,
43048
+ closeDelay,
43049
+ id: idProp,
43050
+ payload,
43051
+ handle: handle2,
43052
+ style: style2,
43053
+ ...elementProps
43054
+ } = componentProps;
43055
+ const rootContext = usePreviewCardRootContext(true);
43056
+ const handleStore = usePopupHandleStore(handle2);
43057
+ const store = handleStore ?? rootContext;
43058
+ if (!store) {
43059
+ throw new Error(formatErrorMessage(89));
43060
+ }
43061
+ const thisTriggerId = useBaseUiId(idProp);
43062
+ const isTriggerActive = store.useState("isTriggerActive", thisTriggerId);
43063
+ const isOpenedByThisTrigger = store.useState("isOpenedByTrigger", thisTriggerId);
43064
+ const floatingRootContext = store.useState("floatingRootContext");
43065
+ const inlineRectCoordsRef = store.context.inlineRectCoordsRef;
43066
+ const triggerElementRef = reactExports.useRef(null);
43067
+ const delayWithDefault = delay ?? OPEN_DELAY$1;
43068
+ const closeDelayWithDefault = closeDelay ?? CLOSE_DELAY;
43069
+ const {
43070
+ registerTrigger,
43071
+ isMountedByThisTrigger
43072
+ } = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store, {
43073
+ payload,
43074
+ closeDelay: closeDelayWithDefault
43075
+ });
43076
+ const hoverProps = useHoverReferenceInteraction(floatingRootContext, {
43077
+ mouseOnly: true,
43078
+ move: false,
43079
+ handleClose: safePolygon(),
43080
+ delay: () => ({
43081
+ open: delayWithDefault,
43082
+ close: closeDelayWithDefault
43083
+ }),
43084
+ triggerElementRef,
43085
+ isActiveTrigger: isTriggerActive,
43086
+ isClosing: () => store.select("transitionStatus") === "ending"
43087
+ });
43088
+ const focusProps = useFocus(floatingRootContext, {
43089
+ delay: delayWithDefault
43090
+ });
43091
+ const state2 = {
43092
+ open: isOpenedByThisTrigger
43093
+ };
43094
+ const rootTriggerProps = store.useState("triggerProps", isMountedByThisTrigger);
43095
+ const inlineRectTriggerProps = getInlineRectTriggerProps(inlineRectCoordsRef, isOpenedByThisTrigger);
43096
+ const element2 = useRenderElement("a", componentProps, {
43097
+ state: state2,
43098
+ ref: [forwardedRef, registerTrigger, triggerElementRef],
43099
+ props: [hoverProps, focusProps.reference, rootTriggerProps, inlineRectTriggerProps, {
43100
+ id: thisTriggerId
43101
+ }, elementProps],
43102
+ stateAttributesMapping: triggerOpenStateMapping$1
43103
+ });
43104
+ return element2;
43105
+ });
43106
+ const PreviewCardPositionerContext = /* @__PURE__ */ reactExports.createContext(void 0);
43107
+ function usePreviewCardPositionerContext() {
43108
+ const context = reactExports.useContext(PreviewCardPositionerContext);
43109
+ if (context === void 0) {
43110
+ throw new Error(formatErrorMessage(49));
43111
+ }
43112
+ return context;
43113
+ }
43114
+ const PreviewCardPositioner = /* @__PURE__ */ reactExports.forwardRef(function PreviewCardPositioner2(componentProps, forwardedRef) {
43115
+ const {
43116
+ render: render4,
43117
+ className,
43118
+ anchor: anchor2,
43119
+ positionMethod = "absolute",
43120
+ side = "bottom",
43121
+ align = "center",
43122
+ sideOffset = 0,
43123
+ alignOffset = 0,
43124
+ collisionBoundary = "clipping-ancestors",
43125
+ collisionPadding = 5,
43126
+ arrowPadding = 5,
43127
+ sticky = false,
43128
+ disableAnchorTracking = false,
43129
+ collisionAvoidance = POPUP_COLLISION_AVOIDANCE,
43130
+ style: style2,
43131
+ ...elementProps
43132
+ } = componentProps;
43133
+ const store = usePreviewCardRootContext();
43134
+ const keepMounted = usePreviewCardPortalContext();
43135
+ const nodeId = useFloatingNodeId();
43136
+ const open2 = store.useState("open");
43137
+ const mounted = store.useState("mounted");
43138
+ const floatingRootContext = store.useState("floatingRootContext");
43139
+ const instantType = store.useState("instantType");
43140
+ const transitionStatus = store.useState("transitionStatus");
43141
+ const adaptiveOrigin = store.useState("adaptiveOrigin");
43142
+ const inlineRectCoordsRef = store.context.inlineRectCoordsRef;
43143
+ const positioning = useAnchorPositioning({
43144
+ anchor: anchor2,
43145
+ floatingRootContext,
43146
+ positionMethod,
43147
+ mounted,
43148
+ side,
43149
+ sideOffset,
43150
+ align,
43151
+ alignOffset,
43152
+ arrowPadding,
43153
+ collisionBoundary,
43154
+ collisionPadding,
43155
+ sticky,
43156
+ disableAnchorTracking,
43157
+ keepMounted,
43158
+ nodeId,
43159
+ collisionAvoidance,
43160
+ adaptiveOrigin,
43161
+ inline: createInlineMiddleware(inlineRectCoordsRef)
43162
+ });
43163
+ const updatePosition = positioning.update;
43164
+ useIsoLayoutEffect(() => {
43165
+ if (open2 && mounted) {
43166
+ updatePosition();
43167
+ }
43168
+ }, [open2, mounted, updatePosition]);
43169
+ const state2 = {
43170
+ open: open2,
43171
+ side: positioning.side,
43172
+ align: positioning.align,
43173
+ anchorHidden: positioning.anchorHidden,
43174
+ instant: instantType
43175
+ };
43176
+ const element2 = usePositioner(componentProps, state2, {
43177
+ styles: positioning.positionerStyles,
43178
+ transitionStatus,
43179
+ props: elementProps,
43180
+ refs: [forwardedRef, store.useStateSetter("positionerElement")],
43181
+ hidden: !mounted,
43182
+ inert: !open2
43183
+ });
43184
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardPositionerContext.Provider, {
43185
+ value: positioning,
43186
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(FloatingNode, {
43187
+ id: nodeId,
43188
+ children: element2
43189
+ })
43190
+ });
43191
+ });
43192
+ const PreviewCardPopup = /* @__PURE__ */ reactExports.forwardRef(function PreviewCardPopup2(componentProps, forwardedRef) {
43193
+ const {
43194
+ className,
43195
+ render: render4,
43196
+ style: style2,
43197
+ ...elementProps
43198
+ } = componentProps;
43199
+ const store = usePreviewCardRootContext();
43200
+ const {
43201
+ side,
43202
+ align
43203
+ } = usePreviewCardPositionerContext();
43204
+ const open2 = store.useState("open");
43205
+ const instantType = store.useState("instantType");
43206
+ const transitionStatus = store.useState("transitionStatus");
43207
+ const popupProps = store.useState("popupProps");
43208
+ const floatingContext = store.useState("floatingRootContext");
43209
+ const closeDelay = store.useState("closeDelay");
43210
+ useOpenChangeComplete({
43211
+ open: open2,
43212
+ ref: store.context.popupRef,
43213
+ onComplete() {
43214
+ if (open2) {
43215
+ store.context.onOpenChangeComplete?.(true);
43216
+ }
43217
+ }
43218
+ });
43219
+ useHoverFloatingInteraction(floatingContext, {
43220
+ closeDelay
43221
+ });
43222
+ const state2 = {
43223
+ open: open2,
43224
+ side,
43225
+ align,
43226
+ instant: instantType,
43227
+ transitionStatus
43228
+ };
43229
+ const element2 = useRenderElement("div", componentProps, {
43230
+ state: state2,
43231
+ ref: [forwardedRef, store.context.popupRef, store.useStateSetter("popupElement")],
43232
+ props: [FOCUSABLE_POPUP_PROPS, popupProps, getDisabledMountTransitionStyles(transitionStatus), elementProps],
43233
+ stateAttributesMapping: popupTransitionStateMapping
43234
+ });
43235
+ return element2;
43236
+ });
43237
+ function HoverCard({ ...props }) {
43238
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardRoot, { "data-slot": "hover-card", ...props });
43239
+ }
43240
+ function HoverCardTrigger({ ...props }) {
43241
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardTrigger, { "data-slot": "hover-card-trigger", ...props });
43242
+ }
43243
+ function HoverCardContent({
43244
+ className,
43245
+ side = "bottom",
43246
+ sideOffset = 4,
43247
+ align = "center",
43248
+ alignOffset = 4,
43249
+ ...props
43250
+ }) {
43251
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardPortal, { "data-slot": "hover-card-portal", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
43252
+ PreviewCardPositioner,
43253
+ {
43254
+ align,
43255
+ alignOffset,
43256
+ side,
43257
+ sideOffset,
43258
+ className: "isolate z-50",
43259
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
43260
+ PreviewCardPopup,
43261
+ {
43262
+ "data-slot": "hover-card-content",
43263
+ className: cn$8(
43264
+ "z-50 w-64 origin-(--transform-origin) rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
43265
+ className
43266
+ ),
43267
+ ...props
43268
+ }
43269
+ )
43270
+ }
43271
+ ) });
43272
+ }
43273
+ function Separator({
43274
+ className,
43275
+ orientation = "horizontal",
43276
+ ...props
43277
+ }) {
43278
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
43279
+ Separator$1,
43280
+ {
43281
+ "data-slot": "separator",
43282
+ orientation,
43283
+ className: cn$8(
43284
+ "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
43285
+ className
43286
+ ),
43287
+ ...props
43288
+ }
43289
+ );
43290
+ }
42847
43291
  function getErrorMessage(error, fallbackMessage) {
42848
43292
  return extractErrorMessage(error) || fallbackMessage;
42849
43293
  }
43294
+ function formatRelativeTime(timestamp2, language) {
43295
+ const diff = Date.now() - timestamp2;
43296
+ const rtf = new Intl.RelativeTimeFormat(language, { numeric: "auto" });
43297
+ const minutes = Math.round(diff / 6e4);
43298
+ if (minutes < 1) return rtf.format(0, "minute");
43299
+ if (minutes < 60) return rtf.format(-minutes, "minute");
43300
+ const hours = Math.round(minutes / 60);
43301
+ if (hours < 24) return rtf.format(-hours, "hour");
43302
+ const days = Math.round(hours / 24);
43303
+ if (days < 30) return rtf.format(-days, "day");
43304
+ return new Date(timestamp2).toLocaleDateString(language);
43305
+ }
42850
43306
  function Sidebar() {
42851
- const { t: t2, i18n: _i18n } = useTranslation();
43307
+ const { t: t2, i18n } = useTranslation();
42852
43308
  const navigate = useNavigate();
42853
43309
  const location2 = useLocation();
42854
43310
  const [optimisticPath, setOptimisticPath] = reactExports.useState(null);
@@ -43307,128 +43763,248 @@ function Sidebar() {
43307
43763
  ]
43308
43764
  }
43309
43765
  ),
43310
- expanded && projectSessions.map((session2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
43311
- ContextMenu,
43312
- {
43313
- onOpenChange: (open2) => {
43314
- setOpenSessionMenuId(
43315
- (prev2) => open2 ? session2.id : prev2 === session2.id ? null : prev2
43316
- );
43317
- },
43318
- children: [
43319
- /* @__PURE__ */ jsxRuntimeExports.jsx(
43320
- ContextMenuTrigger,
43321
- {
43322
- render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
43323
- onClick: () => handleSelectSession(session2),
43324
- className: `group flex h-8 cursor-default items-center justify-between rounded-md pl-1.5 pr-2 text-xs font-normal transition-colors ${activeSessionId === session2.id ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground/95"} ${openSessionMenuId === session2.id ? "bg-sidebar-accent" : ""}`,
43325
- onContextMenu: (e11) => {
43326
- e11.stopPropagation();
43327
- },
43328
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
43329
- "div",
43766
+ expanded && projectSessions.map((session2) => {
43767
+ const agentLabel = configuredAgents.find((a2) => a2.id === session2.agentId)?.id || session2.agentId;
43768
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(HoverCard, { children: [
43769
+ /* @__PURE__ */ jsxRuntimeExports.jsx(HoverCardTrigger, { render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}), children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
43770
+ ContextMenu,
43771
+ {
43772
+ onOpenChange: (open2) => {
43773
+ setOpenSessionMenuId(
43774
+ (prev2) => open2 ? session2.id : prev2 === session2.id ? null : prev2
43775
+ );
43776
+ },
43777
+ children: [
43778
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
43779
+ ContextMenuTrigger,
43330
43780
  {
43331
- className: cn$8(
43332
- "flex min-w-0 flex-1 items-center gap-1.5",
43333
- session2.connectionStatus === "connected" ? "" : "opacity-60"
43334
- ),
43781
+ render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
43782
+ onClick: () => handleSelectSession(session2),
43783
+ className: `group flex h-8 cursor-default items-center justify-between rounded-md pl-1.5 pr-2 text-xs font-normal transition-colors ${activeSessionId === session2.id ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground/95"} ${openSessionMenuId === session2.id ? "bg-sidebar-accent" : ""}`,
43784
+ onContextMenu: (e11) => {
43785
+ e11.stopPropagation();
43786
+ },
43787
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
43788
+ "div",
43789
+ {
43790
+ className: cn$8(
43791
+ "flex min-w-0 flex-1 items-center gap-1.5",
43792
+ session2.connectionStatus === "connected" ? "" : "opacity-60"
43793
+ ),
43794
+ children: [
43795
+ (() => {
43796
+ const state2 = sessionStates.get(session2.id);
43797
+ const hasAskUser = (state2?.askUserRequests?.length ?? 0) > 0;
43798
+ const isStreaming = session2.isStreaming;
43799
+ const completedStatus = state2?.completedStatus;
43800
+ if (hasAskUser) {
43801
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleQuestionMark, { className: "size-3 shrink-0 text-sky-500" });
43802
+ }
43803
+ if (isStreaming) {
43804
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin shrink-0" });
43805
+ }
43806
+ if (completedStatus === "success" || state2?.completedAt && !completedStatus) {
43807
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 shrink-0 text-green-500" });
43808
+ }
43809
+ if (completedStatus === "error") {
43810
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3 shrink-0 text-yellow-500" });
43811
+ }
43812
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-3 shrink-0" });
43813
+ })(),
43814
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
43815
+ Badge,
43816
+ {
43817
+ variant: "outline",
43818
+ className: "px-1 -ml-0.5 text-[10px] uppercase select-none max-w-24",
43819
+ children: agentLabel
43820
+ }
43821
+ ),
43822
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate leading-normal select-none", children: session2.title || t2("sidebar.newChat", "New Chat") }),
43823
+ activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0 text-green-500" })
43824
+ ]
43825
+ }
43826
+ )
43827
+ }
43828
+ ),
43829
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43830
+ ContextMenuContent,
43831
+ {
43832
+ onClick: (e11) => e11.stopPropagation(),
43833
+ className: "w-auto",
43335
43834
  children: [
43336
- (() => {
43337
- const state2 = sessionStates.get(session2.id);
43338
- const hasAskUser = (state2?.askUserRequests?.length ?? 0) > 0;
43339
- const isStreaming = session2.isStreaming;
43340
- const completedStatus = state2?.completedStatus;
43341
- if (hasAskUser) {
43342
- return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleQuestionMark, { className: "size-3 shrink-0 text-sky-500" });
43343
- }
43344
- if (isStreaming) {
43345
- return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin shrink-0" });
43346
- }
43347
- if (completedStatus === "success" || state2?.completedAt && !completedStatus) {
43348
- return /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 shrink-0 text-green-500" });
43835
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43836
+ ContextMenuItem,
43837
+ {
43838
+ onClick: (e11) => {
43839
+ e11.stopPropagation();
43840
+ handleRenameSession(session2);
43841
+ },
43842
+ children: [
43843
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, {}),
43844
+ t2("sidebar.rename")
43845
+ ]
43349
43846
  }
43350
- if (completedStatus === "error") {
43351
- return /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3 shrink-0 text-yellow-500" });
43847
+ ),
43848
+ ilinkStatus.connected && activeIlinkSessionId !== session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43849
+ ContextMenuItem,
43850
+ {
43851
+ onClick: (e11) => {
43852
+ e11.stopPropagation();
43853
+ request.setActiveIlinkSession({ sessionId: session2.id }).catch(() => {
43854
+ });
43855
+ },
43856
+ children: [
43857
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, {}),
43858
+ t2("sidebar.ilinkSetActive", "Set as WeChat Active")
43859
+ ]
43352
43860
  }
43353
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-3 shrink-0" });
43354
- })(),
43355
- /* @__PURE__ */ jsxRuntimeExports.jsx(
43356
- Badge,
43861
+ ),
43862
+ ilinkStatus.connected && activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43863
+ ContextMenuItem,
43357
43864
  {
43358
- variant: "outline",
43359
- className: "px-1 -ml-0.5 text-[10px] uppercase select-none max-w-24",
43360
- children: configuredAgents.find((a2) => a2.id === session2.agentId)?.id || session2.agentId
43865
+ onClick: (e11) => {
43866
+ e11.stopPropagation();
43867
+ request.setActiveIlinkSession({ sessionId: "" }).catch(() => {
43868
+ });
43869
+ },
43870
+ children: [
43871
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, {}),
43872
+ t2("sidebar.ilinkUnsetActive", "Unset WeChat Active")
43873
+ ]
43361
43874
  }
43362
43875
  ),
43363
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate leading-normal select-none", children: session2.title || t2("sidebar.newChat", "New Chat") }),
43364
- activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0 text-green-500" })
43876
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
43877
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43878
+ ContextMenuItem,
43879
+ {
43880
+ variant: "destructive",
43881
+ onClick: (e11) => {
43882
+ e11.stopPropagation();
43883
+ void handleDeleteSession(session2);
43884
+ },
43885
+ children: [
43886
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
43887
+ t2("sidebar.delete")
43888
+ ]
43889
+ }
43890
+ )
43365
43891
  ]
43366
43892
  }
43367
43893
  )
43368
- }
43369
- ),
43370
- /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { onClick: (e11) => e11.stopPropagation(), className: "w-auto", children: [
43371
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
43372
- ContextMenuItem,
43373
- {
43374
- onClick: (e11) => {
43375
- e11.stopPropagation();
43376
- handleRenameSession(session2);
43377
- },
43378
- children: [
43379
- /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, {}),
43380
- t2("sidebar.rename")
43381
- ]
43382
- }
43383
- ),
43384
- ilinkStatus.connected && activeIlinkSessionId !== session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43385
- ContextMenuItem,
43386
- {
43387
- onClick: (e11) => {
43388
- e11.stopPropagation();
43389
- request.setActiveIlinkSession({ sessionId: session2.id }).catch(() => {
43390
- });
43391
- },
43392
- children: [
43393
- /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, {}),
43394
- t2("sidebar.ilinkSetActive", "Set as WeChat Active")
43395
- ]
43396
- }
43397
- ),
43398
- ilinkStatus.connected && activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43399
- ContextMenuItem,
43400
- {
43401
- onClick: (e11) => {
43402
- e11.stopPropagation();
43403
- request.setActiveIlinkSession({ sessionId: "" }).catch(() => {
43404
- });
43405
- },
43406
- children: [
43407
- /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, {}),
43408
- t2("sidebar.ilinkUnsetActive", "Unset WeChat Active")
43409
- ]
43410
- }
43411
- ),
43412
- /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
43413
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
43414
- ContextMenuItem,
43415
- {
43416
- variant: "destructive",
43417
- onClick: (e11) => {
43418
- e11.stopPropagation();
43419
- void handleDeleteSession(session2);
43420
- },
43421
- children: [
43422
- /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
43423
- t2("sidebar.delete")
43424
- ]
43425
- }
43426
- )
43427
- ] })
43428
- ]
43429
- },
43430
- session2.id
43431
- ))
43894
+ ]
43895
+ }
43896
+ ) }),
43897
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43898
+ HoverCardContent,
43899
+ {
43900
+ side: "right",
43901
+ align: "start",
43902
+ sideOffset: 14,
43903
+ alignOffset: 0,
43904
+ className: "max-w-86 min-w-48 w-auto p-3",
43905
+ children: [
43906
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
43907
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium leading-relaxed", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: session2.title || t2("sidebar.newChat", "New Chat") }) }),
43908
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
43909
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Bot, { className: "size-3 shrink-0" }),
43910
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: session2.agentId })
43911
+ ] }),
43912
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
43913
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-3 shrink-0" }),
43914
+ isWebUI ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: project.title }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
43915
+ "button",
43916
+ {
43917
+ type: "button",
43918
+ onClick: () => void handleRevealProjectInFinder(project),
43919
+ title: project.cwd,
43920
+ className: "min-w-0 flex-1 truncate text-left transition-colors hover:text-foreground",
43921
+ children: project.title
43922
+ }
43923
+ )
43924
+ ] }),
43925
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
43926
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3 shrink-0" }),
43927
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "truncate", children: [
43928
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mr-1", children: [
43929
+ t2("sidebar.updated", "Updated"),
43930
+ ":"
43931
+ ] }),
43932
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatRelativeTime(session2.updatedAt, i18n.language) })
43933
+ ] })
43934
+ ] }),
43935
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
43936
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CalendarDays, { className: "size-3 shrink-0" }),
43937
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "truncate", children: [
43938
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mr-1", children: [
43939
+ t2("sidebar.created", "Created"),
43940
+ ":"
43941
+ ] }),
43942
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatRelativeTime(session2.createdAt, i18n.language) })
43943
+ ] })
43944
+ ] })
43945
+ ] }),
43946
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Separator, { className: "my-2.5" }),
43947
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col -mx-2 -my-1", children: [
43948
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43949
+ "button",
43950
+ {
43951
+ type: "button",
43952
+ onClick: () => handleRenameSession(session2),
43953
+ className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
43954
+ children: [
43955
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3 shrink-0" }),
43956
+ t2("sidebar.rename")
43957
+ ]
43958
+ }
43959
+ ),
43960
+ ilinkStatus.connected && activeIlinkSessionId !== session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43961
+ "button",
43962
+ {
43963
+ type: "button",
43964
+ onClick: () => {
43965
+ request.setActiveIlinkSession({ sessionId: session2.id }).catch(() => {
43966
+ });
43967
+ },
43968
+ className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
43969
+ children: [
43970
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0" }),
43971
+ t2("sidebar.ilinkSetActive", "Set as WeChat Active")
43972
+ ]
43973
+ }
43974
+ ),
43975
+ ilinkStatus.connected && activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43976
+ "button",
43977
+ {
43978
+ type: "button",
43979
+ onClick: () => {
43980
+ request.setActiveIlinkSession({ sessionId: "" }).catch(() => {
43981
+ });
43982
+ },
43983
+ className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
43984
+ children: [
43985
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0 text-green-500" }),
43986
+ t2("sidebar.ilinkUnsetActive", "Unset WeChat Active")
43987
+ ]
43988
+ }
43989
+ ),
43990
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43991
+ "button",
43992
+ {
43993
+ type: "button",
43994
+ onClick: () => void handleDeleteSession(session2),
43995
+ className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-destructive transition-colors hover:bg-destructive/10",
43996
+ children: [
43997
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3 shrink-0" }),
43998
+ t2("sidebar.delete")
43999
+ ]
44000
+ }
44001
+ )
44002
+ ] })
44003
+ ]
44004
+ }
44005
+ )
44006
+ ] }, session2.id);
44007
+ })
43432
44008
  ] }, project.id);
43433
44009
  }) }) }),
43434
44010
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-auto border-t border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -43962,7 +44538,7 @@ function Welcome() {
43962
44538
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "absolute bottom-3 right-4 text-[11px] text-muted-foreground/40 z-10 pointer-events-none", children: [
43963
44539
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
43964
44540
  "v",
43965
- "0.1.46"
44541
+ "0.1.48"
43966
44542
  ] }),
43967
44543
  false
43968
44544
  ] }),
@@ -44129,7 +44705,7 @@ function usePopoverRootContext(optional2) {
44129
44705
  }
44130
44706
  return context;
44131
44707
  }
44132
- const selectors$1 = {
44708
+ const selectors = {
44133
44709
  ...popupStoreSelectors,
44134
44710
  disabled: (state2) => state2.disabled,
44135
44711
  instantType: (state2) => state2.instantType,
@@ -44147,7 +44723,7 @@ const selectors$1 = {
44147
44723
  class PopoverStore extends ReactStore {
44148
44724
  constructor(initialState2, floatingId, nested) {
44149
44725
  const triggerElements = new PopupTriggerMap();
44150
- super(createInitialState$1(initialState2, triggerElements, floatingId, nested), createInitialContext$1(triggerElements), selectors$1);
44726
+ super(createInitialState(initialState2, triggerElements, floatingId, nested), createInitialContext(triggerElements), selectors);
44151
44727
  }
44152
44728
  setOpen = (nextOpen, eventDetails) => {
44153
44729
  const isHover = eventDetails.reason === triggerHover;
@@ -44191,7 +44767,7 @@ class PopoverStore extends ReactStore {
44191
44767
  this.set("instantType", instantType);
44192
44768
  };
44193
44769
  }
44194
- function createInitialState$1(initialState2, triggerElements, floatingId, nested = false) {
44770
+ function createInitialState(initialState2, triggerElements, floatingId, nested = false) {
44195
44771
  const state2 = {
44196
44772
  ...createInitialPopupStoreState(),
44197
44773
  disabled: false,
@@ -44214,7 +44790,7 @@ function createInitialState$1(initialState2, triggerElements, floatingId, nested
44214
44790
  state2.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);
44215
44791
  return state2;
44216
44792
  }
44217
- function createInitialContext$1(triggerElements) {
44793
+ function createInitialContext(triggerElements) {
44218
44794
  return {
44219
44795
  popupRef: /* @__PURE__ */ reactExports.createRef(),
44220
44796
  onOpenChange: void 0,
@@ -44328,7 +44904,7 @@ function PopoverInteractions({
44328
44904
  });
44329
44905
  return null;
44330
44906
  }
44331
- const OPEN_DELAY$1 = 300;
44907
+ const OPEN_DELAY = 300;
44332
44908
  const PopoverTrigger = /* @__PURE__ */ reactExports.forwardRef(function PopoverTrigger2(componentProps, forwardedRef) {
44333
44909
  const {
44334
44910
  render: render4,
@@ -44339,7 +44915,7 @@ const PopoverTrigger = /* @__PURE__ */ reactExports.forwardRef(function PopoverT
44339
44915
  handle: handle2,
44340
44916
  payload,
44341
44917
  openOnHover = false,
44342
- delay = OPEN_DELAY$1,
44918
+ delay = OPEN_DELAY,
44343
44919
  closeDelay = 0,
44344
44920
  id: idProp,
44345
44921
  ...elementProps
@@ -46758,24 +47334,6 @@ function CollapsibleContent({
46758
47334
  }
46759
47335
  );
46760
47336
  }
46761
- function Separator({
46762
- className,
46763
- orientation = "horizontal",
46764
- ...props
46765
- }) {
46766
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
46767
- Separator$1,
46768
- {
46769
- "data-slot": "separator",
46770
- orientation,
46771
- className: cn$8(
46772
- "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
46773
- className
46774
- ),
46775
- ...props
46776
- }
46777
- );
46778
- }
46779
47337
  function ItemGroup({ className, ...props }) {
46780
47338
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
46781
47339
  "div",
@@ -70831,7 +71389,7 @@ var lr$5 = (e11) => {
70831
71389
  for (; t2 > 0 && e11[t2 - 1] === `
70832
71390
  `; ) t2--;
70833
71391
  return e11.slice(0, t2);
70834
- }, cr$4 = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-OFNGDK62-Bvl34wyh.js"), true ? [] : void 0, import.meta.url).then((e11) => ({ default: e11.HighlightedCodeBlockBody }))), st$8 = ({ code: e11, language: t2, className: o4, children: n2, isIncomplete: r3 = false, startLine: s16, lineNumbers: a2, ...l6 }) => {
71392
+ }, cr$4 = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-OFNGDK62-EglK-D82.js"), true ? [] : void 0, import.meta.url).then((e11) => ({ default: e11.HighlightedCodeBlockBody }))), st$8 = ({ code: e11, language: t2, className: o4, children: n2, isIncomplete: r3 = false, startLine: s16, lineNumbers: a2, ...l6 }) => {
70835
71393
  let i3 = y$d(), d2 = reactExports.useMemo(() => lr$5(e11), [e11]), c3 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: d2.split(`
70836
71394
  `).map((p3) => [{ content: p3, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [d2]);
70837
71395
  return jsxRuntimeExports.jsx(nt$8.Provider, { value: { code: e11 }, children: jsxRuntimeExports.jsxs(ot$8, { isIncomplete: r3, language: t2, children: [jsxRuntimeExports.jsx(rt$7, { language: t2 }), n2 ? jsxRuntimeExports.jsx("div", { className: i3("pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end"), children: jsxRuntimeExports.jsx("div", { className: i3("pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur"), "data-streamdown": "code-block-actions", children: n2 }) }) : null, jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: jsxRuntimeExports.jsx(At$6, { className: o4, language: t2, lineNumbers: a2, result: c3, startLine: s16, ...l6 }), children: jsxRuntimeExports.jsx(cr$4, { className: o4, code: d2, language: t2, lineNumbers: a2, raw: c3, startLine: s16, ...l6 }) })] }) });
@@ -95672,12 +96230,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
95672
96230
  registerLayoutLoaders([
95673
96231
  {
95674
96232
  name: "dagre",
95675
- loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-KV5264BT-DqnNoP69.js"), true ? __vite__mapDeps([0,1,2,3,4,5]) : void 0, import.meta.url), "loader")
96233
+ loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-KV5264BT-DW9CSFRI.js"), true ? __vite__mapDeps([0,1,2,3,4,5]) : void 0, import.meta.url), "loader")
95676
96234
  },
95677
96235
  ...[
95678
96236
  {
95679
96237
  name: "cose-bilkent",
95680
- loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-ljZi9cz-.js"), true ? __vite__mapDeps([6,7]) : void 0, import.meta.url), "loader")
96238
+ loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-Bjtibz95.js"), true ? __vite__mapDeps([6,7]) : void 0, import.meta.url), "loader")
95681
96239
  }
95682
96240
  ]
95683
96241
  ]);
@@ -96133,7 +96691,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
96133
96691
  }, "detector");
96134
96692
  var loader = /* @__PURE__ */ __name(async () => {
96135
96693
  const { diagram: diagram2 } = await __vitePreload(async () => {
96136
- const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-D9PM_R8p.js");
96694
+ const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-BfRmGEJy.js");
96137
96695
  return { diagram: diagram22 };
96138
96696
  }, true ? __vite__mapDeps([8,9]) : void 0, import.meta.url);
96139
96697
  return { id: id$1, diagram: diagram2 };
@@ -96153,7 +96711,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
96153
96711
  }, "detector");
96154
96712
  var loader2 = /* @__PURE__ */ __name(async () => {
96155
96713
  const { diagram: diagram2 } = await __vitePreload(async () => {
96156
- const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-T3H9Pqwa.js");
96714
+ const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-BrHGujcg.js");
96157
96715
  return { diagram: diagram22 };
96158
96716
  }, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
96159
96717
  return { id: id2, diagram: diagram2 };
@@ -96179,7 +96737,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
96179
96737
  }, "detector");
96180
96738
  var loader3 = /* @__PURE__ */ __name(async () => {
96181
96739
  const { diagram: diagram2 } = await __vitePreload(async () => {
96182
- const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-T3H9Pqwa.js");
96740
+ const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-BrHGujcg.js");
96183
96741
  return { diagram: diagram22 };
96184
96742
  }, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
96185
96743
  return { id: id3, diagram: diagram2 };
@@ -96196,7 +96754,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
96196
96754
  }, "detector");
96197
96755
  var loader4 = /* @__PURE__ */ __name(async () => {
96198
96756
  const { diagram: diagram2 } = await __vitePreload(async () => {
96199
- const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-BENPNKae.js");
96757
+ const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-DaVqqCcL.js");
96200
96758
  return { diagram: diagram22 };
96201
96759
  }, true ? __vite__mapDeps([15,12,13,14]) : void 0, import.meta.url);
96202
96760
  return { id: id4, diagram: diagram2 };
@@ -96213,7 +96771,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
96213
96771
  }, "detector");
96214
96772
  var loader5 = /* @__PURE__ */ __name(async () => {
96215
96773
  const { diagram: diagram2 } = await __vitePreload(async () => {
96216
- const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-BDXB9jT_.js");
96774
+ const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-dFtBMZmH.js");
96217
96775
  return { diagram: diagram22 };
96218
96776
  }, true ? __vite__mapDeps([16,17,18,19,4,2]) : void 0, import.meta.url);
96219
96777
  return { id: id5, diagram: diagram2 };
@@ -96230,7 +96788,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
96230
96788
  }, "detector");
96231
96789
  var loader6 = /* @__PURE__ */ __name(async () => {
96232
96790
  const { diagram: diagram2 } = await __vitePreload(async () => {
96233
- const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-Hh-AJvLC.js");
96791
+ const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-D9tlSXpr.js");
96234
96792
  return { diagram: diagram22 };
96235
96793
  }, true ? __vite__mapDeps([20,21,22,23]) : void 0, import.meta.url);
96236
96794
  return { id: id6, diagram: diagram2 };
@@ -96247,7 +96805,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
96247
96805
  }, "detector");
96248
96806
  var loader7 = /* @__PURE__ */ __name(async () => {
96249
96807
  const { diagram: diagram2 } = await __vitePreload(async () => {
96250
- const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-Ca_9-363.js");
96808
+ const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-CwoWvadJ.js");
96251
96809
  return { diagram: diagram22 };
96252
96810
  }, true ? __vite__mapDeps([24,19,4,2]) : void 0, import.meta.url);
96253
96811
  return { id: id7, diagram: diagram2 };
@@ -96263,7 +96821,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
96263
96821
  }, "detector");
96264
96822
  var loader8 = /* @__PURE__ */ __name(async () => {
96265
96823
  const { diagram: diagram2 } = await __vitePreload(async () => {
96266
- const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-CsCXUSKq.js");
96824
+ const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-owvRXepN.js");
96267
96825
  return { diagram: diagram22 };
96268
96826
  }, true ? __vite__mapDeps([25,17,19,4,2,26,27,22]) : void 0, import.meta.url);
96269
96827
  return { id: id8, diagram: diagram2 };
@@ -96279,7 +96837,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
96279
96837
  }, "detector");
96280
96838
  var loader9 = /* @__PURE__ */ __name(async () => {
96281
96839
  const { diagram: diagram2 } = await __vitePreload(async () => {
96282
- const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-B91qjO1u.js");
96840
+ const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-C9LRroTe.js");
96283
96841
  return { diagram: diagram22 };
96284
96842
  }, true ? __vite__mapDeps([28,21,22,23]) : void 0, import.meta.url);
96285
96843
  return { id: id9, diagram: diagram2 };
@@ -96296,7 +96854,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
96296
96854
  }, "detector");
96297
96855
  var loader10 = /* @__PURE__ */ __name(async () => {
96298
96856
  const { diagram: diagram2 } = await __vitePreload(async () => {
96299
- const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND-YtEoXmYf.js");
96857
+ const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND-Bzj4rKGX.js");
96300
96858
  return { diagram: diagram22 };
96301
96859
  }, true ? __vite__mapDeps([29,22,27,21,23]) : void 0, import.meta.url);
96302
96860
  return { id: id10, diagram: diagram2 };
@@ -96313,7 +96871,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
96313
96871
  }, "detector");
96314
96872
  var loader11 = /* @__PURE__ */ __name(async () => {
96315
96873
  const { diagram: diagram2 } = await __vitePreload(async () => {
96316
- const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-oDcN7qN5.js");
96874
+ const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-Ds_36REQ.js");
96317
96875
  return { diagram: diagram22 };
96318
96876
  }, true ? __vite__mapDeps([30,12,13]) : void 0, import.meta.url);
96319
96877
  return { id: id11, diagram: diagram2 };
@@ -96330,7 +96888,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
96330
96888
  }, "detector");
96331
96889
  var loader12 = /* @__PURE__ */ __name(async () => {
96332
96890
  const { diagram: diagram2 } = await __vitePreload(async () => {
96333
- const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-DCh5u6wY.js");
96891
+ const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-BdGUPHNX.js");
96334
96892
  return { diagram: diagram22 };
96335
96893
  }, true ? __vite__mapDeps([31,9,18]) : void 0, import.meta.url);
96336
96894
  return { id: id12, diagram: diagram2 };
@@ -96350,7 +96908,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
96350
96908
  }, "detector");
96351
96909
  var loader13 = /* @__PURE__ */ __name(async () => {
96352
96910
  const { diagram: diagram2 } = await __vitePreload(async () => {
96353
- const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-O6uMquiH.js");
96911
+ const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-ql_64jJs.js");
96354
96912
  return { diagram: diagram22 };
96355
96913
  }, true ? __vite__mapDeps([32,33,11,9,12,13]) : void 0, import.meta.url);
96356
96914
  return { id: id13, diagram: diagram2 };
@@ -96370,7 +96928,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
96370
96928
  }, "detector");
96371
96929
  var loader14 = /* @__PURE__ */ __name(async () => {
96372
96930
  const { diagram: diagram2 } = await __vitePreload(async () => {
96373
- const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-O6uMquiH.js");
96931
+ const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-ql_64jJs.js");
96374
96932
  return { diagram: diagram22 };
96375
96933
  }, true ? __vite__mapDeps([34,33,11,9,12,13]) : void 0, import.meta.url);
96376
96934
  return { id: id14, diagram: diagram2 };
@@ -96390,7 +96948,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
96390
96948
  }, "detector");
96391
96949
  var loader15 = /* @__PURE__ */ __name(async () => {
96392
96950
  const { diagram: diagram2 } = await __vitePreload(async () => {
96393
- const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-DV0gaxkj.js");
96951
+ const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-CruNLY-0.js");
96394
96952
  return { diagram: diagram22 };
96395
96953
  }, true ? __vite__mapDeps([35,36,12,13,1,2,3,4]) : void 0, import.meta.url);
96396
96954
  return { id: id15, diagram: diagram2 };
@@ -96413,7 +96971,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
96413
96971
  }, "detector");
96414
96972
  var loader16 = /* @__PURE__ */ __name(async () => {
96415
96973
  const { diagram: diagram2 } = await __vitePreload(async () => {
96416
- const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2-D1Sk_TKE.js");
96974
+ const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2-CfBaNTRC.js");
96417
96975
  return { diagram: diagram22 };
96418
96976
  }, true ? __vite__mapDeps([37,36,12,13]) : void 0, import.meta.url);
96419
96977
  return { id: id16, diagram: diagram2 };
@@ -96430,7 +96988,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
96430
96988
  }, "detector");
96431
96989
  var loader17 = /* @__PURE__ */ __name(async () => {
96432
96990
  const { diagram: diagram2 } = await __vitePreload(async () => {
96433
- const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-DkQAlc0b.js");
96991
+ const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-BwKJh5pl.js");
96434
96992
  return { diagram: diagram22 };
96435
96993
  }, true ? __vite__mapDeps([38,11,9,26]) : void 0, import.meta.url);
96436
96994
  return { id: id17, diagram: diagram2 };
@@ -96500,7 +97058,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
96500
97058
  }, "detector");
96501
97059
  var loader18 = /* @__PURE__ */ __name(async () => {
96502
97060
  const { diagram: diagram2 } = await __vitePreload(async () => {
96503
- const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-T3H9Pqwa.js");
97061
+ const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-BrHGujcg.js");
96504
97062
  return { diagram: diagram22 };
96505
97063
  }, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
96506
97064
  return { id: id18, diagram: diagram2 };
@@ -96517,7 +97075,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
96517
97075
  }, "detector");
96518
97076
  var loader19 = /* @__PURE__ */ __name(async () => {
96519
97077
  const { diagram: diagram2 } = await __vitePreload(async () => {
96520
- const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-Nq47TkPV.js");
97078
+ const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-CHPlJ2ZI.js");
96521
97079
  return { diagram: diagram22 };
96522
97080
  }, true ? __vite__mapDeps([39,26]) : void 0, import.meta.url);
96523
97081
  return { id: id19, diagram: diagram2 };
@@ -96534,7 +97092,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
96534
97092
  }, "detector");
96535
97093
  var loader20 = /* @__PURE__ */ __name(async () => {
96536
97094
  const { diagram: diagram2 } = await __vitePreload(async () => {
96537
- const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-B3rcYXPK.js");
97095
+ const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-_8DjK16S.js");
96538
97096
  return { diagram: diagram22 };
96539
97097
  }, true ? __vite__mapDeps([40,12,13]) : void 0, import.meta.url);
96540
97098
  return { id: id20, diagram: diagram2 };
@@ -96551,7 +97109,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
96551
97109
  }, "detector");
96552
97110
  var loader21 = /* @__PURE__ */ __name(async () => {
96553
97111
  const { diagram: diagram2 } = await __vitePreload(async () => {
96554
- const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-DamLzi6S.js");
97112
+ const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-uDhuFOXv.js");
96555
97113
  return { diagram: diagram22 };
96556
97114
  }, true ? __vite__mapDeps([41,11]) : void 0, import.meta.url);
96557
97115
  return { id: id21, diagram: diagram2 };
@@ -96568,7 +97126,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
96568
97126
  }, "detector");
96569
97127
  var loader22 = /* @__PURE__ */ __name(async () => {
96570
97128
  const { diagram: diagram2 } = await __vitePreload(async () => {
96571
- const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-DNQO_6oX.js");
97129
+ const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-6HuBoz3Q.js");
96572
97130
  return { diagram: diagram22 };
96573
97131
  }, true ? __vite__mapDeps([42,27,22]) : void 0, import.meta.url);
96574
97132
  return { id: id22, diagram: diagram2 };
@@ -96585,7 +97143,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
96585
97143
  }, "detector");
96586
97144
  var loader23 = /* @__PURE__ */ __name(async () => {
96587
97145
  const { diagram: diagram2 } = await __vitePreload(async () => {
96588
- const { diagram: diagram22 } = await import("./diagram-TYMM5635-Czl-GGCp.js");
97146
+ const { diagram: diagram22 } = await import("./diagram-TYMM5635-9K0cZf20.js");
96589
97147
  return { diagram: diagram22 };
96590
97148
  }, true ? __vite__mapDeps([43,17,19,4,2]) : void 0, import.meta.url);
96591
97149
  return { id: id23, diagram: diagram2 };
@@ -96601,7 +97159,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
96601
97159
  }, "detector");
96602
97160
  var loader24 = /* @__PURE__ */ __name(async () => {
96603
97161
  const { diagram: diagram2 } = await __vitePreload(async () => {
96604
- const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-DSH58P_m.js");
97162
+ const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-DUDbXS-d.js");
96605
97163
  return { diagram: diagram22 };
96606
97164
  }, true ? __vite__mapDeps([44,17,19,4,2]) : void 0, import.meta.url);
96607
97165
  return { id: id24, diagram: diagram2 };
@@ -96617,7 +97175,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
96617
97175
  }, "detector");
96618
97176
  var loader25 = /* @__PURE__ */ __name(async () => {
96619
97177
  const { diagram: diagram2 } = await __vitePreload(async () => {
96620
- const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-CiCuaiyL.js");
97178
+ const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-BBdankH4.js");
96621
97179
  return { diagram: diagram22 };
96622
97180
  }, true ? __vite__mapDeps([45,11,5,1,2,14]) : void 0, import.meta.url);
96623
97181
  return { id: id25, diagram: diagram2 };
@@ -96634,7 +97192,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
96634
97192
  }, "detector");
96635
97193
  var loader26 = /* @__PURE__ */ __name(async () => {
96636
97194
  const { diagram: diagram2 } = await __vitePreload(async () => {
96637
- const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-pBYJseHI.js");
97195
+ const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-Dptg-C7O.js");
96638
97196
  return { diagram: diagram22 };
96639
97197
  }, true ? __vite__mapDeps([46,17,18,19,4,2]) : void 0, import.meta.url);
96640
97198
  return { id: id26, diagram: diagram2 };
@@ -96651,7 +97209,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
96651
97209
  }, "detector");
96652
97210
  var loader27 = /* @__PURE__ */ __name(async () => {
96653
97211
  const { diagram: diagram2 } = await __vitePreload(async () => {
96654
- const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-BBRMDHvv.js");
97212
+ const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-B40mk-XJ.js");
96655
97213
  return { diagram: diagram22 };
96656
97214
  }, true ? __vite__mapDeps([47,17,19,4,2,7]) : void 0, import.meta.url);
96657
97215
  return { id: id27, diagram: diagram2 };
@@ -96668,7 +97226,7 @@ var detector28 = /* @__PURE__ */ __name((txt) => {
96668
97226
  }, "detector");
96669
97227
  var loader28 = /* @__PURE__ */ __name(async () => {
96670
97228
  const { diagram: diagram2 } = await __vitePreload(async () => {
96671
- const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-D3GtyA4e.js");
97229
+ const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-9MhN_EF5.js");
96672
97230
  return { diagram: diagram22 };
96673
97231
  }, true ? [] : void 0, import.meta.url);
96674
97232
  return { id: id28, diagram: diagram2 };
@@ -96684,7 +97242,7 @@ var detector29 = /* @__PURE__ */ __name((txt) => {
96684
97242
  }, "detector");
96685
97243
  var loader29 = /* @__PURE__ */ __name(async () => {
96686
97244
  const { diagram: diagram2 } = await __vitePreload(async () => {
96687
- const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-CMbmY-R_.js");
97245
+ const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-DMdQtt7i.js");
96688
97246
  return { diagram: diagram22 };
96689
97247
  }, true ? [] : void 0, import.meta.url);
96690
97248
  return { id: id29, diagram: diagram2 };
@@ -96701,7 +97259,7 @@ var detector30 = /* @__PURE__ */ __name((txt) => {
96701
97259
  }, "detector");
96702
97260
  var loader30 = /* @__PURE__ */ __name(async () => {
96703
97261
  const { diagram: diagram2 } = await __vitePreload(async () => {
96704
- const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-IPm9zWeG.js");
97262
+ const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-CX-JVWk7.js");
96705
97263
  return { diagram: diagram22 };
96706
97264
  }, true ? __vite__mapDeps([48,13,17,19,4,2,23,27,22]) : void 0, import.meta.url);
96707
97265
  return { id: id30, diagram: diagram2 };
@@ -96717,7 +97275,7 @@ var detector31 = /* @__PURE__ */ __name((text2) => {
96717
97275
  }, "detector");
96718
97276
  var loader31 = /* @__PURE__ */ __name(async () => {
96719
97277
  const { diagram: diagram2 } = await __vitePreload(async () => {
96720
- const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-8Kc4VQIw.js");
97278
+ const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-BI-3rQpv.js");
96721
97279
  return { diagram: diagram22 };
96722
97280
  }, true ? __vite__mapDeps([49,17,19,4,2]) : void 0, import.meta.url);
96723
97281
  return { id: id31, diagram: diagram2 };
@@ -137979,7 +138537,7 @@ function buildRehypePlugins(transformImageSrc) {
137979
138537
  const protocols = sanitizeSchema.protocols;
137980
138538
  const extendedSchema = {
137981
138539
  ...sanitizeSchema,
137982
- protocols: { ...protocols, src: [...protocols.src || [], "web"] }
138540
+ protocols: { ...protocols, src: [...protocols.src || [], "web", "fello"] }
137983
138541
  };
137984
138542
  const rehypeNormalizeRelativeLinks = () => (tree) => {
137985
138543
  const walk = (node2) => {
@@ -147167,402 +147725,6 @@ function _$9(t2) {
147167
147725
  function D$7(t2) {
147168
147726
  be$9.setTheme(t2);
147169
147727
  }
147170
- const PreviewCardRootContext = /* @__PURE__ */ reactExports.createContext(void 0);
147171
- function usePreviewCardRootContext(optional2) {
147172
- const context = reactExports.useContext(PreviewCardRootContext);
147173
- if (context === void 0 && !optional2) {
147174
- throw new Error(formatErrorMessage(50));
147175
- }
147176
- return context;
147177
- }
147178
- const OPEN_DELAY = 600;
147179
- const CLOSE_DELAY = 300;
147180
- const selectors = {
147181
- ...popupStoreSelectors,
147182
- instantType: (state2) => state2.instantType,
147183
- adaptiveOrigin: (state2) => state2.adaptiveOrigin,
147184
- closeDelay: (state2) => state2.closeDelay
147185
- };
147186
- class PreviewCardStore extends ReactStore {
147187
- constructor(initialState2, floatingId, nested) {
147188
- const triggerElements = new PopupTriggerMap();
147189
- super(createInitialState(initialState2, triggerElements, floatingId, nested), createInitialContext(triggerElements), selectors);
147190
- }
147191
- setOpen = (nextOpen, eventDetails) => {
147192
- const {
147193
- inlineRectCoordsRef
147194
- } = this.context;
147195
- applyPopupOpenChange(this, nextOpen, eventDetails, {
147196
- onBeforeDispatch() {
147197
- const event = eventDetails.event;
147198
- if (nextOpen && eventDetails.reason === triggerHover && eventDetails.trigger && "clientX" in event && "clientY" in event && inlineRectCoordsRef.current?.element !== eventDetails.trigger) {
147199
- updateInlineRectCoords(inlineRectCoordsRef, eventDetails.trigger, event.clientX, event.clientY);
147200
- }
147201
- }
147202
- });
147203
- };
147204
- }
147205
- function createInitialState(initialState2, triggerElements, floatingId, nested = false) {
147206
- const state2 = {
147207
- ...createInitialPopupStoreState(),
147208
- instantType: void 0,
147209
- adaptiveOrigin: void 0,
147210
- closeDelay: CLOSE_DELAY,
147211
- ...initialState2
147212
- };
147213
- state2.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);
147214
- return state2;
147215
- }
147216
- function createInitialContext(triggerElements) {
147217
- return {
147218
- popupRef: /* @__PURE__ */ reactExports.createRef(),
147219
- onOpenChange: void 0,
147220
- onOpenChangeComplete: void 0,
147221
- triggerElements,
147222
- inlineRectCoordsRef: {
147223
- current: void 0
147224
- }
147225
- };
147226
- }
147227
- function PreviewCardRootComponent(props) {
147228
- const {
147229
- open: openProp,
147230
- defaultOpen = false,
147231
- onOpenChange,
147232
- onOpenChangeComplete,
147233
- actionsRef,
147234
- handle: handle2,
147235
- triggerId: triggerIdProp,
147236
- defaultTriggerId: defaultTriggerIdProp = null,
147237
- children: children2
147238
- } = props;
147239
- const store = usePopupRootStore((floatingId, nested) => new PreviewCardStore({
147240
- open: defaultOpen,
147241
- openProp,
147242
- activeTriggerId: defaultTriggerIdProp,
147243
- triggerIdProp
147244
- }, floatingId, nested));
147245
- store.useControlledProp("openProp", openProp);
147246
- store.useControlledProp("triggerIdProp", triggerIdProp);
147247
- store.useContextCallback("onOpenChange", onOpenChange);
147248
- store.useContextCallback("onOpenChangeComplete", onOpenChangeComplete);
147249
- const open2 = store.useState("open");
147250
- const activeTriggerId = store.useState("activeTriggerId");
147251
- const mounted = store.useState("mounted");
147252
- const payload = store.useState("payload");
147253
- useImplicitActiveTrigger(store, {
147254
- closeOnActiveTriggerUnmount: true
147255
- });
147256
- const {
147257
- forceUnmount
147258
- } = useOpenStateTransitions(open2, store, () => {
147259
- store.context.inlineRectCoordsRef.current = void 0;
147260
- });
147261
- useIsoLayoutEffect(() => {
147262
- if (open2) {
147263
- if (activeTriggerId == null) {
147264
- store.set("payload", void 0);
147265
- }
147266
- }
147267
- }, [store, activeTriggerId, open2]);
147268
- reactExports.useImperativeHandle(actionsRef, () => ({
147269
- unmount: forceUnmount,
147270
- close: () => store.setOpen(false, createChangeEventDetails(imperativeAction))
147271
- }), [forceUnmount, store]);
147272
- const shouldRenderInteractions = open2 || mounted;
147273
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(PreviewCardRootContext.Provider, {
147274
- value: store,
147275
- children: [handle2 && /* @__PURE__ */ jsxRuntimeExports.jsx(PopupHandleAttachment, {
147276
- handle: handle2,
147277
- store
147278
- }), shouldRenderInteractions && /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardInteractions, {
147279
- store
147280
- }), typeof children2 === "function" ? children2({
147281
- payload
147282
- }) : children2]
147283
- });
147284
- }
147285
- function PreviewCardInteractions({
147286
- store
147287
- }) {
147288
- const floatingRootContext = store.useState("floatingRootContext");
147289
- const dismiss = useDismiss(floatingRootContext);
147290
- usePopupInteractionProps(store, {
147291
- activeTriggerProps: dismiss.reference,
147292
- inactiveTriggerProps: dismiss.trigger,
147293
- popupProps: dismiss.floating
147294
- });
147295
- return null;
147296
- }
147297
- const PreviewCardRoot = fastComponent(function PreviewCardRoot2(props) {
147298
- if (usePreviewCardRootContext(true)) {
147299
- return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardRootComponent, {
147300
- ...props
147301
- });
147302
- }
147303
- return /* @__PURE__ */ jsxRuntimeExports.jsx(FloatingTree, {
147304
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardRootComponent, {
147305
- ...props
147306
- })
147307
- });
147308
- });
147309
- const PreviewCardPortalContext = /* @__PURE__ */ reactExports.createContext(void 0);
147310
- function usePreviewCardPortalContext() {
147311
- const value = reactExports.useContext(PreviewCardPortalContext);
147312
- if (value === void 0) {
147313
- throw new Error(formatErrorMessage(48));
147314
- }
147315
- return value;
147316
- }
147317
- const PreviewCardPortal = /* @__PURE__ */ reactExports.forwardRef(function PreviewCardPortal2(props, forwardedRef) {
147318
- const {
147319
- keepMounted = false,
147320
- ...portalProps
147321
- } = props;
147322
- const store = usePreviewCardRootContext();
147323
- const mounted = store.useState("mounted");
147324
- const shouldRender = mounted || keepMounted;
147325
- if (!shouldRender) {
147326
- return null;
147327
- }
147328
- return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardPortalContext.Provider, {
147329
- value: keepMounted,
147330
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(FloatingPortalLite, {
147331
- ref: forwardedRef,
147332
- ...portalProps
147333
- })
147334
- });
147335
- });
147336
- const PreviewCardTrigger = fastComponentRef(function PreviewCardTrigger2(componentProps, forwardedRef) {
147337
- const {
147338
- render: render4,
147339
- className,
147340
- delay,
147341
- closeDelay,
147342
- id: idProp,
147343
- payload,
147344
- handle: handle2,
147345
- style: style2,
147346
- ...elementProps
147347
- } = componentProps;
147348
- const rootContext = usePreviewCardRootContext(true);
147349
- const handleStore = usePopupHandleStore(handle2);
147350
- const store = handleStore ?? rootContext;
147351
- if (!store) {
147352
- throw new Error(formatErrorMessage(89));
147353
- }
147354
- const thisTriggerId = useBaseUiId(idProp);
147355
- const isTriggerActive = store.useState("isTriggerActive", thisTriggerId);
147356
- const isOpenedByThisTrigger = store.useState("isOpenedByTrigger", thisTriggerId);
147357
- const floatingRootContext = store.useState("floatingRootContext");
147358
- const inlineRectCoordsRef = store.context.inlineRectCoordsRef;
147359
- const triggerElementRef = reactExports.useRef(null);
147360
- const delayWithDefault = delay ?? OPEN_DELAY;
147361
- const closeDelayWithDefault = closeDelay ?? CLOSE_DELAY;
147362
- const {
147363
- registerTrigger,
147364
- isMountedByThisTrigger
147365
- } = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store, {
147366
- payload,
147367
- closeDelay: closeDelayWithDefault
147368
- });
147369
- const hoverProps = useHoverReferenceInteraction(floatingRootContext, {
147370
- mouseOnly: true,
147371
- move: false,
147372
- handleClose: safePolygon(),
147373
- delay: () => ({
147374
- open: delayWithDefault,
147375
- close: closeDelayWithDefault
147376
- }),
147377
- triggerElementRef,
147378
- isActiveTrigger: isTriggerActive,
147379
- isClosing: () => store.select("transitionStatus") === "ending"
147380
- });
147381
- const focusProps = useFocus(floatingRootContext, {
147382
- delay: delayWithDefault
147383
- });
147384
- const state2 = {
147385
- open: isOpenedByThisTrigger
147386
- };
147387
- const rootTriggerProps = store.useState("triggerProps", isMountedByThisTrigger);
147388
- const inlineRectTriggerProps = getInlineRectTriggerProps(inlineRectCoordsRef, isOpenedByThisTrigger);
147389
- const element2 = useRenderElement("a", componentProps, {
147390
- state: state2,
147391
- ref: [forwardedRef, registerTrigger, triggerElementRef],
147392
- props: [hoverProps, focusProps.reference, rootTriggerProps, inlineRectTriggerProps, {
147393
- id: thisTriggerId
147394
- }, elementProps],
147395
- stateAttributesMapping: triggerOpenStateMapping$1
147396
- });
147397
- return element2;
147398
- });
147399
- const PreviewCardPositionerContext = /* @__PURE__ */ reactExports.createContext(void 0);
147400
- function usePreviewCardPositionerContext() {
147401
- const context = reactExports.useContext(PreviewCardPositionerContext);
147402
- if (context === void 0) {
147403
- throw new Error(formatErrorMessage(49));
147404
- }
147405
- return context;
147406
- }
147407
- const PreviewCardPositioner = /* @__PURE__ */ reactExports.forwardRef(function PreviewCardPositioner2(componentProps, forwardedRef) {
147408
- const {
147409
- render: render4,
147410
- className,
147411
- anchor: anchor2,
147412
- positionMethod = "absolute",
147413
- side = "bottom",
147414
- align = "center",
147415
- sideOffset = 0,
147416
- alignOffset = 0,
147417
- collisionBoundary = "clipping-ancestors",
147418
- collisionPadding = 5,
147419
- arrowPadding = 5,
147420
- sticky = false,
147421
- disableAnchorTracking = false,
147422
- collisionAvoidance = POPUP_COLLISION_AVOIDANCE,
147423
- style: style2,
147424
- ...elementProps
147425
- } = componentProps;
147426
- const store = usePreviewCardRootContext();
147427
- const keepMounted = usePreviewCardPortalContext();
147428
- const nodeId = useFloatingNodeId();
147429
- const open2 = store.useState("open");
147430
- const mounted = store.useState("mounted");
147431
- const floatingRootContext = store.useState("floatingRootContext");
147432
- const instantType = store.useState("instantType");
147433
- const transitionStatus = store.useState("transitionStatus");
147434
- const adaptiveOrigin = store.useState("adaptiveOrigin");
147435
- const inlineRectCoordsRef = store.context.inlineRectCoordsRef;
147436
- const positioning = useAnchorPositioning({
147437
- anchor: anchor2,
147438
- floatingRootContext,
147439
- positionMethod,
147440
- mounted,
147441
- side,
147442
- sideOffset,
147443
- align,
147444
- alignOffset,
147445
- arrowPadding,
147446
- collisionBoundary,
147447
- collisionPadding,
147448
- sticky,
147449
- disableAnchorTracking,
147450
- keepMounted,
147451
- nodeId,
147452
- collisionAvoidance,
147453
- adaptiveOrigin,
147454
- inline: createInlineMiddleware(inlineRectCoordsRef)
147455
- });
147456
- const updatePosition = positioning.update;
147457
- useIsoLayoutEffect(() => {
147458
- if (open2 && mounted) {
147459
- updatePosition();
147460
- }
147461
- }, [open2, mounted, updatePosition]);
147462
- const state2 = {
147463
- open: open2,
147464
- side: positioning.side,
147465
- align: positioning.align,
147466
- anchorHidden: positioning.anchorHidden,
147467
- instant: instantType
147468
- };
147469
- const element2 = usePositioner(componentProps, state2, {
147470
- styles: positioning.positionerStyles,
147471
- transitionStatus,
147472
- props: elementProps,
147473
- refs: [forwardedRef, store.useStateSetter("positionerElement")],
147474
- hidden: !mounted,
147475
- inert: !open2
147476
- });
147477
- return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardPositionerContext.Provider, {
147478
- value: positioning,
147479
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(FloatingNode, {
147480
- id: nodeId,
147481
- children: element2
147482
- })
147483
- });
147484
- });
147485
- const PreviewCardPopup = /* @__PURE__ */ reactExports.forwardRef(function PreviewCardPopup2(componentProps, forwardedRef) {
147486
- const {
147487
- className,
147488
- render: render4,
147489
- style: style2,
147490
- ...elementProps
147491
- } = componentProps;
147492
- const store = usePreviewCardRootContext();
147493
- const {
147494
- side,
147495
- align
147496
- } = usePreviewCardPositionerContext();
147497
- const open2 = store.useState("open");
147498
- const instantType = store.useState("instantType");
147499
- const transitionStatus = store.useState("transitionStatus");
147500
- const popupProps = store.useState("popupProps");
147501
- const floatingContext = store.useState("floatingRootContext");
147502
- const closeDelay = store.useState("closeDelay");
147503
- useOpenChangeComplete({
147504
- open: open2,
147505
- ref: store.context.popupRef,
147506
- onComplete() {
147507
- if (open2) {
147508
- store.context.onOpenChangeComplete?.(true);
147509
- }
147510
- }
147511
- });
147512
- useHoverFloatingInteraction(floatingContext, {
147513
- closeDelay
147514
- });
147515
- const state2 = {
147516
- open: open2,
147517
- side,
147518
- align,
147519
- instant: instantType,
147520
- transitionStatus
147521
- };
147522
- const element2 = useRenderElement("div", componentProps, {
147523
- state: state2,
147524
- ref: [forwardedRef, store.context.popupRef, store.useStateSetter("popupElement")],
147525
- props: [FOCUSABLE_POPUP_PROPS, popupProps, getDisabledMountTransitionStyles(transitionStatus), elementProps],
147526
- stateAttributesMapping: popupTransitionStateMapping
147527
- });
147528
- return element2;
147529
- });
147530
- function HoverCard({ ...props }) {
147531
- return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardRoot, { "data-slot": "hover-card", ...props });
147532
- }
147533
- function HoverCardTrigger({ ...props }) {
147534
- return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardTrigger, { "data-slot": "hover-card-trigger", ...props });
147535
- }
147536
- function HoverCardContent({
147537
- className,
147538
- side = "bottom",
147539
- sideOffset = 4,
147540
- align = "center",
147541
- alignOffset = 4,
147542
- ...props
147543
- }) {
147544
- return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardPortal, { "data-slot": "hover-card-portal", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
147545
- PreviewCardPositioner,
147546
- {
147547
- align,
147548
- alignOffset,
147549
- side,
147550
- sideOffset,
147551
- className: "isolate z-50",
147552
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(
147553
- PreviewCardPopup,
147554
- {
147555
- "data-slot": "hover-card-content",
147556
- className: cn$8(
147557
- "z-50 w-64 origin-(--transform-origin) rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
147558
- className
147559
- ),
147560
- ...props
147561
- }
147562
- )
147563
- }
147564
- ) });
147565
- }
147566
147728
  function skillInfoToSuggestItem(s16) {
147567
147729
  return {
147568
147730
  id: s16.id,
@@ -148724,7 +148886,8 @@ function AskUserDialog({ sessionId }) {
148724
148886
  children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full max-w-6xl px-6 pb-4 mx-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-rows-[auto_1fr_auto] rounded-xl border border-border bg-card p-4 shadow-lg shadow-primary/5 max-h-[90vh] overflow-hidden", children: [
148725
148887
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-3 min-h-0", children: [
148726
148888
  /* @__PURE__ */ jsxRuntimeExports.jsx(CircleQuestionMark, { className: "size-4.5 shrink-0 text-sky-500" }),
148727
- /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium leading-snug truncate", children: currentRequest.title || t2("askUser.title", "Request") })
148889
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium leading-snug truncate", children: currentRequest.title || t2("askUser.title", "Request") }),
148890
+ currentRequest.timeoutAt != null && /* @__PURE__ */ jsxRuntimeExports.jsx(AskUserCountdown, { timeoutAt: currentRequest.timeoutAt })
148728
148891
  ] }),
148729
148892
  currentRequest.description && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-0 overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "h-full rounded-md bg-muted/40", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "py-3 px-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "text-xs text-muted-foreground leading-relaxed whitespace-pre-wrap", children: /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: formatDescription(currentRequest.description) }) }) }) }) }),
148730
148893
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pt-3 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -148749,6 +148912,33 @@ function formatDescription(text2) {
148749
148912
  }
148750
148913
  return text2;
148751
148914
  }
148915
+ function AskUserCountdown({ timeoutAt }) {
148916
+ const { t: t2 } = useTranslation();
148917
+ const [remainingMs, setRemainingMs] = reactExports.useState(() => Math.max(0, timeoutAt - Date.now()));
148918
+ reactExports.useEffect(() => {
148919
+ const update2 = () => setRemainingMs(Math.max(0, timeoutAt - Date.now()));
148920
+ update2();
148921
+ const timer2 = setInterval(update2, 1e3);
148922
+ return () => clearInterval(timer2);
148923
+ }, [timeoutAt]);
148924
+ const totalSeconds = Math.ceil(remainingMs / 1e3);
148925
+ const minutes = Math.floor(totalSeconds / 60);
148926
+ const seconds = totalSeconds % 60;
148927
+ const urgent = totalSeconds <= 30;
148928
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
148929
+ "span",
148930
+ {
148931
+ className: `ml-auto inline-flex shrink-0 items-center h-5 rounded-full px-1.5 text-[10px] font-mono tabular-nums leading-none ${urgent ? "bg-destructive/10 text-destructive" : "bg-muted text-muted-foreground"}`,
148932
+ title: t2("askUser.autoClose", "Auto closes on timeout"),
148933
+ children: [
148934
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3 mr-1 -ml-px" }),
148935
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: minutes.toString().padStart(2, "0") }),
148936
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[8px] mx-0.5", children: ":" }),
148937
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: seconds.toString().padStart(2, "0") })
148938
+ ]
148939
+ }
148940
+ );
148941
+ }
148752
148942
  function AskUserOptions({
148753
148943
  request: request$1,
148754
148944
  onResolved
@@ -270733,7 +270923,15 @@ function Detail({ detailType, projectId, file, terminalId, onClose }) {
270733
270923
  if (!detailType) return null;
270734
270924
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full min-h-0 overflow-hidden bg-background", children: [
270735
270925
  detailType === "file" && projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx(FileDetail$1, { projectId, file, onClose }),
270736
- detailType === "terminal" && projectId && terminalId && /* @__PURE__ */ jsxRuntimeExports.jsx(TerminalDetail, { terminalId, projectId, onClose }),
270926
+ detailType === "terminal" && projectId && terminalId && /* @__PURE__ */ jsxRuntimeExports.jsx(
270927
+ TerminalDetail,
270928
+ {
270929
+ terminalId,
270930
+ projectId,
270931
+ onClose
270932
+ },
270933
+ terminalId
270934
+ ),
270737
270935
  (!detailType || detailType === "file" && (!projectId || !file) || detailType === "terminal" && (!projectId || !terminalId)) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center text-xs text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t2("detail.noContent", "No content") }) })
270738
270936
  ] });
270739
270937
  }
@@ -270838,6 +271036,7 @@ function TreeItem({
270838
271036
  },
270839
271037
  className: cn$8(
270840
271038
  "flex h-6 cursor-default select-none items-center gap-1.5 px-1.5 text-sx leading-none text-foreground/60",
271039
+ node2.ignored && "opacity-50",
270841
271040
  node2.id === previewId ? "bg-primary/8 hover:bg-primary/10" : "hover:bg-primary/5 hover:text-foreground",
270842
271041
  isSelected ? "text-foreground bg-primary/6" : "",
270843
271042
  isDragOver && "relative ring-1 ring-primary bg-primary/5"
@@ -271398,6 +271597,7 @@ const FilePanel = reactExports.memo(function FilePanel2({
271398
271597
  id: tempId,
271399
271598
  name: "",
271400
271599
  isFolder,
271600
+ ignored: false,
271401
271601
  children: isFolder ? [] : void 0
271402
271602
  };
271403
271603
  if (parentId) {
@@ -274663,6 +274863,367 @@ function Session({ session: session2 }) {
274663
274863
  ] })
274664
274864
  ] }, sessionId) : null });
274665
274865
  }
274866
+ function Label({ className, ...props }) {
274867
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274868
+ "label",
274869
+ {
274870
+ "data-slot": "label",
274871
+ className: cn$8(
274872
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
274873
+ className
274874
+ ),
274875
+ ...props
274876
+ }
274877
+ );
274878
+ }
274879
+ function FieldGroup({ className, ...props }) {
274880
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274881
+ "div",
274882
+ {
274883
+ "data-slot": "field-group",
274884
+ className: cn$8(
274885
+ "group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4",
274886
+ className
274887
+ ),
274888
+ ...props
274889
+ }
274890
+ );
274891
+ }
274892
+ const fieldVariants = cva(
274893
+ "group/field flex w-full gap-2 data-[invalid=true]:text-destructive",
274894
+ {
274895
+ variants: {
274896
+ orientation: {
274897
+ vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
274898
+ horizontal: "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
274899
+ responsive: "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"
274900
+ }
274901
+ },
274902
+ defaultVariants: {
274903
+ orientation: "vertical"
274904
+ }
274905
+ }
274906
+ );
274907
+ function Field({
274908
+ className,
274909
+ orientation = "vertical",
274910
+ ...props
274911
+ }) {
274912
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274913
+ "div",
274914
+ {
274915
+ role: "group",
274916
+ "data-slot": "field",
274917
+ "data-orientation": orientation,
274918
+ className: cn$8(fieldVariants({ orientation }), className),
274919
+ ...props
274920
+ }
274921
+ );
274922
+ }
274923
+ function FieldLabel({
274924
+ className,
274925
+ ...props
274926
+ }) {
274927
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274928
+ Label,
274929
+ {
274930
+ "data-slot": "field-label",
274931
+ className: cn$8(
274932
+ "group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10",
274933
+ "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col",
274934
+ className
274935
+ ),
274936
+ ...props
274937
+ }
274938
+ );
274939
+ }
274940
+ function FieldError({
274941
+ className,
274942
+ children: children2,
274943
+ errors,
274944
+ ...props
274945
+ }) {
274946
+ const content2 = reactExports.useMemo(() => {
274947
+ if (children2) {
274948
+ return children2;
274949
+ }
274950
+ if (!errors?.length) {
274951
+ return null;
274952
+ }
274953
+ const uniqueErrors = [
274954
+ ...new Map(errors.map((error) => [error?.message, error])).values()
274955
+ ];
274956
+ if (uniqueErrors?.length == 1) {
274957
+ return uniqueErrors[0]?.message;
274958
+ }
274959
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "ml-4 flex list-disc flex-col gap-1", children: uniqueErrors.map(
274960
+ (error, index2) => error?.message && /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: error.message }, index2)
274961
+ ) });
274962
+ }, [children2, errors]);
274963
+ if (!content2) {
274964
+ return null;
274965
+ }
274966
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274967
+ "div",
274968
+ {
274969
+ role: "alert",
274970
+ "data-slot": "field-error",
274971
+ className: cn$8("text-xs font-normal text-destructive -mb-4.5 -mt-1.5 min-h-4 text-[11px]", className),
274972
+ ...props,
274973
+ children: content2
274974
+ }
274975
+ );
274976
+ }
274977
+ function SettingsProxyDialog({ open: open2, onOpenChange }) {
274978
+ const { t: t2 } = useTranslation();
274979
+ const proxy = useAppStore((s16) => s16.proxy);
274980
+ const setProxy = useAppStore((s16) => s16.setProxy);
274981
+ const { toast: toast2, alert, confirm: confirm2 } = useMessage();
274982
+ const [draft, setDraft] = reactExports.useState(() => ({
274983
+ mode: proxy.mode ?? "off",
274984
+ httpProxy: proxy.httpProxy ?? "",
274985
+ httpsProxy: proxy.httpsProxy ?? "",
274986
+ noProxy: proxy.noProxy ?? "",
274987
+ username: proxy.username ?? "",
274988
+ password: proxy.password ?? ""
274989
+ }));
274990
+ reactExports.useEffect(() => {
274991
+ if (!open2) return;
274992
+ setDraft({
274993
+ mode: proxy.mode ?? "off",
274994
+ httpProxy: proxy.httpProxy ?? "",
274995
+ httpsProxy: proxy.httpsProxy ?? "",
274996
+ noProxy: proxy.noProxy ?? "",
274997
+ username: proxy.username ?? "",
274998
+ password: proxy.password ?? ""
274999
+ });
275000
+ }, [open2, proxy]);
275001
+ const updateDraft = (patch2) => {
275002
+ setDraft((prev2) => ({ ...prev2, ...patch2 }));
275003
+ };
275004
+ const handleModeChange = (mode) => {
275005
+ if (!mode) return;
275006
+ updateDraft({ mode });
275007
+ };
275008
+ const handleSave = async () => {
275009
+ const trimStr = (value) => {
275010
+ const trimmed = value?.trim();
275011
+ return trimmed ? trimmed : void 0;
275012
+ };
275013
+ const next2 = {
275014
+ mode: draft.mode,
275015
+ httpProxy: trimStr(draft.httpProxy),
275016
+ httpsProxy: trimStr(draft.httpsProxy),
275017
+ noProxy: trimStr(draft.noProxy),
275018
+ username: trimStr(draft.username),
275019
+ password: trimStr(draft.password)
275020
+ };
275021
+ if (next2.mode === "manual") {
275022
+ if (!next2.httpProxy) {
275023
+ toast2.error(
275024
+ t2(
275025
+ "settings.proxy.validation.httpProxyRequired",
275026
+ "HTTP proxy URL is required in manual mode."
275027
+ )
275028
+ );
275029
+ return;
275030
+ }
275031
+ for (const [field, value] of [
275032
+ [t2("settings.proxy.httpProxy", "HTTP Proxy"), next2.httpProxy],
275033
+ [t2("settings.proxy.httpsProxy", "HTTPS proxy"), next2.httpsProxy]
275034
+ ]) {
275035
+ const v3 = value?.trim();
275036
+ if (v3 && !/^https?:\/\//i.test(v3) && !/^[^/]+:\d+$/i.test(v3)) {
275037
+ toast2.error(
275038
+ t2(
275039
+ "settings.proxy.validation.invalidProxyUrl",
275040
+ "{{field}} should start with http:// or https://, or use a host:port address (e.g. http://127.0.0.1:7890).",
275041
+ { field }
275042
+ )
275043
+ );
275044
+ return;
275045
+ }
275046
+ }
275047
+ }
275048
+ try {
275049
+ await request.updateSettings({ proxy: next2 });
275050
+ setProxy(next2);
275051
+ onOpenChange(false);
275052
+ if (isWebUI) {
275053
+ await alert({
275054
+ title: t2("settings.proxy.restartTitle", "Restart Required"),
275055
+ content: t2(
275056
+ "settings.proxy.restartManualDesc",
275057
+ "Proxy settings saved. Please manually restart the Fello server process to apply the new configuration."
275058
+ )
275059
+ });
275060
+ return;
275061
+ }
275062
+ const result = await confirm2({
275063
+ title: t2("settings.proxy.restartTitle", "Restart Required"),
275064
+ content: t2(
275065
+ "settings.proxy.restartDesc",
275066
+ "Proxy settings saved. Restart Fello to apply the new proxy configuration."
275067
+ ),
275068
+ buttons: [
275069
+ { text: t2("settings.proxy.later", "Later"), value: null, variant: "outline" },
275070
+ {
275071
+ text: t2("settings.proxy.restartNow", "Restart Now"),
275072
+ value: "confirm",
275073
+ variant: "default"
275074
+ }
275075
+ ]
275076
+ });
275077
+ if (result) {
275078
+ await electron.restartApp();
275079
+ }
275080
+ } catch (err) {
275081
+ toast2.error(
275082
+ extractErrorMessage(err) || t2("settings.proxy.saveFailed", "Failed to save proxy settings.")
275083
+ );
275084
+ }
275085
+ };
275086
+ const modeItems = [
275087
+ { value: "off", label: t2("settings.proxy.off", "Direct") },
275088
+ { value: "manual", label: t2("settings.proxy.manual", "Manual") },
275089
+ { value: "system", label: t2("settings.proxy.system", "System") }
275090
+ ];
275091
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, disablePointerDismissal: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-lg", children: [
275092
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: t2("settings.proxy.title", "Network Proxy") }) }),
275093
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4 mt-2", children: [
275094
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-4", children: [
275095
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { className: "gap-1", children: [
275096
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { className: "text-xs text-muted-foreground", children: t2("settings.proxy.mode", "Proxy Mode") }),
275097
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-[10px] text-muted-foreground/70", children: [
275098
+ draft.mode === "off" && t2("settings.proxy.offDesc", "Connect directly without a proxy"),
275099
+ draft.mode === "manual" && t2(
275100
+ "settings.proxy.manualDesc",
275101
+ "Specify a proxy server manually for all network requests"
275102
+ ),
275103
+ draft.mode === "system" && t2(
275104
+ "settings.proxy.systemDesc",
275105
+ "Use the system proxy settings (macOS/Windows or environment variables)"
275106
+ )
275107
+ ] })
275108
+ ] }),
275109
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: modeItems, value: draft.mode, onValueChange: handleModeChange, children: [
275110
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35 text-[11px]!", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Mode" }) }),
275111
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: modeItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
275112
+ ] })
275113
+ ] }),
275114
+ draft.mode === "manual" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
275115
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275116
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "proxy-http", className: "text-[11px] text-muted-foreground", children: t2("settings.proxy.httpProxy", "HTTP Proxy") }),
275117
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275118
+ Input,
275119
+ {
275120
+ id: "proxy-http",
275121
+ type: "text",
275122
+ value: draft.httpProxy ?? "",
275123
+ onChange: (e11) => updateDraft({ httpProxy: e11.target.value }),
275124
+ placeholder: t2(
275125
+ "settings.proxy.httpProxyPlaceholder",
275126
+ "e.g. http://127.0.0.1:7890"
275127
+ ),
275128
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
275129
+ }
275130
+ )
275131
+ ] }),
275132
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275133
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "proxy-https", className: "text-[11px] text-muted-foreground", children: t2("settings.proxy.httpsProxy", "HTTPS Proxy (optional)") }),
275134
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275135
+ Input,
275136
+ {
275137
+ id: "proxy-https",
275138
+ type: "text",
275139
+ value: draft.httpsProxy ?? "",
275140
+ onChange: (e11) => updateDraft({ httpsProxy: e11.target.value }),
275141
+ placeholder: t2(
275142
+ "settings.proxy.httpProxyPlaceholder",
275143
+ "e.g. http://127.0.0.1:7890"
275144
+ ),
275145
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
275146
+ }
275147
+ ),
275148
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[10px] text-muted-foreground/70", children: t2("settings.proxy.httpsProxyHint", "Falls back to the HTTP proxy when empty.") })
275149
+ ] }),
275150
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275151
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "proxy-no-proxy", className: "text-[11px] text-muted-foreground", children: t2("settings.proxy.noProxy", "No Proxy (optional)") }),
275152
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275153
+ Input,
275154
+ {
275155
+ id: "proxy-no-proxy",
275156
+ type: "text",
275157
+ value: draft.noProxy ?? "",
275158
+ onChange: (e11) => updateDraft({ noProxy: e11.target.value }),
275159
+ placeholder: t2(
275160
+ "settings.proxy.noProxyPlaceholder",
275161
+ "e.g. localhost,127.0.0.1,*.internal"
275162
+ ),
275163
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
275164
+ }
275165
+ )
275166
+ ] }),
275167
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
275168
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275169
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275170
+ FieldLabel,
275171
+ {
275172
+ htmlFor: "proxy-username",
275173
+ className: "text-[11px] text-muted-foreground",
275174
+ children: t2("settings.proxy.username", "Username (optional)")
275175
+ }
275176
+ ),
275177
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275178
+ Input,
275179
+ {
275180
+ id: "proxy-username",
275181
+ type: "text",
275182
+ value: draft.username ?? "",
275183
+ onChange: (e11) => updateDraft({ username: e11.target.value }),
275184
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
275185
+ }
275186
+ )
275187
+ ] }),
275188
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275189
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275190
+ FieldLabel,
275191
+ {
275192
+ htmlFor: "proxy-password",
275193
+ className: "text-[11px] text-muted-foreground",
275194
+ children: t2("settings.proxy.password", "Password (optional)")
275195
+ }
275196
+ ),
275197
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275198
+ Input,
275199
+ {
275200
+ id: "proxy-password",
275201
+ type: "password",
275202
+ value: draft.password ?? "",
275203
+ onChange: (e11) => updateDraft({ password: e11.target.value }),
275204
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
275205
+ }
275206
+ )
275207
+ ] })
275208
+ ] })
275209
+ ] })
275210
+ ] }),
275211
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
275212
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275213
+ Button,
275214
+ {
275215
+ type: "button",
275216
+ variant: "outline",
275217
+ size: "sm",
275218
+ onClick: () => onOpenChange(false),
275219
+ className: "h-7 text-xs",
275220
+ children: t2("settings.proxy.cancel", "Cancel")
275221
+ }
275222
+ ),
275223
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "button", size: "sm", className: "h-7 text-xs", onClick: handleSave, children: t2("settings.proxy.save", "Save") })
275224
+ ] })
275225
+ ] }) });
275226
+ }
274666
275227
  function asc(a2, b2) {
274667
275228
  return a2 - b2;
274668
275229
  }
@@ -275939,9 +276500,18 @@ function SettingsGeneral() {
275939
276500
  editor,
275940
276501
  setEditor,
275941
276502
  sound,
275942
- setSound
276503
+ setSound,
276504
+ proxy
275943
276505
  } = useAppStore();
275944
276506
  const { toast: toast2 } = useMessage();
276507
+ const [proxyDialogOpen, setProxyDialogOpen] = reactExports.useState(false);
276508
+ const proxySummary = (() => {
276509
+ const mode = proxy.mode ?? "off";
276510
+ if (mode === "off") return t2("settings.general.proxyOff", "Direct");
276511
+ if (mode === "system") return t2("settings.general.proxySystem", "System");
276512
+ const url = proxy.httpProxy || proxy.httpsProxy || "";
276513
+ return url ? url : t2("settings.proxy.manual", "Manual");
276514
+ })();
275945
276515
  const handleThemeChange = async (mode) => {
275946
276516
  if (!mode) return;
275947
276517
  const newTheme = { themeMode: mode };
@@ -275981,246 +276551,277 @@ function SettingsGeneral() {
275981
276551
  );
275982
276552
  }
275983
276553
  };
275984
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex flex-col h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6 px-5 py-4 w-full max-w-4xl mx-auto", children: [
275985
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
275986
- /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-medium", children: t2("settings.general.title", "General") }),
275987
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: t2("settings.general.desc", "Manage your application settings.") })
275988
- ] }),
275989
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
275990
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
275991
- /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupAppearance", "Appearance") }),
275992
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
275993
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
275994
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
275995
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.theme") }),
275996
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.themeDesc", "Customize the appearance of the application") })
275997
- ] }),
275998
- (() => {
275999
- const themeItems = [
276000
- { value: "light", label: t2("settings.general.light") },
276001
- { value: "dark", label: t2("settings.general.dark") },
276002
- { value: "system", label: t2("settings.general.system") }
276003
- ];
276004
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276005
- Select,
276006
- {
276007
- items: themeItems,
276008
- value: theme.themeMode,
276009
- onValueChange: handleThemeChange,
276010
- children: [
276011
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Theme" }) }),
276012
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: themeItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
276013
- ]
276014
- }
276015
- );
276016
- })()
276017
- ] }),
276018
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276019
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276020
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.language") }),
276021
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.languageDesc", "Select the display language") })
276022
- ] }),
276023
- (() => {
276024
- const languageItems = [
276025
- { value: "en", label: t2("settings.general.english") },
276026
- { value: "zh-CN", label: t2("settings.general.chinese") }
276027
- ];
276028
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276029
- Select,
276030
- {
276031
- items: languageItems,
276032
- value: i18n.language,
276033
- onValueChange: handleLanguageChange,
276034
- children: [
276035
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Language" }) }),
276036
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: languageItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
276037
- ]
276038
- }
276039
- );
276040
- })()
276041
- ] })
276042
- ] })
276043
- ] }),
276044
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276554
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 flex flex-col h-full", children: [
276555
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6 px-5 py-4 w-full max-w-4xl mx-auto", children: [
276045
276556
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276046
- /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupProject", "Project") }),
276047
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276048
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276049
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.autoWatchFiles") }),
276050
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2(
276051
- "settings.general.autoWatchFilesDesc",
276052
- "Automatically watch project file changes"
276053
- ) })
276054
- ] }),
276055
- /* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { checked: fileWatcher.enabled, onCheckedChange: handleFileWatcherChange })
276056
- ] }) })
276557
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-medium", children: t2("settings.general.title", "General") }),
276558
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: t2("settings.general.desc", "Manage your application settings.") })
276057
276559
  ] }),
276058
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276059
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276060
- /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupEditor", "Editor") }),
276061
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276062
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276063
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.editor", "Open in Editor") }),
276064
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.editorDesc", "Choose the editor to open files") })
276065
- ] }),
276066
- (() => {
276067
- const editorItems = Object.keys(EDITOR_LABELS).sort((a2, b2) => EDITOR_LABELS[a2].localeCompare(EDITOR_LABELS[b2])).map((value) => ({ value, label: EDITOR_LABELS[value] }));
276068
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276069
- Select,
276070
- {
276071
- items: editorItems,
276072
- value: editor.name,
276073
- onValueChange: async (val) => {
276074
- if (!val) return;
276075
- const newEditor = { name: val };
276076
- setEditor(newEditor);
276077
- try {
276078
- await request.updateSettings({ editor: newEditor });
276079
- } catch {
276080
- toast2.error(
276081
- t2(
276082
- "settings.general.saveEditorFailed",
276083
- "Failed to save editor setting."
276084
- )
276085
- );
276560
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
276561
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276562
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupAppearance", "Appearance") }),
276563
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
276564
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276565
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276566
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.theme") }),
276567
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.themeDesc", "Customize the appearance of the application") })
276568
+ ] }),
276569
+ (() => {
276570
+ const themeItems = [
276571
+ { value: "light", label: t2("settings.general.light") },
276572
+ { value: "dark", label: t2("settings.general.dark") },
276573
+ { value: "system", label: t2("settings.general.system") }
276574
+ ];
276575
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276576
+ Select,
276577
+ {
276578
+ items: themeItems,
276579
+ value: theme.themeMode,
276580
+ onValueChange: handleThemeChange,
276581
+ children: [
276582
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Theme" }) }),
276583
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: themeItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
276584
+ ]
276086
276585
  }
276087
- },
276088
- children: [
276089
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-44", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
276090
- SelectValue,
276091
- {
276092
- placeholder: t2("settings.general.selectEditor", "Select editor")
276093
- }
276094
- ) }),
276095
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: editorItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex items-center gap-2", children: item.label }) }, item.value)) })
276096
- ]
276097
- }
276098
- );
276099
- })()
276100
- ] }) })
276101
- ] }),
276102
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276103
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276104
- /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupSound", "Sound") }),
276105
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
276106
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276586
+ );
276587
+ })()
276588
+ ] }),
276589
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276590
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276591
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.language") }),
276592
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.languageDesc", "Select the display language") })
276593
+ ] }),
276594
+ (() => {
276595
+ const languageItems = [
276596
+ { value: "en", label: t2("settings.general.english") },
276597
+ { value: "zh-CN", label: t2("settings.general.chinese") }
276598
+ ];
276599
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276600
+ Select,
276601
+ {
276602
+ items: languageItems,
276603
+ value: i18n.language,
276604
+ onValueChange: handleLanguageChange,
276605
+ children: [
276606
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Language" }) }),
276607
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: languageItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
276608
+ ]
276609
+ }
276610
+ );
276611
+ })()
276612
+ ] })
276613
+ ] })
276614
+ ] }),
276615
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276616
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276617
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupProject", "Project") }),
276618
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276107
276619
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276108
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundEnabled", "Sound Effects") }),
276620
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.autoWatchFiles") }),
276109
276621
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2(
276110
- "settings.general.soundEnabledDesc",
276111
- "Play sound effects for notifications"
276622
+ "settings.general.autoWatchFilesDesc",
276623
+ "Automatically watch project file changes"
276112
276624
  ) })
276113
276625
  ] }),
276114
- /* @__PURE__ */ jsxRuntimeExports.jsx(
276115
- Switch,
276116
- {
276117
- checked: !sound.muted,
276118
- onCheckedChange: async (checked) => {
276119
- const newSound = { ...sound, muted: !checked };
276120
- setSound(newSound);
276121
- if (newSound.muted) {
276122
- L$9();
276123
- } else {
276124
- N$6();
276125
- }
276126
- try {
276127
- await request.updateSettings({ sound: newSound });
276128
- } catch {
276129
- toast2.error(
276130
- t2("settings.general.saveSoundFailed", "Failed to save sound setting.")
276131
- );
276132
- }
276133
- }
276134
- }
276135
- )
276136
- ] }),
276626
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { checked: fileWatcher.enabled, onCheckedChange: handleFileWatcherChange })
276627
+ ] }) })
276628
+ ] }),
276629
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276630
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276631
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupNetwork", "Network") }),
276137
276632
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276138
276633
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276139
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundVolume", "Volume") }),
276140
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.soundVolumeDesc", "Adjust notification volume") })
276634
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.proxy", "Network Proxy") }),
276635
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2(
276636
+ "settings.general.proxyDesc",
276637
+ "Configure the network proxy used by Fello for Node requests, subprocesses and the UI."
276638
+ ) })
276141
276639
  ] }),
276142
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
276143
- Slider,
276640
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
276641
+ Button,
276144
276642
  {
276145
- value: [sound.volume],
276146
- min: 0,
276147
- max: 100,
276148
- step: 1,
276149
- onValueChange: async (val) => {
276150
- const vol = Array.isArray(val) ? val[0] : val;
276151
- const newSound = { ...sound, volume: vol };
276152
- setSound(newSound);
276153
- _$9(vol / 100);
276154
- try {
276155
- await request.updateSettings({ sound: newSound });
276156
- } catch {
276157
- toast2.error(
276158
- t2("settings.general.saveSoundFailed", "Failed to save sound setting.")
276159
- );
276160
- }
276161
- }
276643
+ type: "button",
276644
+ variant: "outline",
276645
+ size: "sm",
276646
+ className: "h-7 w-35 shrink-0 text-xs text-muted-foreground hover:text-foreground",
276647
+ onClick: () => setProxyDialogOpen(true),
276648
+ title: t2("settings.general.proxyEdit", "Edit proxy settings"),
276649
+ children: [
276650
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: proxySummary }),
276651
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-3 shrink-0" })
276652
+ ]
276162
276653
  }
276163
- ) })
276164
- ] }),
276165
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276654
+ )
276655
+ ] })
276656
+ ] }),
276657
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276658
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276659
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupEditor", "Editor") }),
276660
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276166
276661
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276167
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundTheme", "Sound Style") }),
276168
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.soundThemeDesc", "Select the sound effect style") })
276662
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.editor", "Open in Editor") }),
276663
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.editorDesc", "Choose the editor to open files") })
276169
276664
  ] }),
276170
276665
  (() => {
276171
- const themeItems = [
276172
- { value: "soft", label: t2("settings.general.soundSoft", "Soft") },
276173
- { value: "crisp", label: t2("settings.general.soundCrisp", "Crisp") }
276174
- ];
276666
+ const editorItems = Object.keys(EDITOR_LABELS).sort((a2, b2) => EDITOR_LABELS[a2].localeCompare(EDITOR_LABELS[b2])).map((value) => ({ value, label: EDITOR_LABELS[value] }));
276175
276667
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276176
276668
  Select,
276177
276669
  {
276178
- items: themeItems,
276179
- value: sound.theme,
276670
+ items: editorItems,
276671
+ value: editor.name,
276180
276672
  onValueChange: async (val) => {
276181
276673
  if (!val) return;
276182
- const newSound = { ...sound, theme: val };
276183
- setSound(newSound);
276184
- D$7(newSound.theme);
276674
+ const newEditor = { name: val };
276675
+ setEditor(newEditor);
276185
276676
  try {
276186
- await request.updateSettings({ sound: newSound });
276677
+ await request.updateSettings({ editor: newEditor });
276187
276678
  } catch {
276188
276679
  toast2.error(
276189
276680
  t2(
276190
- "settings.general.saveSoundFailed",
276191
- "Failed to save sound setting."
276681
+ "settings.general.saveEditorFailed",
276682
+ "Failed to save editor setting."
276192
276683
  )
276193
276684
  );
276194
276685
  }
276195
276686
  },
276196
276687
  children: [
276197
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Theme" }) }),
276198
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: themeItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
276688
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-44", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
276689
+ SelectValue,
276690
+ {
276691
+ placeholder: t2("settings.general.selectEditor", "Select editor")
276692
+ }
276693
+ ) }),
276694
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: editorItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex items-center gap-2", children: item.label }) }, item.value)) })
276199
276695
  ]
276200
276696
  }
276201
276697
  );
276202
276698
  })()
276203
- ] }),
276204
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276205
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276206
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundTest", "Test") }),
276207
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.soundTestDesc", "Preview the current sound effect") })
276699
+ ] }) })
276700
+ ] }),
276701
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276702
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276703
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupSound", "Sound") }),
276704
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
276705
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276706
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276707
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundEnabled", "Sound Effects") }),
276708
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2(
276709
+ "settings.general.soundEnabledDesc",
276710
+ "Play sound effects for notifications"
276711
+ ) })
276712
+ ] }),
276713
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
276714
+ Switch,
276715
+ {
276716
+ checked: !sound.muted,
276717
+ onCheckedChange: async (checked) => {
276718
+ const newSound = { ...sound, muted: !checked };
276719
+ setSound(newSound);
276720
+ if (newSound.muted) {
276721
+ L$9();
276722
+ } else {
276723
+ N$6();
276724
+ }
276725
+ try {
276726
+ await request.updateSettings({ sound: newSound });
276727
+ } catch {
276728
+ toast2.error(
276729
+ t2("settings.general.saveSoundFailed", "Failed to save sound setting.")
276730
+ );
276731
+ }
276732
+ }
276733
+ }
276734
+ )
276208
276735
  ] }),
276209
- /* @__PURE__ */ jsxRuntimeExports.jsx(
276210
- Button,
276211
- {
276212
- variant: "outline",
276213
- size: "sm",
276214
- className: "h-7 text-xs w-35",
276215
- onClick: () => w$6(),
276216
- children: t2("settings.general.soundTestPlay", "Play")
276217
- }
276218
- )
276736
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276737
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276738
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundVolume", "Volume") }),
276739
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.soundVolumeDesc", "Adjust notification volume") })
276740
+ ] }),
276741
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
276742
+ Slider,
276743
+ {
276744
+ value: [sound.volume],
276745
+ min: 0,
276746
+ max: 100,
276747
+ step: 1,
276748
+ onValueChange: async (val) => {
276749
+ const vol = Array.isArray(val) ? val[0] : val;
276750
+ const newSound = { ...sound, volume: vol };
276751
+ setSound(newSound);
276752
+ _$9(vol / 100);
276753
+ try {
276754
+ await request.updateSettings({ sound: newSound });
276755
+ } catch {
276756
+ toast2.error(
276757
+ t2("settings.general.saveSoundFailed", "Failed to save sound setting.")
276758
+ );
276759
+ }
276760
+ }
276761
+ }
276762
+ ) })
276763
+ ] }),
276764
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276765
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276766
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundTheme", "Sound Style") }),
276767
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.soundThemeDesc", "Select the sound effect style") })
276768
+ ] }),
276769
+ (() => {
276770
+ const themeItems = [
276771
+ { value: "soft", label: t2("settings.general.soundSoft", "Soft") },
276772
+ { value: "crisp", label: t2("settings.general.soundCrisp", "Crisp") }
276773
+ ];
276774
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276775
+ Select,
276776
+ {
276777
+ items: themeItems,
276778
+ value: sound.theme,
276779
+ onValueChange: async (val) => {
276780
+ if (!val) return;
276781
+ const newSound = { ...sound, theme: val };
276782
+ setSound(newSound);
276783
+ D$7(newSound.theme);
276784
+ try {
276785
+ await request.updateSettings({ sound: newSound });
276786
+ } catch {
276787
+ toast2.error(
276788
+ t2(
276789
+ "settings.general.saveSoundFailed",
276790
+ "Failed to save sound setting."
276791
+ )
276792
+ );
276793
+ }
276794
+ },
276795
+ children: [
276796
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Theme" }) }),
276797
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: themeItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
276798
+ ]
276799
+ }
276800
+ );
276801
+ })()
276802
+ ] }),
276803
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276804
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276805
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundTest", "Test") }),
276806
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.soundTestDesc", "Preview the current sound effect") })
276807
+ ] }),
276808
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
276809
+ Button,
276810
+ {
276811
+ variant: "outline",
276812
+ size: "sm",
276813
+ className: "h-7 text-xs w-35 text-muted-foreground hover:text-foreground",
276814
+ onClick: () => w$6(),
276815
+ children: t2("settings.general.soundTestPlay", "Play")
276816
+ }
276817
+ )
276818
+ ] })
276219
276819
  ] })
276220
276820
  ] })
276221
276821
  ] })
276222
- ] })
276223
- ] }) }) });
276822
+ ] }) }),
276823
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsProxyDialog, { open: proxyDialogOpen, onOpenChange: setProxyDialogOpen })
276824
+ ] });
276224
276825
  }
276225
276826
  function useCombinedRefs() {
276226
276827
  for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {
@@ -282561,117 +283162,6 @@ function i2(i3, u4, l6) {
282561
283162
  }
282562
283163
  };
282563
283164
  }
282564
- function Label({ className, ...props }) {
282565
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
282566
- "label",
282567
- {
282568
- "data-slot": "label",
282569
- className: cn$8(
282570
- "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
282571
- className
282572
- ),
282573
- ...props
282574
- }
282575
- );
282576
- }
282577
- function FieldGroup({ className, ...props }) {
282578
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
282579
- "div",
282580
- {
282581
- "data-slot": "field-group",
282582
- className: cn$8(
282583
- "group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4",
282584
- className
282585
- ),
282586
- ...props
282587
- }
282588
- );
282589
- }
282590
- const fieldVariants = cva(
282591
- "group/field flex w-full gap-2 data-[invalid=true]:text-destructive",
282592
- {
282593
- variants: {
282594
- orientation: {
282595
- vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
282596
- horizontal: "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
282597
- responsive: "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px"
282598
- }
282599
- },
282600
- defaultVariants: {
282601
- orientation: "vertical"
282602
- }
282603
- }
282604
- );
282605
- function Field({
282606
- className,
282607
- orientation = "vertical",
282608
- ...props
282609
- }) {
282610
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
282611
- "div",
282612
- {
282613
- role: "group",
282614
- "data-slot": "field",
282615
- "data-orientation": orientation,
282616
- className: cn$8(fieldVariants({ orientation }), className),
282617
- ...props
282618
- }
282619
- );
282620
- }
282621
- function FieldLabel({
282622
- className,
282623
- ...props
282624
- }) {
282625
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
282626
- Label,
282627
- {
282628
- "data-slot": "field-label",
282629
- className: cn$8(
282630
- "group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10",
282631
- "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col",
282632
- className
282633
- ),
282634
- ...props
282635
- }
282636
- );
282637
- }
282638
- function FieldError({
282639
- className,
282640
- children: children2,
282641
- errors,
282642
- ...props
282643
- }) {
282644
- const content2 = reactExports.useMemo(() => {
282645
- if (children2) {
282646
- return children2;
282647
- }
282648
- if (!errors?.length) {
282649
- return null;
282650
- }
282651
- const uniqueErrors = [
282652
- ...new Map(errors.map((error) => [error?.message, error])).values()
282653
- ];
282654
- if (uniqueErrors?.length == 1) {
282655
- return uniqueErrors[0]?.message;
282656
- }
282657
- return /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "ml-4 flex list-disc flex-col gap-1", children: uniqueErrors.map(
282658
- (error, index2) => error?.message && /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: error.message }, index2)
282659
- ) });
282660
- }, [children2, errors]);
282661
- if (!content2) {
282662
- return null;
282663
- }
282664
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
282665
- "div",
282666
- {
282667
- role: "alert",
282668
- "data-slot": "field-error",
282669
- className: cn$8("text-xs font-normal text-destructive -mb-4.5 -mt-1.5 min-h-4 text-[11px]", className),
282670
- ...props,
282671
- children: content2
282672
- }
282673
- );
282674
- }
282675
283165
  function isValidStringMap$5(raw2) {
282676
283166
  const trimmed = raw2.trim();
282677
283167
  if (!trimmed) return true;
@@ -285342,6 +285832,29 @@ function SettingsMemory() {
285342
285832
  );
285343
285833
  }
285344
285834
  };
285835
+ const handleDeleteEntry = async (projectId, entryId) => {
285836
+ const result = await confirm2({
285837
+ title: t2("settings.memory.confirmDeleteTitle", "Delete Memory Entry"),
285838
+ content: t2(
285839
+ "settings.memory.confirmDeleteDesc",
285840
+ "Are you sure you want to delete this memory entry? This cannot be undone."
285841
+ ),
285842
+ buttons: [
285843
+ { text: t2("message.cancel", "Cancel"), value: null, variant: "outline" },
285844
+ { text: t2("settings.memory.delete", "Delete"), value: "confirm", variant: "destructive" }
285845
+ ]
285846
+ });
285847
+ if (!result) return;
285848
+ try {
285849
+ await request.deleteMemoryEntry({ projectId, entryId });
285850
+ await loadMemories();
285851
+ toast2.success(t2("settings.memory.deleted", "Memory entry deleted."));
285852
+ } catch (err) {
285853
+ toast2.error(
285854
+ extractErrorMessage(err) || t2("settings.memory.deleteFailed", "Failed to delete memory entry.")
285855
+ );
285856
+ }
285857
+ };
285345
285858
  const handleReveal = async (projectId) => {
285346
285859
  try {
285347
285860
  const filePath = await request.getMemorySystemFilePath({ projectId });
@@ -285434,33 +285947,49 @@ function SettingsMemory() {
285434
285947
  ")"
285435
285948
  ] })
285436
285949
  ] }),
285437
- /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "divide-y divide-border border-t border-border", children: pm2.entries.map((entry, idx) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-3 px-4 py-2 text-xs", children: [
285438
- /* @__PURE__ */ jsxRuntimeExports.jsx(
285439
- "div",
285440
- {
285441
- className: `w-4 text-center shrink-0 font-mono font-medium ${weightColor(entry.weight)}`,
285442
- "aria-label": weightLabel(entry.weight),
285443
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
285444
- "+",
285445
- entry.weight
285446
- ] })
285447
- }
285448
- ),
285449
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
285450
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-foreground/80", children: entry.text }),
285451
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex mt-2 items-center", children: [
285452
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0 flex gap-1 flex-1", children: entry.tags.map((tag) => /* @__PURE__ */ jsxRuntimeExports.jsx(
285453
- "span",
285950
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "divide-y divide-border border-t border-border", children: pm2.entries.map((entry) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
285951
+ "div",
285952
+ {
285953
+ className: "group flex items-start gap-3 px-4 py-2 text-xs",
285954
+ children: [
285955
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
285956
+ "div",
285454
285957
  {
285455
- className: "px-1.5 py-0.5 rounded bg-muted text-[10px] text-muted-foreground",
285456
- children: tag
285457
- },
285458
- tag
285459
- )) }),
285460
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0 text-muted-foreground/80 text-[10px]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: entry.date }) })
285461
- ] })
285462
- ] })
285463
- ] }, idx)) }) })
285958
+ className: `w-4 text-center shrink-0 font-mono font-medium ${weightColor(entry.weight)}`,
285959
+ "aria-label": weightLabel(entry.weight),
285960
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
285961
+ "+",
285962
+ entry.weight
285963
+ ] })
285964
+ }
285965
+ ),
285966
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
285967
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-foreground/80", children: entry.text }),
285968
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex mt-2 items-center gap-3", children: [
285969
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0 flex gap-1 flex-1", children: entry.tags.map((tag) => /* @__PURE__ */ jsxRuntimeExports.jsx(
285970
+ "span",
285971
+ {
285972
+ className: "px-1.5 py-0.5 rounded bg-muted text-[10px] text-muted-foreground",
285973
+ children: tag
285974
+ },
285975
+ tag
285976
+ )) }),
285977
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
285978
+ "button",
285979
+ {
285980
+ type: "button",
285981
+ className: "shrink-0 text-[10px] text-destructive/70 hover:text-destructive opacity-0 group-hover:opacity-100 transition-opacity focus-visible:opacity-100",
285982
+ onClick: () => handleDeleteEntry(pm2.projectId, entry.id),
285983
+ children: t2("settings.memory.delete", "Delete")
285984
+ }
285985
+ ),
285986
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0 text-muted-foreground/80 text-[10px]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: entry.date }) })
285987
+ ] })
285988
+ ] })
285989
+ ]
285990
+ },
285991
+ entry.id
285992
+ )) }) })
285464
285993
  ] }) })
285465
285994
  ] }, pm2.projectId))
285466
285995
  ] }) }) })
@@ -288533,7 +289062,7 @@ function AppRouter() {
288533
289062
  "div",
288534
289063
  {
288535
289064
  className: cn$8(
288536
- "flex h-12 w-12 fixed z-10 top-0 items-center justify-center transition-[left] duration-200",
289065
+ "flex h-12 w-12 absolute z-10 top-0 items-center justify-center transition-[left] duration-200",
288537
289066
  sidebarOpen ? "left-49" : showMacTrafficLightSpace ? "left-16" : "left-0"
288538
289067
  ),
288539
289068
  style: { WebkitAppRegion: "no-drag" },
@@ -288567,6 +289096,7 @@ function AppContent() {
288567
289096
  setEditor,
288568
289097
  setSnippets,
288569
289098
  setImageGeneration,
289099
+ setProxy,
288570
289100
  isMacApp,
288571
289101
  setIsFullScreen,
288572
289102
  setIlinkStatus,
@@ -288615,6 +289145,7 @@ function AppContent() {
288615
289145
  setI18n2(settings2.i18n);
288616
289146
  i18n.changeLanguage(settings2.i18n.language);
288617
289147
  }
289148
+ if (settings2.proxy) setProxy(settings2.proxy);
288618
289149
  if (settings2.editor) setEditor(settings2.editor);
288619
289150
  if (settings2.snippets) setSnippets(settings2.snippets);
288620
289151
  if (settings2.imageGeneration) setImageGeneration(settings2.imageGeneration);
@@ -288650,6 +289181,7 @@ function AppContent() {
288650
289181
  setEditor,
288651
289182
  setSnippets,
288652
289183
  setImageGeneration,
289184
+ setProxy,
288653
289185
  setIlinkStatus,
288654
289186
  setActiveIlinkSessionId
288655
289187
  ]);
@@ -288821,7 +289353,12 @@ function AppContent() {
288821
289353
  if (event.manual) {
288822
289354
  toast2.loading(t2("updater.checking", "Checking for updates..."), {
288823
289355
  id: UPDATE_TOAST_ID,
288824
- duration: Infinity
289356
+ duration: Infinity,
289357
+ action: void 0,
289358
+ cancel: {
289359
+ label: t2("updater.later", "Later"),
289360
+ onClick: () => toast2.dismiss(UPDATE_TOAST_ID)
289361
+ }
288825
289362
  });
288826
289363
  }
288827
289364
  break;
@@ -288855,7 +289392,9 @@ function AppContent() {
288855
289392
  if (event.manual) {
288856
289393
  toast2.success(t2("updater.upToDate", "Fello is up to date."), {
288857
289394
  id: UPDATE_TOAST_ID,
288858
- duration: 3e3
289395
+ duration: 3e3,
289396
+ action: void 0,
289397
+ cancel: void 0
288859
289398
  });
288860
289399
  }
288861
289400
  break;
@@ -288866,7 +289405,9 @@ function AppContent() {
288866
289405
  }),
288867
289406
  {
288868
289407
  id: UPDATE_TOAST_ID,
288869
- duration: Infinity
289408
+ duration: Infinity,
289409
+ action: void 0,
289410
+ cancel: void 0
288870
289411
  }
288871
289412
  );
288872
289413
  break;
@@ -288898,7 +289439,9 @@ function AppContent() {
288898
289439
  if (event.manual) {
288899
289440
  toast2.info(t2("updater.disabled", "Updates are available only in packaged builds."), {
288900
289441
  id: UPDATE_TOAST_ID,
288901
- duration: 4e3
289442
+ duration: 4e3,
289443
+ action: void 0,
289444
+ cancel: void 0
288902
289445
  });
288903
289446
  }
288904
289447
  break;
@@ -288906,7 +289449,9 @@ function AppContent() {
288906
289449
  if (event.manual) {
288907
289450
  toast2.error(event.message, {
288908
289451
  id: UPDATE_TOAST_ID,
288909
- duration: 5e3
289452
+ duration: 5e3,
289453
+ action: void 0,
289454
+ cancel: void 0
288910
289455
  });
288911
289456
  }
288912
289457
  break;