@zythum02/fello-server 0.1.46 → 0.1.49

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 (218) hide show
  1. package/README.md +11 -2
  2. package/out/renderer/assets/{_baseUniq-JI50qq3v.js → _baseUniq-jsNn2Q0s.js} +1 -1
  3. package/out/renderer/assets/_baseUniq-jsNn2Q0s.js.br +0 -0
  4. package/out/renderer/assets/_baseUniq-jsNn2Q0s.js.gz +0 -0
  5. package/out/renderer/assets/{arc-D82BffDI.js → arc-CZMdjunT.js} +1 -1
  6. package/out/renderer/assets/arc-CZMdjunT.js.br +0 -0
  7. package/out/renderer/assets/arc-CZMdjunT.js.gz +0 -0
  8. package/out/renderer/assets/{architectureDiagram-Q4EWVU46-BBRMDHvv.js → architectureDiagram-Q4EWVU46-BNFtPc1v.js} +5 -5
  9. package/out/renderer/assets/architectureDiagram-Q4EWVU46-BNFtPc1v.js.br +0 -0
  10. package/out/renderer/assets/architectureDiagram-Q4EWVU46-BNFtPc1v.js.gz +0 -0
  11. package/out/renderer/assets/{blockDiagram-DXYQGD6D-CiCuaiyL.js → blockDiagram-DXYQGD6D-CPK2QuaJ.js} +6 -6
  12. package/out/renderer/assets/blockDiagram-DXYQGD6D-CPK2QuaJ.js.br +0 -0
  13. package/out/renderer/assets/blockDiagram-DXYQGD6D-CPK2QuaJ.js.gz +0 -0
  14. package/out/renderer/assets/{c4Diagram-AHTNJAMY-D9PM_R8p.js → c4Diagram-AHTNJAMY-DLQf0xBh.js} +2 -2
  15. package/out/renderer/assets/c4Diagram-AHTNJAMY-DLQf0xBh.js.br +0 -0
  16. package/out/renderer/assets/c4Diagram-AHTNJAMY-DLQf0xBh.js.gz +0 -0
  17. package/out/renderer/assets/{channel-CklIgqOK.js → channel-sFWrTS52.js} +1 -1
  18. package/out/renderer/assets/{chunk-4BX2VUAB-DK0KQU1M.js → chunk-4BX2VUAB-CUoBhtu2.js} +1 -1
  19. package/out/renderer/assets/{chunk-4TB4RGXK-CxHdBbdg.js → chunk-4TB4RGXK-CRjlV65P.js} +5 -5
  20. package/out/renderer/assets/chunk-4TB4RGXK-CRjlV65P.js.br +0 -0
  21. package/out/renderer/assets/chunk-4TB4RGXK-CRjlV65P.js.gz +0 -0
  22. package/out/renderer/assets/{chunk-55IACEB6-ykIH_AN3.js → chunk-55IACEB6-zrgWErN1.js} +1 -1
  23. package/out/renderer/assets/{chunk-EDXVE4YY-DUOS0pBH.js → chunk-EDXVE4YY-B5b9dJFI.js} +1 -1
  24. package/out/renderer/assets/chunk-EDXVE4YY-B5b9dJFI.js.br +0 -0
  25. package/out/renderer/assets/chunk-EDXVE4YY-B5b9dJFI.js.gz +0 -0
  26. package/out/renderer/assets/{chunk-FMBD7UC4-Bm3BHCuh.js → chunk-FMBD7UC4-Bb0FhBnd.js} +1 -1
  27. package/out/renderer/assets/{chunk-OYMX7WX6-DH9JMSMI.js → chunk-OYMX7WX6-CkUp0SL9.js} +3 -3
  28. package/out/renderer/assets/chunk-OYMX7WX6-CkUp0SL9.js.br +0 -0
  29. package/out/renderer/assets/chunk-OYMX7WX6-CkUp0SL9.js.gz +0 -0
  30. package/out/renderer/assets/{chunk-QZHKN3VN-LffrA1jF.js → chunk-QZHKN3VN-Bqt7zsAR.js} +1 -1
  31. package/out/renderer/assets/{chunk-YZCP3GAM-B1pm_POM.js → chunk-YZCP3GAM-Crg82fz2.js} +1 -1
  32. package/out/renderer/assets/chunk-YZCP3GAM-Crg82fz2.js.br +0 -0
  33. package/out/renderer/assets/chunk-YZCP3GAM-Crg82fz2.js.gz +0 -0
  34. package/out/renderer/assets/{classDiagram-6PBFFD2Q-O6uMquiH.js → classDiagram-6PBFFD2Q-BInpfZnW.js} +6 -6
  35. package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-O6uMquiH.js → classDiagram-v2-HSJHXN6E-BInpfZnW.js} +6 -6
  36. package/out/renderer/assets/{clone-BhlnPWG5.js → clone-Brsdp_jq.js} +1 -1
  37. package/out/renderer/assets/{cose-bilkent-S5V4N54A-ljZi9cz-.js → cose-bilkent-S5V4N54A-CH_2zOJR.js} +1 -1
  38. package/out/renderer/assets/cose-bilkent-S5V4N54A-CH_2zOJR.js.br +0 -0
  39. package/out/renderer/assets/cose-bilkent-S5V4N54A-CH_2zOJR.js.gz +0 -0
  40. package/out/renderer/assets/{dagre-KV5264BT-DqnNoP69.js → dagre-KV5264BT-H1wB7v-Q.js} +6 -6
  41. package/out/renderer/assets/dagre-KV5264BT-H1wB7v-Q.js.br +0 -0
  42. package/out/renderer/assets/dagre-KV5264BT-H1wB7v-Q.js.gz +0 -0
  43. package/out/renderer/assets/{diagram-5BDNPKRD-pBYJseHI.js → diagram-5BDNPKRD-D9VV_-Xi.js} +6 -6
  44. package/out/renderer/assets/diagram-5BDNPKRD-D9VV_-Xi.js.br +0 -0
  45. package/out/renderer/assets/diagram-5BDNPKRD-D9VV_-Xi.js.gz +0 -0
  46. package/out/renderer/assets/{diagram-G4DWMVQ6-IPm9zWeG.js → diagram-G4DWMVQ6-CfRglPBg.js} +6 -6
  47. package/out/renderer/assets/diagram-G4DWMVQ6-CfRglPBg.js.br +0 -0
  48. package/out/renderer/assets/diagram-G4DWMVQ6-CfRglPBg.js.gz +0 -0
  49. package/out/renderer/assets/{diagram-MMDJMWI5-DSH58P_m.js → diagram-MMDJMWI5-BnwRyNpR.js} +5 -5
  50. package/out/renderer/assets/diagram-MMDJMWI5-BnwRyNpR.js.br +0 -0
  51. package/out/renderer/assets/diagram-MMDJMWI5-BnwRyNpR.js.gz +0 -0
  52. package/out/renderer/assets/{diagram-TYMM5635-Czl-GGCp.js → diagram-TYMM5635-BKn_5Ga7.js} +5 -5
  53. package/out/renderer/assets/diagram-TYMM5635-BKn_5Ga7.js.br +0 -0
  54. package/out/renderer/assets/diagram-TYMM5635-BKn_5Ga7.js.gz +0 -0
  55. package/out/renderer/assets/{erDiagram-SMLLAGMA-BENPNKae.js → erDiagram-SMLLAGMA-B35CLzqQ.js} +4 -4
  56. package/out/renderer/assets/erDiagram-SMLLAGMA-B35CLzqQ.js.br +0 -0
  57. package/out/renderer/assets/erDiagram-SMLLAGMA-B35CLzqQ.js.gz +0 -0
  58. package/out/renderer/assets/{flowDiagram-DWJPFMVM-T3H9Pqwa.js → flowDiagram-DWJPFMVM-BidIy8zc.js} +6 -6
  59. package/out/renderer/assets/flowDiagram-DWJPFMVM-BidIy8zc.js.br +0 -0
  60. package/out/renderer/assets/flowDiagram-DWJPFMVM-BidIy8zc.js.gz +0 -0
  61. package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-Hh-AJvLC.js → ganttDiagram-T4ZO3ILL-CqV1ei6S.js} +2 -2
  62. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CqV1ei6S.js.br +0 -0
  63. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CqV1ei6S.js.gz +0 -0
  64. package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-BDXB9jT_.js → gitGraphDiagram-UUTBAWPF-7wQ8gKPV.js} +6 -6
  65. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-7wQ8gKPV.js.br +0 -0
  66. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-7wQ8gKPV.js.gz +0 -0
  67. package/out/renderer/assets/{graph-MWvZ47Hf.js → graph-Ck9_bXv5.js} +2 -2
  68. package/out/renderer/assets/graph-Ck9_bXv5.js.br +0 -0
  69. package/out/renderer/assets/graph-Ck9_bXv5.js.gz +0 -0
  70. package/out/renderer/assets/{highlighted-body-OFNGDK62-Bvl34wyh.js → highlighted-body-OFNGDK62-gS-2OBX1.js} +1 -1
  71. package/out/renderer/assets/{index-BTEKdfpj.css → index-BtjFxpR5.css} +1 -1
  72. package/out/renderer/assets/index-BtjFxpR5.css.br +0 -0
  73. package/out/renderer/assets/index-BtjFxpR5.css.gz +0 -0
  74. package/out/renderer/assets/{index-BpPCAjGn.js → index-Cy_TZSUE.js} +2040 -1485
  75. package/out/renderer/assets/index-Cy_TZSUE.js.br +0 -0
  76. package/out/renderer/assets/index-Cy_TZSUE.js.gz +0 -0
  77. package/out/renderer/assets/{infoDiagram-42DDH7IO-Ca_9-363.js → infoDiagram-42DDH7IO-DlKxzT4w.js} +4 -4
  78. package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-D3GtyA4e.js → ishikawaDiagram-UXIWVN3A-DmOMlIE8.js} +1 -1
  79. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-DmOMlIE8.js.br +0 -0
  80. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-DmOMlIE8.js.gz +0 -0
  81. package/out/renderer/assets/{journeyDiagram-VCZTEJTY-DkQAlc0b.js → journeyDiagram-VCZTEJTY-CYRPGJN7.js} +4 -4
  82. package/out/renderer/assets/journeyDiagram-VCZTEJTY-CYRPGJN7.js.br +0 -0
  83. package/out/renderer/assets/journeyDiagram-VCZTEJTY-CYRPGJN7.js.gz +0 -0
  84. package/out/renderer/assets/{kanban-definition-6JOO6SKY-DamLzi6S.js → kanban-definition-6JOO6SKY-Dovb_i6Z.js} +2 -2
  85. package/out/renderer/assets/kanban-definition-6JOO6SKY-Dovb_i6Z.js.br +0 -0
  86. package/out/renderer/assets/kanban-definition-6JOO6SKY-Dovb_i6Z.js.gz +0 -0
  87. package/out/renderer/assets/{layout-Dw_ZcO_L.js → layout-BUs47sjz.js} +4 -4
  88. package/out/renderer/assets/layout-BUs47sjz.js.br +0 -0
  89. package/out/renderer/assets/layout-BUs47sjz.js.gz +0 -0
  90. package/out/renderer/assets/{linear-Dh5vwFy4.js → linear-CO24wS_v.js} +1 -1
  91. package/out/renderer/assets/linear-CO24wS_v.js.br +0 -0
  92. package/out/renderer/assets/linear-CO24wS_v.js.gz +0 -0
  93. package/out/renderer/assets/{min-DDCW5FhP.js → min-Dd_ATNHv.js} +2 -2
  94. package/out/renderer/assets/min-Dd_ATNHv.js.br +0 -0
  95. package/out/renderer/assets/min-Dd_ATNHv.js.gz +0 -0
  96. package/out/renderer/assets/{mindmap-definition-QFDTVHPH-B3rcYXPK.js → mindmap-definition-QFDTVHPH-CC3W7LA-.js} +3 -3
  97. package/out/renderer/assets/mindmap-definition-QFDTVHPH-CC3W7LA-.js.br +0 -0
  98. package/out/renderer/assets/mindmap-definition-QFDTVHPH-CC3W7LA-.js.gz +0 -0
  99. package/out/renderer/assets/{pieDiagram-DEJITSTG-CsCXUSKq.js → pieDiagram-DEJITSTG-BN6Ummnw.js} +6 -6
  100. package/out/renderer/assets/pieDiagram-DEJITSTG-BN6Ummnw.js.br +0 -0
  101. package/out/renderer/assets/pieDiagram-DEJITSTG-BN6Ummnw.js.gz +0 -0
  102. package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-B91qjO1u.js → quadrantDiagram-34T5L4WZ-DTE_dLJv.js} +2 -2
  103. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-DTE_dLJv.js.br +0 -0
  104. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-DTE_dLJv.js.gz +0 -0
  105. package/out/renderer/assets/{requirementDiagram-MS252O5E-oDcN7qN5.js → requirementDiagram-MS252O5E-DVDS2RYN.js} +3 -3
  106. package/out/renderer/assets/requirementDiagram-MS252O5E-DVDS2RYN.js.br +0 -0
  107. package/out/renderer/assets/requirementDiagram-MS252O5E-DVDS2RYN.js.gz +0 -0
  108. package/out/renderer/assets/{sankeyDiagram-XADWPNL6-DNQO_6oX.js → sankeyDiagram-XADWPNL6-D4_LywJM.js} +1 -1
  109. package/out/renderer/assets/sankeyDiagram-XADWPNL6-D4_LywJM.js.br +0 -0
  110. package/out/renderer/assets/sankeyDiagram-XADWPNL6-D4_LywJM.js.gz +0 -0
  111. package/out/renderer/assets/{sequenceDiagram-FGHM5R23-DCh5u6wY.js → sequenceDiagram-FGHM5R23-89GBJZmd.js} +3 -3
  112. package/out/renderer/assets/sequenceDiagram-FGHM5R23-89GBJZmd.js.br +0 -0
  113. package/out/renderer/assets/sequenceDiagram-FGHM5R23-89GBJZmd.js.gz +0 -0
  114. package/out/renderer/assets/{stateDiagram-FHFEXIEX-DV0gaxkj.js → stateDiagram-FHFEXIEX-YKrUbogP.js} +8 -8
  115. package/out/renderer/assets/stateDiagram-FHFEXIEX-YKrUbogP.js.br +0 -0
  116. package/out/renderer/assets/stateDiagram-FHFEXIEX-YKrUbogP.js.gz +0 -0
  117. package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-D1Sk_TKE.js → stateDiagram-v2-QKLJ7IA2-CO0pZRqI.js} +4 -4
  118. package/out/renderer/assets/{timeline-definition-GMOUNBTQ-Nq47TkPV.js → timeline-definition-GMOUNBTQ-BW2oxhj-.js} +2 -2
  119. package/out/renderer/assets/timeline-definition-GMOUNBTQ-BW2oxhj-.js.br +0 -0
  120. package/out/renderer/assets/timeline-definition-GMOUNBTQ-BW2oxhj-.js.gz +0 -0
  121. package/out/renderer/assets/{vennDiagram-DHZGUBPP-CMbmY-R_.js → vennDiagram-DHZGUBPP-DSy9zL6k.js} +1 -1
  122. package/out/renderer/assets/vennDiagram-DHZGUBPP-DSy9zL6k.js.br +0 -0
  123. package/out/renderer/assets/vennDiagram-DHZGUBPP-DSy9zL6k.js.gz +0 -0
  124. package/out/renderer/assets/{wardley-RL74JXVD-aLLqbf8o.js → wardley-RL74JXVD-DFRGDO55.js} +3 -3
  125. package/out/renderer/assets/wardley-RL74JXVD-DFRGDO55.js.br +0 -0
  126. package/out/renderer/assets/wardley-RL74JXVD-DFRGDO55.js.gz +0 -0
  127. package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-8Kc4VQIw.js → wardleyDiagram-NUSXRM2D-CJUPdnii.js} +5 -5
  128. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-CJUPdnii.js.br +0 -0
  129. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-CJUPdnii.js.gz +0 -0
  130. package/out/renderer/assets/{xychartDiagram-5P7HB3ND-YtEoXmYf.js → xychartDiagram-5P7HB3ND-UGlSGsDE.js} +2 -2
  131. package/out/renderer/assets/xychartDiagram-5P7HB3ND-UGlSGsDE.js.br +0 -0
  132. package/out/renderer/assets/xychartDiagram-5P7HB3ND-UGlSGsDE.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/scripts/mcp-search/server.mjs +46 -46
  137. package/out/server/main.js +1067 -318
  138. package/package.json +4 -1
  139. package/out/renderer/assets/_baseUniq-JI50qq3v.js.br +0 -0
  140. package/out/renderer/assets/_baseUniq-JI50qq3v.js.gz +0 -0
  141. package/out/renderer/assets/arc-D82BffDI.js.br +0 -0
  142. package/out/renderer/assets/arc-D82BffDI.js.gz +0 -0
  143. package/out/renderer/assets/architectureDiagram-Q4EWVU46-BBRMDHvv.js.br +0 -0
  144. package/out/renderer/assets/architectureDiagram-Q4EWVU46-BBRMDHvv.js.gz +0 -0
  145. package/out/renderer/assets/blockDiagram-DXYQGD6D-CiCuaiyL.js.br +0 -0
  146. package/out/renderer/assets/blockDiagram-DXYQGD6D-CiCuaiyL.js.gz +0 -0
  147. package/out/renderer/assets/c4Diagram-AHTNJAMY-D9PM_R8p.js.br +0 -0
  148. package/out/renderer/assets/c4Diagram-AHTNJAMY-D9PM_R8p.js.gz +0 -0
  149. package/out/renderer/assets/chunk-4TB4RGXK-CxHdBbdg.js.br +0 -0
  150. package/out/renderer/assets/chunk-4TB4RGXK-CxHdBbdg.js.gz +0 -0
  151. package/out/renderer/assets/chunk-EDXVE4YY-DUOS0pBH.js.br +0 -0
  152. package/out/renderer/assets/chunk-EDXVE4YY-DUOS0pBH.js.gz +0 -0
  153. package/out/renderer/assets/chunk-OYMX7WX6-DH9JMSMI.js.br +0 -0
  154. package/out/renderer/assets/chunk-OYMX7WX6-DH9JMSMI.js.gz +0 -0
  155. package/out/renderer/assets/chunk-YZCP3GAM-B1pm_POM.js.br +0 -0
  156. package/out/renderer/assets/chunk-YZCP3GAM-B1pm_POM.js.gz +0 -0
  157. package/out/renderer/assets/cose-bilkent-S5V4N54A-ljZi9cz-.js.br +0 -0
  158. package/out/renderer/assets/cose-bilkent-S5V4N54A-ljZi9cz-.js.gz +0 -0
  159. package/out/renderer/assets/dagre-KV5264BT-DqnNoP69.js.br +0 -0
  160. package/out/renderer/assets/dagre-KV5264BT-DqnNoP69.js.gz +0 -0
  161. package/out/renderer/assets/diagram-5BDNPKRD-pBYJseHI.js.br +0 -0
  162. package/out/renderer/assets/diagram-5BDNPKRD-pBYJseHI.js.gz +0 -0
  163. package/out/renderer/assets/diagram-G4DWMVQ6-IPm9zWeG.js.br +0 -0
  164. package/out/renderer/assets/diagram-G4DWMVQ6-IPm9zWeG.js.gz +0 -0
  165. package/out/renderer/assets/diagram-MMDJMWI5-DSH58P_m.js.br +0 -0
  166. package/out/renderer/assets/diagram-MMDJMWI5-DSH58P_m.js.gz +0 -0
  167. package/out/renderer/assets/diagram-TYMM5635-Czl-GGCp.js.br +0 -0
  168. package/out/renderer/assets/diagram-TYMM5635-Czl-GGCp.js.gz +0 -0
  169. package/out/renderer/assets/erDiagram-SMLLAGMA-BENPNKae.js.br +0 -0
  170. package/out/renderer/assets/erDiagram-SMLLAGMA-BENPNKae.js.gz +0 -0
  171. package/out/renderer/assets/flowDiagram-DWJPFMVM-T3H9Pqwa.js.br +0 -0
  172. package/out/renderer/assets/flowDiagram-DWJPFMVM-T3H9Pqwa.js.gz +0 -0
  173. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-Hh-AJvLC.js.br +0 -0
  174. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-Hh-AJvLC.js.gz +0 -0
  175. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-BDXB9jT_.js.br +0 -0
  176. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-BDXB9jT_.js.gz +0 -0
  177. package/out/renderer/assets/graph-MWvZ47Hf.js.br +0 -0
  178. package/out/renderer/assets/graph-MWvZ47Hf.js.gz +0 -0
  179. package/out/renderer/assets/index-BTEKdfpj.css.br +0 -0
  180. package/out/renderer/assets/index-BTEKdfpj.css.gz +0 -0
  181. package/out/renderer/assets/index-BpPCAjGn.js.br +0 -0
  182. package/out/renderer/assets/index-BpPCAjGn.js.gz +0 -0
  183. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-D3GtyA4e.js.br +0 -0
  184. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-D3GtyA4e.js.gz +0 -0
  185. package/out/renderer/assets/journeyDiagram-VCZTEJTY-DkQAlc0b.js.br +0 -0
  186. package/out/renderer/assets/journeyDiagram-VCZTEJTY-DkQAlc0b.js.gz +0 -0
  187. package/out/renderer/assets/kanban-definition-6JOO6SKY-DamLzi6S.js.br +0 -0
  188. package/out/renderer/assets/kanban-definition-6JOO6SKY-DamLzi6S.js.gz +0 -0
  189. package/out/renderer/assets/layout-Dw_ZcO_L.js.br +0 -0
  190. package/out/renderer/assets/layout-Dw_ZcO_L.js.gz +0 -0
  191. package/out/renderer/assets/linear-Dh5vwFy4.js.br +0 -0
  192. package/out/renderer/assets/linear-Dh5vwFy4.js.gz +0 -0
  193. package/out/renderer/assets/min-DDCW5FhP.js.br +0 -0
  194. package/out/renderer/assets/min-DDCW5FhP.js.gz +0 -0
  195. package/out/renderer/assets/mindmap-definition-QFDTVHPH-B3rcYXPK.js.br +0 -0
  196. package/out/renderer/assets/mindmap-definition-QFDTVHPH-B3rcYXPK.js.gz +0 -0
  197. package/out/renderer/assets/pieDiagram-DEJITSTG-CsCXUSKq.js.br +0 -0
  198. package/out/renderer/assets/pieDiagram-DEJITSTG-CsCXUSKq.js.gz +0 -0
  199. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-B91qjO1u.js.br +0 -0
  200. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-B91qjO1u.js.gz +0 -0
  201. package/out/renderer/assets/requirementDiagram-MS252O5E-oDcN7qN5.js.br +0 -0
  202. package/out/renderer/assets/requirementDiagram-MS252O5E-oDcN7qN5.js.gz +0 -0
  203. package/out/renderer/assets/sankeyDiagram-XADWPNL6-DNQO_6oX.js.br +0 -0
  204. package/out/renderer/assets/sankeyDiagram-XADWPNL6-DNQO_6oX.js.gz +0 -0
  205. package/out/renderer/assets/sequenceDiagram-FGHM5R23-DCh5u6wY.js.br +0 -0
  206. package/out/renderer/assets/sequenceDiagram-FGHM5R23-DCh5u6wY.js.gz +0 -0
  207. package/out/renderer/assets/stateDiagram-FHFEXIEX-DV0gaxkj.js.br +0 -0
  208. package/out/renderer/assets/stateDiagram-FHFEXIEX-DV0gaxkj.js.gz +0 -0
  209. package/out/renderer/assets/timeline-definition-GMOUNBTQ-Nq47TkPV.js.br +0 -0
  210. package/out/renderer/assets/timeline-definition-GMOUNBTQ-Nq47TkPV.js.gz +0 -0
  211. package/out/renderer/assets/vennDiagram-DHZGUBPP-CMbmY-R_.js.br +0 -0
  212. package/out/renderer/assets/vennDiagram-DHZGUBPP-CMbmY-R_.js.gz +0 -0
  213. package/out/renderer/assets/wardley-RL74JXVD-aLLqbf8o.js.br +0 -0
  214. package/out/renderer/assets/wardley-RL74JXVD-aLLqbf8o.js.gz +0 -0
  215. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-8Kc4VQIw.js.br +0 -0
  216. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-8Kc4VQIw.js.gz +0 -0
  217. package/out/renderer/assets/xychartDiagram-5P7HB3ND-YtEoXmYf.js.br +0 -0
  218. 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-H1wB7v-Q.js","./graph-Ck9_bXv5.js","./_baseUniq-jsNn2Q0s.js","./layout-BUs47sjz.js","./min-Dd_ATNHv.js","./clone-Brsdp_jq.js","./cose-bilkent-S5V4N54A-CH_2zOJR.js","./cytoscape.esm-Bm8DJGmZ.js","./c4Diagram-AHTNJAMY-DLQf0xBh.js","./chunk-YZCP3GAM-Crg82fz2.js","./flowDiagram-DWJPFMVM-BidIy8zc.js","./chunk-FMBD7UC4-Bb0FhBnd.js","./chunk-55IACEB6-zrgWErN1.js","./chunk-EDXVE4YY-B5b9dJFI.js","./channel-sFWrTS52.js","./erDiagram-SMLLAGMA-B35CLzqQ.js","./gitGraphDiagram-UUTBAWPF-7wQ8gKPV.js","./chunk-4BX2VUAB-CUoBhtu2.js","./chunk-QZHKN3VN-Bqt7zsAR.js","./wardley-RL74JXVD-DFRGDO55.js","./ganttDiagram-T4ZO3ILL-CqV1ei6S.js","./linear-CO24wS_v.js","./init-ZxktEp_H.js","./defaultLocale-B2RvLBDe.js","./infoDiagram-42DDH7IO-DlKxzT4w.js","./pieDiagram-DEJITSTG-BN6Ummnw.js","./arc-CZMdjunT.js","./ordinal-CxptdPJm.js","./quadrantDiagram-34T5L4WZ-DTE_dLJv.js","./xychartDiagram-5P7HB3ND-UGlSGsDE.js","./requirementDiagram-MS252O5E-DVDS2RYN.js","./sequenceDiagram-FGHM5R23-89GBJZmd.js","./classDiagram-6PBFFD2Q-BInpfZnW.js","./chunk-4TB4RGXK-CRjlV65P.js","./classDiagram-v2-HSJHXN6E-BInpfZnW.js","./stateDiagram-FHFEXIEX-YKrUbogP.js","./chunk-OYMX7WX6-CkUp0SL9.js","./stateDiagram-v2-QKLJ7IA2-CO0pZRqI.js","./journeyDiagram-VCZTEJTY-CYRPGJN7.js","./timeline-definition-GMOUNBTQ-BW2oxhj-.js","./mindmap-definition-QFDTVHPH-CC3W7LA-.js","./kanban-definition-6JOO6SKY-Dovb_i6Z.js","./sankeyDiagram-XADWPNL6-D4_LywJM.js","./diagram-TYMM5635-BKn_5Ga7.js","./diagram-MMDJMWI5-BnwRyNpR.js","./blockDiagram-DXYQGD6D-CPK2QuaJ.js","./diagram-5BDNPKRD-D9VV_-Xi.js","./architectureDiagram-Q4EWVU46-BNFtPc1v.js","./diagram-G4DWMVQ6-CfRglPBg.js","./wardleyDiagram-NUSXRM2D-CJUPdnii.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,17 +16885,17 @@ 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" } };
16893
16895
  const chatHeader$1 = { "sessionId": "Session", "openSessionFolder": "Open Session Folder", "refresh": "Restart Session", "closeSession": "Close Session", "closingSession": "Closing…", "failedToCloseSession": "Failed to close session.", "contextWindow": "Context Window", "used": "Used", "size": "Size", "percentUsed": "{{pct}}% used", "remaining": "{{count}} remaining", "lastTurn": "Last Turn", "input": "Input", "output": "Output", "total": "Total", "thought": "Thought", "cacheRead": "Cache read", "cacheWrite": "Cache write", "cost": "Cost" };
16894
16896
  const chatInput$1 = { "placeholderDisabled": "Start a new chat to begin...", "placeholderActive": "Ask anything... (Enter to send)", "mode": "Mode", "suggestions": "Suggestions", "messageInput": "Message input", "stop": "Stop", "send": "Send", "tokensUsage": "In: {{input}} Out: {{output}} Total: {{total}}{{thoughtStr}}", "tokensTotal": "{{total}}k tokens", "generationFailed": "Generation failed.", "attach": "Attach file", "snippets": "Snippets", "snippetsEmpty": "No snippets. Click to add in Settings.", "selectModel": "Select model", "stopReasonMaxTokens": "Reached maximum token limit", "stopReasonMaxTurnRequests": "Reached maximum turn limit", "stopReasonRefusal": "Model refused to respond", "stopReasonCancelled": "Generation was cancelled" };
16895
16897
  const filePanel$1 = { "title": "Files", "emptyDirectory": "Empty directory", "newFile": "New File", "newFolder": "New Folder", "rename": "Rename", "copyPath": "Copy Path", "copyRelativePath": "Copy Relative Path", "revealInFinder": "Reveal in Finder", "openInEditor": "Open in {{editor}}", "delete": "Delete", "deleteConfirmSingle": 'How would you like to delete "{{name}}"?', "deleteConfirmMultiple": "How would you like to delete {{count}} items?", "dragItems": "{{count}} items", "cancel": "Cancel", "moveToTrash": "Move to Trash", "moveToRecycleBin": "Move to Recycle Bin", "moveConfirmTitle": "Move", "moveConfirmSingle": 'Move "{{name}}" to "{{dest}}"?', "moveConfirmMultiple": 'Move {{count}} items to "{{dest}}"?', "moveConfirmSingleToRoot": 'Move "{{name}}" to the root directory?', "moveConfirmMultipleToRoot": "Move {{count}} items to the root directory?", "loading": "Loading...", "collapseFolders": "Collapse Folders", "refresh": "Refresh", "addToChat": "Add to Chat", "noProject": "No project selected" };
16896
- const toolBubble$1 = { "tool": "Tool", "stop": "Stop", "stopping": "Stopping…" };
16898
+ const toolBubble$1 = { "tool": "Tool", "stop": "Stop", "stopping": "Stopping…", "result": "Result", "terminal": "Terminal" };
16897
16899
  const imageView$1 = { "fallbackAlt": "Image" };
16898
16900
  const readonlyTerminal$1 = { "noOutput": "No output" };
16899
16901
  const message$1 = { "validationFailed": "Validation failed", "ok": "OK", "cancel": "Cancel", "confirm": "Confirm", "dialogTitle": "Message Dialog", "errorTitle": "Error" };
@@ -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,17 +16957,17 @@ 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": "图片生成" } };
16965
16967
  const chatHeader = { "sessionId": "会话编号", "openSessionFolder": "打开会话文件夹", "refresh": "重启会话", "closeSession": "关闭会话", "closingSession": "关闭中…", "failedToCloseSession": "关闭会话失败。", "contextWindow": "上下文窗口", "used": "已用", "size": "上限", "percentUsed": "已用 {{pct}}%", "remaining": "剩余 {{count}}", "lastTurn": "上一轮", "input": "输入", "output": "输出", "total": "总计", "thought": "思考", "cacheRead": "缓存读取", "cacheWrite": "缓存写入", "cost": "费用" };
16966
16968
  const chatInput = { "placeholderDisabled": "请先开启新的会话...", "placeholderActive": "有任何问题请问我... (回车发送)", "mode": "模式", "suggestions": "建议", "messageInput": "消息输入", "stop": "停止", "send": "发送", "tokensUsage": "输入: {{input}} 输出: {{output}} 总计: {{total}}{{thoughtStr}}", "tokensTotal": "{{total}}k tokens", "generationFailed": "生成失败。", "attach": "附加文件", "snippets": "快捷短语", "snippetsEmpty": "暂无短语,点击前往设置添加。", "selectModel": "选择模型", "stopReasonMaxTokens": "已达到最大 token 限制", "stopReasonMaxTurnRequests": "已达到最大轮次限制", "stopReasonRefusal": "模型拒绝回答", "stopReasonCancelled": "生成已取消" };
16967
16969
  const filePanel = { "title": "文件", "emptyDirectory": "空目录", "newFile": "新建文件", "newFolder": "新建文件夹", "rename": "重命名", "copyPath": "复制路径", "copyRelativePath": "复制相对路径", "revealInFinder": "在访达中显示", "openInEditor": "使用 {{editor}} 打开", "delete": "删除", "deleteConfirmSingle": "是否删除“{{name}}”?", "deleteConfirmMultiple": "是否删除选中的 {{count}} 个项目?", "dragItems": "{{count}} 个项目", "cancel": "取消", "moveToTrash": "移至废纸篓", "moveToRecycleBin": "移至回收站", "moveConfirmTitle": "移动", "moveConfirmSingle": "是否将“{{name}}”移动到“{{dest}}”?", "moveConfirmMultiple": "是否将 {{count}} 个项目移动到“{{dest}}”?", "moveConfirmSingleToRoot": "是否将“{{name}}”移动到根目录?", "moveConfirmMultipleToRoot": "是否将 {{count}} 个项目移动到根目录?", "loading": "加载中...", "collapseFolders": "折叠文件夹", "refresh": "刷新", "addToChat": "添加到对话", "noProject": "未选择项目" };
16968
- const toolBubble = { "tool": "工具", "stop": "停止", "stopping": "停止中…" };
16970
+ const toolBubble = { "tool": "工具", "stop": "停止", "stopping": "停止中…", "result": "结果", "terminal": "终端" };
16969
16971
  const imageView = { "fallbackAlt": "图片" };
16970
16972
  const readonlyTerminal = { "noOutput": "无输出." };
16971
16973
  const message = { "validationFailed": "验证失败", "ok": "确定", "cancel": "取消", "confirm": "确认", "dialogTitle": "消息提示", "errorTitle": "错误" };
@@ -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": "周六" } } };
@@ -20722,10 +20724,20 @@ function calculateToolCallUpdate(state2, subSessionId, update2, displayId, recei
20722
20724
  message2.title = update2.title ?? "";
20723
20725
  }
20724
20726
  if (Object.prototype.hasOwnProperty.call(update2, "status") && update2.status != null) {
20725
- message2.status = update2.status;
20727
+ const next2 = update2.status;
20728
+ const current2 = message2.status;
20729
+ const order2 = { pending: 0, in_progress: 1, completed: 2, failed: 2 };
20730
+ if (current2 == null || order2[next2] >= order2[current2]) {
20731
+ message2.status = next2;
20732
+ }
20726
20733
  }
20727
20734
  if (Object.prototype.hasOwnProperty.call(update2, "content")) {
20728
- message2.content = update2.content ?? [];
20735
+ const newContent = update2.content ?? [];
20736
+ const hasDiff = message2.content?.some((c3) => c3.type === "diff") ?? false;
20737
+ const nextHasDiff = newContent.some((c3) => c3.type === "diff");
20738
+ if (!hasDiff || nextHasDiff) {
20739
+ message2.content = newContent;
20740
+ }
20729
20741
  }
20730
20742
  if (Object.prototype.hasOwnProperty.call(update2, "kind") && update2.kind != null) {
20731
20743
  message2.kind = update2.kind;
@@ -20757,6 +20769,14 @@ function calculateToolCallUpdate(state2, subSessionId, update2, displayId, recei
20757
20769
  state22.activeSubagents.set(subSessionId, subagentMessage);
20758
20770
  return subagentMessage.messages;
20759
20771
  })();
20772
+ if (subSessionId) {
20773
+ const mainIdx = state22.messages.findIndex(
20774
+ (m2) => m2.role === "tool_call" && m2.toolCallId === update2.toolCallId
20775
+ );
20776
+ if (mainIdx !== -1) {
20777
+ state22.messages.splice(mainIdx, 1);
20778
+ }
20779
+ }
20760
20780
  const idx = messages.findIndex(
20761
20781
  (m2) => m2.role === "tool_call" && m2.toolCallId === update2.toolCallId
20762
20782
  );
@@ -30983,35 +31003,35 @@ const createLucideIcon = (iconName, iconNode) => {
30983
31003
  Component.displayName = toPascalCase(iconName);
30984
31004
  return Component;
30985
31005
  };
30986
- const __iconNode$1t = [
31006
+ const __iconNode$1v = [
30987
31007
  ["path", { d: "M12 5v14", key: "s699le" }],
30988
31008
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
30989
31009
  ];
30990
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$1t);
30991
- const __iconNode$1s = [
31010
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$1v);
31011
+ const __iconNode$1u = [
30992
31012
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
30993
31013
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
30994
31014
  ];
30995
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1s);
30996
- const __iconNode$1r = [
31015
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1u);
31016
+ const __iconNode$1t = [
30997
31017
  ["path", { d: "m16 3 4 4-4 4", key: "1x1c3m" }],
30998
31018
  ["path", { d: "M20 7H4", key: "zbl0bi" }],
30999
31019
  ["path", { d: "m8 21-4-4 4-4", key: "h9nckh" }],
31000
31020
  ["path", { d: "M4 17h16", key: "g4d7ey" }]
31001
31021
  ];
31002
- const ArrowRightLeft = createLucideIcon("arrow-right-left", __iconNode$1r);
31003
- const __iconNode$1q = [
31022
+ const ArrowRightLeft = createLucideIcon("arrow-right-left", __iconNode$1t);
31023
+ const __iconNode$1s = [
31004
31024
  ["path", { d: "M5 3h14", key: "7usisc" }],
31005
31025
  ["path", { d: "m18 13-6-6-6 6", key: "1kf1n9" }],
31006
31026
  ["path", { d: "M12 7v14", key: "1akyts" }]
31007
31027
  ];
31008
- const ArrowUpToLine = createLucideIcon("arrow-up-to-line", __iconNode$1q);
31009
- const __iconNode$1p = [
31028
+ const ArrowUpToLine = createLucideIcon("arrow-up-to-line", __iconNode$1s);
31029
+ const __iconNode$1r = [
31010
31030
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
31011
31031
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
31012
31032
  ];
31013
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$1p);
31014
- const __iconNode$1o = [
31033
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$1r);
31034
+ const __iconNode$1q = [
31015
31035
  [
31016
31036
  "path",
31017
31037
  {
@@ -31020,13 +31040,13 @@ const __iconNode$1o = [
31020
31040
  }
31021
31041
  ]
31022
31042
  ];
31023
- const Astroid = createLucideIcon("astroid", __iconNode$1o);
31024
- const __iconNode$1n = [
31043
+ const Astroid = createLucideIcon("astroid", __iconNode$1q);
31044
+ const __iconNode$1p = [
31025
31045
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31026
31046
  ["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }]
31027
31047
  ];
31028
- const Ban = createLucideIcon("ban", __iconNode$1n);
31029
- const __iconNode$1m = [
31048
+ const Ban = createLucideIcon("ban", __iconNode$1p);
31049
+ const __iconNode$1o = [
31030
31050
  ["path", { d: "M12 7v6", key: "lw1j43" }],
31031
31051
  ["path", { d: "M15 10H9", key: "o6yqo3" }],
31032
31052
  [
@@ -31037,8 +31057,8 @@ const __iconNode$1m = [
31037
31057
  }
31038
31058
  ]
31039
31059
  ];
31040
- const BookmarkPlus = createLucideIcon("bookmark-plus", __iconNode$1m);
31041
- const __iconNode$1l = [
31060
+ const BookmarkPlus = createLucideIcon("bookmark-plus", __iconNode$1o);
31061
+ const __iconNode$1n = [
31042
31062
  ["path", { d: "M12 8V4H8", key: "hb8ula" }],
31043
31063
  ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
31044
31064
  ["path", { d: "M2 14h2", key: "vft8re" }],
@@ -31046,8 +31066,8 @@ const __iconNode$1l = [
31046
31066
  ["path", { d: "M15 13v2", key: "1xurst" }],
31047
31067
  ["path", { d: "M9 13v2", key: "rq6x2g" }]
31048
31068
  ];
31049
- const Bot = createLucideIcon("bot", __iconNode$1l);
31050
- const __iconNode$1k = [
31069
+ const Bot = createLucideIcon("bot", __iconNode$1n);
31070
+ const __iconNode$1m = [
31051
31071
  ["path", { d: "M12 18V5", key: "adv99a" }],
31052
31072
  ["path", { d: "M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4", key: "1e3is1" }],
31053
31073
  ["path", { d: "M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5", key: "1gqd8o" }],
@@ -31057,61 +31077,74 @@ const __iconNode$1k = [
31057
31077
  ["path", { d: "M6 18a4 4 0 0 1-2-7.464", key: "k1g0md" }],
31058
31078
  ["path", { d: "M6.003 5.125a4 4 0 0 0-2.526 5.77", key: "q97ue3" }]
31059
31079
  ];
31060
- const Brain = createLucideIcon("brain", __iconNode$1k);
31061
- const __iconNode$1j = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
31062
- const Check = createLucideIcon("check", __iconNode$1j);
31063
- const __iconNode$1i = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
31064
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$1i);
31065
- const __iconNode$1h = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
31066
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$1h);
31067
- const __iconNode$1g = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
31068
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$1g);
31069
- const __iconNode$1f = [
31080
+ const Brain = createLucideIcon("brain", __iconNode$1m);
31081
+ const __iconNode$1l = [
31082
+ ["path", { d: "M8 2v3", key: "1ioesn" }],
31083
+ ["path", { d: "M16 2v3", key: "otl347" }],
31084
+ ["rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", key: "h1oib" }],
31085
+ ["path", { d: "M3 9h18", key: "1pudct" }],
31086
+ ["path", { d: "M8 13h.01", key: "1sbv64" }],
31087
+ ["path", { d: "M12 13h.01", key: "y0uutt" }],
31088
+ ["path", { d: "M16 13h.01", key: "wip0gl" }],
31089
+ ["path", { d: "M8 17h.01", key: "p3bg7i" }],
31090
+ ["path", { d: "M12 17h.01", key: "p32p05" }],
31091
+ ["path", { d: "M16 17h.01", key: "ql8jdd" }]
31092
+ ];
31093
+ const CalendarDays = createLucideIcon("calendar-days", __iconNode$1l);
31094
+ const __iconNode$1k = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
31095
+ const Check = createLucideIcon("check", __iconNode$1k);
31096
+ const __iconNode$1j = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
31097
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$1j);
31098
+ const __iconNode$1i = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
31099
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$1i);
31100
+ const __iconNode$1h = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
31101
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1h);
31102
+ const __iconNode$1g = [
31070
31103
  ["path", { d: "m7 20 5-5 5 5", key: "13a0gw" }],
31071
31104
  ["path", { d: "m7 4 5 5 5-5", key: "1kwcof" }]
31072
31105
  ];
31073
- const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$1f);
31074
- const __iconNode$1e = [
31106
+ const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$1g);
31107
+ const __iconNode$1f = [
31075
31108
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
31076
31109
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
31077
31110
  ];
31078
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1e);
31079
- const __iconNode$1d = [
31111
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1f);
31112
+ const __iconNode$1e = [
31080
31113
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31081
31114
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
31082
31115
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
31083
31116
  ];
31084
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$1d);
31085
- const __iconNode$1c = [
31117
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1e);
31118
+ const __iconNode$1d = [
31086
31119
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31087
31120
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
31088
31121
  ];
31089
- const CircleCheck = createLucideIcon("circle-check", __iconNode$1c);
31090
- const __iconNode$1b = [
31122
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$1d);
31123
+ const __iconNode$1c = [
31091
31124
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31092
31125
  ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
31093
31126
  ["path", { d: "M12 17h.01", key: "p32p05" }]
31094
31127
  ];
31095
- const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$1b);
31096
- const __iconNode$1a = [["circle", { cx: "12", cy: "12", r: "6", key: "1vlfrh" }]];
31097
- const CircleSmall = createLucideIcon("circle-small", __iconNode$1a);
31098
- const __iconNode$19 = [
31128
+ const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$1c);
31129
+ const __iconNode$1b = [["circle", { cx: "12", cy: "12", r: "6", key: "1vlfrh" }]];
31130
+ const CircleSmall = createLucideIcon("circle-small", __iconNode$1b);
31131
+ const __iconNode$1a = [
31099
31132
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31100
31133
  ["path", { d: "m15 9-6 6", key: "1uzhvr" }],
31101
31134
  ["path", { d: "m9 9 6 6", key: "z0biqf" }]
31102
31135
  ];
31103
- const CircleX = createLucideIcon("circle-x", __iconNode$19);
31104
- const __iconNode$18 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
31105
- const Circle = createLucideIcon("circle", __iconNode$18);
31106
- const __iconNode$17 = [
31136
+ const CircleX = createLucideIcon("circle-x", __iconNode$1a);
31137
+ const __iconNode$19 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
31138
+ const Circle = createLucideIcon("circle", __iconNode$19);
31139
+ const __iconNode$18 = [
31107
31140
  ["path", { d: "M11 14h10", key: "1w8e9d" }],
31108
31141
  ["path", { d: "M16 4h2a2 2 0 0 1 2 2v1.344", key: "1e62lh" }],
31109
31142
  ["path", { d: "m17 18 4-4-4-4", key: "z2g111" }],
31110
31143
  ["path", { d: "M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113", key: "bjbb7m" }],
31111
31144
  ["rect", { x: "8", y: "2", width: "8", height: "4", rx: "1", key: "ublpy" }]
31112
31145
  ];
31113
- const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$17);
31114
- const __iconNode$16 = [
31146
+ const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$18);
31147
+ const __iconNode$17 = [
31115
31148
  ["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
31116
31149
  [
31117
31150
  "path",
@@ -31121,65 +31154,65 @@ const __iconNode$16 = [
31121
31154
  }
31122
31155
  ]
31123
31156
  ];
31124
- const Clipboard = createLucideIcon("clipboard", __iconNode$16);
31125
- const __iconNode$15 = [
31157
+ const Clipboard = createLucideIcon("clipboard", __iconNode$17);
31158
+ const __iconNode$16 = [
31126
31159
  ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }],
31127
31160
  ["path", { d: "M22 12a10 10 0 1 0-11 9.95", key: "17dhok" }],
31128
31161
  ["path", { d: "m22 16-5.5 5.5L14 19", key: "1eibut" }]
31129
31162
  ];
31130
- const ClockCheck = createLucideIcon("clock-check", __iconNode$15);
31131
- const __iconNode$14 = [
31163
+ const ClockCheck = createLucideIcon("clock-check", __iconNode$16);
31164
+ const __iconNode$15 = [
31132
31165
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31133
31166
  ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
31134
31167
  ];
31135
- const Clock = createLucideIcon("clock", __iconNode$14);
31136
- const __iconNode$13 = [
31168
+ const Clock = createLucideIcon("clock", __iconNode$15);
31169
+ const __iconNode$14 = [
31137
31170
  ["path", { d: "m16 18 6-6-6-6", key: "eg8j8" }],
31138
31171
  ["path", { d: "m8 6-6 6 6 6", key: "ppft3o" }]
31139
31172
  ];
31140
- const Code = createLucideIcon("code", __iconNode$13);
31141
- const __iconNode$12 = [
31173
+ const Code = createLucideIcon("code", __iconNode$14);
31174
+ const __iconNode$13 = [
31142
31175
  ["line", { x1: "15", x2: "15", y1: "12", y2: "18", key: "1p7wdc" }],
31143
31176
  ["line", { x1: "12", x2: "18", y1: "15", y2: "15", key: "1nscbv" }],
31144
31177
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
31145
31178
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
31146
31179
  ];
31147
- const CopyPlus = createLucideIcon("copy-plus", __iconNode$12);
31148
- const __iconNode$11 = [
31180
+ const CopyPlus = createLucideIcon("copy-plus", __iconNode$13);
31181
+ const __iconNode$12 = [
31149
31182
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
31150
31183
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
31151
31184
  ];
31152
- const Copy = createLucideIcon("copy", __iconNode$11);
31153
- const __iconNode$10 = [
31185
+ const Copy = createLucideIcon("copy", __iconNode$12);
31186
+ const __iconNode$11 = [
31154
31187
  ["path", { d: "M12 15V3", key: "m9g1x1" }],
31155
31188
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
31156
31189
  ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
31157
31190
  ];
31158
- const Download = createLucideIcon("download", __iconNode$10);
31159
- const __iconNode$$ = [
31191
+ const Download = createLucideIcon("download", __iconNode$11);
31192
+ const __iconNode$10 = [
31160
31193
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31161
31194
  ["path", { d: "M12 2a7 7 0 1 0 10 10", key: "1yuj32" }]
31162
31195
  ];
31163
- const Eclipse = createLucideIcon("eclipse", __iconNode$$);
31164
- const __iconNode$_ = [
31196
+ const Eclipse = createLucideIcon("eclipse", __iconNode$10);
31197
+ const __iconNode$$ = [
31165
31198
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
31166
31199
  ["circle", { cx: "12", cy: "5", r: "1", key: "gxeob9" }],
31167
31200
  ["circle", { cx: "12", cy: "19", r: "1", key: "lyex9k" }]
31168
31201
  ];
31169
- const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$_);
31170
- const __iconNode$Z = [
31202
+ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$$);
31203
+ const __iconNode$_ = [
31171
31204
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
31172
31205
  ["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
31173
31206
  ["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
31174
31207
  ];
31175
- const Ellipsis = createLucideIcon("ellipsis", __iconNode$Z);
31176
- const __iconNode$Y = [
31208
+ const Ellipsis = createLucideIcon("ellipsis", __iconNode$_);
31209
+ const __iconNode$Z = [
31177
31210
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
31178
31211
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
31179
31212
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
31180
31213
  ];
31181
- const ExternalLink = createLucideIcon("external-link", __iconNode$Y);
31182
- const __iconNode$X = [
31214
+ const ExternalLink = createLucideIcon("external-link", __iconNode$Z);
31215
+ const __iconNode$Y = [
31183
31216
  [
31184
31217
  "path",
31185
31218
  {
@@ -31191,8 +31224,8 @@ const __iconNode$X = [
31191
31224
  ["path", { d: "M10 12.5 8 15l2 2.5", key: "1tg20x" }],
31192
31225
  ["path", { d: "m14 12.5 2 2.5-2 2.5", key: "yinavb" }]
31193
31226
  ];
31194
- const FileCode = createLucideIcon("file-code", __iconNode$X);
31195
- const __iconNode$W = [
31227
+ const FileCode = createLucideIcon("file-code", __iconNode$Y);
31228
+ const __iconNode$X = [
31196
31229
  [
31197
31230
  "path",
31198
31231
  {
@@ -31204,8 +31237,8 @@ const __iconNode$W = [
31204
31237
  ["path", { d: "M9 15h6", key: "cctwl0" }],
31205
31238
  ["path", { d: "M12 18v-6", key: "17g6i2" }]
31206
31239
  ];
31207
- const FilePlus = createLucideIcon("file-plus", __iconNode$W);
31208
- const __iconNode$V = [
31240
+ const FilePlus = createLucideIcon("file-plus", __iconNode$X);
31241
+ const __iconNode$W = [
31209
31242
  [
31210
31243
  "path",
31211
31244
  {
@@ -31218,8 +31251,8 @@ const __iconNode$V = [
31218
31251
  ["path", { d: "M16 13H8", key: "t4e002" }],
31219
31252
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
31220
31253
  ];
31221
- const FileText = createLucideIcon("file-text", __iconNode$V);
31222
- const __iconNode$U = [
31254
+ const FileText = createLucideIcon("file-text", __iconNode$W);
31255
+ const __iconNode$V = [
31223
31256
  [
31224
31257
  "path",
31225
31258
  {
@@ -31229,8 +31262,8 @@ const __iconNode$U = [
31229
31262
  ],
31230
31263
  ["path", { d: "M2 10h20", key: "1ir3d8" }]
31231
31264
  ];
31232
- const FolderClosed = createLucideIcon("folder-closed", __iconNode$U);
31233
- const __iconNode$T = [
31265
+ const FolderClosed = createLucideIcon("folder-closed", __iconNode$V);
31266
+ const __iconNode$U = [
31234
31267
  [
31235
31268
  "path",
31236
31269
  {
@@ -31239,8 +31272,8 @@ const __iconNode$T = [
31239
31272
  }
31240
31273
  ]
31241
31274
  ];
31242
- const FolderOpen = createLucideIcon("folder-open", __iconNode$T);
31243
- const __iconNode$S = [
31275
+ const FolderOpen = createLucideIcon("folder-open", __iconNode$U);
31276
+ const __iconNode$T = [
31244
31277
  ["path", { d: "M12 10v6", key: "1bos4e" }],
31245
31278
  ["path", { d: "M9 13h6", key: "1uhe8q" }],
31246
31279
  [
@@ -31251,8 +31284,8 @@ const __iconNode$S = [
31251
31284
  }
31252
31285
  ]
31253
31286
  ];
31254
- const FolderPlus = createLucideIcon("folder-plus", __iconNode$S);
31255
- const __iconNode$R = [
31287
+ const FolderPlus = createLucideIcon("folder-plus", __iconNode$T);
31288
+ const __iconNode$S = [
31256
31289
  [
31257
31290
  "path",
31258
31291
  {
@@ -31261,8 +31294,8 @@ const __iconNode$R = [
31261
31294
  }
31262
31295
  ]
31263
31296
  ];
31264
- const Folder = createLucideIcon("folder", __iconNode$R);
31265
- const __iconNode$Q = [
31297
+ const Folder = createLucideIcon("folder", __iconNode$S);
31298
+ const __iconNode$R = [
31266
31299
  [
31267
31300
  "path",
31268
31301
  {
@@ -31275,25 +31308,25 @@ const __iconNode$Q = [
31275
31308
  { d: "M3 8.268a2 2 0 0 0-1 1.738V19a2 2 0 0 0 2 2h11a2 2 0 0 0 1.732-1", key: "yxbcw3" }
31276
31309
  ]
31277
31310
  ];
31278
- const Folders = createLucideIcon("folders", __iconNode$Q);
31279
- const __iconNode$P = [
31311
+ const Folders = createLucideIcon("folders", __iconNode$R);
31312
+ const __iconNode$Q = [
31280
31313
  ["path", { d: "m12 14 4-4", key: "9kzdfg" }],
31281
31314
  ["path", { d: "M3.34 19a10 10 0 1 1 17.32 0", key: "19p75a" }]
31282
31315
  ];
31283
- const Gauge = createLucideIcon("gauge", __iconNode$P);
31284
- const __iconNode$O = [
31316
+ const Gauge = createLucideIcon("gauge", __iconNode$Q);
31317
+ const __iconNode$P = [
31285
31318
  ["path", { d: "M15 6a9 9 0 0 0-9 9V3", key: "1cii5b" }],
31286
31319
  ["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
31287
31320
  ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }]
31288
31321
  ];
31289
- const GitBranch = createLucideIcon("git-branch", __iconNode$O);
31290
- const __iconNode$N = [
31322
+ const GitBranch = createLucideIcon("git-branch", __iconNode$P);
31323
+ const __iconNode$O = [
31291
31324
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31292
31325
  ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
31293
31326
  ["path", { d: "M2 12h20", key: "9i4pu4" }]
31294
31327
  ];
31295
- const Globe = createLucideIcon("globe", __iconNode$N);
31296
- const __iconNode$M = [
31328
+ const Globe = createLucideIcon("globe", __iconNode$O);
31329
+ const __iconNode$N = [
31297
31330
  ["circle", { cx: "9", cy: "12", r: "1", key: "1vctgf" }],
31298
31331
  ["circle", { cx: "9", cy: "5", r: "1", key: "hp0tcf" }],
31299
31332
  ["circle", { cx: "9", cy: "19", r: "1", key: "fkjjf6" }],
@@ -31301,8 +31334,8 @@ const __iconNode$M = [
31301
31334
  ["circle", { cx: "15", cy: "5", r: "1", key: "19l28e" }],
31302
31335
  ["circle", { cx: "15", cy: "19", r: "1", key: "f4zoj3" }]
31303
31336
  ];
31304
- const GripVertical = createLucideIcon("grip-vertical", __iconNode$M);
31305
- const __iconNode$L = [
31337
+ const GripVertical = createLucideIcon("grip-vertical", __iconNode$N);
31338
+ const __iconNode$M = [
31306
31339
  ["path", { d: "m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9", key: "1hayfq" }],
31307
31340
  ["path", { d: "m18 15 4-4", key: "16gjal" }],
31308
31341
  [
@@ -31313,8 +31346,8 @@ const __iconNode$L = [
31313
31346
  }
31314
31347
  ]
31315
31348
  ];
31316
- const Hammer = createLucideIcon("hammer", __iconNode$L);
31317
- const __iconNode$K = [
31349
+ const Hammer = createLucideIcon("hammer", __iconNode$M);
31350
+ const __iconNode$L = [
31318
31351
  ["path", { d: "M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8", key: "5wwlr5" }],
31319
31352
  [
31320
31353
  "path",
@@ -31324,27 +31357,27 @@ const __iconNode$K = [
31324
31357
  }
31325
31358
  ]
31326
31359
  ];
31327
- const House = createLucideIcon("house", __iconNode$K);
31328
- const __iconNode$J = [
31360
+ const House = createLucideIcon("house", __iconNode$L);
31361
+ const __iconNode$K = [
31329
31362
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
31330
31363
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
31331
31364
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
31332
31365
  ];
31333
- const Image$1 = createLucideIcon("image", __iconNode$J);
31334
- const __iconNode$I = [
31366
+ const Image$1 = createLucideIcon("image", __iconNode$K);
31367
+ const __iconNode$J = [
31335
31368
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
31336
31369
  ["path", { d: "M12 16v-4", key: "1dtifu" }],
31337
31370
  ["path", { d: "M12 8h.01", key: "e9boi3" }]
31338
31371
  ];
31339
- const Info$1 = createLucideIcon("info", __iconNode$I);
31340
- const __iconNode$H = [
31372
+ const Info$1 = createLucideIcon("info", __iconNode$J);
31373
+ const __iconNode$I = [
31341
31374
  ["path", { d: "m16 6 4 14", key: "ji33uf" }],
31342
31375
  ["path", { d: "M12 6v14", key: "1n7gus" }],
31343
31376
  ["path", { d: "M8 8v12", key: "1gg7y9" }],
31344
31377
  ["path", { d: "M4 4v16", key: "6qkkli" }]
31345
31378
  ];
31346
- const Library = createLucideIcon("library", __iconNode$H);
31347
- const __iconNode$G = [
31379
+ const Library = createLucideIcon("library", __iconNode$I);
31380
+ const __iconNode$H = [
31348
31381
  [
31349
31382
  "path",
31350
31383
  {
@@ -31355,20 +31388,27 @@ const __iconNode$G = [
31355
31388
  ["path", { d: "M9 18h6", key: "x1upvd" }],
31356
31389
  ["path", { d: "M10 22h4", key: "ceow96" }]
31357
31390
  ];
31358
- const Lightbulb = createLucideIcon("lightbulb", __iconNode$G);
31359
- const __iconNode$F = [
31391
+ const Lightbulb = createLucideIcon("lightbulb", __iconNode$H);
31392
+ const __iconNode$G = [
31360
31393
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
31361
31394
  ["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
31362
31395
  ["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
31363
31396
  ];
31364
- const Link2 = createLucideIcon("link-2", __iconNode$F);
31365
- const __iconNode$E = [
31397
+ const Link2 = createLucideIcon("link-2", __iconNode$G);
31398
+ const __iconNode$F = [
31366
31399
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7", key: "10o201" }],
31367
31400
  ["path", { d: "M15 7h2a5 5 0 0 1 4 8", key: "1d3206" }],
31368
31401
  ["line", { x1: "8", x2: "12", y1: "12", y2: "12", key: "rvw6j4" }],
31369
31402
  ["line", { x1: "2", x2: "22", y1: "2", y2: "22", key: "a6p6uj" }]
31370
31403
  ];
31371
- const Link2Off = createLucideIcon("link-2-off", __iconNode$E);
31404
+ const Link2Off = createLucideIcon("link-2-off", __iconNode$F);
31405
+ const __iconNode$E = [
31406
+ ["path", { d: "M16 5H3", key: "m91uny" }],
31407
+ ["path", { d: "M16 12H3", key: "1a2rj7" }],
31408
+ ["path", { d: "M11 19H3", key: "zflm78" }],
31409
+ ["path", { d: "m15 18 2 2 4-4", key: "1szwhi" }]
31410
+ ];
31411
+ const ListCheck = createLucideIcon("list-check", __iconNode$E);
31372
31412
  const __iconNode$D = [
31373
31413
  ["path", { d: "M3 5h8", key: "18g2rq" }],
31374
31414
  ["path", { d: "M3 12h8", key: "1xfjp6" }],
@@ -35676,9 +35716,15 @@ function GlobalTextContextMenu() {
35676
35716
  })
35677
35717
  });
35678
35718
  requestAnimationFrame(() => {
35679
- const selection2 = window.getSelection()?.toString() || "";
35680
- const nextHasSelection = selection2.trim().length > 0;
35719
+ const selectionObj = window.getSelection();
35720
+ const selection2 = selectionObj?.toString() || "";
35681
35721
  const nextIsEditable = editable;
35722
+ let nextHasSelection = selection2.trim().length > 0;
35723
+ if (nextHasSelection && selectionObj && target instanceof Node) {
35724
+ if (!selectionObj.containsNode(target, true)) {
35725
+ nextHasSelection = false;
35726
+ }
35727
+ }
35682
35728
  if (!nextHasSelection && !nextIsEditable) {
35683
35729
  setOpen(false);
35684
35730
  return;
@@ -38398,6 +38444,13 @@ const electron = {
38398
38444
  if (isWebUI) return;
38399
38445
  return window.fello.invoke("installUpdate");
38400
38446
  },
38447
+ restartApp: async () => {
38448
+ if (isWebUI) {
38449
+ console.warn("WebUI mode: restartApp is not supported. Restart the server process manually.");
38450
+ return;
38451
+ }
38452
+ return window.fello.invoke("restartApp");
38453
+ },
38401
38454
  updateTheme: (theme) => {
38402
38455
  if (isWebUI || !window.fello) return;
38403
38456
  return window.fello.updateTheme(theme);
@@ -38415,280 +38468,6 @@ const electron = {
38415
38468
  return window.fello.onUpdater(handler);
38416
38469
  }
38417
38470
  };
38418
- function ContextMenuRoot(props) {
38419
- const [anchor2, setAnchor] = reactExports.useState({
38420
- getBoundingClientRect() {
38421
- return DOMRect.fromRect({
38422
- width: 0,
38423
- height: 0,
38424
- x: 0,
38425
- y: 0
38426
- });
38427
- }
38428
- });
38429
- const backdropRef = reactExports.useRef(null);
38430
- const internalBackdropRef = reactExports.useRef(null);
38431
- const actionsRef = reactExports.useRef(null);
38432
- const positionerRef = reactExports.useRef(null);
38433
- const allowMouseUpTriggerRef = reactExports.useRef(true);
38434
- const initialCursorPointRef = reactExports.useRef(null);
38435
- const id32 = useId();
38436
- const contextValue = reactExports.useMemo(() => ({
38437
- anchor: anchor2,
38438
- setAnchor,
38439
- actionsRef,
38440
- backdropRef,
38441
- internalBackdropRef,
38442
- positionerRef,
38443
- allowMouseUpTriggerRef,
38444
- initialCursorPointRef,
38445
- rootId: id32
38446
- }), [anchor2, id32]);
38447
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuRootContext.Provider, {
38448
- value: contextValue,
38449
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRootContext.Provider, {
38450
- value: void 0,
38451
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRoot, {
38452
- ...props
38453
- })
38454
- })
38455
- });
38456
- }
38457
- const LONG_PRESS_DELAY = 500;
38458
- const ContextMenuTrigger$1 = /* @__PURE__ */ reactExports.forwardRef(function ContextMenuTrigger2(componentProps, forwardedRef) {
38459
- const {
38460
- render: render4,
38461
- className,
38462
- style: style2,
38463
- ...elementProps
38464
- } = componentProps;
38465
- const {
38466
- setAnchor,
38467
- actionsRef,
38468
- internalBackdropRef,
38469
- backdropRef,
38470
- positionerRef,
38471
- allowMouseUpTriggerRef,
38472
- initialCursorPointRef,
38473
- rootId
38474
- } = useContextMenuRootContext(false);
38475
- const {
38476
- store
38477
- } = useMenuRootContext(false);
38478
- const open2 = store.useState("open");
38479
- const disabled2 = store.useState("disabled");
38480
- const triggerRef = reactExports.useRef(null);
38481
- const touchPositionRef = reactExports.useRef(null);
38482
- const longPressTimeout = useTimeout();
38483
- const allowMouseUpTimeout = useTimeout();
38484
- const allowMouseUpRef = reactExports.useRef(false);
38485
- const mouseUpAbortControllerRef = reactExports.useRef(null);
38486
- function handleLongPress(x2, y4, event) {
38487
- const isTouchEvent2 = event.type.startsWith("touch");
38488
- initialCursorPointRef.current = {
38489
- x: x2,
38490
- y: y4
38491
- };
38492
- setAnchor({
38493
- getBoundingClientRect() {
38494
- return DOMRect.fromRect({
38495
- width: isTouchEvent2 ? 10 : 0,
38496
- height: isTouchEvent2 ? 10 : 0,
38497
- x: x2,
38498
- y: y4
38499
- });
38500
- }
38501
- });
38502
- allowMouseUpRef.current = false;
38503
- actionsRef.current?.setOpen(true, createChangeEventDetails(triggerPress, event));
38504
- allowMouseUpTimeout.start(LONG_PRESS_DELAY, () => {
38505
- allowMouseUpRef.current = true;
38506
- });
38507
- }
38508
- function handleContextMenu(event) {
38509
- if (disabled2) {
38510
- return;
38511
- }
38512
- allowMouseUpTriggerRef.current = true;
38513
- stopEvent$1(event);
38514
- handleLongPress(event.clientX, event.clientY, event.nativeEvent);
38515
- const doc = ownerDocument(triggerRef.current);
38516
- mouseUpAbortControllerRef.current?.abort();
38517
- const mouseUpAbortController = new AbortController();
38518
- mouseUpAbortControllerRef.current = mouseUpAbortController;
38519
- doc.addEventListener("mouseup", (mouseEvent) => {
38520
- allowMouseUpTriggerRef.current = false;
38521
- if (!allowMouseUpRef.current) {
38522
- return;
38523
- }
38524
- allowMouseUpTimeout.clear();
38525
- allowMouseUpRef.current = false;
38526
- const mouseUpTarget = getTarget(mouseEvent);
38527
- if (contains(positionerRef.current, mouseUpTarget)) {
38528
- return;
38529
- }
38530
- if (rootId && mouseUpTarget && findRootOwnerId(mouseUpTarget) === rootId) {
38531
- return;
38532
- }
38533
- actionsRef.current?.setOpen(false, createChangeEventDetails(cancelOpen, mouseEvent));
38534
- }, {
38535
- once: true,
38536
- signal: mouseUpAbortController.signal
38537
- });
38538
- }
38539
- function cancelLongPress() {
38540
- longPressTimeout.clear();
38541
- touchPositionRef.current = null;
38542
- }
38543
- function handleTouchStart(event) {
38544
- if (disabled2) {
38545
- cancelLongPress();
38546
- return;
38547
- }
38548
- allowMouseUpTriggerRef.current = false;
38549
- if (event.touches.length !== 1) {
38550
- cancelLongPress();
38551
- return;
38552
- }
38553
- event.stopPropagation();
38554
- const touch = event.touches[0];
38555
- const touchPosition = {
38556
- x: touch.clientX,
38557
- y: touch.clientY
38558
- };
38559
- touchPositionRef.current = touchPosition;
38560
- longPressTimeout.start(LONG_PRESS_DELAY, () => {
38561
- handleLongPress(touchPosition.x, touchPosition.y, event.nativeEvent);
38562
- });
38563
- }
38564
- function handleTouchMove(event) {
38565
- if (event.touches.length !== 1) {
38566
- cancelLongPress();
38567
- return;
38568
- }
38569
- if (longPressTimeout.isStarted() && touchPositionRef.current) {
38570
- const touch = event.touches[0];
38571
- const moveThreshold = 10;
38572
- const deltaX = Math.abs(touch.clientX - touchPositionRef.current.x);
38573
- const deltaY = Math.abs(touch.clientY - touchPositionRef.current.y);
38574
- if (deltaX > moveThreshold || deltaY > moveThreshold) {
38575
- cancelLongPress();
38576
- }
38577
- }
38578
- }
38579
- reactExports.useEffect(() => () => {
38580
- mouseUpAbortControllerRef.current?.abort();
38581
- }, []);
38582
- reactExports.useEffect(() => {
38583
- function handleDocumentContextMenu(event) {
38584
- if (disabled2) {
38585
- return;
38586
- }
38587
- const target = getTarget(event);
38588
- const targetElement = target;
38589
- if (contains(triggerRef.current, targetElement) || contains(internalBackdropRef.current, targetElement) || contains(backdropRef.current, targetElement)) {
38590
- event.preventDefault();
38591
- }
38592
- }
38593
- const doc = ownerDocument(triggerRef.current);
38594
- return addEventListener(doc, "contextmenu", handleDocumentContextMenu);
38595
- }, [backdropRef, disabled2, internalBackdropRef]);
38596
- const state2 = {
38597
- open: open2
38598
- };
38599
- const element2 = useRenderElement("div", componentProps, {
38600
- state: state2,
38601
- ref: [triggerRef, forwardedRef],
38602
- props: [{
38603
- onContextMenu: handleContextMenu,
38604
- onTouchStart: handleTouchStart,
38605
- onTouchMove: handleTouchMove,
38606
- onTouchEnd: cancelLongPress,
38607
- onTouchCancel: cancelLongPress,
38608
- style: {
38609
- WebkitTouchCallout: "none"
38610
- }
38611
- }, elementProps],
38612
- stateAttributesMapping: pressableTriggerOpenStateMapping
38613
- });
38614
- return element2;
38615
- });
38616
- function ContextMenu({ ...props }) {
38617
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuRoot, { "data-slot": "context-menu", ...props });
38618
- }
38619
- function ContextMenuTrigger({
38620
- className,
38621
- ...props
38622
- }) {
38623
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
38624
- ContextMenuTrigger$1,
38625
- {
38626
- "data-slot": "context-menu-trigger",
38627
- className: cn$8("select-none", className),
38628
- ...props
38629
- }
38630
- );
38631
- }
38632
- function ContextMenuContent({
38633
- className,
38634
- align = "start",
38635
- alignOffset = 4,
38636
- side = "right",
38637
- sideOffset = 0,
38638
- ...props
38639
- }) {
38640
- return /* @__PURE__ */ jsxRuntimeExports.jsx(MenuPortal, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
38641
- MenuPositioner,
38642
- {
38643
- className: "isolate z-50 outline-none",
38644
- align,
38645
- alignOffset,
38646
- side,
38647
- sideOffset,
38648
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(
38649
- MenuPopup,
38650
- {
38651
- "data-slot": "context-menu-content",
38652
- className: cn$8("z-50 max-h-(--available-height) min-w-38 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover py-1 px-1 space-y-0.5 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none 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", className),
38653
- ...props
38654
- }
38655
- )
38656
- }
38657
- ) });
38658
- }
38659
- function ContextMenuItem({
38660
- className,
38661
- inset,
38662
- variant = "default",
38663
- ...props
38664
- }) {
38665
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
38666
- MenuItem,
38667
- {
38668
- "data-slot": "context-menu-item",
38669
- "data-inset": inset,
38670
- "data-variant": variant,
38671
- className: cn$8(
38672
- "group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-sm px-1.5 py-1 text-xs text-muted-foreground/90 outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive",
38673
- className
38674
- ),
38675
- ...props
38676
- }
38677
- );
38678
- }
38679
- function ContextMenuSeparator({
38680
- className,
38681
- ...props
38682
- }) {
38683
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
38684
- Separator$1,
38685
- {
38686
- "data-slot": "context-menu-separator",
38687
- className: cn$8("-mx-1 my-1 h-px bg-border", className),
38688
- ...props
38689
- }
38690
- );
38691
- }
38692
38471
  function useRender(params) {
38693
38472
  return useRenderElement(params.defaultTagName ?? "div", params, params);
38694
38473
  }
@@ -42844,11 +42623,443 @@ function ScrollBar({
42844
42623
  }
42845
42624
  );
42846
42625
  }
42626
+ const PreviewCardRootContext = /* @__PURE__ */ reactExports.createContext(void 0);
42627
+ function usePreviewCardRootContext(optional2) {
42628
+ const context = reactExports.useContext(PreviewCardRootContext);
42629
+ if (context === void 0 && !optional2) {
42630
+ throw new Error(formatErrorMessage(50));
42631
+ }
42632
+ return context;
42633
+ }
42634
+ const OPEN_DELAY$1 = 600;
42635
+ const CLOSE_DELAY = 300;
42636
+ const selectors$1 = {
42637
+ ...popupStoreSelectors,
42638
+ instantType: (state2) => state2.instantType,
42639
+ adaptiveOrigin: (state2) => state2.adaptiveOrigin,
42640
+ closeDelay: (state2) => state2.closeDelay
42641
+ };
42642
+ class PreviewCardStore extends ReactStore {
42643
+ constructor(initialState2, floatingId, nested) {
42644
+ const triggerElements = new PopupTriggerMap();
42645
+ super(createInitialState$1(initialState2, triggerElements, floatingId, nested), createInitialContext$1(triggerElements), selectors$1);
42646
+ }
42647
+ setOpen = (nextOpen, eventDetails) => {
42648
+ const {
42649
+ inlineRectCoordsRef
42650
+ } = this.context;
42651
+ applyPopupOpenChange(this, nextOpen, eventDetails, {
42652
+ onBeforeDispatch() {
42653
+ const event = eventDetails.event;
42654
+ if (nextOpen && eventDetails.reason === triggerHover && eventDetails.trigger && "clientX" in event && "clientY" in event && inlineRectCoordsRef.current?.element !== eventDetails.trigger) {
42655
+ updateInlineRectCoords(inlineRectCoordsRef, eventDetails.trigger, event.clientX, event.clientY);
42656
+ }
42657
+ }
42658
+ });
42659
+ };
42660
+ }
42661
+ function createInitialState$1(initialState2, triggerElements, floatingId, nested = false) {
42662
+ const state2 = {
42663
+ ...createInitialPopupStoreState(),
42664
+ instantType: void 0,
42665
+ adaptiveOrigin: void 0,
42666
+ closeDelay: CLOSE_DELAY,
42667
+ ...initialState2
42668
+ };
42669
+ state2.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);
42670
+ return state2;
42671
+ }
42672
+ function createInitialContext$1(triggerElements) {
42673
+ return {
42674
+ popupRef: /* @__PURE__ */ reactExports.createRef(),
42675
+ onOpenChange: void 0,
42676
+ onOpenChangeComplete: void 0,
42677
+ triggerElements,
42678
+ inlineRectCoordsRef: {
42679
+ current: void 0
42680
+ }
42681
+ };
42682
+ }
42683
+ function PreviewCardRootComponent(props) {
42684
+ const {
42685
+ open: openProp,
42686
+ defaultOpen = false,
42687
+ onOpenChange,
42688
+ onOpenChangeComplete,
42689
+ actionsRef,
42690
+ handle: handle2,
42691
+ triggerId: triggerIdProp,
42692
+ defaultTriggerId: defaultTriggerIdProp = null,
42693
+ children: children2
42694
+ } = props;
42695
+ const store = usePopupRootStore((floatingId, nested) => new PreviewCardStore({
42696
+ open: defaultOpen,
42697
+ openProp,
42698
+ activeTriggerId: defaultTriggerIdProp,
42699
+ triggerIdProp
42700
+ }, floatingId, nested));
42701
+ store.useControlledProp("openProp", openProp);
42702
+ store.useControlledProp("triggerIdProp", triggerIdProp);
42703
+ store.useContextCallback("onOpenChange", onOpenChange);
42704
+ store.useContextCallback("onOpenChangeComplete", onOpenChangeComplete);
42705
+ const open2 = store.useState("open");
42706
+ const activeTriggerId = store.useState("activeTriggerId");
42707
+ const mounted = store.useState("mounted");
42708
+ const payload = store.useState("payload");
42709
+ useImplicitActiveTrigger(store, {
42710
+ closeOnActiveTriggerUnmount: true
42711
+ });
42712
+ const {
42713
+ forceUnmount
42714
+ } = useOpenStateTransitions(open2, store, () => {
42715
+ store.context.inlineRectCoordsRef.current = void 0;
42716
+ });
42717
+ useIsoLayoutEffect(() => {
42718
+ if (open2) {
42719
+ if (activeTriggerId == null) {
42720
+ store.set("payload", void 0);
42721
+ }
42722
+ }
42723
+ }, [store, activeTriggerId, open2]);
42724
+ reactExports.useImperativeHandle(actionsRef, () => ({
42725
+ unmount: forceUnmount,
42726
+ close: () => store.setOpen(false, createChangeEventDetails(imperativeAction))
42727
+ }), [forceUnmount, store]);
42728
+ const shouldRenderInteractions = open2 || mounted;
42729
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(PreviewCardRootContext.Provider, {
42730
+ value: store,
42731
+ children: [handle2 && /* @__PURE__ */ jsxRuntimeExports.jsx(PopupHandleAttachment, {
42732
+ handle: handle2,
42733
+ store
42734
+ }), shouldRenderInteractions && /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardInteractions, {
42735
+ store
42736
+ }), typeof children2 === "function" ? children2({
42737
+ payload
42738
+ }) : children2]
42739
+ });
42740
+ }
42741
+ function PreviewCardInteractions({
42742
+ store
42743
+ }) {
42744
+ const floatingRootContext = store.useState("floatingRootContext");
42745
+ const dismiss = useDismiss(floatingRootContext);
42746
+ usePopupInteractionProps(store, {
42747
+ activeTriggerProps: dismiss.reference,
42748
+ inactiveTriggerProps: dismiss.trigger,
42749
+ popupProps: dismiss.floating
42750
+ });
42751
+ return null;
42752
+ }
42753
+ const PreviewCardRoot = fastComponent(function PreviewCardRoot2(props) {
42754
+ if (usePreviewCardRootContext(true)) {
42755
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardRootComponent, {
42756
+ ...props
42757
+ });
42758
+ }
42759
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(FloatingTree, {
42760
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardRootComponent, {
42761
+ ...props
42762
+ })
42763
+ });
42764
+ });
42765
+ const PreviewCardPortalContext = /* @__PURE__ */ reactExports.createContext(void 0);
42766
+ function usePreviewCardPortalContext() {
42767
+ const value = reactExports.useContext(PreviewCardPortalContext);
42768
+ if (value === void 0) {
42769
+ throw new Error(formatErrorMessage(48));
42770
+ }
42771
+ return value;
42772
+ }
42773
+ const PreviewCardPortal = /* @__PURE__ */ reactExports.forwardRef(function PreviewCardPortal2(props, forwardedRef) {
42774
+ const {
42775
+ keepMounted = false,
42776
+ ...portalProps
42777
+ } = props;
42778
+ const store = usePreviewCardRootContext();
42779
+ const mounted = store.useState("mounted");
42780
+ const shouldRender = mounted || keepMounted;
42781
+ if (!shouldRender) {
42782
+ return null;
42783
+ }
42784
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardPortalContext.Provider, {
42785
+ value: keepMounted,
42786
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(FloatingPortalLite, {
42787
+ ref: forwardedRef,
42788
+ ...portalProps
42789
+ })
42790
+ });
42791
+ });
42792
+ const PreviewCardTrigger = fastComponentRef(function PreviewCardTrigger2(componentProps, forwardedRef) {
42793
+ const {
42794
+ render: render4,
42795
+ className,
42796
+ delay,
42797
+ closeDelay,
42798
+ id: idProp,
42799
+ payload,
42800
+ handle: handle2,
42801
+ style: style2,
42802
+ ...elementProps
42803
+ } = componentProps;
42804
+ const rootContext = usePreviewCardRootContext(true);
42805
+ const handleStore = usePopupHandleStore(handle2);
42806
+ const store = handleStore ?? rootContext;
42807
+ if (!store) {
42808
+ throw new Error(formatErrorMessage(89));
42809
+ }
42810
+ const thisTriggerId = useBaseUiId(idProp);
42811
+ const isTriggerActive = store.useState("isTriggerActive", thisTriggerId);
42812
+ const isOpenedByThisTrigger = store.useState("isOpenedByTrigger", thisTriggerId);
42813
+ const floatingRootContext = store.useState("floatingRootContext");
42814
+ const inlineRectCoordsRef = store.context.inlineRectCoordsRef;
42815
+ const triggerElementRef = reactExports.useRef(null);
42816
+ const delayWithDefault = delay ?? OPEN_DELAY$1;
42817
+ const closeDelayWithDefault = closeDelay ?? CLOSE_DELAY;
42818
+ const {
42819
+ registerTrigger,
42820
+ isMountedByThisTrigger
42821
+ } = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store, {
42822
+ payload,
42823
+ closeDelay: closeDelayWithDefault
42824
+ });
42825
+ const hoverProps = useHoverReferenceInteraction(floatingRootContext, {
42826
+ mouseOnly: true,
42827
+ move: false,
42828
+ handleClose: safePolygon(),
42829
+ delay: () => ({
42830
+ open: delayWithDefault,
42831
+ close: closeDelayWithDefault
42832
+ }),
42833
+ triggerElementRef,
42834
+ isActiveTrigger: isTriggerActive,
42835
+ isClosing: () => store.select("transitionStatus") === "ending"
42836
+ });
42837
+ const focusProps = useFocus(floatingRootContext, {
42838
+ delay: delayWithDefault
42839
+ });
42840
+ const state2 = {
42841
+ open: isOpenedByThisTrigger
42842
+ };
42843
+ const rootTriggerProps = store.useState("triggerProps", isMountedByThisTrigger);
42844
+ const inlineRectTriggerProps = getInlineRectTriggerProps(inlineRectCoordsRef, isOpenedByThisTrigger);
42845
+ const element2 = useRenderElement("a", componentProps, {
42846
+ state: state2,
42847
+ ref: [forwardedRef, registerTrigger, triggerElementRef],
42848
+ props: [hoverProps, focusProps.reference, rootTriggerProps, inlineRectTriggerProps, {
42849
+ id: thisTriggerId
42850
+ }, elementProps],
42851
+ stateAttributesMapping: triggerOpenStateMapping$1
42852
+ });
42853
+ return element2;
42854
+ });
42855
+ const PreviewCardPositionerContext = /* @__PURE__ */ reactExports.createContext(void 0);
42856
+ function usePreviewCardPositionerContext() {
42857
+ const context = reactExports.useContext(PreviewCardPositionerContext);
42858
+ if (context === void 0) {
42859
+ throw new Error(formatErrorMessage(49));
42860
+ }
42861
+ return context;
42862
+ }
42863
+ const PreviewCardPositioner = /* @__PURE__ */ reactExports.forwardRef(function PreviewCardPositioner2(componentProps, forwardedRef) {
42864
+ const {
42865
+ render: render4,
42866
+ className,
42867
+ anchor: anchor2,
42868
+ positionMethod = "absolute",
42869
+ side = "bottom",
42870
+ align = "center",
42871
+ sideOffset = 0,
42872
+ alignOffset = 0,
42873
+ collisionBoundary = "clipping-ancestors",
42874
+ collisionPadding = 5,
42875
+ arrowPadding = 5,
42876
+ sticky = false,
42877
+ disableAnchorTracking = false,
42878
+ collisionAvoidance = POPUP_COLLISION_AVOIDANCE,
42879
+ style: style2,
42880
+ ...elementProps
42881
+ } = componentProps;
42882
+ const store = usePreviewCardRootContext();
42883
+ const keepMounted = usePreviewCardPortalContext();
42884
+ const nodeId = useFloatingNodeId();
42885
+ const open2 = store.useState("open");
42886
+ const mounted = store.useState("mounted");
42887
+ const floatingRootContext = store.useState("floatingRootContext");
42888
+ const instantType = store.useState("instantType");
42889
+ const transitionStatus = store.useState("transitionStatus");
42890
+ const adaptiveOrigin = store.useState("adaptiveOrigin");
42891
+ const inlineRectCoordsRef = store.context.inlineRectCoordsRef;
42892
+ const positioning = useAnchorPositioning({
42893
+ anchor: anchor2,
42894
+ floatingRootContext,
42895
+ positionMethod,
42896
+ mounted,
42897
+ side,
42898
+ sideOffset,
42899
+ align,
42900
+ alignOffset,
42901
+ arrowPadding,
42902
+ collisionBoundary,
42903
+ collisionPadding,
42904
+ sticky,
42905
+ disableAnchorTracking,
42906
+ keepMounted,
42907
+ nodeId,
42908
+ collisionAvoidance,
42909
+ adaptiveOrigin,
42910
+ inline: createInlineMiddleware(inlineRectCoordsRef)
42911
+ });
42912
+ const updatePosition = positioning.update;
42913
+ useIsoLayoutEffect(() => {
42914
+ if (open2 && mounted) {
42915
+ updatePosition();
42916
+ }
42917
+ }, [open2, mounted, updatePosition]);
42918
+ const state2 = {
42919
+ open: open2,
42920
+ side: positioning.side,
42921
+ align: positioning.align,
42922
+ anchorHidden: positioning.anchorHidden,
42923
+ instant: instantType
42924
+ };
42925
+ const element2 = usePositioner(componentProps, state2, {
42926
+ styles: positioning.positionerStyles,
42927
+ transitionStatus,
42928
+ props: elementProps,
42929
+ refs: [forwardedRef, store.useStateSetter("positionerElement")],
42930
+ hidden: !mounted,
42931
+ inert: !open2
42932
+ });
42933
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardPositionerContext.Provider, {
42934
+ value: positioning,
42935
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(FloatingNode, {
42936
+ id: nodeId,
42937
+ children: element2
42938
+ })
42939
+ });
42940
+ });
42941
+ const PreviewCardPopup = /* @__PURE__ */ reactExports.forwardRef(function PreviewCardPopup2(componentProps, forwardedRef) {
42942
+ const {
42943
+ className,
42944
+ render: render4,
42945
+ style: style2,
42946
+ ...elementProps
42947
+ } = componentProps;
42948
+ const store = usePreviewCardRootContext();
42949
+ const {
42950
+ side,
42951
+ align
42952
+ } = usePreviewCardPositionerContext();
42953
+ const open2 = store.useState("open");
42954
+ const instantType = store.useState("instantType");
42955
+ const transitionStatus = store.useState("transitionStatus");
42956
+ const popupProps = store.useState("popupProps");
42957
+ const floatingContext = store.useState("floatingRootContext");
42958
+ const closeDelay = store.useState("closeDelay");
42959
+ useOpenChangeComplete({
42960
+ open: open2,
42961
+ ref: store.context.popupRef,
42962
+ onComplete() {
42963
+ if (open2) {
42964
+ store.context.onOpenChangeComplete?.(true);
42965
+ }
42966
+ }
42967
+ });
42968
+ useHoverFloatingInteraction(floatingContext, {
42969
+ closeDelay
42970
+ });
42971
+ const state2 = {
42972
+ open: open2,
42973
+ side,
42974
+ align,
42975
+ instant: instantType,
42976
+ transitionStatus
42977
+ };
42978
+ const element2 = useRenderElement("div", componentProps, {
42979
+ state: state2,
42980
+ ref: [forwardedRef, store.context.popupRef, store.useStateSetter("popupElement")],
42981
+ props: [FOCUSABLE_POPUP_PROPS, popupProps, getDisabledMountTransitionStyles(transitionStatus), elementProps],
42982
+ stateAttributesMapping: popupTransitionStateMapping
42983
+ });
42984
+ return element2;
42985
+ });
42986
+ function HoverCard({ ...props }) {
42987
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardRoot, { "data-slot": "hover-card", ...props });
42988
+ }
42989
+ function HoverCardTrigger({ ...props }) {
42990
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardTrigger, { "data-slot": "hover-card-trigger", ...props });
42991
+ }
42992
+ function HoverCardContent({
42993
+ className,
42994
+ side = "bottom",
42995
+ sideOffset = 4,
42996
+ align = "center",
42997
+ alignOffset = 4,
42998
+ ...props
42999
+ }) {
43000
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(PreviewCardPortal, { "data-slot": "hover-card-portal", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
43001
+ PreviewCardPositioner,
43002
+ {
43003
+ align,
43004
+ alignOffset,
43005
+ side,
43006
+ sideOffset,
43007
+ className: "isolate z-50",
43008
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
43009
+ PreviewCardPopup,
43010
+ {
43011
+ "data-slot": "hover-card-content",
43012
+ className: cn$8(
43013
+ "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",
43014
+ className
43015
+ ),
43016
+ ...props
43017
+ }
43018
+ )
43019
+ }
43020
+ ) });
43021
+ }
43022
+ function Separator({
43023
+ className,
43024
+ orientation = "horizontal",
43025
+ ...props
43026
+ }) {
43027
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
43028
+ Separator$1,
43029
+ {
43030
+ "data-slot": "separator",
43031
+ orientation,
43032
+ className: cn$8(
43033
+ "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
43034
+ className
43035
+ ),
43036
+ ...props
43037
+ }
43038
+ );
43039
+ }
42847
43040
  function getErrorMessage(error, fallbackMessage) {
42848
43041
  return extractErrorMessage(error) || fallbackMessage;
42849
43042
  }
43043
+ function formatRelativeTime(timestamp2, language) {
43044
+ const diff = Date.now() - timestamp2;
43045
+ const rtf = new Intl.RelativeTimeFormat(language, { numeric: "auto" });
43046
+ const minutes = Math.round(diff / 6e4);
43047
+ if (minutes < 1) return rtf.format(0, "minute");
43048
+ if (minutes < 60) return rtf.format(-minutes, "minute");
43049
+ const hours = Math.round(minutes / 60);
43050
+ if (hours < 24) return rtf.format(-hours, "hour");
43051
+ const days = Math.round(hours / 24);
43052
+ if (days < 30) return rtf.format(-days, "day");
43053
+ return new Date(timestamp2).toLocaleDateString(language);
43054
+ }
43055
+ function projectHoverId(id32) {
43056
+ return `p:${id32}`;
43057
+ }
43058
+ function sessionHoverId(id32) {
43059
+ return `s:${id32}`;
43060
+ }
42850
43061
  function Sidebar() {
42851
- const { t: t2, i18n: _i18n } = useTranslation();
43062
+ const { t: t2, i18n } = useTranslation();
42852
43063
  const navigate = useNavigate();
42853
43064
  const location2 = useLocation();
42854
43065
  const [optimisticPath, setOptimisticPath] = reactExports.useState(null);
@@ -42923,8 +43134,7 @@ function Sidebar() {
42923
43134
  [configuredAgents]
42924
43135
  );
42925
43136
  const [expandedProjects, setExpandedProjects] = reactExports.useState({});
42926
- const [openProjectMenuId, setOpenProjectMenuId] = reactExports.useState(null);
42927
- const [openSessionMenuId, setOpenSessionMenuId] = reactExports.useState(null);
43137
+ const [hoverId, setHoverId] = reactExports.useState(null);
42928
43138
  const { prompt, confirm: confirm2, toast: toast2 } = useMessage();
42929
43139
  const showMacTrafficLightSpace = isMacApp && !isFullScreen;
42930
43140
  const refreshData = async () => {
@@ -43206,25 +43416,22 @@ function Sidebar() {
43206
43416
  /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-0.5 p-1.5", children: sortedProjects.map((project) => {
43207
43417
  const projectSessions = sessionsByProject[project.id] ?? [];
43208
43418
  const expanded = isProjectExpanded(project.id);
43209
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-0.5", children: [
43419
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-0.5 group", children: [
43210
43420
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
43211
- ContextMenu,
43421
+ HoverCard,
43212
43422
  {
43423
+ open: hoverId === projectHoverId(project.id),
43213
43424
  onOpenChange: (open2) => {
43214
- setOpenProjectMenuId(
43215
- (prev2) => open2 ? project.id : prev2 === project.id ? null : prev2
43425
+ setHoverId(
43426
+ (prev2) => open2 ? projectHoverId(project.id) : prev2 === projectHoverId(project.id) ? null : prev2
43216
43427
  );
43217
43428
  },
43218
43429
  children: [
43219
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
43220
- ContextMenuTrigger,
43430
+ /* @__PURE__ */ jsxRuntimeExports.jsx(HoverCardTrigger, { render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}), delay: 50, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
43431
+ "div",
43221
43432
  {
43222
- render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
43223
- className: `group flex h-7 cursor-default items-center gap-1.5 rounded-md px-1.5 text-xs font-normal text-sidebar-foreground/45 hover:bg-sidebar-accent/25 hover:text-sidebar-foreground/80 ${openProjectMenuId === project.id ? "bg-sidebar-accent/25 text-sidebar-foreground/80" : ""}`,
43224
43433
  onClick: () => toggleProject(project.id),
43225
- onContextMenu: (e11) => {
43226
- e11.stopPropagation();
43227
- },
43434
+ className: `flex h-7 cursor-default items-center gap-1.5 rounded-md px-1.5 text-xs font-normal transition-colors text-sidebar-foreground/45 hover:bg-sidebar-accent/25 hover:text-sidebar-foreground/80 ${hoverId === projectHoverId(project.id) ? "bg-sidebar-accent/25 text-sidebar-foreground/80" : ""}`,
43228
43435
  children: [
43229
43436
  expanded ? /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(FolderClosed, { className: "size-3.5" }),
43230
43437
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal font-normal uppercase select-none", children: project.title }),
@@ -43236,199 +43443,272 @@ function Sidebar() {
43236
43443
  e11.stopPropagation();
43237
43444
  openNewSessionDialog(project.id);
43238
43445
  },
43239
- className: `flex size-4 items-center justify-center rounded-sm text-sidebar-foreground/40 hover:bg-sidebar-accent/25 hover:text-sidebar-foreground/70 ${projectSessions.length === 0 ? "opacity-100" : "opacity-0 group-hover:opacity-100"}`,
43446
+ className: `flex size-4 items-center justify-center rounded-sm text-sidebar-foreground/40 hover:bg-sidebar-accent/25 hover:text-sidebar-foreground/70 transition-opacity duration-300 ${projectSessions.length === 0 ? "opacity-100" : "opacity-0 group-hover:opacity-100"}`,
43240
43447
  "aria-label": t2("sidebar.createChatInProject", {
43241
43448
  defaultValue: "Create chat in {{title}}",
43242
43449
  title: project.title
43243
43450
  }),
43244
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, {})
43451
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, { className: "size-3.5" })
43245
43452
  }
43246
43453
  )
43247
43454
  ]
43248
43455
  }
43249
- ),
43250
- /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { onClick: (e11) => e11.stopPropagation(), className: "w-auto", children: [
43251
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
43252
- ContextMenuItem,
43253
- {
43254
- onClick: (e11) => {
43255
- e11.stopPropagation();
43256
- openNewSessionDialog(project.id);
43257
- },
43258
- children: [
43259
- /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, {}),
43260
- t2("sidebar.newChat", "New Chat")
43261
- ]
43262
- }
43263
- ),
43264
- /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
43265
- !isWebUI && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43266
- ContextMenuItem,
43267
- {
43268
- onClick: (e11) => {
43269
- e11.stopPropagation();
43270
- void handleRevealProjectInFinder(project);
43271
- },
43272
- children: [
43273
- /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, {}),
43274
- t2("sidebar.revealInFinder")
43275
- ]
43276
- }
43277
- ),
43278
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
43279
- ContextMenuItem,
43456
+ ) }),
43457
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43458
+ HoverCardContent,
43459
+ {
43460
+ side: "right",
43461
+ align: "start",
43462
+ sideOffset: 12,
43463
+ alignOffset: 1,
43464
+ className: "max-w-60 min-w-48 w-auto p-3",
43465
+ children: [
43466
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
43467
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium leading-snug", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: project.title }) }),
43468
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
43469
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-3 shrink-0" }),
43470
+ isWebUI ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", title: project.cwd, children: project.cwd }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
43471
+ "button",
43472
+ {
43473
+ type: "button",
43474
+ onClick: () => void handleRevealProjectInFinder(project),
43475
+ title: project.cwd,
43476
+ className: "min-w-0 flex-1 truncate text-left transition-colors hover:text-foreground",
43477
+ children: project.cwd
43478
+ }
43479
+ )
43480
+ ] })
43481
+ ] }),
43482
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Separator, { className: "my-2.5" }),
43483
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col -mx-2 -my-1", children: [
43484
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43485
+ "button",
43486
+ {
43487
+ type: "button",
43488
+ onClick: () => openNewSessionDialog(project.id),
43489
+ 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",
43490
+ children: [
43491
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, { className: "size-3 shrink-0" }),
43492
+ t2("sidebar.newChat", "New Chat")
43493
+ ]
43494
+ }
43495
+ ),
43496
+ !isWebUI && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43497
+ "button",
43498
+ {
43499
+ type: "button",
43500
+ onClick: () => void handleRevealProjectInFinder(project),
43501
+ 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",
43502
+ children: [
43503
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3 shrink-0" }),
43504
+ t2("sidebar.revealInFinder")
43505
+ ]
43506
+ }
43507
+ ),
43508
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43509
+ "button",
43510
+ {
43511
+ type: "button",
43512
+ onClick: () => handleRenameProject(project),
43513
+ 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",
43514
+ children: [
43515
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3 shrink-0" }),
43516
+ t2("sidebar.rename")
43517
+ ]
43518
+ }
43519
+ ),
43520
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43521
+ "button",
43522
+ {
43523
+ type: "button",
43524
+ onClick: () => void handleDeleteProject(project),
43525
+ className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-destructive transition-colors hover:bg-destructive/10",
43526
+ children: [
43527
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3 shrink-0" }),
43528
+ t2("sidebar.delete")
43529
+ ]
43530
+ }
43531
+ )
43532
+ ] })
43533
+ ]
43534
+ }
43535
+ )
43536
+ ]
43537
+ }
43538
+ ),
43539
+ expanded && projectSessions.map((session2) => {
43540
+ const agentLabel = configuredAgents.find((a2) => a2.id === session2.agentId)?.id || session2.agentId;
43541
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
43542
+ HoverCard,
43543
+ {
43544
+ open: hoverId === sessionHoverId(session2.id),
43545
+ onOpenChange: (open2) => {
43546
+ setHoverId(
43547
+ (prev2) => open2 ? sessionHoverId(session2.id) : prev2 === sessionHoverId(session2.id) ? null : prev2
43548
+ );
43549
+ },
43550
+ children: [
43551
+ /* @__PURE__ */ jsxRuntimeExports.jsx(HoverCardTrigger, { render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}), delay: 50, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
43552
+ "div",
43280
43553
  {
43281
- onClick: (e11) => {
43282
- e11.stopPropagation();
43283
- handleRenameProject(project);
43284
- },
43285
- children: [
43286
- /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, {}),
43287
- t2("sidebar.rename")
43288
- ]
43554
+ onClick: () => handleSelectSession(session2),
43555
+ 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"} ${hoverId === sessionHoverId(session2.id) ? "bg-sidebar-accent" : ""}`,
43556
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
43557
+ "div",
43558
+ {
43559
+ className: cn$8(
43560
+ "flex min-w-0 flex-1 items-center gap-1.5",
43561
+ session2.connectionStatus === "connected" ? "" : "opacity-60"
43562
+ ),
43563
+ children: [
43564
+ (() => {
43565
+ const state2 = sessionStates.get(session2.id);
43566
+ const hasAskUser = (state2?.askUserRequests?.length ?? 0) > 0;
43567
+ const isStreaming = session2.isStreaming;
43568
+ const completedStatus = state2?.completedStatus;
43569
+ if (hasAskUser) {
43570
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleQuestionMark, { className: "size-3 shrink-0 text-sky-500" });
43571
+ }
43572
+ if (isStreaming) {
43573
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin shrink-0" });
43574
+ }
43575
+ if (completedStatus === "success" || state2?.completedAt && !completedStatus) {
43576
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 shrink-0 text-green-500" });
43577
+ }
43578
+ if (completedStatus === "error") {
43579
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3 shrink-0 text-yellow-500" });
43580
+ }
43581
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-3 shrink-0" });
43582
+ })(),
43583
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
43584
+ Badge,
43585
+ {
43586
+ variant: "outline",
43587
+ className: "px-1 -ml-0.5 text-[10px] uppercase select-none max-w-24",
43588
+ children: agentLabel
43589
+ }
43590
+ ),
43591
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate leading-normal select-none", children: session2.title || t2("sidebar.newChat", "New Chat") }),
43592
+ activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0 text-green-500" })
43593
+ ]
43594
+ }
43595
+ )
43289
43596
  }
43290
- ),
43291
- /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
43597
+ ) }),
43292
43598
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
43293
- ContextMenuItem,
43599
+ HoverCardContent,
43294
43600
  {
43295
- variant: "destructive",
43296
- onClick: (e11) => {
43297
- e11.stopPropagation();
43298
- handleDeleteProject(project);
43299
- },
43601
+ side: "right",
43602
+ align: "start",
43603
+ sideOffset: 12,
43604
+ alignOffset: 1,
43605
+ className: "max-w-60 min-w-48 w-auto p-3",
43300
43606
  children: [
43301
- /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
43302
- t2("sidebar.delete")
43303
- ]
43304
- }
43305
- )
43306
- ] })
43307
- ]
43308
- }
43309
- ),
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",
43330
- {
43331
- className: cn$8(
43332
- "flex min-w-0 flex-1 items-center gap-1.5",
43333
- session2.connectionStatus === "connected" ? "" : "opacity-60"
43334
- ),
43335
- 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" });
43607
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
43608
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium leading-snug", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: session2.title || t2("sidebar.newChat", "New Chat") }) }),
43609
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
43610
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Bot, { className: "size-3 shrink-0" }),
43611
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: session2.agentId })
43612
+ ] }),
43613
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
43614
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-3 shrink-0" }),
43615
+ isWebUI ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: project.title }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
43616
+ "button",
43617
+ {
43618
+ type: "button",
43619
+ onClick: () => void handleRevealProjectInFinder(project),
43620
+ title: project.cwd,
43621
+ className: "min-w-0 flex-1 truncate text-left transition-colors hover:text-foreground",
43622
+ children: project.title
43623
+ }
43624
+ )
43625
+ ] }),
43626
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
43627
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3 shrink-0" }),
43628
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "truncate", children: [
43629
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mr-1", children: [
43630
+ t2("sidebar.updated", "Updated"),
43631
+ ":"
43632
+ ] }),
43633
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatRelativeTime(session2.updatedAt, i18n.language) })
43634
+ ] })
43635
+ ] }),
43636
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
43637
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CalendarDays, { className: "size-3 shrink-0" }),
43638
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "truncate", children: [
43639
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mr-1", children: [
43640
+ t2("sidebar.created", "Created"),
43641
+ ":"
43642
+ ] }),
43643
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatRelativeTime(session2.createdAt, i18n.language) })
43644
+ ] })
43645
+ ] })
43646
+ ] }),
43647
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Separator, { className: "my-2.5" }),
43648
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col -mx-2 -my-1", children: [
43649
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43650
+ "button",
43651
+ {
43652
+ type: "button",
43653
+ onClick: () => handleRenameSession(session2),
43654
+ 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",
43655
+ children: [
43656
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3 shrink-0" }),
43657
+ t2("sidebar.rename")
43658
+ ]
43349
43659
  }
43350
- if (completedStatus === "error") {
43351
- return /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3 shrink-0 text-yellow-500" });
43660
+ ),
43661
+ ilinkStatus.connected && activeIlinkSessionId !== session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43662
+ "button",
43663
+ {
43664
+ type: "button",
43665
+ onClick: () => {
43666
+ request.setActiveIlinkSession({ sessionId: session2.id }).catch(() => {
43667
+ });
43668
+ },
43669
+ 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",
43670
+ children: [
43671
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0" }),
43672
+ t2("sidebar.ilinkSetActive", "Set as WeChat Active")
43673
+ ]
43352
43674
  }
43353
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-3 shrink-0" });
43354
- })(),
43355
- /* @__PURE__ */ jsxRuntimeExports.jsx(
43356
- Badge,
43675
+ ),
43676
+ ilinkStatus.connected && activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
43677
+ "button",
43357
43678
  {
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
43679
+ type: "button",
43680
+ onClick: () => {
43681
+ request.setActiveIlinkSession({ sessionId: "" }).catch(() => {
43682
+ });
43683
+ },
43684
+ 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",
43685
+ children: [
43686
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0 text-green-500" }),
43687
+ t2("sidebar.ilinkUnsetActive", "Unset WeChat Active")
43688
+ ]
43361
43689
  }
43362
43690
  ),
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" })
43365
- ]
43366
- }
43367
- )
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")
43691
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
43692
+ "button",
43693
+ {
43694
+ type: "button",
43695
+ onClick: () => void handleDeleteSession(session2),
43696
+ className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-destructive transition-colors hover:bg-destructive/10",
43697
+ children: [
43698
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3 shrink-0" }),
43699
+ t2("sidebar.delete")
43700
+ ]
43701
+ }
43702
+ )
43703
+ ] })
43424
43704
  ]
43425
43705
  }
43426
43706
  )
43427
- ] })
43428
- ]
43429
- },
43430
- session2.id
43431
- ))
43707
+ ]
43708
+ },
43709
+ session2.id
43710
+ );
43711
+ })
43432
43712
  ] }, project.id);
43433
43713
  }) }) }),
43434
43714
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-auto border-t border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -43962,7 +44242,7 @@ function Welcome() {
43962
44242
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "absolute bottom-3 right-4 text-[11px] text-muted-foreground/40 z-10 pointer-events-none", children: [
43963
44243
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
43964
44244
  "v",
43965
- "0.1.46"
44245
+ "0.1.49"
43966
44246
  ] }),
43967
44247
  false
43968
44248
  ] }),
@@ -44129,7 +44409,7 @@ function usePopoverRootContext(optional2) {
44129
44409
  }
44130
44410
  return context;
44131
44411
  }
44132
- const selectors$1 = {
44412
+ const selectors = {
44133
44413
  ...popupStoreSelectors,
44134
44414
  disabled: (state2) => state2.disabled,
44135
44415
  instantType: (state2) => state2.instantType,
@@ -44147,7 +44427,7 @@ const selectors$1 = {
44147
44427
  class PopoverStore extends ReactStore {
44148
44428
  constructor(initialState2, floatingId, nested) {
44149
44429
  const triggerElements = new PopupTriggerMap();
44150
- super(createInitialState$1(initialState2, triggerElements, floatingId, nested), createInitialContext$1(triggerElements), selectors$1);
44430
+ super(createInitialState(initialState2, triggerElements, floatingId, nested), createInitialContext(triggerElements), selectors);
44151
44431
  }
44152
44432
  setOpen = (nextOpen, eventDetails) => {
44153
44433
  const isHover = eventDetails.reason === triggerHover;
@@ -44191,7 +44471,7 @@ class PopoverStore extends ReactStore {
44191
44471
  this.set("instantType", instantType);
44192
44472
  };
44193
44473
  }
44194
- function createInitialState$1(initialState2, triggerElements, floatingId, nested = false) {
44474
+ function createInitialState(initialState2, triggerElements, floatingId, nested = false) {
44195
44475
  const state2 = {
44196
44476
  ...createInitialPopupStoreState(),
44197
44477
  disabled: false,
@@ -44214,7 +44494,7 @@ function createInitialState$1(initialState2, triggerElements, floatingId, nested
44214
44494
  state2.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);
44215
44495
  return state2;
44216
44496
  }
44217
- function createInitialContext$1(triggerElements) {
44497
+ function createInitialContext(triggerElements) {
44218
44498
  return {
44219
44499
  popupRef: /* @__PURE__ */ reactExports.createRef(),
44220
44500
  onOpenChange: void 0,
@@ -44328,7 +44608,7 @@ function PopoverInteractions({
44328
44608
  });
44329
44609
  return null;
44330
44610
  }
44331
- const OPEN_DELAY$1 = 300;
44611
+ const OPEN_DELAY = 300;
44332
44612
  const PopoverTrigger = /* @__PURE__ */ reactExports.forwardRef(function PopoverTrigger2(componentProps, forwardedRef) {
44333
44613
  const {
44334
44614
  render: render4,
@@ -44339,7 +44619,7 @@ const PopoverTrigger = /* @__PURE__ */ reactExports.forwardRef(function PopoverT
44339
44619
  handle: handle2,
44340
44620
  payload,
44341
44621
  openOnHover = false,
44342
- delay = OPEN_DELAY$1,
44622
+ delay = OPEN_DELAY,
44343
44623
  closeDelay = 0,
44344
44624
  id: idProp,
44345
44625
  ...elementProps
@@ -46758,24 +47038,6 @@ function CollapsibleContent({
46758
47038
  }
46759
47039
  );
46760
47040
  }
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
47041
  function ItemGroup({ className, ...props }) {
46780
47042
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
46781
47043
  "div",
@@ -47168,7 +47430,7 @@ function AgentTerminalOutput({
47168
47430
  const cleanLog = reactExports.useMemo(() => {
47169
47431
  return log3?.replace(/\u001b\[[0-9;]*[a-zA-Z]/g, "").replace(/\[[0-9;]*[0-9]m/g, "");
47170
47432
  }, [log3]);
47171
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "bg-secondary/50 text-foreground/80", viewportClassName: "max-h-[70vh]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { ref: containerRef, className: "p-2 whitespace-pre-wrap font-mono text-[11px] leading-3.5", children: /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: cleanLog ?? t2("readonlyTerminal.noOutput") }) }) });
47433
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "text-foreground/80", viewportClassName: "max-h-[70vh]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { ref: containerRef, className: "p-2 whitespace-pre-wrap font-mono text-[11px] leading-3.5", children: /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: cleanLog ?? t2("readonlyTerminal.noOutput") }) }) });
47172
47434
  }
47173
47435
  const scriptRel = /* @__PURE__ */ (function detectScriptRel() {
47174
47436
  const relList = typeof document !== "undefined" && document.createElement("link").relList;
@@ -70831,7 +71093,7 @@ var lr$5 = (e11) => {
70831
71093
  for (; t2 > 0 && e11[t2 - 1] === `
70832
71094
  `; ) t2--;
70833
71095
  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 }) => {
71096
+ }, cr$4 = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-OFNGDK62-gS-2OBX1.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
71097
  let i3 = y$d(), d2 = reactExports.useMemo(() => lr$5(e11), [e11]), c3 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: d2.split(`
70836
71098
  `).map((p3) => [{ content: p3, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [d2]);
70837
71099
  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 +95934,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
95672
95934
  registerLayoutLoaders([
95673
95935
  {
95674
95936
  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")
95937
+ loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-KV5264BT-H1wB7v-Q.js"), true ? __vite__mapDeps([0,1,2,3,4,5]) : void 0, import.meta.url), "loader")
95676
95938
  },
95677
95939
  ...[
95678
95940
  {
95679
95941
  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")
95942
+ loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-CH_2zOJR.js"), true ? __vite__mapDeps([6,7]) : void 0, import.meta.url), "loader")
95681
95943
  }
95682
95944
  ]
95683
95945
  ]);
@@ -96133,7 +96395,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
96133
96395
  }, "detector");
96134
96396
  var loader = /* @__PURE__ */ __name(async () => {
96135
96397
  const { diagram: diagram2 } = await __vitePreload(async () => {
96136
- const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-D9PM_R8p.js");
96398
+ const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-DLQf0xBh.js");
96137
96399
  return { diagram: diagram22 };
96138
96400
  }, true ? __vite__mapDeps([8,9]) : void 0, import.meta.url);
96139
96401
  return { id: id$1, diagram: diagram2 };
@@ -96153,7 +96415,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
96153
96415
  }, "detector");
96154
96416
  var loader2 = /* @__PURE__ */ __name(async () => {
96155
96417
  const { diagram: diagram2 } = await __vitePreload(async () => {
96156
- const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-T3H9Pqwa.js");
96418
+ const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-BidIy8zc.js");
96157
96419
  return { diagram: diagram22 };
96158
96420
  }, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
96159
96421
  return { id: id2, diagram: diagram2 };
@@ -96179,7 +96441,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
96179
96441
  }, "detector");
96180
96442
  var loader3 = /* @__PURE__ */ __name(async () => {
96181
96443
  const { diagram: diagram2 } = await __vitePreload(async () => {
96182
- const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-T3H9Pqwa.js");
96444
+ const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-BidIy8zc.js");
96183
96445
  return { diagram: diagram22 };
96184
96446
  }, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
96185
96447
  return { id: id3, diagram: diagram2 };
@@ -96196,7 +96458,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
96196
96458
  }, "detector");
96197
96459
  var loader4 = /* @__PURE__ */ __name(async () => {
96198
96460
  const { diagram: diagram2 } = await __vitePreload(async () => {
96199
- const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-BENPNKae.js");
96461
+ const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-B35CLzqQ.js");
96200
96462
  return { diagram: diagram22 };
96201
96463
  }, true ? __vite__mapDeps([15,12,13,14]) : void 0, import.meta.url);
96202
96464
  return { id: id4, diagram: diagram2 };
@@ -96213,7 +96475,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
96213
96475
  }, "detector");
96214
96476
  var loader5 = /* @__PURE__ */ __name(async () => {
96215
96477
  const { diagram: diagram2 } = await __vitePreload(async () => {
96216
- const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-BDXB9jT_.js");
96478
+ const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-7wQ8gKPV.js");
96217
96479
  return { diagram: diagram22 };
96218
96480
  }, true ? __vite__mapDeps([16,17,18,19,4,2]) : void 0, import.meta.url);
96219
96481
  return { id: id5, diagram: diagram2 };
@@ -96230,7 +96492,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
96230
96492
  }, "detector");
96231
96493
  var loader6 = /* @__PURE__ */ __name(async () => {
96232
96494
  const { diagram: diagram2 } = await __vitePreload(async () => {
96233
- const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-Hh-AJvLC.js");
96495
+ const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-CqV1ei6S.js");
96234
96496
  return { diagram: diagram22 };
96235
96497
  }, true ? __vite__mapDeps([20,21,22,23]) : void 0, import.meta.url);
96236
96498
  return { id: id6, diagram: diagram2 };
@@ -96247,7 +96509,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
96247
96509
  }, "detector");
96248
96510
  var loader7 = /* @__PURE__ */ __name(async () => {
96249
96511
  const { diagram: diagram2 } = await __vitePreload(async () => {
96250
- const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-Ca_9-363.js");
96512
+ const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-DlKxzT4w.js");
96251
96513
  return { diagram: diagram22 };
96252
96514
  }, true ? __vite__mapDeps([24,19,4,2]) : void 0, import.meta.url);
96253
96515
  return { id: id7, diagram: diagram2 };
@@ -96263,7 +96525,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
96263
96525
  }, "detector");
96264
96526
  var loader8 = /* @__PURE__ */ __name(async () => {
96265
96527
  const { diagram: diagram2 } = await __vitePreload(async () => {
96266
- const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-CsCXUSKq.js");
96528
+ const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-BN6Ummnw.js");
96267
96529
  return { diagram: diagram22 };
96268
96530
  }, true ? __vite__mapDeps([25,17,19,4,2,26,27,22]) : void 0, import.meta.url);
96269
96531
  return { id: id8, diagram: diagram2 };
@@ -96279,7 +96541,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
96279
96541
  }, "detector");
96280
96542
  var loader9 = /* @__PURE__ */ __name(async () => {
96281
96543
  const { diagram: diagram2 } = await __vitePreload(async () => {
96282
- const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-B91qjO1u.js");
96544
+ const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-DTE_dLJv.js");
96283
96545
  return { diagram: diagram22 };
96284
96546
  }, true ? __vite__mapDeps([28,21,22,23]) : void 0, import.meta.url);
96285
96547
  return { id: id9, diagram: diagram2 };
@@ -96296,7 +96558,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
96296
96558
  }, "detector");
96297
96559
  var loader10 = /* @__PURE__ */ __name(async () => {
96298
96560
  const { diagram: diagram2 } = await __vitePreload(async () => {
96299
- const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND-YtEoXmYf.js");
96561
+ const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND-UGlSGsDE.js");
96300
96562
  return { diagram: diagram22 };
96301
96563
  }, true ? __vite__mapDeps([29,22,27,21,23]) : void 0, import.meta.url);
96302
96564
  return { id: id10, diagram: diagram2 };
@@ -96313,7 +96575,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
96313
96575
  }, "detector");
96314
96576
  var loader11 = /* @__PURE__ */ __name(async () => {
96315
96577
  const { diagram: diagram2 } = await __vitePreload(async () => {
96316
- const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-oDcN7qN5.js");
96578
+ const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-DVDS2RYN.js");
96317
96579
  return { diagram: diagram22 };
96318
96580
  }, true ? __vite__mapDeps([30,12,13]) : void 0, import.meta.url);
96319
96581
  return { id: id11, diagram: diagram2 };
@@ -96330,7 +96592,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
96330
96592
  }, "detector");
96331
96593
  var loader12 = /* @__PURE__ */ __name(async () => {
96332
96594
  const { diagram: diagram2 } = await __vitePreload(async () => {
96333
- const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-DCh5u6wY.js");
96595
+ const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-89GBJZmd.js");
96334
96596
  return { diagram: diagram22 };
96335
96597
  }, true ? __vite__mapDeps([31,9,18]) : void 0, import.meta.url);
96336
96598
  return { id: id12, diagram: diagram2 };
@@ -96350,7 +96612,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
96350
96612
  }, "detector");
96351
96613
  var loader13 = /* @__PURE__ */ __name(async () => {
96352
96614
  const { diagram: diagram2 } = await __vitePreload(async () => {
96353
- const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-O6uMquiH.js");
96615
+ const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-BInpfZnW.js");
96354
96616
  return { diagram: diagram22 };
96355
96617
  }, true ? __vite__mapDeps([32,33,11,9,12,13]) : void 0, import.meta.url);
96356
96618
  return { id: id13, diagram: diagram2 };
@@ -96370,7 +96632,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
96370
96632
  }, "detector");
96371
96633
  var loader14 = /* @__PURE__ */ __name(async () => {
96372
96634
  const { diagram: diagram2 } = await __vitePreload(async () => {
96373
- const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-O6uMquiH.js");
96635
+ const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-BInpfZnW.js");
96374
96636
  return { diagram: diagram22 };
96375
96637
  }, true ? __vite__mapDeps([34,33,11,9,12,13]) : void 0, import.meta.url);
96376
96638
  return { id: id14, diagram: diagram2 };
@@ -96390,7 +96652,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
96390
96652
  }, "detector");
96391
96653
  var loader15 = /* @__PURE__ */ __name(async () => {
96392
96654
  const { diagram: diagram2 } = await __vitePreload(async () => {
96393
- const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-DV0gaxkj.js");
96655
+ const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-YKrUbogP.js");
96394
96656
  return { diagram: diagram22 };
96395
96657
  }, true ? __vite__mapDeps([35,36,12,13,1,2,3,4]) : void 0, import.meta.url);
96396
96658
  return { id: id15, diagram: diagram2 };
@@ -96413,7 +96675,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
96413
96675
  }, "detector");
96414
96676
  var loader16 = /* @__PURE__ */ __name(async () => {
96415
96677
  const { diagram: diagram2 } = await __vitePreload(async () => {
96416
- const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2-D1Sk_TKE.js");
96678
+ const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2-CO0pZRqI.js");
96417
96679
  return { diagram: diagram22 };
96418
96680
  }, true ? __vite__mapDeps([37,36,12,13]) : void 0, import.meta.url);
96419
96681
  return { id: id16, diagram: diagram2 };
@@ -96430,7 +96692,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
96430
96692
  }, "detector");
96431
96693
  var loader17 = /* @__PURE__ */ __name(async () => {
96432
96694
  const { diagram: diagram2 } = await __vitePreload(async () => {
96433
- const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-DkQAlc0b.js");
96695
+ const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-CYRPGJN7.js");
96434
96696
  return { diagram: diagram22 };
96435
96697
  }, true ? __vite__mapDeps([38,11,9,26]) : void 0, import.meta.url);
96436
96698
  return { id: id17, diagram: diagram2 };
@@ -96500,7 +96762,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
96500
96762
  }, "detector");
96501
96763
  var loader18 = /* @__PURE__ */ __name(async () => {
96502
96764
  const { diagram: diagram2 } = await __vitePreload(async () => {
96503
- const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-T3H9Pqwa.js");
96765
+ const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-BidIy8zc.js");
96504
96766
  return { diagram: diagram22 };
96505
96767
  }, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
96506
96768
  return { id: id18, diagram: diagram2 };
@@ -96517,7 +96779,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
96517
96779
  }, "detector");
96518
96780
  var loader19 = /* @__PURE__ */ __name(async () => {
96519
96781
  const { diagram: diagram2 } = await __vitePreload(async () => {
96520
- const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-Nq47TkPV.js");
96782
+ const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-BW2oxhj-.js");
96521
96783
  return { diagram: diagram22 };
96522
96784
  }, true ? __vite__mapDeps([39,26]) : void 0, import.meta.url);
96523
96785
  return { id: id19, diagram: diagram2 };
@@ -96534,7 +96796,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
96534
96796
  }, "detector");
96535
96797
  var loader20 = /* @__PURE__ */ __name(async () => {
96536
96798
  const { diagram: diagram2 } = await __vitePreload(async () => {
96537
- const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-B3rcYXPK.js");
96799
+ const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-CC3W7LA-.js");
96538
96800
  return { diagram: diagram22 };
96539
96801
  }, true ? __vite__mapDeps([40,12,13]) : void 0, import.meta.url);
96540
96802
  return { id: id20, diagram: diagram2 };
@@ -96551,7 +96813,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
96551
96813
  }, "detector");
96552
96814
  var loader21 = /* @__PURE__ */ __name(async () => {
96553
96815
  const { diagram: diagram2 } = await __vitePreload(async () => {
96554
- const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-DamLzi6S.js");
96816
+ const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-Dovb_i6Z.js");
96555
96817
  return { diagram: diagram22 };
96556
96818
  }, true ? __vite__mapDeps([41,11]) : void 0, import.meta.url);
96557
96819
  return { id: id21, diagram: diagram2 };
@@ -96568,7 +96830,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
96568
96830
  }, "detector");
96569
96831
  var loader22 = /* @__PURE__ */ __name(async () => {
96570
96832
  const { diagram: diagram2 } = await __vitePreload(async () => {
96571
- const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-DNQO_6oX.js");
96833
+ const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-D4_LywJM.js");
96572
96834
  return { diagram: diagram22 };
96573
96835
  }, true ? __vite__mapDeps([42,27,22]) : void 0, import.meta.url);
96574
96836
  return { id: id22, diagram: diagram2 };
@@ -96585,7 +96847,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
96585
96847
  }, "detector");
96586
96848
  var loader23 = /* @__PURE__ */ __name(async () => {
96587
96849
  const { diagram: diagram2 } = await __vitePreload(async () => {
96588
- const { diagram: diagram22 } = await import("./diagram-TYMM5635-Czl-GGCp.js");
96850
+ const { diagram: diagram22 } = await import("./diagram-TYMM5635-BKn_5Ga7.js");
96589
96851
  return { diagram: diagram22 };
96590
96852
  }, true ? __vite__mapDeps([43,17,19,4,2]) : void 0, import.meta.url);
96591
96853
  return { id: id23, diagram: diagram2 };
@@ -96601,7 +96863,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
96601
96863
  }, "detector");
96602
96864
  var loader24 = /* @__PURE__ */ __name(async () => {
96603
96865
  const { diagram: diagram2 } = await __vitePreload(async () => {
96604
- const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-DSH58P_m.js");
96866
+ const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-BnwRyNpR.js");
96605
96867
  return { diagram: diagram22 };
96606
96868
  }, true ? __vite__mapDeps([44,17,19,4,2]) : void 0, import.meta.url);
96607
96869
  return { id: id24, diagram: diagram2 };
@@ -96617,7 +96879,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
96617
96879
  }, "detector");
96618
96880
  var loader25 = /* @__PURE__ */ __name(async () => {
96619
96881
  const { diagram: diagram2 } = await __vitePreload(async () => {
96620
- const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-CiCuaiyL.js");
96882
+ const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-CPK2QuaJ.js");
96621
96883
  return { diagram: diagram22 };
96622
96884
  }, true ? __vite__mapDeps([45,11,5,1,2,14]) : void 0, import.meta.url);
96623
96885
  return { id: id25, diagram: diagram2 };
@@ -96634,7 +96896,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
96634
96896
  }, "detector");
96635
96897
  var loader26 = /* @__PURE__ */ __name(async () => {
96636
96898
  const { diagram: diagram2 } = await __vitePreload(async () => {
96637
- const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-pBYJseHI.js");
96899
+ const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-D9VV_-Xi.js");
96638
96900
  return { diagram: diagram22 };
96639
96901
  }, true ? __vite__mapDeps([46,17,18,19,4,2]) : void 0, import.meta.url);
96640
96902
  return { id: id26, diagram: diagram2 };
@@ -96651,7 +96913,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
96651
96913
  }, "detector");
96652
96914
  var loader27 = /* @__PURE__ */ __name(async () => {
96653
96915
  const { diagram: diagram2 } = await __vitePreload(async () => {
96654
- const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-BBRMDHvv.js");
96916
+ const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-BNFtPc1v.js");
96655
96917
  return { diagram: diagram22 };
96656
96918
  }, true ? __vite__mapDeps([47,17,19,4,2,7]) : void 0, import.meta.url);
96657
96919
  return { id: id27, diagram: diagram2 };
@@ -96668,7 +96930,7 @@ var detector28 = /* @__PURE__ */ __name((txt) => {
96668
96930
  }, "detector");
96669
96931
  var loader28 = /* @__PURE__ */ __name(async () => {
96670
96932
  const { diagram: diagram2 } = await __vitePreload(async () => {
96671
- const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-D3GtyA4e.js");
96933
+ const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-DmOMlIE8.js");
96672
96934
  return { diagram: diagram22 };
96673
96935
  }, true ? [] : void 0, import.meta.url);
96674
96936
  return { id: id28, diagram: diagram2 };
@@ -96684,7 +96946,7 @@ var detector29 = /* @__PURE__ */ __name((txt) => {
96684
96946
  }, "detector");
96685
96947
  var loader29 = /* @__PURE__ */ __name(async () => {
96686
96948
  const { diagram: diagram2 } = await __vitePreload(async () => {
96687
- const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-CMbmY-R_.js");
96949
+ const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-DSy9zL6k.js");
96688
96950
  return { diagram: diagram22 };
96689
96951
  }, true ? [] : void 0, import.meta.url);
96690
96952
  return { id: id29, diagram: diagram2 };
@@ -96701,7 +96963,7 @@ var detector30 = /* @__PURE__ */ __name((txt) => {
96701
96963
  }, "detector");
96702
96964
  var loader30 = /* @__PURE__ */ __name(async () => {
96703
96965
  const { diagram: diagram2 } = await __vitePreload(async () => {
96704
- const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-IPm9zWeG.js");
96966
+ const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-CfRglPBg.js");
96705
96967
  return { diagram: diagram22 };
96706
96968
  }, true ? __vite__mapDeps([48,13,17,19,4,2,23,27,22]) : void 0, import.meta.url);
96707
96969
  return { id: id30, diagram: diagram2 };
@@ -96717,7 +96979,7 @@ var detector31 = /* @__PURE__ */ __name((text2) => {
96717
96979
  }, "detector");
96718
96980
  var loader31 = /* @__PURE__ */ __name(async () => {
96719
96981
  const { diagram: diagram2 } = await __vitePreload(async () => {
96720
- const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-8Kc4VQIw.js");
96982
+ const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-CJUPdnii.js");
96721
96983
  return { diagram: diagram22 };
96722
96984
  }, true ? __vite__mapDeps([49,17,19,4,2]) : void 0, import.meta.url);
96723
96985
  return { id: id31, diagram: diagram2 };
@@ -137979,7 +138241,7 @@ function buildRehypePlugins(transformImageSrc) {
137979
138241
  const protocols = sanitizeSchema.protocols;
137980
138242
  const extendedSchema = {
137981
138243
  ...sanitizeSchema,
137982
- protocols: { ...protocols, src: [...protocols.src || [], "web"] }
138244
+ protocols: { ...protocols, src: [...protocols.src || [], "web", "fello"] }
137983
138245
  };
137984
138246
  const rehypeNormalizeRelativeLinks = () => (tree) => {
137985
138247
  const walk = (node2) => {
@@ -143104,20 +143366,43 @@ function parseFelloTools(message2) {
143104
143366
  if (message2.content[0].content.type !== "text") return null;
143105
143367
  const text2 = message2.content[0].content.text;
143106
143368
  try {
143107
- const json2 = JSON.parse(text2);
143108
- if (json2.fello) {
143109
- if (json2.fello["share-to-user"]) {
143369
+ const parsed = JSON.parse(text2);
143370
+ const candidates = [];
143371
+ if (Array.isArray(parsed)) {
143372
+ for (const item of parsed) {
143373
+ if (item && typeof item === "object" && "text" in item) {
143374
+ const inner2 = item.text;
143375
+ if (typeof inner2 === "string") {
143376
+ try {
143377
+ candidates.push(JSON.parse(inner2));
143378
+ continue;
143379
+ } catch {
143380
+ }
143381
+ }
143382
+ }
143383
+ candidates.push(item);
143384
+ }
143385
+ } else {
143386
+ candidates.push(parsed);
143387
+ }
143388
+ for (const candidate of candidates) {
143389
+ if (!candidate || typeof candidate !== "object") continue;
143390
+ const fello = candidate.fello;
143391
+ if (!fello || typeof fello !== "object") continue;
143392
+ const felloObj = fello;
143393
+ if (felloObj["share-to-user"]) {
143110
143394
  const shareToUserRespondResult = shareToUserRespondSchema.safeParse(
143111
- json2.fello["share-to-user"]
143395
+ felloObj["share-to-user"]
143112
143396
  );
143113
143397
  if (shareToUserRespondResult.success) {
143114
143398
  return { type: "shareToUser", respond: shareToUserRespondResult.data };
143115
143399
  }
143116
143400
  }
143117
- if (json2.fello["image-generation"]) {
143118
- const raw2 = json2.fello["image-generation"];
143119
- if (raw2.sharePath && !raw2.images) {
143120
- raw2.images = [{ sharePath: raw2.sharePath, name: raw2.name, mimeType: raw2.mimeType }];
143401
+ if (felloObj["image-generation"]) {
143402
+ const raw2 = felloObj["image-generation"];
143403
+ if (raw2 && typeof raw2 === "object" && !("images" in raw2) && "sharePath" in raw2) {
143404
+ const r3 = raw2;
143405
+ r3.images = [{ sharePath: r3.sharePath, name: r3.name, mimeType: r3.mimeType }];
143121
143406
  }
143122
143407
  const imageGenRespondResult = imageGenerationRespondSchema.safeParse(raw2);
143123
143408
  if (imageGenRespondResult.success) {
@@ -143129,6 +143414,31 @@ function parseFelloTools(message2) {
143129
143414
  }
143130
143415
  return null;
143131
143416
  }
143417
+ function renderContentItem(content2, index2, cwd2) {
143418
+ if (content2.type === "content") {
143419
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-2 text-foreground/80", children: content2.content.type === "text" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "-mx-2", viewportClassName: "max-h-[70vh]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "m-0 p-2 text-[11px]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("code", {
143420
+ // Strip ANSI escape sequences (e.g. \x1b[38;5;250m, [38;5;250m) for clean display
143421
+ children: content2.content.text.replace(/\u001b\[[0-9;]*[a-zA-Z]/g, "").replace(/\[[0-9;]*[0-9]m/g, "")
143422
+ }) }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ContentBlocks, { blocks: [content2.content], role: "tool_call" }) }, index2);
143423
+ }
143424
+ if (content2.type === "diff") {
143425
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-b border-border last:border-b-0 flex flex-col", children: [
143426
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-2 py-2 bg-muted/50 border-b border-border text-xs font-mono text-muted-foreground truncate flex items-center gap-2", children: [
143427
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { name: content2.path.split("/").pop() ?? content2.path, className: "size-3.5" }),
143428
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: content2.path.startsWith(cwd2) ? content2.path.slice(cwd2.length + 1) : content2.path })
143429
+ ] }),
143430
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0 overflow-hidden w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full", viewportClassName: "max-h-[70vh]", children: content2.oldText == null || content2.oldText === content2.newText ? /* @__PURE__ */ jsxRuntimeExports.jsx(CodeView, { content: content2.newText, filename: content2.path.split("/").pop() }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
143431
+ CodeCompareView,
143432
+ {
143433
+ oldContent: content2.oldText,
143434
+ newContent: content2.newText,
143435
+ filename: content2.path.split("/").pop()
143436
+ }
143437
+ ) }) })
143438
+ ] }, index2);
143439
+ }
143440
+ return null;
143441
+ }
143132
143442
  function ToolItem({ session: session2, message: message2 }) {
143133
143443
  const { t: t2 } = useTranslation();
143134
143444
  const activeProjectId = session2.projectId;
@@ -143138,6 +143448,10 @@ function ToolItem({ session: session2, message: message2 }) {
143138
143448
  const [open2, setOpen] = reactExports.useState(false);
143139
143449
  const [stopping, setStopping] = reactExports.useState(false);
143140
143450
  const isRunningShell = message2.kind === "execute" && message2.status === "in_progress" && message2.terminalId != null;
143451
+ const contentItems = (message2.content ?? []).filter(
143452
+ (c3) => c3.type === "content" || c3.type === "diff"
143453
+ );
143454
+ const defaultTab = isRunningShell ? "terminal" : contentItems.length > 0 ? "content-0" : "terminal";
143141
143455
  const handleStop = reactExports.useCallback(async () => {
143142
143456
  if (!message2.terminalId || stopping) return;
143143
143457
  setStopping(true);
@@ -143230,7 +143544,7 @@ function ToolItem({ session: session2, message: message2 }) {
143230
143544
  type: "button",
143231
143545
  variant: "destructive",
143232
143546
  size: "xs",
143233
- className: "shrink-0 rounded-full px-2 disabled:opacity-100",
143547
+ className: "shrink-0 rounded-full px-1.5 -my-2 h-5 disabled:opacity-100",
143234
143548
  title: t2("toolBubble.stop"),
143235
143549
  disabled: stopping,
143236
143550
  onClick: (e11) => {
@@ -143257,43 +143571,42 @@ function ToolItem({ session: session2, message: message2 }) {
143257
143571
  children: /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "p-2 m-0 text-[11px] leading-relaxed text-foreground/80", children: /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: typeof message2.rawInput === "string" ? message2.rawInput : jsonToPrettyYamlExports.stringify(message2.rawInput) }) })
143258
143572
  }
143259
143573
  ),
143260
- message2.content && message2.content.map((content2, index2) => {
143261
- if (content2.type === "content") {
143262
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-2 text-foreground/80", children: content2.content.type === "text" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "-mx-2", viewportClassName: "max-h-[70vh]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "m-0 p-2 text-[11px]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("code", {
143263
- // Strip ANSI escape sequences (e.g. \x1b[38;5;250m, [38;5;250m) for clean display
143264
- children: content2.content.text.replace(/\u001b\[[0-9;]*[a-zA-Z]/g, "").replace(/\[[0-9;]*[0-9]m/g, "")
143265
- }) }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ContentBlocks, { blocks: [content2.content], role: "tool_call" }) }, index2);
143266
- } else if (content2.type === "diff") {
143267
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-b border-border last:border-b-0 flex flex-col", children: [
143268
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-2 py-2 bg-muted/50 border-b border-border text-xs font-mono text-muted-foreground truncate flex items-center gap-2", children: [
143269
- /* @__PURE__ */ jsxRuntimeExports.jsx(
143270
- FileIcon,
143574
+ (contentItems.length > 0 || message2.terminalId) && /* @__PURE__ */ jsxRuntimeExports.jsxs(Tabs, { defaultValue: defaultTab, className: "w-full", children: [
143575
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
143576
+ TabsList,
143577
+ {
143578
+ variant: "line",
143579
+ className: "w-full h-8 justify-start rounded-none border-b border-border",
143580
+ children: [
143581
+ contentItems.map((content2, index2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
143582
+ TabsTrigger,
143271
143583
  {
143272
- name: content2.path.split("/").pop() ?? content2.path,
143273
- className: "size-3.5"
143584
+ value: `content-${index2}`,
143585
+ className: "h-full flex-none text-xs font-normal opacity-70",
143586
+ children: [
143587
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ListCheck, { className: "size-3.5 -ml-1" }),
143588
+ content2.type === "diff" ? `${content2.path.split("/").pop()}` : t2("toolBubble.result")
143589
+ ]
143590
+ },
143591
+ index2
143592
+ )),
143593
+ message2.terminalId && /* @__PURE__ */ jsxRuntimeExports.jsxs(
143594
+ TabsTrigger,
143595
+ {
143596
+ value: "terminal",
143597
+ className: "h-full flex-none px-2 text-xs font-normal opacity-70",
143598
+ children: [
143599
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Terminal, { className: "size-3.5 -ml-1" }),
143600
+ t2("toolBubble.terminal")
143601
+ ]
143274
143602
  }
143275
- ),
143276
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: content2.path.startsWith(session2.cwd) ? content2.path.slice(session2.cwd.length + 1) : content2.path })
143277
- ] }),
143278
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-h-0 overflow-hidden w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full", viewportClassName: "max-h-[70vh]", children: content2.oldText == null || content2.oldText === content2.newText ? /* @__PURE__ */ jsxRuntimeExports.jsx(
143279
- CodeView,
143280
- {
143281
- content: content2.newText,
143282
- filename: content2.path.split("/").pop()
143283
- }
143284
- ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
143285
- CodeCompareView,
143286
- {
143287
- oldContent: content2.oldText,
143288
- newContent: content2.newText,
143289
- filename: content2.path.split("/").pop()
143290
- }
143291
- ) }) })
143292
- ] }, index2);
143293
- }
143294
- return null;
143295
- }),
143296
- message2.terminalId && /* @__PURE__ */ jsxRuntimeExports.jsx(AgentTerminalOutput, { sessionId: session2.id, terminalId: message2.terminalId })
143603
+ )
143604
+ ]
143605
+ }
143606
+ ),
143607
+ contentItems.map((content2, index2) => /* @__PURE__ */ jsxRuntimeExports.jsx(TabsContent, { value: `content-${index2}`, children: renderContentItem(content2, index2, session2.cwd) }, index2)),
143608
+ message2.terminalId && /* @__PURE__ */ jsxRuntimeExports.jsx(TabsContent, { value: "terminal", children: /* @__PURE__ */ jsxRuntimeExports.jsx(AgentTerminalOutput, { sessionId: session2.id, terminalId: message2.terminalId }) })
143609
+ ] })
143297
143610
  ] })
143298
143611
  ]
143299
143612
  }
@@ -143560,8 +143873,8 @@ const ThinkingBubble = reactExports.memo(function ThinkingBubble2({
143560
143873
  open: open2,
143561
143874
  onOpenChange: setOpen,
143562
143875
  children: [
143563
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "w-full bg-transparent border-0 flex select-none items-center gap-2 px-0 py-1 text-[11px] text-muted-foreground/90 hover:text-muted-foreground pointer-events-auto", children: [
143564
- /* @__PURE__ */ jsxRuntimeExports.jsx(Lightbulb, { className: `size-3.5 ${isStreaming ? "animate-pulse" : ""}` }),
143876
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "w-full bg-transparent border-0 flex select-none items-center gap-1 px-0 py-1 text-[11px] text-muted-foreground/90 hover:text-muted-foreground pointer-events-auto", children: [
143877
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Lightbulb, { className: `size-3.5 -ml-px ${isStreaming ? "animate-pulse" : ""}` }),
143565
143878
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: isStreaming ? t2("thinkingBubble.thinking", "Thinking...") : t2("thinkingBubble.thought", "Thought") })
143566
143879
  ] }),
143567
143880
  /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { className: "mt-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "max-w-none", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -147167,402 +147480,6 @@ function _$9(t2) {
147167
147480
  function D$7(t2) {
147168
147481
  be$9.setTheme(t2);
147169
147482
  }
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
147483
  function skillInfoToSuggestItem(s16) {
147567
147484
  return {
147568
147485
  id: s16.id,
@@ -147619,16 +147536,8 @@ function readFileAsBase64(file) {
147619
147536
  reader.readAsDataURL(file);
147620
147537
  });
147621
147538
  }
147622
- function readFileAsText(file) {
147623
- return new Promise((resolve, reject) => {
147624
- const reader = new FileReader();
147625
- reader.onload = () => resolve(reader.result);
147626
- reader.onerror = reject;
147627
- reader.readAsText(file);
147628
- });
147629
- }
147630
147539
  async function addFileAsAttachment(file, type2, updateSessionState) {
147631
- const data = type2 === "image" ? await readFileAsBase64(file) : await readFileAsText(file);
147540
+ const data = await readFileAsBase64(file);
147632
147541
  updateSessionState((s16) => ({
147633
147542
  draftAttachments: [
147634
147543
  ...s16.draftAttachments,
@@ -147823,10 +147732,18 @@ function ChatInput({ session: session2 }) {
147823
147732
  }, [appendMentionsToInput]);
147824
147733
  const handleFileSelect = async (e11) => {
147825
147734
  const files = Array.from(e11.target.files || []);
147735
+ const absPaths = [];
147826
147736
  for (const file of files) {
147827
147737
  const isImage2 = file.type.startsWith("image/");
147828
- const type2 = isImage2 && supportsImage ? "image" : "file";
147829
- await addFileAsAttachment(file, type2, updateSessionState);
147738
+ if (isImage2 && supportsImage) {
147739
+ await addFileAsAttachment(file, "image", updateSessionState);
147740
+ } else if (!isWebUI) {
147741
+ const p3 = electron.getPathForFile(file);
147742
+ if (p3) absPaths.push(p3);
147743
+ }
147744
+ }
147745
+ if (absPaths.length > 0) {
147746
+ await insertPathMentions(absPaths);
147830
147747
  }
147831
147748
  if (fileInputRef.current) fileInputRef.current.value = "";
147832
147749
  };
@@ -148005,25 +147922,15 @@ function ChatInput({ session: session2 }) {
148005
147922
  let hasInlineAttachments = false;
148006
147923
  for (const file of Array.from(e11.dataTransfer.files)) {
148007
147924
  const isImage2 = file.type.startsWith("image/");
148008
- const canEmbed = isImage2 && supportsImage;
148009
- const canReadText = supportsEmbedded;
148010
- if (canEmbed || canReadText) {
147925
+ if (isImage2 && supportsImage) {
148011
147926
  hasInlineAttachments = true;
148012
147927
  (async () => {
148013
147928
  try {
148014
- const type2 = isImage2 ? "image" : "file";
148015
- await addFileAsAttachment(file, type2, updateSessionState);
147929
+ await addFileAsAttachment(file, "image", updateSessionState);
148016
147930
  } catch {
148017
147931
  if (!isWebUI) {
148018
147932
  const p3 = electron.getPathForFile(file);
148019
- if (p3) {
148020
- const mention = await absPathToMention(p3, session2.projectId, session2.cwd);
148021
- const textarea = getTextarea();
148022
- if (textarea) {
148023
- textarea.focus();
148024
- insertMentionsAtCursor(textarea, [mention]);
148025
- }
148026
- }
147933
+ if (p3) absPaths.push(p3);
148027
147934
  }
148028
147935
  }
148029
147936
  })();
@@ -148056,16 +147963,7 @@ function ChatInput({ session: session2 }) {
148056
147963
  } catch {
148057
147964
  }
148058
147965
  },
148059
- [
148060
- supportsImage,
148061
- supportsEmbedded,
148062
- session2.projectId,
148063
- session2.cwd,
148064
- updateSessionState,
148065
- getTextarea,
148066
- insertPathMentions,
148067
- appendMentionsToInput
148068
- ]
147966
+ [supportsImage, updateSessionState, insertPathMentions, appendMentionsToInput]
148069
147967
  );
148070
147968
  const handleDragOver = reactExports.useCallback((e11) => {
148071
147969
  if (e11.dataTransfer.types.includes("application/x-fello-tree-nodes") || e11.dataTransfer.types.includes("Files") || e11.dataTransfer.types.includes("text/uri-list")) {
@@ -148131,14 +148029,16 @@ function ChatInput({ session: session2 }) {
148131
148029
  const paths = [];
148132
148030
  for (const file of Array.from(files)) {
148133
148031
  const isImage2 = file.type.startsWith("image/");
148134
- const canEmbed = isImage2 && supportsImage;
148135
- const canReadText = supportsEmbedded;
148136
- if (canEmbed || canReadText) {
148032
+ if (isImage2 && supportsImage) {
148137
148033
  (async () => {
148138
- const type2 = isImage2 ? "image" : "file";
148139
- await addFileAsAttachment(file, type2, updateSessionState);
148034
+ try {
148035
+ await addFileAsAttachment(file, "image", updateSessionState);
148036
+ } catch {
148037
+ const p3 = electron.getPathForFile(file);
148038
+ if (p3) paths.push(p3);
148039
+ }
148140
148040
  })();
148141
- } else if (!isWebUI) {
148041
+ } else {
148142
148042
  const p3 = electron.getPathForFile(file);
148143
148043
  if (p3) paths.push(p3);
148144
148044
  }
@@ -148153,7 +148053,7 @@ function ChatInput({ session: session2 }) {
148153
148053
  return;
148154
148054
  }
148155
148055
  },
148156
- [session2, supportsImage, supportsEmbedded, updateSessionState, insertPathMentions]
148056
+ [session2, supportsImage, updateSessionState, insertPathMentions]
148157
148057
  );
148158
148058
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
148159
148059
  "div",
@@ -148331,7 +148231,7 @@ function ChatInput({ session: session2 }) {
148331
148231
  }
148332
148232
  ),
148333
148233
  children: [
148334
- /* @__PURE__ */ jsxRuntimeExports.jsx(Eclipse, { className: "size-3" }),
148234
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Eclipse, { className: "size-3.5" }),
148335
148235
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: availableModes.find((m2) => m2.id === currentModeId)?.name ?? t2("chatInput.mode", "Mode") }),
148336
148236
  /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-3 opacity-60 shrink-0" })
148337
148237
  ]
@@ -148366,19 +148266,16 @@ function ChatInput({ session: session2 }) {
148366
148266
  )
148367
148267
  ] }),
148368
148268
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center", children: [
148369
- initializeInfo?.agentCapabilities?.promptCapabilities?.embeddedContext || initializeInfo?.agentCapabilities?.promptCapabilities?.image ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
148269
+ supportsImage || supportsEmbedded ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
148370
148270
  /* @__PURE__ */ jsxRuntimeExports.jsx(
148371
148271
  "input",
148372
148272
  {
148373
148273
  type: "file",
148374
148274
  multiple: true,
148275
+ accept: "*/*",
148375
148276
  ref: fileInputRef,
148376
148277
  className: "hidden",
148377
- onChange: handleFileSelect,
148378
- accept: [
148379
- initializeInfo?.agentCapabilities?.promptCapabilities?.image ? "image/*" : "",
148380
- initializeInfo?.agentCapabilities?.promptCapabilities?.embeddedContext ? "*/*" : ""
148381
- ].filter(Boolean).join(",")
148278
+ onChange: handleFileSelect
148382
148279
  }
148383
148280
  ),
148384
148281
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -148390,7 +148287,7 @@ function ChatInput({ session: session2 }) {
148390
148287
  onClick: () => fileInputRef.current?.click(),
148391
148288
  "aria-label": t2("chatInput.attach", "Attach file"),
148392
148289
  disabled: disabled2,
148393
- children: initializeInfo?.agentCapabilities?.promptCapabilities?.embeddedContext ? /* @__PURE__ */ jsxRuntimeExports.jsx(Paperclip, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "size-3.5" })
148290
+ children: supportsEmbedded ? /* @__PURE__ */ jsxRuntimeExports.jsx(Paperclip, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "size-3.5" })
148394
148291
  }
148395
148292
  )
148396
148293
  ] }) : null,
@@ -148442,7 +148339,7 @@ function ChatInput({ session: session2 }) {
148442
148339
  }
148443
148340
  ),
148444
148341
  children: [
148445
- /* @__PURE__ */ jsxRuntimeExports.jsx(Astroid, { className: "size-3" }),
148342
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Astroid, { className: "size-3.5" }),
148446
148343
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: availableModels.find((m2) => m2.modelId === currentModelId)?.name ?? t2("chatInput.selectModel", "Select model") }),
148447
148344
  /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-3 opacity-60 shrink-0" })
148448
148345
  ]
@@ -148536,11 +148433,11 @@ function ChatInput({ session: session2 }) {
148536
148433
  {
148537
148434
  variant: "outline",
148538
148435
  size: "sm",
148539
- className: "h-7 text-xs text-muted-foreground hover:text-foreground gap-2 max-w-32 shrink overflow-hidden"
148436
+ className: "h-7 text-xs text-muted-foreground hover:text-foreground gap-2 max-w-48 shrink overflow-hidden"
148540
148437
  }
148541
148438
  ),
148542
148439
  children: [
148543
- /* @__PURE__ */ jsxRuntimeExports.jsx(Gauge, { className: "size-3" }),
148440
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Gauge, { className: "size-3.5" }),
148544
148441
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: availableThoughtLevels.find((l6) => l6.id === currentThoughtLevelId)?.name ?? "Thought" }),
148545
148442
  /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-3 opacity-60 shrink-0" })
148546
148443
  ]
@@ -148724,7 +148621,8 @@ function AskUserDialog({ sessionId }) {
148724
148621
  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
148622
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-3 min-h-0", children: [
148726
148623
  /* @__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") })
148624
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium leading-snug truncate", children: currentRequest.title || t2("askUser.title", "Request") }),
148625
+ currentRequest.timeoutAt != null && /* @__PURE__ */ jsxRuntimeExports.jsx(AskUserCountdown, { timeoutAt: currentRequest.timeoutAt })
148728
148626
  ] }),
148729
148627
  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
148628
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pt-3 min-h-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -148749,6 +148647,33 @@ function formatDescription(text2) {
148749
148647
  }
148750
148648
  return text2;
148751
148649
  }
148650
+ function AskUserCountdown({ timeoutAt }) {
148651
+ const { t: t2 } = useTranslation();
148652
+ const [remainingMs, setRemainingMs] = reactExports.useState(() => Math.max(0, timeoutAt - Date.now()));
148653
+ reactExports.useEffect(() => {
148654
+ const update2 = () => setRemainingMs(Math.max(0, timeoutAt - Date.now()));
148655
+ update2();
148656
+ const timer2 = setInterval(update2, 1e3);
148657
+ return () => clearInterval(timer2);
148658
+ }, [timeoutAt]);
148659
+ const totalSeconds = Math.ceil(remainingMs / 1e3);
148660
+ const minutes = Math.floor(totalSeconds / 60);
148661
+ const seconds = totalSeconds % 60;
148662
+ const urgent = totalSeconds <= 30;
148663
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
148664
+ "span",
148665
+ {
148666
+ 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"}`,
148667
+ title: t2("askUser.autoClose", "Auto closes on timeout"),
148668
+ children: [
148669
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3 mr-1 -ml-px" }),
148670
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: minutes.toString().padStart(2, "0") }),
148671
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[8px] mx-0.5", children: ":" }),
148672
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: seconds.toString().padStart(2, "0") })
148673
+ ]
148674
+ }
148675
+ );
148676
+ }
148752
148677
  function AskUserOptions({
148753
148678
  request: request$1,
148754
148679
  onResolved
@@ -148919,6 +148844,280 @@ function getFileKind$1(filename) {
148919
148844
  if (ext === "md") return "markdown";
148920
148845
  return "text";
148921
148846
  }
148847
+ function ContextMenuRoot(props) {
148848
+ const [anchor2, setAnchor] = reactExports.useState({
148849
+ getBoundingClientRect() {
148850
+ return DOMRect.fromRect({
148851
+ width: 0,
148852
+ height: 0,
148853
+ x: 0,
148854
+ y: 0
148855
+ });
148856
+ }
148857
+ });
148858
+ const backdropRef = reactExports.useRef(null);
148859
+ const internalBackdropRef = reactExports.useRef(null);
148860
+ const actionsRef = reactExports.useRef(null);
148861
+ const positionerRef = reactExports.useRef(null);
148862
+ const allowMouseUpTriggerRef = reactExports.useRef(true);
148863
+ const initialCursorPointRef = reactExports.useRef(null);
148864
+ const id32 = useId();
148865
+ const contextValue = reactExports.useMemo(() => ({
148866
+ anchor: anchor2,
148867
+ setAnchor,
148868
+ actionsRef,
148869
+ backdropRef,
148870
+ internalBackdropRef,
148871
+ positionerRef,
148872
+ allowMouseUpTriggerRef,
148873
+ initialCursorPointRef,
148874
+ rootId: id32
148875
+ }), [anchor2, id32]);
148876
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuRootContext.Provider, {
148877
+ value: contextValue,
148878
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRootContext.Provider, {
148879
+ value: void 0,
148880
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRoot, {
148881
+ ...props
148882
+ })
148883
+ })
148884
+ });
148885
+ }
148886
+ const LONG_PRESS_DELAY = 500;
148887
+ const ContextMenuTrigger$1 = /* @__PURE__ */ reactExports.forwardRef(function ContextMenuTrigger2(componentProps, forwardedRef) {
148888
+ const {
148889
+ render: render4,
148890
+ className,
148891
+ style: style2,
148892
+ ...elementProps
148893
+ } = componentProps;
148894
+ const {
148895
+ setAnchor,
148896
+ actionsRef,
148897
+ internalBackdropRef,
148898
+ backdropRef,
148899
+ positionerRef,
148900
+ allowMouseUpTriggerRef,
148901
+ initialCursorPointRef,
148902
+ rootId
148903
+ } = useContextMenuRootContext(false);
148904
+ const {
148905
+ store
148906
+ } = useMenuRootContext(false);
148907
+ const open2 = store.useState("open");
148908
+ const disabled2 = store.useState("disabled");
148909
+ const triggerRef = reactExports.useRef(null);
148910
+ const touchPositionRef = reactExports.useRef(null);
148911
+ const longPressTimeout = useTimeout();
148912
+ const allowMouseUpTimeout = useTimeout();
148913
+ const allowMouseUpRef = reactExports.useRef(false);
148914
+ const mouseUpAbortControllerRef = reactExports.useRef(null);
148915
+ function handleLongPress(x2, y4, event) {
148916
+ const isTouchEvent2 = event.type.startsWith("touch");
148917
+ initialCursorPointRef.current = {
148918
+ x: x2,
148919
+ y: y4
148920
+ };
148921
+ setAnchor({
148922
+ getBoundingClientRect() {
148923
+ return DOMRect.fromRect({
148924
+ width: isTouchEvent2 ? 10 : 0,
148925
+ height: isTouchEvent2 ? 10 : 0,
148926
+ x: x2,
148927
+ y: y4
148928
+ });
148929
+ }
148930
+ });
148931
+ allowMouseUpRef.current = false;
148932
+ actionsRef.current?.setOpen(true, createChangeEventDetails(triggerPress, event));
148933
+ allowMouseUpTimeout.start(LONG_PRESS_DELAY, () => {
148934
+ allowMouseUpRef.current = true;
148935
+ });
148936
+ }
148937
+ function handleContextMenu(event) {
148938
+ if (disabled2) {
148939
+ return;
148940
+ }
148941
+ allowMouseUpTriggerRef.current = true;
148942
+ stopEvent$1(event);
148943
+ handleLongPress(event.clientX, event.clientY, event.nativeEvent);
148944
+ const doc = ownerDocument(triggerRef.current);
148945
+ mouseUpAbortControllerRef.current?.abort();
148946
+ const mouseUpAbortController = new AbortController();
148947
+ mouseUpAbortControllerRef.current = mouseUpAbortController;
148948
+ doc.addEventListener("mouseup", (mouseEvent) => {
148949
+ allowMouseUpTriggerRef.current = false;
148950
+ if (!allowMouseUpRef.current) {
148951
+ return;
148952
+ }
148953
+ allowMouseUpTimeout.clear();
148954
+ allowMouseUpRef.current = false;
148955
+ const mouseUpTarget = getTarget(mouseEvent);
148956
+ if (contains(positionerRef.current, mouseUpTarget)) {
148957
+ return;
148958
+ }
148959
+ if (rootId && mouseUpTarget && findRootOwnerId(mouseUpTarget) === rootId) {
148960
+ return;
148961
+ }
148962
+ actionsRef.current?.setOpen(false, createChangeEventDetails(cancelOpen, mouseEvent));
148963
+ }, {
148964
+ once: true,
148965
+ signal: mouseUpAbortController.signal
148966
+ });
148967
+ }
148968
+ function cancelLongPress() {
148969
+ longPressTimeout.clear();
148970
+ touchPositionRef.current = null;
148971
+ }
148972
+ function handleTouchStart(event) {
148973
+ if (disabled2) {
148974
+ cancelLongPress();
148975
+ return;
148976
+ }
148977
+ allowMouseUpTriggerRef.current = false;
148978
+ if (event.touches.length !== 1) {
148979
+ cancelLongPress();
148980
+ return;
148981
+ }
148982
+ event.stopPropagation();
148983
+ const touch = event.touches[0];
148984
+ const touchPosition = {
148985
+ x: touch.clientX,
148986
+ y: touch.clientY
148987
+ };
148988
+ touchPositionRef.current = touchPosition;
148989
+ longPressTimeout.start(LONG_PRESS_DELAY, () => {
148990
+ handleLongPress(touchPosition.x, touchPosition.y, event.nativeEvent);
148991
+ });
148992
+ }
148993
+ function handleTouchMove(event) {
148994
+ if (event.touches.length !== 1) {
148995
+ cancelLongPress();
148996
+ return;
148997
+ }
148998
+ if (longPressTimeout.isStarted() && touchPositionRef.current) {
148999
+ const touch = event.touches[0];
149000
+ const moveThreshold = 10;
149001
+ const deltaX = Math.abs(touch.clientX - touchPositionRef.current.x);
149002
+ const deltaY = Math.abs(touch.clientY - touchPositionRef.current.y);
149003
+ if (deltaX > moveThreshold || deltaY > moveThreshold) {
149004
+ cancelLongPress();
149005
+ }
149006
+ }
149007
+ }
149008
+ reactExports.useEffect(() => () => {
149009
+ mouseUpAbortControllerRef.current?.abort();
149010
+ }, []);
149011
+ reactExports.useEffect(() => {
149012
+ function handleDocumentContextMenu(event) {
149013
+ if (disabled2) {
149014
+ return;
149015
+ }
149016
+ const target = getTarget(event);
149017
+ const targetElement = target;
149018
+ if (contains(triggerRef.current, targetElement) || contains(internalBackdropRef.current, targetElement) || contains(backdropRef.current, targetElement)) {
149019
+ event.preventDefault();
149020
+ }
149021
+ }
149022
+ const doc = ownerDocument(triggerRef.current);
149023
+ return addEventListener(doc, "contextmenu", handleDocumentContextMenu);
149024
+ }, [backdropRef, disabled2, internalBackdropRef]);
149025
+ const state2 = {
149026
+ open: open2
149027
+ };
149028
+ const element2 = useRenderElement("div", componentProps, {
149029
+ state: state2,
149030
+ ref: [triggerRef, forwardedRef],
149031
+ props: [{
149032
+ onContextMenu: handleContextMenu,
149033
+ onTouchStart: handleTouchStart,
149034
+ onTouchMove: handleTouchMove,
149035
+ onTouchEnd: cancelLongPress,
149036
+ onTouchCancel: cancelLongPress,
149037
+ style: {
149038
+ WebkitTouchCallout: "none"
149039
+ }
149040
+ }, elementProps],
149041
+ stateAttributesMapping: pressableTriggerOpenStateMapping
149042
+ });
149043
+ return element2;
149044
+ });
149045
+ function ContextMenu({ ...props }) {
149046
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuRoot, { "data-slot": "context-menu", ...props });
149047
+ }
149048
+ function ContextMenuTrigger({
149049
+ className,
149050
+ ...props
149051
+ }) {
149052
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
149053
+ ContextMenuTrigger$1,
149054
+ {
149055
+ "data-slot": "context-menu-trigger",
149056
+ className: cn$8("select-none", className),
149057
+ ...props
149058
+ }
149059
+ );
149060
+ }
149061
+ function ContextMenuContent({
149062
+ className,
149063
+ align = "start",
149064
+ alignOffset = 4,
149065
+ side = "right",
149066
+ sideOffset = 0,
149067
+ ...props
149068
+ }) {
149069
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(MenuPortal, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
149070
+ MenuPositioner,
149071
+ {
149072
+ className: "isolate z-50 outline-none",
149073
+ align,
149074
+ alignOffset,
149075
+ side,
149076
+ sideOffset,
149077
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
149078
+ MenuPopup,
149079
+ {
149080
+ "data-slot": "context-menu-content",
149081
+ className: cn$8("z-50 max-h-(--available-height) min-w-38 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover py-1 px-1 space-y-0.5 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none 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", className),
149082
+ ...props
149083
+ }
149084
+ )
149085
+ }
149086
+ ) });
149087
+ }
149088
+ function ContextMenuItem({
149089
+ className,
149090
+ inset,
149091
+ variant = "default",
149092
+ ...props
149093
+ }) {
149094
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
149095
+ MenuItem,
149096
+ {
149097
+ "data-slot": "context-menu-item",
149098
+ "data-inset": inset,
149099
+ "data-variant": variant,
149100
+ className: cn$8(
149101
+ "group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-sm px-1.5 py-1 text-xs text-muted-foreground/90 outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive",
149102
+ className
149103
+ ),
149104
+ ...props
149105
+ }
149106
+ );
149107
+ }
149108
+ function ContextMenuSeparator({
149109
+ className,
149110
+ ...props
149111
+ }) {
149112
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
149113
+ Separator$1,
149114
+ {
149115
+ "data-slot": "context-menu-separator",
149116
+ className: cn$8("-mx-1 my-1 h-px bg-border", className),
149117
+ ...props
149118
+ }
149119
+ );
149120
+ }
148922
149121
  function FileViewTabs({ viewMode, viewModes, onViewModeChange }) {
148923
149122
  const { t: t2 } = useTranslation();
148924
149123
  if (viewModes.length <= 1) return null;
@@ -270733,7 +270932,15 @@ function Detail({ detailType, projectId, file, terminalId, onClose }) {
270733
270932
  if (!detailType) return null;
270734
270933
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full min-h-0 overflow-hidden bg-background", children: [
270735
270934
  detailType === "file" && projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx(FileDetail$1, { projectId, file, onClose }),
270736
- detailType === "terminal" && projectId && terminalId && /* @__PURE__ */ jsxRuntimeExports.jsx(TerminalDetail, { terminalId, projectId, onClose }),
270935
+ detailType === "terminal" && projectId && terminalId && /* @__PURE__ */ jsxRuntimeExports.jsx(
270936
+ TerminalDetail,
270937
+ {
270938
+ terminalId,
270939
+ projectId,
270940
+ onClose
270941
+ },
270942
+ terminalId
270943
+ ),
270737
270944
  (!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
270945
  ] });
270739
270946
  }
@@ -270838,6 +271045,7 @@ function TreeItem({
270838
271045
  },
270839
271046
  className: cn$8(
270840
271047
  "flex h-6 cursor-default select-none items-center gap-1.5 px-1.5 text-sx leading-none text-foreground/60",
271048
+ node2.ignored && "opacity-50",
270841
271049
  node2.id === previewId ? "bg-primary/8 hover:bg-primary/10" : "hover:bg-primary/5 hover:text-foreground",
270842
271050
  isSelected ? "text-foreground bg-primary/6" : "",
270843
271051
  isDragOver && "relative ring-1 ring-primary bg-primary/5"
@@ -271398,6 +271606,7 @@ const FilePanel = reactExports.memo(function FilePanel2({
271398
271606
  id: tempId,
271399
271607
  name: "",
271400
271608
  isFolder,
271609
+ ignored: false,
271401
271610
  children: isFolder ? [] : void 0
271402
271611
  };
271403
271612
  if (parentId) {
@@ -274563,6 +274772,7 @@ function Session({ session: session2 }) {
274563
274772
  }
274564
274773
  state2 = reduceSessionNotification(sessionId, state2, notification);
274565
274774
  }
274775
+ state2 = reduceFlushStreaming(state2);
274566
274776
  state2 = {
274567
274777
  ...state2,
274568
274778
  isLoading: false,
@@ -274663,6 +274873,367 @@ function Session({ session: session2 }) {
274663
274873
  ] })
274664
274874
  ] }, sessionId) : null });
274665
274875
  }
274876
+ function Label({ className, ...props }) {
274877
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274878
+ "label",
274879
+ {
274880
+ "data-slot": "label",
274881
+ className: cn$8(
274882
+ "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",
274883
+ className
274884
+ ),
274885
+ ...props
274886
+ }
274887
+ );
274888
+ }
274889
+ function FieldGroup({ className, ...props }) {
274890
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274891
+ "div",
274892
+ {
274893
+ "data-slot": "field-group",
274894
+ className: cn$8(
274895
+ "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",
274896
+ className
274897
+ ),
274898
+ ...props
274899
+ }
274900
+ );
274901
+ }
274902
+ const fieldVariants = cva(
274903
+ "group/field flex w-full gap-2 data-[invalid=true]:text-destructive",
274904
+ {
274905
+ variants: {
274906
+ orientation: {
274907
+ vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
274908
+ 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",
274909
+ 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"
274910
+ }
274911
+ },
274912
+ defaultVariants: {
274913
+ orientation: "vertical"
274914
+ }
274915
+ }
274916
+ );
274917
+ function Field({
274918
+ className,
274919
+ orientation = "vertical",
274920
+ ...props
274921
+ }) {
274922
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274923
+ "div",
274924
+ {
274925
+ role: "group",
274926
+ "data-slot": "field",
274927
+ "data-orientation": orientation,
274928
+ className: cn$8(fieldVariants({ orientation }), className),
274929
+ ...props
274930
+ }
274931
+ );
274932
+ }
274933
+ function FieldLabel({
274934
+ className,
274935
+ ...props
274936
+ }) {
274937
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274938
+ Label,
274939
+ {
274940
+ "data-slot": "field-label",
274941
+ className: cn$8(
274942
+ "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",
274943
+ "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col",
274944
+ className
274945
+ ),
274946
+ ...props
274947
+ }
274948
+ );
274949
+ }
274950
+ function FieldError({
274951
+ className,
274952
+ children: children2,
274953
+ errors,
274954
+ ...props
274955
+ }) {
274956
+ const content2 = reactExports.useMemo(() => {
274957
+ if (children2) {
274958
+ return children2;
274959
+ }
274960
+ if (!errors?.length) {
274961
+ return null;
274962
+ }
274963
+ const uniqueErrors = [
274964
+ ...new Map(errors.map((error) => [error?.message, error])).values()
274965
+ ];
274966
+ if (uniqueErrors?.length == 1) {
274967
+ return uniqueErrors[0]?.message;
274968
+ }
274969
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "ml-4 flex list-disc flex-col gap-1", children: uniqueErrors.map(
274970
+ (error, index2) => error?.message && /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: error.message }, index2)
274971
+ ) });
274972
+ }, [children2, errors]);
274973
+ if (!content2) {
274974
+ return null;
274975
+ }
274976
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
274977
+ "div",
274978
+ {
274979
+ role: "alert",
274980
+ "data-slot": "field-error",
274981
+ className: cn$8("text-xs font-normal text-destructive -mb-4.5 -mt-1.5 min-h-4 text-[11px]", className),
274982
+ ...props,
274983
+ children: content2
274984
+ }
274985
+ );
274986
+ }
274987
+ function SettingsProxyDialog({ open: open2, onOpenChange }) {
274988
+ const { t: t2 } = useTranslation();
274989
+ const proxy = useAppStore((s16) => s16.proxy);
274990
+ const setProxy = useAppStore((s16) => s16.setProxy);
274991
+ const { toast: toast2, alert, confirm: confirm2 } = useMessage();
274992
+ const [draft, setDraft] = reactExports.useState(() => ({
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
+ reactExports.useEffect(() => {
275001
+ if (!open2) return;
275002
+ setDraft({
275003
+ mode: proxy.mode ?? "off",
275004
+ httpProxy: proxy.httpProxy ?? "",
275005
+ httpsProxy: proxy.httpsProxy ?? "",
275006
+ noProxy: proxy.noProxy ?? "",
275007
+ username: proxy.username ?? "",
275008
+ password: proxy.password ?? ""
275009
+ });
275010
+ }, [open2, proxy]);
275011
+ const updateDraft = (patch2) => {
275012
+ setDraft((prev2) => ({ ...prev2, ...patch2 }));
275013
+ };
275014
+ const handleModeChange = (mode) => {
275015
+ if (!mode) return;
275016
+ updateDraft({ mode });
275017
+ };
275018
+ const handleSave = async () => {
275019
+ const trimStr = (value) => {
275020
+ const trimmed = value?.trim();
275021
+ return trimmed ? trimmed : void 0;
275022
+ };
275023
+ const next2 = {
275024
+ mode: draft.mode,
275025
+ httpProxy: trimStr(draft.httpProxy),
275026
+ httpsProxy: trimStr(draft.httpsProxy),
275027
+ noProxy: trimStr(draft.noProxy),
275028
+ username: trimStr(draft.username),
275029
+ password: trimStr(draft.password)
275030
+ };
275031
+ if (next2.mode === "manual") {
275032
+ if (!next2.httpProxy) {
275033
+ toast2.error(
275034
+ t2(
275035
+ "settings.proxy.validation.httpProxyRequired",
275036
+ "HTTP proxy URL is required in manual mode."
275037
+ )
275038
+ );
275039
+ return;
275040
+ }
275041
+ for (const [field, value] of [
275042
+ [t2("settings.proxy.httpProxy", "HTTP Proxy"), next2.httpProxy],
275043
+ [t2("settings.proxy.httpsProxy", "HTTPS proxy"), next2.httpsProxy]
275044
+ ]) {
275045
+ const v3 = value?.trim();
275046
+ if (v3 && !/^https?:\/\//i.test(v3) && !/^[^/]+:\d+$/i.test(v3)) {
275047
+ toast2.error(
275048
+ t2(
275049
+ "settings.proxy.validation.invalidProxyUrl",
275050
+ "{{field}} should start with http:// or https://, or use a host:port address (e.g. http://127.0.0.1:7890).",
275051
+ { field }
275052
+ )
275053
+ );
275054
+ return;
275055
+ }
275056
+ }
275057
+ }
275058
+ try {
275059
+ await request.updateSettings({ proxy: next2 });
275060
+ setProxy(next2);
275061
+ onOpenChange(false);
275062
+ if (isWebUI) {
275063
+ await alert({
275064
+ title: t2("settings.proxy.restartTitle", "Restart Required"),
275065
+ content: t2(
275066
+ "settings.proxy.restartManualDesc",
275067
+ "Proxy settings saved. Please manually restart the Fello server process to apply the new configuration."
275068
+ )
275069
+ });
275070
+ return;
275071
+ }
275072
+ const result = await confirm2({
275073
+ title: t2("settings.proxy.restartTitle", "Restart Required"),
275074
+ content: t2(
275075
+ "settings.proxy.restartDesc",
275076
+ "Proxy settings saved. Restart Fello to apply the new proxy configuration."
275077
+ ),
275078
+ buttons: [
275079
+ { text: t2("settings.proxy.later", "Later"), value: null, variant: "outline" },
275080
+ {
275081
+ text: t2("settings.proxy.restartNow", "Restart Now"),
275082
+ value: "confirm",
275083
+ variant: "default"
275084
+ }
275085
+ ]
275086
+ });
275087
+ if (result) {
275088
+ await electron.restartApp();
275089
+ }
275090
+ } catch (err) {
275091
+ toast2.error(
275092
+ extractErrorMessage(err) || t2("settings.proxy.saveFailed", "Failed to save proxy settings.")
275093
+ );
275094
+ }
275095
+ };
275096
+ const modeItems = [
275097
+ { value: "off", label: t2("settings.proxy.off", "Direct") },
275098
+ { value: "manual", label: t2("settings.proxy.manual", "Manual") },
275099
+ { value: "system", label: t2("settings.proxy.system", "System") }
275100
+ ];
275101
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, disablePointerDismissal: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-lg", children: [
275102
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: t2("settings.proxy.title", "Network Proxy") }) }),
275103
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4 mt-2", children: [
275104
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-4", children: [
275105
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { className: "gap-1", children: [
275106
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { className: "text-xs text-muted-foreground", children: t2("settings.proxy.mode", "Proxy Mode") }),
275107
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-[10px] text-muted-foreground/70", children: [
275108
+ draft.mode === "off" && t2("settings.proxy.offDesc", "Connect directly without a proxy"),
275109
+ draft.mode === "manual" && t2(
275110
+ "settings.proxy.manualDesc",
275111
+ "Specify a proxy server manually for all network requests"
275112
+ ),
275113
+ draft.mode === "system" && t2(
275114
+ "settings.proxy.systemDesc",
275115
+ "Use the system proxy settings (macOS/Windows or environment variables)"
275116
+ )
275117
+ ] })
275118
+ ] }),
275119
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: modeItems, value: draft.mode, onValueChange: handleModeChange, children: [
275120
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35 text-[11px]!", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Mode" }) }),
275121
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: modeItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
275122
+ ] })
275123
+ ] }),
275124
+ draft.mode === "manual" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
275125
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275126
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "proxy-http", className: "text-[11px] text-muted-foreground", children: t2("settings.proxy.httpProxy", "HTTP Proxy") }),
275127
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275128
+ Input,
275129
+ {
275130
+ id: "proxy-http",
275131
+ type: "text",
275132
+ value: draft.httpProxy ?? "",
275133
+ onChange: (e11) => updateDraft({ httpProxy: e11.target.value }),
275134
+ placeholder: t2(
275135
+ "settings.proxy.httpProxyPlaceholder",
275136
+ "e.g. http://127.0.0.1:7890"
275137
+ ),
275138
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
275139
+ }
275140
+ )
275141
+ ] }),
275142
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275143
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "proxy-https", className: "text-[11px] text-muted-foreground", children: t2("settings.proxy.httpsProxy", "HTTPS Proxy (optional)") }),
275144
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275145
+ Input,
275146
+ {
275147
+ id: "proxy-https",
275148
+ type: "text",
275149
+ value: draft.httpsProxy ?? "",
275150
+ onChange: (e11) => updateDraft({ httpsProxy: e11.target.value }),
275151
+ placeholder: t2(
275152
+ "settings.proxy.httpProxyPlaceholder",
275153
+ "e.g. http://127.0.0.1:7890"
275154
+ ),
275155
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
275156
+ }
275157
+ ),
275158
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[10px] text-muted-foreground/70", children: t2("settings.proxy.httpsProxyHint", "Falls back to the HTTP proxy when empty.") })
275159
+ ] }),
275160
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275161
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "proxy-no-proxy", className: "text-[11px] text-muted-foreground", children: t2("settings.proxy.noProxy", "No Proxy (optional)") }),
275162
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275163
+ Input,
275164
+ {
275165
+ id: "proxy-no-proxy",
275166
+ type: "text",
275167
+ value: draft.noProxy ?? "",
275168
+ onChange: (e11) => updateDraft({ noProxy: e11.target.value }),
275169
+ placeholder: t2(
275170
+ "settings.proxy.noProxyPlaceholder",
275171
+ "e.g. localhost,127.0.0.1,*.internal"
275172
+ ),
275173
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
275174
+ }
275175
+ )
275176
+ ] }),
275177
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
275178
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275179
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275180
+ FieldLabel,
275181
+ {
275182
+ htmlFor: "proxy-username",
275183
+ className: "text-[11px] text-muted-foreground",
275184
+ children: t2("settings.proxy.username", "Username (optional)")
275185
+ }
275186
+ ),
275187
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275188
+ Input,
275189
+ {
275190
+ id: "proxy-username",
275191
+ type: "text",
275192
+ value: draft.username ?? "",
275193
+ onChange: (e11) => updateDraft({ username: e11.target.value }),
275194
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
275195
+ }
275196
+ )
275197
+ ] }),
275198
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
275199
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275200
+ FieldLabel,
275201
+ {
275202
+ htmlFor: "proxy-password",
275203
+ className: "text-[11px] text-muted-foreground",
275204
+ children: t2("settings.proxy.password", "Password (optional)")
275205
+ }
275206
+ ),
275207
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275208
+ Input,
275209
+ {
275210
+ id: "proxy-password",
275211
+ type: "password",
275212
+ value: draft.password ?? "",
275213
+ onChange: (e11) => updateDraft({ password: e11.target.value }),
275214
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
275215
+ }
275216
+ )
275217
+ ] })
275218
+ ] })
275219
+ ] })
275220
+ ] }),
275221
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
275222
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
275223
+ Button,
275224
+ {
275225
+ type: "button",
275226
+ variant: "outline",
275227
+ size: "sm",
275228
+ onClick: () => onOpenChange(false),
275229
+ className: "h-7 text-xs",
275230
+ children: t2("settings.proxy.cancel", "Cancel")
275231
+ }
275232
+ ),
275233
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "button", size: "sm", className: "h-7 text-xs", onClick: handleSave, children: t2("settings.proxy.save", "Save") })
275234
+ ] })
275235
+ ] }) });
275236
+ }
274666
275237
  function asc(a2, b2) {
274667
275238
  return a2 - b2;
274668
275239
  }
@@ -275939,9 +276510,18 @@ function SettingsGeneral() {
275939
276510
  editor,
275940
276511
  setEditor,
275941
276512
  sound,
275942
- setSound
276513
+ setSound,
276514
+ proxy
275943
276515
  } = useAppStore();
275944
276516
  const { toast: toast2 } = useMessage();
276517
+ const [proxyDialogOpen, setProxyDialogOpen] = reactExports.useState(false);
276518
+ const proxySummary = (() => {
276519
+ const mode = proxy.mode ?? "off";
276520
+ if (mode === "off") return t2("settings.general.proxyOff", "Direct");
276521
+ if (mode === "system") return t2("settings.general.proxySystem", "System");
276522
+ const url = proxy.httpProxy || proxy.httpsProxy || "";
276523
+ return url ? url : t2("settings.proxy.manual", "Manual");
276524
+ })();
275945
276525
  const handleThemeChange = async (mode) => {
275946
276526
  if (!mode) return;
275947
276527
  const newTheme = { themeMode: mode };
@@ -275981,246 +276561,277 @@ function SettingsGeneral() {
275981
276561
  );
275982
276562
  }
275983
276563
  };
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" }),
276564
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 flex flex-col h-full", children: [
276565
+ /* @__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
276566
  /* @__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
- ] }) })
276567
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-medium", children: t2("settings.general.title", "General") }),
276568
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: t2("settings.general.desc", "Manage your application settings.") })
276057
276569
  ] }),
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
- );
276570
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
276571
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276572
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupAppearance", "Appearance") }),
276573
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
276574
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276575
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276576
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.theme") }),
276577
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.themeDesc", "Customize the appearance of the application") })
276578
+ ] }),
276579
+ (() => {
276580
+ const themeItems = [
276581
+ { value: "light", label: t2("settings.general.light") },
276582
+ { value: "dark", label: t2("settings.general.dark") },
276583
+ { value: "system", label: t2("settings.general.system") }
276584
+ ];
276585
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276586
+ Select,
276587
+ {
276588
+ items: themeItems,
276589
+ value: theme.themeMode,
276590
+ onValueChange: handleThemeChange,
276591
+ children: [
276592
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Theme" }) }),
276593
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: themeItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
276594
+ ]
276086
276595
  }
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: [
276596
+ );
276597
+ })()
276598
+ ] }),
276599
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276600
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276601
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.language") }),
276602
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.languageDesc", "Select the display language") })
276603
+ ] }),
276604
+ (() => {
276605
+ const languageItems = [
276606
+ { value: "en", label: t2("settings.general.english") },
276607
+ { value: "zh-CN", label: t2("settings.general.chinese") }
276608
+ ];
276609
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276610
+ Select,
276611
+ {
276612
+ items: languageItems,
276613
+ value: i18n.language,
276614
+ onValueChange: handleLanguageChange,
276615
+ children: [
276616
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Language" }) }),
276617
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: languageItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
276618
+ ]
276619
+ }
276620
+ );
276621
+ })()
276622
+ ] })
276623
+ ] })
276624
+ ] }),
276625
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276626
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276627
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupProject", "Project") }),
276628
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276107
276629
  /* @__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") }),
276630
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.autoWatchFiles") }),
276109
276631
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2(
276110
- "settings.general.soundEnabledDesc",
276111
- "Play sound effects for notifications"
276632
+ "settings.general.autoWatchFilesDesc",
276633
+ "Automatically watch project file changes"
276112
276634
  ) })
276113
276635
  ] }),
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
- ] }),
276636
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { checked: fileWatcher.enabled, onCheckedChange: handleFileWatcherChange })
276637
+ ] }) })
276638
+ ] }),
276639
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276640
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276641
+ /* @__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
276642
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276138
276643
  /* @__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") })
276644
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.proxy", "Network Proxy") }),
276645
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2(
276646
+ "settings.general.proxyDesc",
276647
+ "Configure the network proxy used by Fello for Node requests, subprocesses and the UI."
276648
+ ) })
276141
276649
  ] }),
276142
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
276143
- Slider,
276650
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
276651
+ Button,
276144
276652
  {
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
- }
276653
+ type: "button",
276654
+ variant: "outline",
276655
+ size: "sm",
276656
+ className: "h-7 w-35 shrink-0 text-xs text-muted-foreground hover:text-foreground",
276657
+ onClick: () => setProxyDialogOpen(true),
276658
+ title: t2("settings.general.proxyEdit", "Edit proxy settings"),
276659
+ children: [
276660
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: proxySummary }),
276661
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-3 shrink-0" })
276662
+ ]
276162
276663
  }
276163
- ) })
276164
- ] }),
276165
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276664
+ )
276665
+ ] })
276666
+ ] }),
276667
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276668
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276669
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupEditor", "Editor") }),
276670
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276166
276671
  /* @__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") })
276672
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.editor", "Open in Editor") }),
276673
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.editorDesc", "Choose the editor to open files") })
276169
276674
  ] }),
276170
276675
  (() => {
276171
- const themeItems = [
276172
- { value: "soft", label: t2("settings.general.soundSoft", "Soft") },
276173
- { value: "crisp", label: t2("settings.general.soundCrisp", "Crisp") }
276174
- ];
276676
+ const editorItems = Object.keys(EDITOR_LABELS).sort((a2, b2) => EDITOR_LABELS[a2].localeCompare(EDITOR_LABELS[b2])).map((value) => ({ value, label: EDITOR_LABELS[value] }));
276175
276677
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276176
276678
  Select,
276177
276679
  {
276178
- items: themeItems,
276179
- value: sound.theme,
276680
+ items: editorItems,
276681
+ value: editor.name,
276180
276682
  onValueChange: async (val) => {
276181
276683
  if (!val) return;
276182
- const newSound = { ...sound, theme: val };
276183
- setSound(newSound);
276184
- D$7(newSound.theme);
276684
+ const newEditor = { name: val };
276685
+ setEditor(newEditor);
276185
276686
  try {
276186
- await request.updateSettings({ sound: newSound });
276687
+ await request.updateSettings({ editor: newEditor });
276187
276688
  } catch {
276188
276689
  toast2.error(
276189
276690
  t2(
276190
- "settings.general.saveSoundFailed",
276191
- "Failed to save sound setting."
276691
+ "settings.general.saveEditorFailed",
276692
+ "Failed to save editor setting."
276192
276693
  )
276193
276694
  );
276194
276695
  }
276195
276696
  },
276196
276697
  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)) })
276698
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-44", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
276699
+ SelectValue,
276700
+ {
276701
+ placeholder: t2("settings.general.selectEditor", "Select editor")
276702
+ }
276703
+ ) }),
276704
+ /* @__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
276705
  ]
276200
276706
  }
276201
276707
  );
276202
276708
  })()
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") })
276709
+ ] }) })
276710
+ ] }),
276711
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }),
276712
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
276713
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-semibold text-muted-foreground/60 uppercase tracking-wider mb-3", children: t2("settings.general.groupSound", "Sound") }),
276714
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
276715
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276716
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276717
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundEnabled", "Sound Effects") }),
276718
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2(
276719
+ "settings.general.soundEnabledDesc",
276720
+ "Play sound effects for notifications"
276721
+ ) })
276722
+ ] }),
276723
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
276724
+ Switch,
276725
+ {
276726
+ checked: !sound.muted,
276727
+ onCheckedChange: async (checked) => {
276728
+ const newSound = { ...sound, muted: !checked };
276729
+ setSound(newSound);
276730
+ if (newSound.muted) {
276731
+ L$9();
276732
+ } else {
276733
+ N$6();
276734
+ }
276735
+ try {
276736
+ await request.updateSettings({ sound: newSound });
276737
+ } catch {
276738
+ toast2.error(
276739
+ t2("settings.general.saveSoundFailed", "Failed to save sound setting.")
276740
+ );
276741
+ }
276742
+ }
276743
+ }
276744
+ )
276208
276745
  ] }),
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
- )
276746
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276747
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276748
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundVolume", "Volume") }),
276749
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.soundVolumeDesc", "Adjust notification volume") })
276750
+ ] }),
276751
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
276752
+ Slider,
276753
+ {
276754
+ value: [sound.volume],
276755
+ min: 0,
276756
+ max: 100,
276757
+ step: 1,
276758
+ onValueChange: async (val) => {
276759
+ const vol = Array.isArray(val) ? val[0] : val;
276760
+ const newSound = { ...sound, volume: vol };
276761
+ setSound(newSound);
276762
+ _$9(vol / 100);
276763
+ try {
276764
+ await request.updateSettings({ sound: newSound });
276765
+ } catch {
276766
+ toast2.error(
276767
+ t2("settings.general.saveSoundFailed", "Failed to save sound setting.")
276768
+ );
276769
+ }
276770
+ }
276771
+ }
276772
+ ) })
276773
+ ] }),
276774
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276775
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276776
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundTheme", "Sound Style") }),
276777
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.soundThemeDesc", "Select the sound effect style") })
276778
+ ] }),
276779
+ (() => {
276780
+ const themeItems = [
276781
+ { value: "soft", label: t2("settings.general.soundSoft", "Soft") },
276782
+ { value: "crisp", label: t2("settings.general.soundCrisp", "Crisp") }
276783
+ ];
276784
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
276785
+ Select,
276786
+ {
276787
+ items: themeItems,
276788
+ value: sound.theme,
276789
+ onValueChange: async (val) => {
276790
+ if (!val) return;
276791
+ const newSound = { ...sound, theme: val };
276792
+ setSound(newSound);
276793
+ D$7(newSound.theme);
276794
+ try {
276795
+ await request.updateSettings({ sound: newSound });
276796
+ } catch {
276797
+ toast2.error(
276798
+ t2(
276799
+ "settings.general.saveSoundFailed",
276800
+ "Failed to save sound setting."
276801
+ )
276802
+ );
276803
+ }
276804
+ },
276805
+ children: [
276806
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { size: "sm", className: "w-35", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Theme" }) }),
276807
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: themeItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
276808
+ ]
276809
+ }
276810
+ );
276811
+ })()
276812
+ ] }),
276813
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
276814
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1.5", children: [
276815
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium leading-none", children: t2("settings.general.soundTest", "Test") }),
276816
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/90", children: t2("settings.general.soundTestDesc", "Preview the current sound effect") })
276817
+ ] }),
276818
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
276819
+ Button,
276820
+ {
276821
+ variant: "outline",
276822
+ size: "sm",
276823
+ className: "h-7 text-xs w-35 text-muted-foreground hover:text-foreground",
276824
+ onClick: () => w$6(),
276825
+ children: t2("settings.general.soundTestPlay", "Play")
276826
+ }
276827
+ )
276828
+ ] })
276219
276829
  ] })
276220
276830
  ] })
276221
276831
  ] })
276222
- ] })
276223
- ] }) }) });
276832
+ ] }) }),
276833
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsProxyDialog, { open: proxyDialogOpen, onOpenChange: setProxyDialogOpen })
276834
+ ] });
276224
276835
  }
276225
276836
  function useCombinedRefs() {
276226
276837
  for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {
@@ -282561,117 +283172,6 @@ function i2(i3, u4, l6) {
282561
283172
  }
282562
283173
  };
282563
283174
  }
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
283175
  function isValidStringMap$5(raw2) {
282676
283176
  const trimmed = raw2.trim();
282677
283177
  if (!trimmed) return true;
@@ -285342,6 +285842,29 @@ function SettingsMemory() {
285342
285842
  );
285343
285843
  }
285344
285844
  };
285845
+ const handleDeleteEntry = async (projectId, entryId) => {
285846
+ const result = await confirm2({
285847
+ title: t2("settings.memory.confirmDeleteTitle", "Delete Memory Entry"),
285848
+ content: t2(
285849
+ "settings.memory.confirmDeleteDesc",
285850
+ "Are you sure you want to delete this memory entry? This cannot be undone."
285851
+ ),
285852
+ buttons: [
285853
+ { text: t2("message.cancel", "Cancel"), value: null, variant: "outline" },
285854
+ { text: t2("settings.memory.delete", "Delete"), value: "confirm", variant: "destructive" }
285855
+ ]
285856
+ });
285857
+ if (!result) return;
285858
+ try {
285859
+ await request.deleteMemoryEntry({ projectId, entryId });
285860
+ await loadMemories();
285861
+ toast2.success(t2("settings.memory.deleted", "Memory entry deleted."));
285862
+ } catch (err) {
285863
+ toast2.error(
285864
+ extractErrorMessage(err) || t2("settings.memory.deleteFailed", "Failed to delete memory entry.")
285865
+ );
285866
+ }
285867
+ };
285345
285868
  const handleReveal = async (projectId) => {
285346
285869
  try {
285347
285870
  const filePath = await request.getMemorySystemFilePath({ projectId });
@@ -285434,33 +285957,49 @@ function SettingsMemory() {
285434
285957
  ")"
285435
285958
  ] })
285436
285959
  ] }),
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",
285960
+ /* @__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(
285961
+ "div",
285962
+ {
285963
+ className: "group flex items-start gap-3 px-4 py-2 text-xs",
285964
+ children: [
285965
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
285966
+ "div",
285454
285967
  {
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)) }) })
285968
+ className: `w-4 text-center shrink-0 font-mono font-medium ${weightColor(entry.weight)}`,
285969
+ "aria-label": weightLabel(entry.weight),
285970
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
285971
+ "+",
285972
+ entry.weight
285973
+ ] })
285974
+ }
285975
+ ),
285976
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
285977
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-foreground/80", children: entry.text }),
285978
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex mt-2 items-center gap-3", children: [
285979
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0 flex gap-1 flex-1", children: entry.tags.map((tag) => /* @__PURE__ */ jsxRuntimeExports.jsx(
285980
+ "span",
285981
+ {
285982
+ className: "px-1.5 py-0.5 rounded bg-muted text-[10px] text-muted-foreground",
285983
+ children: tag
285984
+ },
285985
+ tag
285986
+ )) }),
285987
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
285988
+ "button",
285989
+ {
285990
+ type: "button",
285991
+ className: "shrink-0 text-[10px] text-destructive/70 hover:text-destructive opacity-0 group-hover:opacity-100 transition-opacity focus-visible:opacity-100",
285992
+ onClick: () => handleDeleteEntry(pm2.projectId, entry.id),
285993
+ children: t2("settings.memory.delete", "Delete")
285994
+ }
285995
+ ),
285996
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0 text-muted-foreground/80 text-[10px]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: entry.date }) })
285997
+ ] })
285998
+ ] })
285999
+ ]
286000
+ },
286001
+ entry.id
286002
+ )) }) })
285464
286003
  ] }) })
285465
286004
  ] }, pm2.projectId))
285466
286005
  ] }) }) })
@@ -288533,7 +289072,7 @@ function AppRouter() {
288533
289072
  "div",
288534
289073
  {
288535
289074
  className: cn$8(
288536
- "flex h-12 w-12 fixed z-10 top-0 items-center justify-center transition-[left] duration-200",
289075
+ "flex h-12 w-12 absolute z-10 top-0 items-center justify-center transition-[left] duration-200",
288537
289076
  sidebarOpen ? "left-49" : showMacTrafficLightSpace ? "left-16" : "left-0"
288538
289077
  ),
288539
289078
  style: { WebkitAppRegion: "no-drag" },
@@ -288567,6 +289106,7 @@ function AppContent() {
288567
289106
  setEditor,
288568
289107
  setSnippets,
288569
289108
  setImageGeneration,
289109
+ setProxy,
288570
289110
  isMacApp,
288571
289111
  setIsFullScreen,
288572
289112
  setIlinkStatus,
@@ -288615,6 +289155,7 @@ function AppContent() {
288615
289155
  setI18n2(settings2.i18n);
288616
289156
  i18n.changeLanguage(settings2.i18n.language);
288617
289157
  }
289158
+ if (settings2.proxy) setProxy(settings2.proxy);
288618
289159
  if (settings2.editor) setEditor(settings2.editor);
288619
289160
  if (settings2.snippets) setSnippets(settings2.snippets);
288620
289161
  if (settings2.imageGeneration) setImageGeneration(settings2.imageGeneration);
@@ -288650,6 +289191,7 @@ function AppContent() {
288650
289191
  setEditor,
288651
289192
  setSnippets,
288652
289193
  setImageGeneration,
289194
+ setProxy,
288653
289195
  setIlinkStatus,
288654
289196
  setActiveIlinkSessionId
288655
289197
  ]);
@@ -288821,7 +289363,12 @@ function AppContent() {
288821
289363
  if (event.manual) {
288822
289364
  toast2.loading(t2("updater.checking", "Checking for updates..."), {
288823
289365
  id: UPDATE_TOAST_ID,
288824
- duration: Infinity
289366
+ duration: Infinity,
289367
+ action: void 0,
289368
+ cancel: {
289369
+ label: t2("updater.later", "Later"),
289370
+ onClick: () => toast2.dismiss(UPDATE_TOAST_ID)
289371
+ }
288825
289372
  });
288826
289373
  }
288827
289374
  break;
@@ -288855,7 +289402,9 @@ function AppContent() {
288855
289402
  if (event.manual) {
288856
289403
  toast2.success(t2("updater.upToDate", "Fello is up to date."), {
288857
289404
  id: UPDATE_TOAST_ID,
288858
- duration: 3e3
289405
+ duration: 3e3,
289406
+ action: void 0,
289407
+ cancel: void 0
288859
289408
  });
288860
289409
  }
288861
289410
  break;
@@ -288866,7 +289415,9 @@ function AppContent() {
288866
289415
  }),
288867
289416
  {
288868
289417
  id: UPDATE_TOAST_ID,
288869
- duration: Infinity
289418
+ duration: Infinity,
289419
+ action: void 0,
289420
+ cancel: void 0
288870
289421
  }
288871
289422
  );
288872
289423
  break;
@@ -288898,7 +289449,9 @@ function AppContent() {
288898
289449
  if (event.manual) {
288899
289450
  toast2.info(t2("updater.disabled", "Updates are available only in packaged builds."), {
288900
289451
  id: UPDATE_TOAST_ID,
288901
- duration: 4e3
289452
+ duration: 4e3,
289453
+ action: void 0,
289454
+ cancel: void 0
288902
289455
  });
288903
289456
  }
288904
289457
  break;
@@ -288906,7 +289459,9 @@ function AppContent() {
288906
289459
  if (event.manual) {
288907
289460
  toast2.error(event.message, {
288908
289461
  id: UPDATE_TOAST_ID,
288909
- duration: 5e3
289462
+ duration: 5e3,
289463
+ action: void 0,
289464
+ cancel: void 0
288910
289465
  });
288911
289466
  }
288912
289467
  break;