@zythum02/fello-server 0.1.55 → 0.1.57

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 (396) hide show
  1. package/out/renderer/assets/PopoverPopup-BcHY-oda.js +591 -0
  2. package/out/renderer/assets/PopoverPopup-BcHY-oda.js.br +0 -0
  3. package/out/renderer/assets/PopoverPopup-BcHY-oda.js.gz +0 -0
  4. package/out/renderer/assets/{_baseUniq-BdLqGxOi.js → _baseUniq-KD2XGr9F.js} +1 -1
  5. package/out/renderer/assets/_baseUniq-KD2XGr9F.js.br +0 -0
  6. package/out/renderer/assets/_baseUniq-KD2XGr9F.js.gz +0 -0
  7. package/out/renderer/assets/{arc-UpL8po5R.js → arc-CR7wDdln.js} +1 -1
  8. package/out/renderer/assets/arc-CR7wDdln.js.br +0 -0
  9. package/out/renderer/assets/arc-CR7wDdln.js.gz +0 -0
  10. package/out/renderer/assets/{architectureDiagram-Q4EWVU46-ManEkEbl.js → architectureDiagram-Q4EWVU46-ob7rXg_N.js} +6 -6
  11. package/out/renderer/assets/architectureDiagram-Q4EWVU46-ob7rXg_N.js.br +0 -0
  12. package/out/renderer/assets/architectureDiagram-Q4EWVU46-ob7rXg_N.js.gz +0 -0
  13. package/out/renderer/assets/{arrow-left-BnuWerui.js → arrow-left-Ck_ZVJr5.js} +1 -1
  14. package/out/renderer/assets/{arrow-up-quD46bYg.js → arrow-up-D7cOrlYE.js} +4 -15
  15. package/out/renderer/assets/{automation-cVl19jbl.js → automation-W30eYgU8.js} +36 -13
  16. package/out/renderer/assets/automation-W30eYgU8.js.br +0 -0
  17. package/out/renderer/assets/automation-W30eYgU8.js.gz +0 -0
  18. package/out/renderer/assets/{blockDiagram-DXYQGD6D-B7n8X8F6.js → blockDiagram-DXYQGD6D-DH0dgWHF.js} +7 -7
  19. package/out/renderer/assets/blockDiagram-DXYQGD6D-DH0dgWHF.js.br +0 -0
  20. package/out/renderer/assets/blockDiagram-DXYQGD6D-DH0dgWHF.js.gz +0 -0
  21. package/out/renderer/assets/{c4Diagram-AHTNJAMY-BoP_JNY0.js → c4Diagram-AHTNJAMY--55RlH_-.js} +3 -3
  22. package/out/renderer/assets/c4Diagram-AHTNJAMY--55RlH_-.js.br +0 -0
  23. package/out/renderer/assets/c4Diagram-AHTNJAMY--55RlH_-.js.gz +0 -0
  24. package/out/renderer/assets/{channel-BTAU8ahK.js → channel-Bz679Wzq.js} +1 -1
  25. package/out/renderer/assets/{chunk-4BX2VUAB-BCKz1EgZ.js → chunk-4BX2VUAB-0jn0O1rt.js} +1 -1
  26. package/out/renderer/assets/{chunk-4TB4RGXK-B2HhnMqB.js → chunk-4TB4RGXK-BI1TetiG.js} +5 -5
  27. package/out/renderer/assets/chunk-4TB4RGXK-BI1TetiG.js.br +0 -0
  28. package/out/renderer/assets/chunk-4TB4RGXK-BI1TetiG.js.gz +0 -0
  29. package/out/renderer/assets/{chunk-55IACEB6-Drurz_4k.js → chunk-55IACEB6-9LfmpuHC.js} +1 -1
  30. package/out/renderer/assets/{chunk-EDXVE4YY-Xfghcg7b.js → chunk-EDXVE4YY-CtHVLcvG.js} +1 -1
  31. package/out/renderer/assets/chunk-EDXVE4YY-CtHVLcvG.js.br +0 -0
  32. package/out/renderer/assets/chunk-EDXVE4YY-CtHVLcvG.js.gz +0 -0
  33. package/out/renderer/assets/{chunk-FMBD7UC4-Birgz8kz.js → chunk-FMBD7UC4-eUJaG2CL.js} +1 -1
  34. package/out/renderer/assets/{chunk-OYMX7WX6-Cv4jgShd.js → chunk-OYMX7WX6-D-sPmxYW.js} +3 -3
  35. package/out/renderer/assets/chunk-OYMX7WX6-D-sPmxYW.js.br +0 -0
  36. package/out/renderer/assets/chunk-OYMX7WX6-D-sPmxYW.js.gz +0 -0
  37. package/out/renderer/assets/{chunk-QZHKN3VN-DkqKjktH.js → chunk-QZHKN3VN-Pdv-mSqK.js} +1 -1
  38. package/out/renderer/assets/{chunk-YZCP3GAM-CJK_tBTq.js → chunk-YZCP3GAM-DLpllNY2.js} +1 -1
  39. package/out/renderer/assets/chunk-YZCP3GAM-DLpllNY2.js.br +0 -0
  40. package/out/renderer/assets/chunk-YZCP3GAM-DLpllNY2.js.gz +0 -0
  41. package/out/renderer/assets/{circle-x-C9_Yp0Tg.js → circle-x-Cs_T6g0B.js} +1 -1
  42. package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-Bf4To0VI.js → classDiagram-6PBFFD2Q-BQx6mUfF.js} +7 -7
  43. package/out/renderer/assets/{classDiagram-6PBFFD2Q-Bf4To0VI.js → classDiagram-v2-HSJHXN6E-BQx6mUfF.js} +7 -7
  44. package/out/renderer/assets/{clone-Ci5J50Pn.js → clone-DsYDv_WX.js} +1 -1
  45. package/out/renderer/assets/{code-editor-BwPwET3m.js → code-editor-Ce-8PAj3.js} +2 -2
  46. package/out/renderer/assets/code-editor-Ce-8PAj3.js.br +0 -0
  47. package/out/renderer/assets/code-editor-Ce-8PAj3.js.gz +0 -0
  48. package/out/renderer/assets/{collapsible-CMQ8h8ID.js → collapsible-CKgHeKAs.js} +1 -1
  49. package/out/renderer/assets/collapsible-CKgHeKAs.js.br +0 -0
  50. package/out/renderer/assets/collapsible-CKgHeKAs.js.gz +0 -0
  51. package/out/renderer/assets/{command-nKlwdb6i.js → command-Cgkdasyl.js} +1 -1
  52. package/out/renderer/assets/{cose-bilkent-S5V4N54A-BZpcn2q9.js → cose-bilkent-S5V4N54A-hNCr9Ibx.js} +2 -2
  53. package/out/renderer/assets/cose-bilkent-S5V4N54A-hNCr9Ibx.js.br +0 -0
  54. package/out/renderer/assets/cose-bilkent-S5V4N54A-hNCr9Ibx.js.gz +0 -0
  55. package/out/renderer/assets/{dagre-KV5264BT-onHZodsn.js → dagre-KV5264BT-CGyBht8M.js} +7 -7
  56. package/out/renderer/assets/dagre-KV5264BT-CGyBht8M.js.br +0 -0
  57. package/out/renderer/assets/dagre-KV5264BT-CGyBht8M.js.gz +0 -0
  58. package/out/renderer/assets/{diagram-5BDNPKRD-y3QVYwp7.js → diagram-5BDNPKRD-BiZfiCzA.js} +7 -7
  59. package/out/renderer/assets/diagram-5BDNPKRD-BiZfiCzA.js.br +0 -0
  60. package/out/renderer/assets/diagram-5BDNPKRD-BiZfiCzA.js.gz +0 -0
  61. package/out/renderer/assets/{diagram-G4DWMVQ6-LB3RUjrJ.js → diagram-G4DWMVQ6-CWj4c_xE.js} +7 -7
  62. package/out/renderer/assets/diagram-G4DWMVQ6-CWj4c_xE.js.br +0 -0
  63. package/out/renderer/assets/diagram-G4DWMVQ6-CWj4c_xE.js.gz +0 -0
  64. package/out/renderer/assets/{diagram-MMDJMWI5-7NpY26IL.js → diagram-MMDJMWI5-iBnXAZDJ.js} +6 -6
  65. package/out/renderer/assets/diagram-MMDJMWI5-iBnXAZDJ.js.br +0 -0
  66. package/out/renderer/assets/diagram-MMDJMWI5-iBnXAZDJ.js.gz +0 -0
  67. package/out/renderer/assets/{diagram-TYMM5635-DRM1RRr4.js → diagram-TYMM5635-C7IGtL42.js} +6 -6
  68. package/out/renderer/assets/diagram-TYMM5635-C7IGtL42.js.br +0 -0
  69. package/out/renderer/assets/diagram-TYMM5635-C7IGtL42.js.gz +0 -0
  70. package/out/renderer/assets/{ellipsis-D_eCkauJ.js → ellipsis-DSui0Rae.js} +1 -1
  71. package/out/renderer/assets/{erDiagram-SMLLAGMA-DNIZ639C.js → erDiagram-SMLLAGMA-ChPUl_x9.js} +5 -5
  72. package/out/renderer/assets/erDiagram-SMLLAGMA-ChPUl_x9.js.br +0 -0
  73. package/out/renderer/assets/erDiagram-SMLLAGMA-ChPUl_x9.js.gz +0 -0
  74. package/out/renderer/assets/external-link-CoW4VuI3.js +15 -0
  75. package/out/renderer/assets/{field-YZTi9Jxc.js → field-CXofwfDF.js} +1 -1
  76. package/out/renderer/assets/field-CXofwfDF.js.br +0 -0
  77. package/out/renderer/assets/field-CXofwfDF.js.gz +0 -0
  78. package/out/renderer/assets/{file-text-DDtS1g4Q.js → file-text-CwFSQGtt.js} +1 -1
  79. package/out/renderer/assets/{flowDiagram-DWJPFMVM-C0ghMibN.js → flowDiagram-DWJPFMVM-C5Zt4Sfn.js} +7 -7
  80. package/out/renderer/assets/flowDiagram-DWJPFMVM-C5Zt4Sfn.js.br +0 -0
  81. package/out/renderer/assets/flowDiagram-DWJPFMVM-C5Zt4Sfn.js.gz +0 -0
  82. package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-tqeHqMu4.js → ganttDiagram-T4ZO3ILL-Cp30RG1g.js} +3 -3
  83. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-Cp30RG1g.js.br +0 -0
  84. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-Cp30RG1g.js.gz +0 -0
  85. package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-D6acFhfE.js → gitGraphDiagram-UUTBAWPF-CkfzOUvM.js} +7 -7
  86. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-CkfzOUvM.js.br +0 -0
  87. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-CkfzOUvM.js.gz +0 -0
  88. package/out/renderer/assets/{graph-DqFGMaSz.js → graph-HfEt9-p2.js} +2 -2
  89. package/out/renderer/assets/graph-HfEt9-p2.js.br +0 -0
  90. package/out/renderer/assets/graph-HfEt9-p2.js.gz +0 -0
  91. package/out/renderer/assets/{highlighted-body-KPVGNVTW-D2IZ7Enb.js → highlighted-body-KPVGNVTW-CUokS6r6.js} +2 -2
  92. package/out/renderer/assets/index-Byirxhp5.css +382 -0
  93. package/out/renderer/assets/index-Byirxhp5.css.br +0 -0
  94. package/out/renderer/assets/index-Byirxhp5.css.gz +0 -0
  95. package/out/renderer/assets/{index-BeEZXfJZ.js → index-CKDwIiIb.js} +2277 -923
  96. package/out/renderer/assets/index-CKDwIiIb.js.br +0 -0
  97. package/out/renderer/assets/index-CKDwIiIb.js.gz +0 -0
  98. package/out/renderer/assets/{infoDiagram-42DDH7IO-BJeydI3V.js → infoDiagram-42DDH7IO-DbQvToBf.js} +5 -5
  99. package/out/renderer/assets/infoDiagram-42DDH7IO-DbQvToBf.js.br +0 -0
  100. package/out/renderer/assets/infoDiagram-42DDH7IO-DbQvToBf.js.gz +0 -0
  101. package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-DPgToD8D.js → ishikawaDiagram-UXIWVN3A-Crmx2UcL.js} +2 -2
  102. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-Crmx2UcL.js.br +0 -0
  103. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-Crmx2UcL.js.gz +0 -0
  104. package/out/renderer/assets/{item-SQsw2AyN.js → item-2gdt65LZ.js} +1 -1
  105. package/out/renderer/assets/item-2gdt65LZ.js.br +0 -0
  106. package/out/renderer/assets/item-2gdt65LZ.js.gz +0 -0
  107. package/out/renderer/assets/{journeyDiagram-VCZTEJTY-CAnZXd__.js → journeyDiagram-VCZTEJTY-BD3MzoDm.js} +5 -5
  108. package/out/renderer/assets/journeyDiagram-VCZTEJTY-BD3MzoDm.js.br +0 -0
  109. package/out/renderer/assets/journeyDiagram-VCZTEJTY-BD3MzoDm.js.gz +0 -0
  110. package/out/renderer/assets/{kanban-definition-6JOO6SKY-VCfgwCTi.js → kanban-definition-6JOO6SKY-DlPWdcq8.js} +3 -3
  111. package/out/renderer/assets/kanban-definition-6JOO6SKY-DlPWdcq8.js.br +0 -0
  112. package/out/renderer/assets/kanban-definition-6JOO6SKY-DlPWdcq8.js.gz +0 -0
  113. package/out/renderer/assets/keyboard-BmncEbVT.js +21 -0
  114. package/out/renderer/assets/{layout-lw2KhCMB.js → layout-OHsAY-70.js} +4 -4
  115. package/out/renderer/assets/layout-OHsAY-70.js.br +0 -0
  116. package/out/renderer/assets/layout-OHsAY-70.js.gz +0 -0
  117. package/out/renderer/assets/{linear-DmbMR7a-.js → linear-CnBTAk2r.js} +1 -1
  118. package/out/renderer/assets/linear-CnBTAk2r.js.br +0 -0
  119. package/out/renderer/assets/linear-CnBTAk2r.js.gz +0 -0
  120. package/out/renderer/assets/{link-2-CWpGKoWR.js → link-2-CABYiITN.js} +3 -15
  121. package/out/renderer/assets/{mermaid-HWGCJPDP-BufLuIVq.js → mermaid-HWGCJPDP-OB5tfzeR.js} +58 -54
  122. package/out/renderer/assets/mermaid-HWGCJPDP-OB5tfzeR.js.br +0 -0
  123. package/out/renderer/assets/mermaid-HWGCJPDP-OB5tfzeR.js.gz +0 -0
  124. package/out/renderer/assets/{mic-UZHvCQhw.js → mic-Bu7eaTKt.js} +1 -1
  125. package/out/renderer/assets/{min-BCqStlR1.js → min-lM3sC06g.js} +2 -2
  126. package/out/renderer/assets/min-lM3sC06g.js.br +0 -0
  127. package/out/renderer/assets/min-lM3sC06g.js.gz +0 -0
  128. package/out/renderer/assets/{mindmap-definition-QFDTVHPH-C0dBO3f9.js → mindmap-definition-QFDTVHPH-2KHTVjBe.js} +4 -4
  129. package/out/renderer/assets/mindmap-definition-QFDTVHPH-2KHTVjBe.js.br +0 -0
  130. package/out/renderer/assets/mindmap-definition-QFDTVHPH-2KHTVjBe.js.gz +0 -0
  131. package/out/renderer/assets/{open-guide-CWoE2W97.js → open-guide-CKryRC5n.js} +1 -1
  132. package/out/renderer/assets/{package-search-SZPcR_1L.js → package-search-DPG91yZB.js} +1 -1
  133. package/out/renderer/assets/{pieDiagram-DEJITSTG-Dv_tH6Z_.js → pieDiagram-DEJITSTG-CWRoGvfQ.js} +7 -7
  134. package/out/renderer/assets/pieDiagram-DEJITSTG-CWRoGvfQ.js.br +0 -0
  135. package/out/renderer/assets/pieDiagram-DEJITSTG-CWRoGvfQ.js.gz +0 -0
  136. package/out/renderer/assets/{plus-BZ0wwKkh.js → plus-CFoa8VhI.js} +1 -1
  137. package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-Cvsj5cyu.js → quadrantDiagram-34T5L4WZ-BJVP6FPm.js} +3 -3
  138. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-BJVP6FPm.js.br +0 -0
  139. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-BJVP6FPm.js.gz +0 -0
  140. package/out/renderer/assets/{requirementDiagram-MS252O5E-CxM7H308.js → requirementDiagram-MS252O5E-_MTj_l0V.js} +4 -4
  141. package/out/renderer/assets/requirementDiagram-MS252O5E-_MTj_l0V.js.br +0 -0
  142. package/out/renderer/assets/requirementDiagram-MS252O5E-_MTj_l0V.js.gz +0 -0
  143. package/out/renderer/assets/{resizable-DD8ADhVy.js → resizable-CcCcCDAN.js} +1 -1
  144. package/out/renderer/assets/resizable-CcCcCDAN.js.br +0 -0
  145. package/out/renderer/assets/resizable-CcCcCDAN.js.gz +0 -0
  146. package/out/renderer/assets/{sankeyDiagram-XADWPNL6-BGTOA6ee.js → sankeyDiagram-XADWPNL6-BWkr3adU.js} +2 -2
  147. package/out/renderer/assets/sankeyDiagram-XADWPNL6-BWkr3adU.js.br +0 -0
  148. package/out/renderer/assets/sankeyDiagram-XADWPNL6-BWkr3adU.js.gz +0 -0
  149. package/out/renderer/assets/{schedule-DMyyz9A1.js → schedule-H1BEvD9Q.js} +24 -11
  150. package/out/renderer/assets/schedule-H1BEvD9Q.js.br +0 -0
  151. package/out/renderer/assets/schedule-H1BEvD9Q.js.gz +0 -0
  152. package/out/renderer/assets/{search-XexOgLud.js → search-B3aFhEKs.js} +1 -1
  153. package/out/renderer/assets/{sequenceDiagram-FGHM5R23-DezlXo1X.js → sequenceDiagram-FGHM5R23-CfRs3_Dx.js} +4 -4
  154. package/out/renderer/assets/sequenceDiagram-FGHM5R23-CfRs3_Dx.js.br +0 -0
  155. package/out/renderer/assets/sequenceDiagram-FGHM5R23-CfRs3_Dx.js.gz +0 -0
  156. package/out/renderer/assets/{session-DQEqHTKb.js → session-D6NE3yNE.js} +2327 -2791
  157. package/out/renderer/assets/session-D6NE3yNE.js.br +0 -0
  158. package/out/renderer/assets/session-D6NE3yNE.js.gz +0 -0
  159. package/out/renderer/assets/setting-dialog-CANlzubW.js +5086 -0
  160. package/out/renderer/assets/setting-dialog-CANlzubW.js.br +0 -0
  161. package/out/renderer/assets/setting-dialog-CANlzubW.js.gz +0 -0
  162. package/out/renderer/assets/{settings-agents-f3HkdiTw.js → settings-agents-DxIwcY7M.js} +12 -12
  163. package/out/renderer/assets/settings-agents-DxIwcY7M.js.br +0 -0
  164. package/out/renderer/assets/settings-agents-DxIwcY7M.js.gz +0 -0
  165. package/out/renderer/assets/settings-general-B85uTAij.js +624 -0
  166. package/out/renderer/assets/settings-general-B85uTAij.js.br +0 -0
  167. package/out/renderer/assets/settings-general-B85uTAij.js.gz +0 -0
  168. package/out/renderer/assets/{settings-ilink-Da336Koc.js → settings-ilink-BgeA04Nv.js} +51 -20
  169. package/out/renderer/assets/settings-ilink-BgeA04Nv.js.br +0 -0
  170. package/out/renderer/assets/settings-ilink-BgeA04Nv.js.gz +0 -0
  171. package/out/renderer/assets/{settings-image-generation-RmWs73ZG.js → settings-image-generation-CsWv4wXY.js} +6 -6
  172. package/out/renderer/assets/settings-image-generation-CsWv4wXY.js.br +0 -0
  173. package/out/renderer/assets/settings-image-generation-CsWv4wXY.js.gz +0 -0
  174. package/out/renderer/assets/{settings-layout-DL6ZEzgP.js → settings-layout-DJbT4rIH.js} +32 -7
  175. package/out/renderer/assets/settings-layout-DJbT4rIH.js.br +0 -0
  176. package/out/renderer/assets/settings-layout-DJbT4rIH.js.gz +0 -0
  177. package/out/renderer/assets/{settings-mcp-BKW8JKtO.js → settings-mcp-Cz6GMogp.js} +97 -29
  178. package/out/renderer/assets/settings-mcp-Cz6GMogp.js.br +0 -0
  179. package/out/renderer/assets/settings-mcp-Cz6GMogp.js.gz +0 -0
  180. package/out/renderer/assets/{settings-memory-o4r-_vob.js → settings-memory-Cidr_Ghw.js} +2 -2
  181. package/out/renderer/assets/settings-memory-Cidr_Ghw.js.br +0 -0
  182. package/out/renderer/assets/settings-memory-Cidr_Ghw.js.gz +0 -0
  183. package/out/renderer/assets/settings-peripherals-DilwOpyO.js +269 -0
  184. package/out/renderer/assets/settings-peripherals-DilwOpyO.js.br +0 -0
  185. package/out/renderer/assets/settings-peripherals-DilwOpyO.js.gz +0 -0
  186. package/out/renderer/assets/{settings-shortcuts-BmUGS1q_.js → settings-shortcuts-dWdRCFxB.js} +16 -6
  187. package/out/renderer/assets/settings-shortcuts-dWdRCFxB.js.br +0 -0
  188. package/out/renderer/assets/settings-shortcuts-dWdRCFxB.js.gz +0 -0
  189. package/out/renderer/assets/{settings-snippets-CpAOJmDF.js → settings-snippets-CrtJYwLV.js} +9 -9
  190. package/out/renderer/assets/settings-snippets-CrtJYwLV.js.br +0 -0
  191. package/out/renderer/assets/settings-snippets-CrtJYwLV.js.gz +0 -0
  192. package/out/renderer/assets/settings-speech-CteE8F4J.js +1369 -0
  193. package/out/renderer/assets/settings-speech-CteE8F4J.js.br +0 -0
  194. package/out/renderer/assets/settings-speech-CteE8F4J.js.gz +0 -0
  195. package/out/renderer/assets/{settings-webui-DIEKvTrI.js → settings-webui-DKiOzDSD.js} +3 -3
  196. package/out/renderer/assets/settings-webui-DKiOzDSD.js.br +0 -0
  197. package/out/renderer/assets/settings-webui-DKiOzDSD.js.gz +0 -0
  198. package/out/renderer/assets/{skills-installed-BuWBDk6r.js → skills-installed-Beqe9G7p.js} +4 -4
  199. package/out/renderer/assets/skills-installed-Beqe9G7p.js.br +0 -0
  200. package/out/renderer/assets/skills-installed-Beqe9G7p.js.gz +0 -0
  201. package/out/renderer/assets/{skills-layout-ByPhfHG6.js → skills-layout-BAzfcnkT.js} +2 -2
  202. package/out/renderer/assets/skills-layout-BAzfcnkT.js.br +0 -0
  203. package/out/renderer/assets/skills-layout-BAzfcnkT.js.gz +0 -0
  204. package/out/renderer/assets/{skills-skills-sh-wR7YNmAJ.js → skills-skills-sh-Dzocqfu4.js} +4 -4
  205. package/out/renderer/assets/skills-skills-sh-Dzocqfu4.js.br +0 -0
  206. package/out/renderer/assets/skills-skills-sh-Dzocqfu4.js.gz +0 -0
  207. package/out/renderer/assets/{settings-general-BcCOVmx3.js → slider-DEK94SlL.js} +4 -623
  208. package/out/renderer/assets/slider-DEK94SlL.js.br +0 -0
  209. package/out/renderer/assets/slider-DEK94SlL.js.gz +0 -0
  210. package/out/renderer/assets/{sortable.esm-BWvT9HIK.js → sortable.esm-Cm4rqFU7.js} +1 -1
  211. package/out/renderer/assets/sortable.esm-Cm4rqFU7.js.br +0 -0
  212. package/out/renderer/assets/sortable.esm-Cm4rqFU7.js.gz +0 -0
  213. package/out/renderer/assets/{standard-schema-BkTVIf7N.js → standard-schema-B43ZsT5c.js} +52 -1
  214. package/out/renderer/assets/standard-schema-B43ZsT5c.js.br +0 -0
  215. package/out/renderer/assets/standard-schema-B43ZsT5c.js.gz +0 -0
  216. package/out/renderer/assets/{stateDiagram-FHFEXIEX-xdKKCs-p.js → stateDiagram-FHFEXIEX-CaiRC_NA.js} +9 -9
  217. package/out/renderer/assets/stateDiagram-FHFEXIEX-CaiRC_NA.js.br +0 -0
  218. package/out/renderer/assets/stateDiagram-FHFEXIEX-CaiRC_NA.js.gz +0 -0
  219. package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-BaaiQ6Kr.js → stateDiagram-v2-QKLJ7IA2-EA3ViVW-.js} +5 -5
  220. package/out/renderer/assets/{task-PHAOSE-W.js → task-DM-bWOFz.js} +13 -11
  221. package/out/renderer/assets/task-DM-bWOFz.js.br +0 -0
  222. package/out/renderer/assets/task-DM-bWOFz.js.gz +0 -0
  223. package/out/renderer/assets/{textarea-1ZWl3C-x.js → textarea-B0OAhnF7.js} +1 -1
  224. package/out/renderer/assets/{timeline-definition-GMOUNBTQ-DFLeLybV.js → timeline-definition-GMOUNBTQ-D-M9BAZz.js} +3 -3
  225. package/out/renderer/assets/timeline-definition-GMOUNBTQ-D-M9BAZz.js.br +0 -0
  226. package/out/renderer/assets/timeline-definition-GMOUNBTQ-D-M9BAZz.js.gz +0 -0
  227. package/out/renderer/assets/{vennDiagram-DHZGUBPP-PKmZLY7H.js → vennDiagram-DHZGUBPP-B_yjg_0U.js} +2 -2
  228. package/out/renderer/assets/vennDiagram-DHZGUBPP-B_yjg_0U.js.br +0 -0
  229. package/out/renderer/assets/vennDiagram-DHZGUBPP-B_yjg_0U.js.gz +0 -0
  230. package/out/renderer/assets/{wardley-RL74JXVD-BCH2vKnv.js → wardley-RL74JXVD-2Xd7XlwA.js} +4 -4
  231. package/out/renderer/assets/wardley-RL74JXVD-2Xd7XlwA.js.br +0 -0
  232. package/out/renderer/assets/wardley-RL74JXVD-2Xd7XlwA.js.gz +0 -0
  233. package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-Bkd3xMno.js → wardleyDiagram-NUSXRM2D-BA9tzMk-.js} +6 -6
  234. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-BA9tzMk-.js.br +0 -0
  235. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-BA9tzMk-.js.gz +0 -0
  236. package/out/renderer/assets/{wrench-8H0LZ83G.js → wrench-QfEqqx9F.js} +1 -1
  237. package/out/renderer/assets/wrench-QfEqqx9F.js.br +0 -0
  238. package/out/renderer/assets/wrench-QfEqqx9F.js.gz +0 -0
  239. package/out/renderer/assets/{xlsx-view-BYx5Ha2P.js → xlsx-view-Bov2NXsI.js} +141 -79
  240. package/out/renderer/assets/xlsx-view-Bov2NXsI.js.br +0 -0
  241. package/out/renderer/assets/xlsx-view-Bov2NXsI.js.gz +0 -0
  242. package/out/renderer/assets/{xychartDiagram-5P7HB3ND-DCOm4uPr.js → xychartDiagram-5P7HB3ND-svs-11is.js} +3 -3
  243. package/out/renderer/assets/xychartDiagram-5P7HB3ND-svs-11is.js.br +0 -0
  244. package/out/renderer/assets/xychartDiagram-5P7HB3ND-svs-11is.js.gz +0 -0
  245. package/out/renderer/index.html +2 -2
  246. package/out/renderer/index.html.br +0 -0
  247. package/out/renderer/index.html.gz +0 -0
  248. package/out/scripts/mcp-toolbox/server.mjs +80 -1
  249. package/out/server/main.js +1576 -353
  250. package/package.json +3 -2
  251. package/out/renderer/assets/_baseUniq-BdLqGxOi.js.br +0 -0
  252. package/out/renderer/assets/_baseUniq-BdLqGxOi.js.gz +0 -0
  253. package/out/renderer/assets/arc-UpL8po5R.js.br +0 -0
  254. package/out/renderer/assets/arc-UpL8po5R.js.gz +0 -0
  255. package/out/renderer/assets/architectureDiagram-Q4EWVU46-ManEkEbl.js.br +0 -0
  256. package/out/renderer/assets/architectureDiagram-Q4EWVU46-ManEkEbl.js.gz +0 -0
  257. package/out/renderer/assets/automation-cVl19jbl.js.br +0 -0
  258. package/out/renderer/assets/automation-cVl19jbl.js.gz +0 -0
  259. package/out/renderer/assets/blockDiagram-DXYQGD6D-B7n8X8F6.js.br +0 -0
  260. package/out/renderer/assets/blockDiagram-DXYQGD6D-B7n8X8F6.js.gz +0 -0
  261. package/out/renderer/assets/c4Diagram-AHTNJAMY-BoP_JNY0.js.br +0 -0
  262. package/out/renderer/assets/c4Diagram-AHTNJAMY-BoP_JNY0.js.gz +0 -0
  263. package/out/renderer/assets/chunk-4TB4RGXK-B2HhnMqB.js.br +0 -0
  264. package/out/renderer/assets/chunk-4TB4RGXK-B2HhnMqB.js.gz +0 -0
  265. package/out/renderer/assets/chunk-EDXVE4YY-Xfghcg7b.js.br +0 -0
  266. package/out/renderer/assets/chunk-EDXVE4YY-Xfghcg7b.js.gz +0 -0
  267. package/out/renderer/assets/chunk-OYMX7WX6-Cv4jgShd.js.br +0 -0
  268. package/out/renderer/assets/chunk-OYMX7WX6-Cv4jgShd.js.gz +0 -0
  269. package/out/renderer/assets/chunk-YZCP3GAM-CJK_tBTq.js.br +0 -0
  270. package/out/renderer/assets/chunk-YZCP3GAM-CJK_tBTq.js.gz +0 -0
  271. package/out/renderer/assets/code-editor-BwPwET3m.js.br +0 -0
  272. package/out/renderer/assets/code-editor-BwPwET3m.js.gz +0 -0
  273. package/out/renderer/assets/collapsible-CMQ8h8ID.js.br +0 -0
  274. package/out/renderer/assets/collapsible-CMQ8h8ID.js.gz +0 -0
  275. package/out/renderer/assets/cose-bilkent-S5V4N54A-BZpcn2q9.js.br +0 -0
  276. package/out/renderer/assets/cose-bilkent-S5V4N54A-BZpcn2q9.js.gz +0 -0
  277. package/out/renderer/assets/dagre-KV5264BT-onHZodsn.js.br +0 -0
  278. package/out/renderer/assets/dagre-KV5264BT-onHZodsn.js.gz +0 -0
  279. package/out/renderer/assets/diagram-5BDNPKRD-y3QVYwp7.js.br +0 -0
  280. package/out/renderer/assets/diagram-5BDNPKRD-y3QVYwp7.js.gz +0 -0
  281. package/out/renderer/assets/diagram-G4DWMVQ6-LB3RUjrJ.js.br +0 -0
  282. package/out/renderer/assets/diagram-G4DWMVQ6-LB3RUjrJ.js.gz +0 -0
  283. package/out/renderer/assets/diagram-MMDJMWI5-7NpY26IL.js.br +0 -0
  284. package/out/renderer/assets/diagram-MMDJMWI5-7NpY26IL.js.gz +0 -0
  285. package/out/renderer/assets/diagram-TYMM5635-DRM1RRr4.js.br +0 -0
  286. package/out/renderer/assets/diagram-TYMM5635-DRM1RRr4.js.gz +0 -0
  287. package/out/renderer/assets/erDiagram-SMLLAGMA-DNIZ639C.js.br +0 -0
  288. package/out/renderer/assets/erDiagram-SMLLAGMA-DNIZ639C.js.gz +0 -0
  289. package/out/renderer/assets/field-YZTi9Jxc.js.br +0 -0
  290. package/out/renderer/assets/field-YZTi9Jxc.js.gz +0 -0
  291. package/out/renderer/assets/flowDiagram-DWJPFMVM-C0ghMibN.js.br +0 -0
  292. package/out/renderer/assets/flowDiagram-DWJPFMVM-C0ghMibN.js.gz +0 -0
  293. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-tqeHqMu4.js.br +0 -0
  294. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-tqeHqMu4.js.gz +0 -0
  295. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-D6acFhfE.js.br +0 -0
  296. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-D6acFhfE.js.gz +0 -0
  297. package/out/renderer/assets/graph-DqFGMaSz.js.br +0 -0
  298. package/out/renderer/assets/graph-DqFGMaSz.js.gz +0 -0
  299. package/out/renderer/assets/index-BZTYKZe8.css +0 -382
  300. package/out/renderer/assets/index-BZTYKZe8.css.br +0 -0
  301. package/out/renderer/assets/index-BZTYKZe8.css.gz +0 -0
  302. package/out/renderer/assets/index-BeEZXfJZ.js.br +0 -0
  303. package/out/renderer/assets/index-BeEZXfJZ.js.gz +0 -0
  304. package/out/renderer/assets/infoDiagram-42DDH7IO-BJeydI3V.js.br +0 -0
  305. package/out/renderer/assets/infoDiagram-42DDH7IO-BJeydI3V.js.gz +0 -0
  306. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-DPgToD8D.js.br +0 -0
  307. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-DPgToD8D.js.gz +0 -0
  308. package/out/renderer/assets/item-SQsw2AyN.js.br +0 -0
  309. package/out/renderer/assets/item-SQsw2AyN.js.gz +0 -0
  310. package/out/renderer/assets/journeyDiagram-VCZTEJTY-CAnZXd__.js.br +0 -0
  311. package/out/renderer/assets/journeyDiagram-VCZTEJTY-CAnZXd__.js.gz +0 -0
  312. package/out/renderer/assets/kanban-definition-6JOO6SKY-VCfgwCTi.js.br +0 -0
  313. package/out/renderer/assets/kanban-definition-6JOO6SKY-VCfgwCTi.js.gz +0 -0
  314. package/out/renderer/assets/layout-lw2KhCMB.js.br +0 -0
  315. package/out/renderer/assets/layout-lw2KhCMB.js.gz +0 -0
  316. package/out/renderer/assets/linear-DmbMR7a-.js.br +0 -0
  317. package/out/renderer/assets/linear-DmbMR7a-.js.gz +0 -0
  318. package/out/renderer/assets/link-2-CWpGKoWR.js.br +0 -0
  319. package/out/renderer/assets/link-2-CWpGKoWR.js.gz +0 -0
  320. package/out/renderer/assets/mermaid-HWGCJPDP-BufLuIVq.js.br +0 -0
  321. package/out/renderer/assets/mermaid-HWGCJPDP-BufLuIVq.js.gz +0 -0
  322. package/out/renderer/assets/min-BCqStlR1.js.br +0 -0
  323. package/out/renderer/assets/min-BCqStlR1.js.gz +0 -0
  324. package/out/renderer/assets/mindmap-definition-QFDTVHPH-C0dBO3f9.js.br +0 -0
  325. package/out/renderer/assets/mindmap-definition-QFDTVHPH-C0dBO3f9.js.gz +0 -0
  326. package/out/renderer/assets/pieDiagram-DEJITSTG-Dv_tH6Z_.js.br +0 -0
  327. package/out/renderer/assets/pieDiagram-DEJITSTG-Dv_tH6Z_.js.gz +0 -0
  328. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-Cvsj5cyu.js.br +0 -0
  329. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-Cvsj5cyu.js.gz +0 -0
  330. package/out/renderer/assets/requirementDiagram-MS252O5E-CxM7H308.js.br +0 -0
  331. package/out/renderer/assets/requirementDiagram-MS252O5E-CxM7H308.js.gz +0 -0
  332. package/out/renderer/assets/resizable-DD8ADhVy.js.br +0 -0
  333. package/out/renderer/assets/resizable-DD8ADhVy.js.gz +0 -0
  334. package/out/renderer/assets/sankeyDiagram-XADWPNL6-BGTOA6ee.js.br +0 -0
  335. package/out/renderer/assets/sankeyDiagram-XADWPNL6-BGTOA6ee.js.gz +0 -0
  336. package/out/renderer/assets/schedule-DMyyz9A1.js.br +0 -0
  337. package/out/renderer/assets/schedule-DMyyz9A1.js.gz +0 -0
  338. package/out/renderer/assets/sequenceDiagram-FGHM5R23-DezlXo1X.js.br +0 -0
  339. package/out/renderer/assets/sequenceDiagram-FGHM5R23-DezlXo1X.js.gz +0 -0
  340. package/out/renderer/assets/session-DQEqHTKb.js.br +0 -0
  341. package/out/renderer/assets/session-DQEqHTKb.js.gz +0 -0
  342. package/out/renderer/assets/setting-dialog-BdiZbd8J.js +0 -642
  343. package/out/renderer/assets/setting-dialog-BdiZbd8J.js.br +0 -0
  344. package/out/renderer/assets/setting-dialog-BdiZbd8J.js.gz +0 -0
  345. package/out/renderer/assets/settings-2-q22Cv4G7.js +0 -16
  346. package/out/renderer/assets/settings-agents-f3HkdiTw.js.br +0 -0
  347. package/out/renderer/assets/settings-agents-f3HkdiTw.js.gz +0 -0
  348. package/out/renderer/assets/settings-general-BcCOVmx3.js.br +0 -0
  349. package/out/renderer/assets/settings-general-BcCOVmx3.js.gz +0 -0
  350. package/out/renderer/assets/settings-ilink-Da336Koc.js.br +0 -0
  351. package/out/renderer/assets/settings-ilink-Da336Koc.js.gz +0 -0
  352. package/out/renderer/assets/settings-image-generation-RmWs73ZG.js.br +0 -0
  353. package/out/renderer/assets/settings-image-generation-RmWs73ZG.js.gz +0 -0
  354. package/out/renderer/assets/settings-layout-DL6ZEzgP.js.br +0 -0
  355. package/out/renderer/assets/settings-layout-DL6ZEzgP.js.gz +0 -0
  356. package/out/renderer/assets/settings-mcp-BKW8JKtO.js.br +0 -0
  357. package/out/renderer/assets/settings-mcp-BKW8JKtO.js.gz +0 -0
  358. package/out/renderer/assets/settings-memory-o4r-_vob.js.br +0 -0
  359. package/out/renderer/assets/settings-memory-o4r-_vob.js.gz +0 -0
  360. package/out/renderer/assets/settings-shortcuts-BmUGS1q_.js.br +0 -0
  361. package/out/renderer/assets/settings-shortcuts-BmUGS1q_.js.gz +0 -0
  362. package/out/renderer/assets/settings-snippets-CpAOJmDF.js.br +0 -0
  363. package/out/renderer/assets/settings-snippets-CpAOJmDF.js.gz +0 -0
  364. package/out/renderer/assets/settings-speech-to-text-C8KHNGE4.js +0 -1054
  365. package/out/renderer/assets/settings-speech-to-text-C8KHNGE4.js.br +0 -0
  366. package/out/renderer/assets/settings-speech-to-text-C8KHNGE4.js.gz +0 -0
  367. package/out/renderer/assets/settings-webui-DIEKvTrI.js.br +0 -0
  368. package/out/renderer/assets/settings-webui-DIEKvTrI.js.gz +0 -0
  369. package/out/renderer/assets/skills-installed-BuWBDk6r.js.br +0 -0
  370. package/out/renderer/assets/skills-installed-BuWBDk6r.js.gz +0 -0
  371. package/out/renderer/assets/skills-layout-ByPhfHG6.js.br +0 -0
  372. package/out/renderer/assets/skills-layout-ByPhfHG6.js.gz +0 -0
  373. package/out/renderer/assets/skills-skills-sh-wR7YNmAJ.js.br +0 -0
  374. package/out/renderer/assets/skills-skills-sh-wR7YNmAJ.js.gz +0 -0
  375. package/out/renderer/assets/sortable.esm-BWvT9HIK.js.br +0 -0
  376. package/out/renderer/assets/sortable.esm-BWvT9HIK.js.gz +0 -0
  377. package/out/renderer/assets/standard-schema-BkTVIf7N.js.br +0 -0
  378. package/out/renderer/assets/standard-schema-BkTVIf7N.js.gz +0 -0
  379. package/out/renderer/assets/stateDiagram-FHFEXIEX-xdKKCs-p.js.br +0 -0
  380. package/out/renderer/assets/stateDiagram-FHFEXIEX-xdKKCs-p.js.gz +0 -0
  381. package/out/renderer/assets/task-PHAOSE-W.js.br +0 -0
  382. package/out/renderer/assets/task-PHAOSE-W.js.gz +0 -0
  383. package/out/renderer/assets/timeline-definition-GMOUNBTQ-DFLeLybV.js.br +0 -0
  384. package/out/renderer/assets/timeline-definition-GMOUNBTQ-DFLeLybV.js.gz +0 -0
  385. package/out/renderer/assets/vennDiagram-DHZGUBPP-PKmZLY7H.js.br +0 -0
  386. package/out/renderer/assets/vennDiagram-DHZGUBPP-PKmZLY7H.js.gz +0 -0
  387. package/out/renderer/assets/wardley-RL74JXVD-BCH2vKnv.js.br +0 -0
  388. package/out/renderer/assets/wardley-RL74JXVD-BCH2vKnv.js.gz +0 -0
  389. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-Bkd3xMno.js.br +0 -0
  390. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-Bkd3xMno.js.gz +0 -0
  391. package/out/renderer/assets/wrench-8H0LZ83G.js.br +0 -0
  392. package/out/renderer/assets/wrench-8H0LZ83G.js.gz +0 -0
  393. package/out/renderer/assets/xlsx-view-BYx5Ha2P.js.br +0 -0
  394. package/out/renderer/assets/xlsx-view-BYx5Ha2P.js.gz +0 -0
  395. package/out/renderer/assets/xychartDiagram-5P7HB3ND-DCOm4uPr.js.br +0 -0
  396. package/out/renderer/assets/xychartDiagram-5P7HB3ND-DCOm4uPr.js.gz +0 -0
@@ -0,0 +1,1369 @@
1
+ import { u as useTranslation, j as jsxRuntimeExports, I as Input, v as Select, w as SelectTrigger, x as SelectValue, y as SelectContent, z as SelectItem, r as reactExports, a as useAppStore, b as useMessage, B as Button, S as ScrollArea, k as ContextMenu, l as ContextMenuTrigger, d as Switch, m as ContextMenuContent, n as ContextMenuItem, P as Pencil, o as ContextMenuSeparator, T as Trash, D as Dialog, p as DialogContent, q as DialogHeader, s as DialogTitle, t as DialogDescription, H as DialogFooter, f as request, g as extractErrorMessage, J as generateUUID } from "./index-CKDwIiIb.js";
2
+ import { B as BookOpen, o as openGuide } from "./open-guide-CKryRC5n.js";
3
+ import { a as useFormContext, C as Controller, u as useForm, i, F as FormProvider } from "./standard-schema-B43ZsT5c.js";
4
+ import { a as Field, b as FieldLabel, c as FieldError, F as FieldGroup } from "./field-CXofwfDF.js";
5
+ import { o as object, _ as _enum, s as string, b as boolean } from "./schemas-BL-_QQNp.js";
6
+ import { P as Plus } from "./plus-CFoa8VhI.js";
7
+ const DASHSCOPE_ASR_MODEL = "fun-asr-flash-8k-realtime";
8
+ const OPENAI_ASR_MODEL = "gpt-4o-transcribe";
9
+ const DEFAULT_ASR_MODELS = {
10
+ dashscope: DASHSCOPE_ASR_MODEL,
11
+ openai: OPENAI_ASR_MODEL
12
+ };
13
+ function effectiveAsrModel(provider) {
14
+ return provider.asrModel?.trim() || DEFAULT_ASR_MODELS[provider.provider];
15
+ }
16
+ const DASHSCOPE_TTS_VOICE = "longanhuan_v3.6";
17
+ const OPENAI_TTS_VOICE = "coral";
18
+ const IFLYTEK_TTS_VCN = "x5_lingxiaoxuan_flow";
19
+ const VOLC_TTS_VOICE = "zh_female_vv_uranus_bigtts";
20
+ const DEFAULT_TTS_VOICES = {
21
+ dashscope: DASHSCOPE_TTS_VOICE,
22
+ openai: OPENAI_TTS_VOICE,
23
+ iflytek: IFLYTEK_TTS_VCN,
24
+ volcengine: VOLC_TTS_VOICE
25
+ };
26
+ function effectiveTtsVoice(provider) {
27
+ return provider.voice?.trim() || DEFAULT_TTS_VOICES[provider.provider];
28
+ }
29
+ const speechProviderValues = ["dashscope", "volcengine", "openai", "iflytek"];
30
+ const speechRegionValues = ["", "cn-beijing", "ap-southeast-1"];
31
+ const nameField = string().trim().min(1, "settings.speech.validation.enterName");
32
+ const providerField = _enum(speechProviderValues, "settings.speech.validation.selectProvider");
33
+ const speechDashscopeSchema = object({
34
+ name: nameField,
35
+ provider: providerField,
36
+ apiKey: string().trim().min(1, "settings.speech.validation.enterApiKey"),
37
+ workspaceId: string(),
38
+ region: _enum(speechRegionValues),
39
+ workspace: string(),
40
+ language: string(),
41
+ asrEnabled: boolean(),
42
+ asrModel: string(),
43
+ ttsEnabled: boolean(),
44
+ voice: string(),
45
+ ttsModel: string()
46
+ });
47
+ function speechDashscopeDefaultValues() {
48
+ return {
49
+ name: "",
50
+ provider: "dashscope",
51
+ apiKey: "",
52
+ workspaceId: "",
53
+ region: "",
54
+ workspace: "",
55
+ language: "",
56
+ asrEnabled: false,
57
+ asrModel: "",
58
+ ttsEnabled: false,
59
+ voice: "",
60
+ ttsModel: ""
61
+ };
62
+ }
63
+ function speechDashscopeFromProvider(provider) {
64
+ return {
65
+ name: provider?.name ?? "",
66
+ provider: "dashscope",
67
+ apiKey: provider?.apiKey ?? "",
68
+ workspaceId: provider?.workspaceId ?? "",
69
+ region: provider?.region ?? "",
70
+ workspace: provider?.workspace ?? "",
71
+ language: provider?.language ?? "",
72
+ asrEnabled: provider?.asrEnabled ?? false,
73
+ asrModel: provider?.asrModel ?? "",
74
+ ttsEnabled: provider?.ttsEnabled ?? false,
75
+ voice: provider?.voice ?? "",
76
+ ttsModel: provider?.ttsModel ?? ""
77
+ };
78
+ }
79
+ function speechDashscopeToDraft(values) {
80
+ return {
81
+ name: values.name.trim(),
82
+ provider: "dashscope",
83
+ apiKey: values.apiKey.trim(),
84
+ workspaceId: values.workspaceId.trim() || void 0,
85
+ region: values.region || void 0,
86
+ workspace: values.workspace.trim() || void 0,
87
+ language: values.language.trim() || void 0,
88
+ asrEnabled: values.asrEnabled,
89
+ asrModel: values.asrModel.trim() || void 0,
90
+ ttsEnabled: values.ttsEnabled,
91
+ voice: values.voice.trim() || void 0,
92
+ ttsModel: values.ttsModel.trim() || void 0
93
+ };
94
+ }
95
+ const speechVolcengineSchema = object({
96
+ name: nameField,
97
+ provider: providerField,
98
+ apiKey: string().trim().min(1, "settings.speech.validation.enterApiKey"),
99
+ appId: string(),
100
+ baseUrl: string(),
101
+ language: string(),
102
+ asrEnabled: boolean(),
103
+ asrResourceId: string(),
104
+ ttsEnabled: boolean(),
105
+ voice: string()
106
+ });
107
+ function speechVolcengineDefaultValues() {
108
+ return {
109
+ name: "",
110
+ provider: "volcengine",
111
+ apiKey: "",
112
+ appId: "",
113
+ baseUrl: "",
114
+ language: "",
115
+ asrEnabled: false,
116
+ asrResourceId: "",
117
+ ttsEnabled: false,
118
+ voice: ""
119
+ };
120
+ }
121
+ function speechVolcengineFromProvider(provider) {
122
+ return {
123
+ name: provider?.name ?? "",
124
+ provider: "volcengine",
125
+ apiKey: provider?.apiKey ?? "",
126
+ appId: provider?.appId ?? "",
127
+ baseUrl: provider?.baseUrl ?? "",
128
+ language: provider?.language ?? "",
129
+ asrEnabled: provider?.asrEnabled ?? false,
130
+ asrResourceId: provider?.asrResourceId ?? "",
131
+ ttsEnabled: provider?.ttsEnabled ?? false,
132
+ voice: provider?.voice ?? ""
133
+ };
134
+ }
135
+ function speechVolcengineToDraft(values) {
136
+ return {
137
+ name: values.name.trim(),
138
+ provider: "volcengine",
139
+ apiKey: values.apiKey.trim(),
140
+ appId: values.appId.trim() || void 0,
141
+ baseUrl: values.baseUrl.trim().replace(/\/+$/, "") || void 0,
142
+ language: values.language.trim() || void 0,
143
+ asrEnabled: values.asrEnabled,
144
+ asrResourceId: values.asrResourceId.trim() || void 0,
145
+ ttsEnabled: values.ttsEnabled,
146
+ voice: values.voice.trim() || void 0
147
+ };
148
+ }
149
+ const speechOpenaiSchema = object({
150
+ name: nameField,
151
+ provider: providerField,
152
+ apiKey: string().trim().min(1, "settings.speech.validation.enterApiKey"),
153
+ baseUrl: string(),
154
+ language: string(),
155
+ asrEnabled: boolean(),
156
+ asrModel: string(),
157
+ ttsEnabled: boolean(),
158
+ voice: string(),
159
+ ttsModel: string()
160
+ });
161
+ function speechOpenaiDefaultValues() {
162
+ return {
163
+ name: "",
164
+ provider: "openai",
165
+ apiKey: "",
166
+ baseUrl: "",
167
+ language: "",
168
+ asrEnabled: false,
169
+ asrModel: "",
170
+ ttsEnabled: false,
171
+ voice: "",
172
+ ttsModel: ""
173
+ };
174
+ }
175
+ function speechOpenaiFromProvider(provider) {
176
+ return {
177
+ name: provider?.name ?? "",
178
+ provider: "openai",
179
+ apiKey: provider?.apiKey ?? "",
180
+ baseUrl: provider?.baseUrl ?? "",
181
+ language: provider?.language ?? "",
182
+ asrEnabled: provider?.asrEnabled ?? false,
183
+ asrModel: provider?.asrModel ?? "",
184
+ ttsEnabled: provider?.ttsEnabled ?? false,
185
+ voice: provider?.voice ?? "",
186
+ ttsModel: provider?.ttsModel ?? ""
187
+ };
188
+ }
189
+ function speechOpenaiToDraft(values) {
190
+ return {
191
+ name: values.name.trim(),
192
+ provider: "openai",
193
+ apiKey: values.apiKey.trim(),
194
+ baseUrl: values.baseUrl.trim().replace(/\/+$/, "") || void 0,
195
+ language: values.language.trim() || void 0,
196
+ asrEnabled: values.asrEnabled,
197
+ asrModel: values.asrModel.trim() || void 0,
198
+ ttsEnabled: values.ttsEnabled,
199
+ voice: values.voice.trim() || void 0,
200
+ ttsModel: values.ttsModel.trim() || void 0
201
+ };
202
+ }
203
+ const speechIflytekSchema = object({
204
+ name: nameField,
205
+ provider: providerField,
206
+ appId: string().trim().min(1, "settings.speech.validation.enterAppId"),
207
+ apiKey: string().trim().min(1, "settings.speech.validation.enterApiKey"),
208
+ apiSecret: string().trim().min(1, "settings.speech.validation.enterApiSecret"),
209
+ baseUrl: string(),
210
+ language: string(),
211
+ asrEnabled: boolean(),
212
+ ttsEnabled: boolean(),
213
+ voice: string()
214
+ });
215
+ function speechIflytekDefaultValues() {
216
+ return {
217
+ name: "",
218
+ provider: "iflytek",
219
+ appId: "",
220
+ apiKey: "",
221
+ apiSecret: "",
222
+ baseUrl: "",
223
+ language: "",
224
+ asrEnabled: false,
225
+ ttsEnabled: false,
226
+ voice: ""
227
+ };
228
+ }
229
+ function speechIflytekFromProvider(provider) {
230
+ return {
231
+ name: provider?.name ?? "",
232
+ provider: "iflytek",
233
+ appId: provider?.appId ?? "",
234
+ apiKey: provider?.apiKey ?? "",
235
+ apiSecret: provider?.apiSecret ?? "",
236
+ baseUrl: provider?.baseUrl ?? "",
237
+ language: provider?.language ?? "",
238
+ asrEnabled: provider?.asrEnabled ?? false,
239
+ ttsEnabled: provider?.ttsEnabled ?? false,
240
+ voice: provider?.voice ?? ""
241
+ };
242
+ }
243
+ function speechIflytekToDraft(values) {
244
+ return {
245
+ name: values.name.trim(),
246
+ provider: "iflytek",
247
+ appId: values.appId.trim(),
248
+ apiKey: values.apiKey.trim(),
249
+ apiSecret: values.apiSecret.trim(),
250
+ baseUrl: values.baseUrl.trim().replace(/\/+$/, "") || void 0,
251
+ language: values.language.trim() || void 0,
252
+ asrEnabled: values.asrEnabled,
253
+ ttsEnabled: values.ttsEnabled,
254
+ voice: values.voice.trim() || void 0
255
+ };
256
+ }
257
+ function SpeechCommonFields({ onProviderChange }) {
258
+ const { t } = useTranslation();
259
+ const { control, getValues } = useFormContext();
260
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
261
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
262
+ Controller,
263
+ {
264
+ name: "name",
265
+ control,
266
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
267
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "speech-name", className: "text-[11px] text-muted-foreground", children: t("settings.speech.form.name", "Name") }),
268
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
269
+ Input,
270
+ {
271
+ ...field,
272
+ id: "speech-name",
273
+ placeholder: "e.g. Qwen",
274
+ "aria-invalid": fieldState.invalid,
275
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
276
+ }
277
+ ),
278
+ fieldState.error?.message ? /* @__PURE__ */ jsxRuntimeExports.jsx(
279
+ FieldError,
280
+ {
281
+ errors: [{ message: t(fieldState.error.message, fieldState.error.message) }]
282
+ }
283
+ ) : null
284
+ ] })
285
+ }
286
+ ),
287
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
288
+ Controller,
289
+ {
290
+ name: "provider",
291
+ control,
292
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
293
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "speech-provider", className: "text-[11px] text-muted-foreground", children: t("settings.speech.form.provider", "Provider") }),
294
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
295
+ Select,
296
+ {
297
+ name: field.name,
298
+ value: field.value,
299
+ onValueChange: (value) => {
300
+ const provider = value;
301
+ field.onChange(provider);
302
+ onProviderChange(provider, getValues("name"));
303
+ },
304
+ children: [
305
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "speech-provider", className: "w-full text-[11px]! font-mono", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
306
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: speechProviderValues.map((provider) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: provider, children: provider }, provider)) })
307
+ ]
308
+ }
309
+ )
310
+ ] })
311
+ }
312
+ )
313
+ ] });
314
+ }
315
+ function OptionalLabel({ htmlFor, children }) {
316
+ const { t } = useTranslation();
317
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldLabel, { htmlFor, className: "text-[11px] text-muted-foreground", children: [
318
+ children,
319
+ t("settings.speech.form.optional", " (optional)")
320
+ ] });
321
+ }
322
+ function SpeechSection({ title, description, children }) {
323
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-lg ring ring-border/60 p-3", children: [
324
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
325
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs font-medium", children: title }),
326
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[11px] text-muted-foreground", children: description })
327
+ ] }),
328
+ children ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-5 space-y-5", children }) : null
329
+ ] });
330
+ }
331
+ function SpeechDashscopeForm({
332
+ open,
333
+ initial,
334
+ seededName,
335
+ onSave,
336
+ onProviderChange
337
+ }) {
338
+ const { t } = useTranslation();
339
+ const form = useForm({
340
+ resolver: i(speechDashscopeSchema),
341
+ mode: "onTouched",
342
+ defaultValues: speechDashscopeDefaultValues()
343
+ });
344
+ reactExports.useEffect(() => {
345
+ if (!open) return;
346
+ form.reset({ ...speechDashscopeFromProvider(initial), name: seededName });
347
+ }, [open, initial, seededName, form]);
348
+ const renderError = (message) => message ? /* @__PURE__ */ jsxRuntimeExports.jsx(FieldError, { errors: [{ message: t(message, message) }] }) : null;
349
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(FormProvider, { ...form, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
350
+ "form",
351
+ {
352
+ id: "form-speech",
353
+ onSubmit: form.handleSubmit((values) => onSave(speechDashscopeToDraft(values))),
354
+ className: "grid grid-cols-2 gap-5 py-2",
355
+ children: [
356
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
357
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SpeechCommonFields, { onProviderChange }),
358
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
359
+ Controller,
360
+ {
361
+ name: "apiKey",
362
+ control: form.control,
363
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
364
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
365
+ FieldLabel,
366
+ {
367
+ htmlFor: "speech-ds-apikey",
368
+ className: "text-[11px] text-muted-foreground",
369
+ children: t("settings.speech.form.apiKey", "API Key")
370
+ }
371
+ ),
372
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
373
+ Input,
374
+ {
375
+ ...field,
376
+ id: "speech-ds-apikey",
377
+ type: "password",
378
+ placeholder: "sk-...",
379
+ "aria-invalid": fieldState.invalid,
380
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
381
+ }
382
+ ),
383
+ renderError(fieldState.error?.message)
384
+ ] })
385
+ }
386
+ ),
387
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
388
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
389
+ Controller,
390
+ {
391
+ name: "workspaceId",
392
+ control: form.control,
393
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
394
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-ds-workspace-id", children: "Workspace ID" }),
395
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { ...field, id: "speech-ds-workspace-id", className: "h-8 text-[11px]!" })
396
+ ] })
397
+ }
398
+ ),
399
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
400
+ Controller,
401
+ {
402
+ name: "region",
403
+ control: form.control,
404
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
405
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-ds-region", children: "Region" }),
406
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
407
+ Input,
408
+ {
409
+ ...field,
410
+ id: "speech-ds-region",
411
+ placeholder: "cn-beijing",
412
+ "aria-invalid": fieldState.invalid,
413
+ className: "h-8 text-[11px]! font-mono"
414
+ }
415
+ ),
416
+ renderError(fieldState.error?.message)
417
+ ] })
418
+ }
419
+ )
420
+ ] }),
421
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
422
+ Controller,
423
+ {
424
+ name: "workspace",
425
+ control: form.control,
426
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
427
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-ds-workspace", children: "Workspace" }),
428
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { ...field, id: "speech-ds-workspace", className: "h-8 text-[11px]! font-mono" })
429
+ ] })
430
+ }
431
+ ),
432
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
433
+ Controller,
434
+ {
435
+ name: "language",
436
+ control: form.control,
437
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
438
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-ds-language", children: t("settings.speech.form.language", "Language") }),
439
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
440
+ Input,
441
+ {
442
+ ...field,
443
+ id: "speech-ds-language",
444
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
445
+ }
446
+ )
447
+ ] })
448
+ }
449
+ )
450
+ ] }),
451
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { className: "mt-3", children: [
452
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
453
+ SpeechSection,
454
+ {
455
+ title: t("settings.speech.form.recognition", "Recognition"),
456
+ description: t(
457
+ "settings.speech.form.recognitionDesc",
458
+ "Realtime speech-to-text for chat voice input."
459
+ ),
460
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
461
+ Controller,
462
+ {
463
+ name: "asrModel",
464
+ control: form.control,
465
+ render: ({ field: asrField }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
466
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-ds-asr-model", children: "Model" }),
467
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
468
+ Input,
469
+ {
470
+ ...asrField,
471
+ id: "speech-ds-asr-model",
472
+ placeholder: DASHSCOPE_ASR_MODEL,
473
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
474
+ }
475
+ )
476
+ ] })
477
+ }
478
+ )
479
+ }
480
+ ),
481
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
482
+ SpeechSection,
483
+ {
484
+ title: t("settings.speech.form.synthesis", "Synthesis"),
485
+ description: t(
486
+ "settings.speech.form.synthesisDesc",
487
+ "Read agent replies out loud with this voice."
488
+ ),
489
+ children: [
490
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
491
+ Controller,
492
+ {
493
+ name: "ttsModel",
494
+ control: form.control,
495
+ render: ({ field: modelField }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
496
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-ds-tts-model", children: "Model" }),
497
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
498
+ Input,
499
+ {
500
+ ...modelField,
501
+ id: "speech-ds-tts-model",
502
+ placeholder: "qwen-audio-3.0-tts-flash",
503
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
504
+ }
505
+ )
506
+ ] })
507
+ }
508
+ ),
509
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
510
+ Controller,
511
+ {
512
+ name: "voice",
513
+ control: form.control,
514
+ render: ({ field: voiceField }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
515
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-ds-voice", children: t("settings.speech.form.voice", "Voice") }),
516
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
517
+ Input,
518
+ {
519
+ ...voiceField,
520
+ id: "speech-ds-voice",
521
+ placeholder: DASHSCOPE_TTS_VOICE,
522
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
523
+ }
524
+ )
525
+ ] })
526
+ }
527
+ )
528
+ ]
529
+ }
530
+ )
531
+ ] })
532
+ ]
533
+ }
534
+ ) });
535
+ }
536
+ function SpeechVolcengineForm({
537
+ open,
538
+ initial,
539
+ seededName,
540
+ onSave,
541
+ onProviderChange
542
+ }) {
543
+ const { t } = useTranslation();
544
+ const form = useForm({
545
+ resolver: i(speechVolcengineSchema),
546
+ mode: "onTouched",
547
+ defaultValues: speechVolcengineDefaultValues()
548
+ });
549
+ reactExports.useEffect(() => {
550
+ if (!open) return;
551
+ form.reset({ ...speechVolcengineFromProvider(initial), name: seededName });
552
+ }, [open, initial, seededName, form]);
553
+ const renderError = (message) => message ? /* @__PURE__ */ jsxRuntimeExports.jsx(FieldError, { errors: [{ message: t(message, message) }] }) : null;
554
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(FormProvider, { ...form, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
555
+ "form",
556
+ {
557
+ id: "form-speech",
558
+ onSubmit: form.handleSubmit((values) => onSave(speechVolcengineToDraft(values))),
559
+ className: "grid grid-cols-2 gap-5 py-2",
560
+ children: [
561
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
562
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SpeechCommonFields, { onProviderChange }),
563
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
564
+ Controller,
565
+ {
566
+ name: "apiKey",
567
+ control: form.control,
568
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
569
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
570
+ FieldLabel,
571
+ {
572
+ htmlFor: "speech-vol-apikey",
573
+ className: "text-[11px] text-muted-foreground",
574
+ children: t("settings.speech.form.apiKey", "API Key")
575
+ }
576
+ ),
577
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
578
+ Input,
579
+ {
580
+ ...field,
581
+ id: "speech-vol-apikey",
582
+ type: "password",
583
+ placeholder: "sk-...",
584
+ "aria-invalid": fieldState.invalid,
585
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
586
+ }
587
+ ),
588
+ renderError(fieldState.error?.message)
589
+ ] })
590
+ }
591
+ ),
592
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
593
+ Controller,
594
+ {
595
+ name: "appId",
596
+ control: form.control,
597
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
598
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-vol-appid", children: t("settings.speech.form.appId", "App ID") }),
599
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { ...field, id: "speech-vol-appid", className: "h-8 text-[11px]! font-mono" })
600
+ ] })
601
+ }
602
+ ),
603
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
604
+ Controller,
605
+ {
606
+ name: "baseUrl",
607
+ control: form.control,
608
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
609
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-vol-baseurl", children: "Endpoint" }),
610
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
611
+ Input,
612
+ {
613
+ ...field,
614
+ id: "speech-vol-baseurl",
615
+ placeholder: "wss://...",
616
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
617
+ }
618
+ )
619
+ ] })
620
+ }
621
+ ),
622
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
623
+ Controller,
624
+ {
625
+ name: "language",
626
+ control: form.control,
627
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
628
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-vol-language", children: t("settings.speech.form.language", "Language") }),
629
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
630
+ Input,
631
+ {
632
+ ...field,
633
+ id: "speech-vol-language",
634
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
635
+ }
636
+ )
637
+ ] })
638
+ }
639
+ )
640
+ ] }),
641
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { className: "mt-3", children: [
642
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
643
+ SpeechSection,
644
+ {
645
+ title: t("settings.speech.form.recognition", "Recognition"),
646
+ description: t(
647
+ "settings.speech.form.recognitionDesc",
648
+ "Realtime speech-to-text for chat voice input."
649
+ ),
650
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
651
+ Controller,
652
+ {
653
+ name: "asrResourceId",
654
+ control: form.control,
655
+ render: ({ field: resourceField }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
656
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-vol-resource-id", children: "Resource ID" }),
657
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
658
+ Input,
659
+ {
660
+ ...resourceField,
661
+ id: "speech-vol-resource-id",
662
+ placeholder: "volc.seedasr.sauc.duration",
663
+ className: "h-8 text-[11px]! font-mono"
664
+ }
665
+ )
666
+ ] })
667
+ }
668
+ )
669
+ }
670
+ ),
671
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
672
+ SpeechSection,
673
+ {
674
+ title: t("settings.speech.form.synthesis", "Synthesis"),
675
+ description: t(
676
+ "settings.speech.form.synthesisDesc",
677
+ "Read agent replies out loud with this voice."
678
+ ),
679
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
680
+ Controller,
681
+ {
682
+ name: "voice",
683
+ control: form.control,
684
+ render: ({ field: voiceField }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
685
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-vol-voice", children: t("settings.speech.form.voice", "Voice") }),
686
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
687
+ Input,
688
+ {
689
+ ...voiceField,
690
+ id: "speech-vol-voice",
691
+ placeholder: VOLC_TTS_VOICE,
692
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
693
+ }
694
+ )
695
+ ] })
696
+ }
697
+ )
698
+ }
699
+ )
700
+ ] })
701
+ ]
702
+ }
703
+ ) });
704
+ }
705
+ function SpeechOpenaiForm({
706
+ open,
707
+ initial,
708
+ seededName,
709
+ onSave,
710
+ onProviderChange
711
+ }) {
712
+ const { t } = useTranslation();
713
+ const form = useForm({
714
+ resolver: i(speechOpenaiSchema),
715
+ mode: "onTouched",
716
+ defaultValues: speechOpenaiDefaultValues()
717
+ });
718
+ reactExports.useEffect(() => {
719
+ if (!open) return;
720
+ form.reset({ ...speechOpenaiFromProvider(initial), name: seededName });
721
+ }, [open, initial, seededName, form]);
722
+ const renderError = (message) => message ? /* @__PURE__ */ jsxRuntimeExports.jsx(FieldError, { errors: [{ message: t(message, message) }] }) : null;
723
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(FormProvider, { ...form, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
724
+ "form",
725
+ {
726
+ id: "form-speech",
727
+ onSubmit: form.handleSubmit((values) => onSave(speechOpenaiToDraft(values))),
728
+ className: "grid grid-cols-2 gap-5 py-2",
729
+ children: [
730
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
731
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SpeechCommonFields, { onProviderChange }),
732
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
733
+ Controller,
734
+ {
735
+ name: "apiKey",
736
+ control: form.control,
737
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
738
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
739
+ FieldLabel,
740
+ {
741
+ htmlFor: "speech-oi-apikey",
742
+ className: "text-[11px] text-muted-foreground",
743
+ children: t("settings.speech.form.apiKey", "API Key")
744
+ }
745
+ ),
746
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
747
+ Input,
748
+ {
749
+ ...field,
750
+ id: "speech-oi-apikey",
751
+ type: "password",
752
+ placeholder: "sk-...",
753
+ "aria-invalid": fieldState.invalid,
754
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
755
+ }
756
+ ),
757
+ renderError(fieldState.error?.message)
758
+ ] })
759
+ }
760
+ ),
761
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
762
+ Controller,
763
+ {
764
+ name: "baseUrl",
765
+ control: form.control,
766
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
767
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-oi-baseurl", children: "Base URL" }),
768
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
769
+ Input,
770
+ {
771
+ ...field,
772
+ id: "speech-oi-baseurl",
773
+ placeholder: "https://api.openai.com",
774
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
775
+ }
776
+ )
777
+ ] })
778
+ }
779
+ ),
780
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
781
+ Controller,
782
+ {
783
+ name: "language",
784
+ control: form.control,
785
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
786
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-oi-language", children: t("settings.speech.form.language", "Language") }),
787
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
788
+ Input,
789
+ {
790
+ ...field,
791
+ id: "speech-oi-language",
792
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
793
+ }
794
+ )
795
+ ] })
796
+ }
797
+ )
798
+ ] }),
799
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { className: "mt-3", children: [
800
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
801
+ SpeechSection,
802
+ {
803
+ title: t("settings.speech.form.recognition", "Recognition"),
804
+ description: t(
805
+ "settings.speech.form.recognitionDesc",
806
+ "Realtime speech-to-text for chat voice input."
807
+ ),
808
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
809
+ Controller,
810
+ {
811
+ name: "asrModel",
812
+ control: form.control,
813
+ render: ({ field: asrField }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
814
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-oi-asr-model", children: "Model" }),
815
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
816
+ Input,
817
+ {
818
+ ...asrField,
819
+ id: "speech-oi-asr-model",
820
+ placeholder: OPENAI_ASR_MODEL,
821
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
822
+ }
823
+ )
824
+ ] })
825
+ }
826
+ )
827
+ }
828
+ ),
829
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
830
+ SpeechSection,
831
+ {
832
+ title: t("settings.speech.form.synthesis", "Synthesis"),
833
+ description: t(
834
+ "settings.speech.form.synthesisDesc",
835
+ "Read agent replies out loud with this voice."
836
+ ),
837
+ children: [
838
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
839
+ Controller,
840
+ {
841
+ name: "ttsModel",
842
+ control: form.control,
843
+ render: ({ field: modelField }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
844
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-oi-tts-model", children: "Model" }),
845
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
846
+ Input,
847
+ {
848
+ ...modelField,
849
+ id: "speech-oi-tts-model",
850
+ placeholder: "gpt-4o-mini-tts",
851
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
852
+ }
853
+ )
854
+ ] })
855
+ }
856
+ ),
857
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
858
+ Controller,
859
+ {
860
+ name: "voice",
861
+ control: form.control,
862
+ render: ({ field: voiceField }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
863
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-oi-voice", children: t("settings.speech.form.voice", "Voice") }),
864
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
865
+ Input,
866
+ {
867
+ ...voiceField,
868
+ id: "speech-oi-voice",
869
+ placeholder: OPENAI_TTS_VOICE,
870
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
871
+ }
872
+ )
873
+ ] })
874
+ }
875
+ )
876
+ ]
877
+ }
878
+ )
879
+ ] })
880
+ ]
881
+ }
882
+ ) });
883
+ }
884
+ function SpeechIflytekForm({
885
+ open,
886
+ initial,
887
+ seededName,
888
+ onSave,
889
+ onProviderChange
890
+ }) {
891
+ const { t } = useTranslation();
892
+ const form = useForm({
893
+ resolver: i(speechIflytekSchema),
894
+ mode: "onTouched",
895
+ defaultValues: speechIflytekDefaultValues()
896
+ });
897
+ reactExports.useEffect(() => {
898
+ if (!open) return;
899
+ form.reset({ ...speechIflytekFromProvider(initial), name: seededName });
900
+ }, [open, initial, seededName, form]);
901
+ const renderError = (message) => message ? /* @__PURE__ */ jsxRuntimeExports.jsx(FieldError, { errors: [{ message: t(message, message) }] }) : null;
902
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(FormProvider, { ...form, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
903
+ "form",
904
+ {
905
+ id: "form-speech",
906
+ onSubmit: form.handleSubmit((values) => onSave(speechIflytekToDraft(values))),
907
+ className: "grid grid-cols-2 gap-5 py-2",
908
+ children: [
909
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
910
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SpeechCommonFields, { onProviderChange }),
911
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
912
+ Controller,
913
+ {
914
+ name: "appId",
915
+ control: form.control,
916
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
917
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "speech-xf-appid", className: "text-[11px] text-muted-foreground", children: t("settings.speech.form.appId", "App ID") }),
918
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
919
+ Input,
920
+ {
921
+ ...field,
922
+ id: "speech-xf-appid",
923
+ "aria-invalid": fieldState.invalid,
924
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
925
+ }
926
+ ),
927
+ renderError(fieldState.error?.message)
928
+ ] })
929
+ }
930
+ ),
931
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
932
+ Controller,
933
+ {
934
+ name: "apiKey",
935
+ control: form.control,
936
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
937
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
938
+ FieldLabel,
939
+ {
940
+ htmlFor: "speech-xf-apikey",
941
+ className: "text-[11px] text-muted-foreground",
942
+ children: t("settings.speech.form.apiKey", "API Key")
943
+ }
944
+ ),
945
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
946
+ Input,
947
+ {
948
+ ...field,
949
+ id: "speech-xf-apikey",
950
+ type: "password",
951
+ placeholder: "sk-...",
952
+ "aria-invalid": fieldState.invalid,
953
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
954
+ }
955
+ ),
956
+ renderError(fieldState.error?.message)
957
+ ] })
958
+ }
959
+ ),
960
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
961
+ Controller,
962
+ {
963
+ name: "apiSecret",
964
+ control: form.control,
965
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
966
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
967
+ FieldLabel,
968
+ {
969
+ htmlFor: "speech-xf-api-secret",
970
+ className: "text-[11px] text-muted-foreground",
971
+ children: t("settings.speech.form.apiSecret", "API Secret")
972
+ }
973
+ ),
974
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
975
+ Input,
976
+ {
977
+ ...field,
978
+ id: "speech-xf-api-secret",
979
+ type: "password",
980
+ "aria-invalid": fieldState.invalid,
981
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
982
+ }
983
+ ),
984
+ renderError(fieldState.error?.message)
985
+ ] })
986
+ }
987
+ ),
988
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
989
+ Controller,
990
+ {
991
+ name: "baseUrl",
992
+ control: form.control,
993
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
994
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-xf-baseurl", children: "Endpoint" }),
995
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
996
+ Input,
997
+ {
998
+ ...field,
999
+ id: "speech-xf-baseurl",
1000
+ placeholder: "wss://...",
1001
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
1002
+ }
1003
+ )
1004
+ ] })
1005
+ }
1006
+ ),
1007
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1008
+ Controller,
1009
+ {
1010
+ name: "language",
1011
+ control: form.control,
1012
+ render: ({ field }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
1013
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-xf-language", children: t("settings.speech.form.language", "Language") }),
1014
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1015
+ Input,
1016
+ {
1017
+ ...field,
1018
+ id: "speech-xf-language",
1019
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
1020
+ }
1021
+ )
1022
+ ] })
1023
+ }
1024
+ )
1025
+ ] }),
1026
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { className: "mt-3", children: [
1027
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1028
+ SpeechSection,
1029
+ {
1030
+ title: t("settings.speech.form.recognition", "Recognition"),
1031
+ description: t(
1032
+ "settings.speech.form.recognitionDesc",
1033
+ "Realtime speech-to-text for chat voice input."
1034
+ )
1035
+ }
1036
+ ),
1037
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1038
+ SpeechSection,
1039
+ {
1040
+ title: t("settings.speech.form.synthesis", "Synthesis"),
1041
+ description: t(
1042
+ "settings.speech.form.synthesisDesc",
1043
+ "Read agent replies out loud with this voice."
1044
+ ),
1045
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
1046
+ Controller,
1047
+ {
1048
+ name: "voice",
1049
+ control: form.control,
1050
+ render: ({ field: voiceField }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
1051
+ /* @__PURE__ */ jsxRuntimeExports.jsx(OptionalLabel, { htmlFor: "speech-xf-voice", children: t("settings.speech.form.voice", "Voice") }),
1052
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1053
+ Input,
1054
+ {
1055
+ ...voiceField,
1056
+ id: "speech-xf-voice",
1057
+ placeholder: IFLYTEK_TTS_VCN,
1058
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
1059
+ }
1060
+ )
1061
+ ] })
1062
+ }
1063
+ )
1064
+ }
1065
+ )
1066
+ ] })
1067
+ ]
1068
+ }
1069
+ ) });
1070
+ }
1071
+ function SettingsSpeechDialog({
1072
+ open,
1073
+ onOpenChange,
1074
+ initialProvider,
1075
+ provider,
1076
+ seededName,
1077
+ onProviderChange,
1078
+ onSave
1079
+ }) {
1080
+ const { t } = useTranslation();
1081
+ const saveDraft = async (draft) => {
1082
+ await onSave({
1083
+ id: initialProvider?.id ?? generateUUID().replace(/-/g, "").slice(0, 12),
1084
+ ...draft
1085
+ });
1086
+ };
1087
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open, onOpenChange, disablePointerDismissal: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "max-h-[90vh] overflow-y-auto sm:max-w-3xl", children: [
1088
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
1089
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: initialProvider ? t("settings.speech.editProvider", "Edit Provider") : t("settings.speech.addProvider", "Add Provider") }),
1090
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: t(
1091
+ "settings.speech.dialogDesc",
1092
+ "Configure one provider for speech recognition and/or speech synthesis."
1093
+ ) })
1094
+ ] }),
1095
+ provider === "dashscope" && /* @__PURE__ */ jsxRuntimeExports.jsx(
1096
+ SpeechDashscopeForm,
1097
+ {
1098
+ open,
1099
+ initial: initialProvider,
1100
+ seededName,
1101
+ onSave: saveDraft,
1102
+ onProviderChange
1103
+ }
1104
+ ),
1105
+ provider === "volcengine" && /* @__PURE__ */ jsxRuntimeExports.jsx(
1106
+ SpeechVolcengineForm,
1107
+ {
1108
+ open,
1109
+ initial: initialProvider,
1110
+ seededName,
1111
+ onSave: saveDraft,
1112
+ onProviderChange
1113
+ }
1114
+ ),
1115
+ provider === "openai" && /* @__PURE__ */ jsxRuntimeExports.jsx(
1116
+ SpeechOpenaiForm,
1117
+ {
1118
+ open,
1119
+ initial: initialProvider,
1120
+ seededName,
1121
+ onSave: saveDraft,
1122
+ onProviderChange
1123
+ }
1124
+ ),
1125
+ provider === "iflytek" && /* @__PURE__ */ jsxRuntimeExports.jsx(
1126
+ SpeechIflytekForm,
1127
+ {
1128
+ open,
1129
+ initial: initialProvider,
1130
+ seededName,
1131
+ onSave: saveDraft,
1132
+ onProviderChange
1133
+ }
1134
+ ),
1135
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
1136
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1137
+ Button,
1138
+ {
1139
+ type: "button",
1140
+ variant: "outline",
1141
+ size: "sm",
1142
+ onClick: () => onOpenChange(false),
1143
+ className: "h-7 text-xs",
1144
+ children: t("settings.speech.cancel", "Cancel")
1145
+ }
1146
+ ),
1147
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "submit", form: "form-speech", size: "sm", className: "h-7 text-xs", children: t("settings.speech.save", "Save") })
1148
+ ] })
1149
+ ] }) });
1150
+ }
1151
+ function SettingsSpeech() {
1152
+ const { t, i18n } = useTranslation();
1153
+ const { speechProviders, setSpeechProviders } = useAppStore();
1154
+ const { toast, confirm } = useMessage();
1155
+ const [providers, setProviders] = reactExports.useState([]);
1156
+ const [contextMenuId, setContextMenuId] = reactExports.useState(null);
1157
+ const [dialogOpen, setDialogOpen] = reactExports.useState(false);
1158
+ const [dialogItem, setDialogItem] = reactExports.useState(null);
1159
+ const [dialogProvider, setDialogProvider] = reactExports.useState("dashscope");
1160
+ const [dialogName, setDialogName] = reactExports.useState("");
1161
+ reactExports.useEffect(() => {
1162
+ setProviders(speechProviders);
1163
+ }, [speechProviders]);
1164
+ const handleSave = async (updated) => {
1165
+ try {
1166
+ await request.updateSettings({ speechProviders: updated });
1167
+ setSpeechProviders(updated);
1168
+ } catch (err) {
1169
+ toast.error(
1170
+ extractErrorMessage(err) || t("settings.speech.updateFailed", "Failed to update configuration.")
1171
+ );
1172
+ }
1173
+ };
1174
+ const closeDialog = () => {
1175
+ setDialogOpen(false);
1176
+ setDialogItem(null);
1177
+ };
1178
+ const openAddDialog = () => {
1179
+ setDialogItem(null);
1180
+ setDialogProvider("dashscope");
1181
+ setDialogName("");
1182
+ setDialogOpen(true);
1183
+ };
1184
+ const openEditDialog = (provider) => {
1185
+ setDialogItem(provider);
1186
+ setDialogProvider(provider.provider);
1187
+ setDialogName(provider.name);
1188
+ setDialogOpen(true);
1189
+ };
1190
+ const upsertProvider = async (next) => {
1191
+ const isNew = dialogItem === null;
1192
+ const saved = isNew && !next.asrEnabled && !next.ttsEnabled && !providers.some((p) => p.asrEnabled) ? { ...next, asrEnabled: true } : next;
1193
+ const base = isNew ? [...providers, saved] : providers.map((provider) => provider.id === dialogItem.id ? saved : provider);
1194
+ const updated = base.map(
1195
+ (provider) => provider.id === saved.id ? provider : {
1196
+ ...provider,
1197
+ asrEnabled: saved.asrEnabled ? false : provider.asrEnabled,
1198
+ ttsEnabled: saved.ttsEnabled ? false : provider.ttsEnabled
1199
+ }
1200
+ );
1201
+ setProviders(updated);
1202
+ closeDialog();
1203
+ await handleSave(updated);
1204
+ };
1205
+ const handleDelete = async (id) => {
1206
+ const result = await confirm({
1207
+ title: t("settings.speech.confirmDeleteTitle", "Delete Provider"),
1208
+ content: t(
1209
+ "settings.speech.confirmDeleteDesc",
1210
+ "Are you sure you want to delete this speech provider?"
1211
+ ),
1212
+ buttons: [
1213
+ { text: t("message.cancel", "Cancel"), value: null, variant: "outline" },
1214
+ {
1215
+ text: t("settings.speech.delete", "Delete"),
1216
+ value: "confirm",
1217
+ variant: "destructive"
1218
+ }
1219
+ ]
1220
+ });
1221
+ if (!result) return;
1222
+ const updated = providers.filter((provider) => provider.id !== id);
1223
+ setProviders(updated);
1224
+ await handleSave(updated);
1225
+ };
1226
+ const handleToggleDirection = async (id, field, enabled) => {
1227
+ const updated = providers.map((provider) => {
1228
+ if (provider.id === id) {
1229
+ return field === "asrEnabled" ? { ...provider, asrEnabled: enabled } : { ...provider, ttsEnabled: enabled };
1230
+ }
1231
+ if (!enabled) return provider;
1232
+ return field === "asrEnabled" ? { ...provider, asrEnabled: false } : { ...provider, ttsEnabled: false };
1233
+ });
1234
+ setProviders(updated);
1235
+ await handleSave(updated);
1236
+ };
1237
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full flex-col", children: [
1238
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto w-full max-w-4xl px-5 py-4", children: [
1239
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
1240
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-medium", children: t("settings.speech.title", "Speech") }),
1241
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
1242
+ "button",
1243
+ {
1244
+ type: "button",
1245
+ onClick: () => openGuide(i18n.language, "speech.md"),
1246
+ className: "inline-flex cursor-default items-center gap-1.5 text-xs text-muted-foreground transition-colors hover:text-foreground",
1247
+ children: [
1248
+ /* @__PURE__ */ jsxRuntimeExports.jsx(BookOpen, { className: "size-3.5" }),
1249
+ t("settings.speech.guide", "User Guide")
1250
+ ]
1251
+ }
1252
+ )
1253
+ ] }),
1254
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: t(
1255
+ "settings.speech.desc",
1256
+ "Configure voice input (speech-to-text) and voice output (speech synthesis)."
1257
+ ) })
1258
+ ] }),
1259
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto w-full max-w-4xl space-y-2 px-4", children: [
1260
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between p-1", children: [
1261
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-xs text-foreground/50", children: t("settings.speech.providers", "Providers") }),
1262
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
1263
+ Button,
1264
+ {
1265
+ variant: "outline",
1266
+ size: "xs",
1267
+ onClick: openAddDialog,
1268
+ className: "h-7 text-xs text-foreground/70",
1269
+ children: [
1270
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "mr-1 size-3" }),
1271
+ t("settings.speech.add", "Add Provider")
1272
+ ]
1273
+ }
1274
+ )
1275
+ ] }),
1276
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "-mx-4 border-t border-border" })
1277
+ ] }),
1278
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto w-full max-w-4xl", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "m-5 space-y-3 pb-6", children: [
1279
+ providers.map((provider) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
1280
+ ContextMenu,
1281
+ {
1282
+ onOpenChange: (open) => setContextMenuId(open ? provider.id : null),
1283
+ children: [
1284
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuTrigger, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
1285
+ "div",
1286
+ {
1287
+ className: `flex min-h-10 cursor-default select-none items-center gap-2 overflow-hidden rounded-lg border bg-secondary/50 p-1.5 text-sm ${contextMenuId === provider.id ? "ring-1 ring-primary" : ""}`,
1288
+ children: [
1289
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1290
+ "span",
1291
+ {
1292
+ className: `ml-1 max-w-32 shrink-0 truncate text-xs font-bold ${!provider.asrEnabled && !provider.ttsEnabled ? "text-muted-foreground/50" : ""}`,
1293
+ children: provider.name
1294
+ }
1295
+ ),
1296
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 rounded bg-muted px-1 py-0.5 text-[9px] font-medium uppercase text-muted-foreground/70", children: provider.provider }),
1297
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-0 flex-1 truncate font-mono text-[10px] text-muted-foreground", children: [
1298
+ effectiveAsrModel(provider) || provider.asrResourceId,
1299
+ [provider.ttsModel, effectiveTtsVoice(provider)].filter(Boolean).join("/")
1300
+ ].filter(Boolean).join(" · ") || provider.baseUrl }),
1301
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ml-1 flex shrink-0 items-center gap-3", children: [
1302
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [
1303
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] text-muted-foreground", children: t("settings.speech.shortRecognition", "ASR") }),
1304
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1305
+ Switch,
1306
+ {
1307
+ size: "sm",
1308
+ checked: provider.asrEnabled,
1309
+ onCheckedChange: (enabled) => handleToggleDirection(provider.id, "asrEnabled", enabled),
1310
+ "aria-label": t("settings.speech.form.recognition", "Recognition")
1311
+ }
1312
+ )
1313
+ ] }),
1314
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [
1315
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] text-muted-foreground", children: t("settings.speech.shortSynthesis", "TTS") }),
1316
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1317
+ Switch,
1318
+ {
1319
+ size: "sm",
1320
+ checked: provider.ttsEnabled,
1321
+ onCheckedChange: (enabled) => handleToggleDirection(provider.id, "ttsEnabled", enabled),
1322
+ "aria-label": t("settings.speech.form.synthesis", "Synthesis")
1323
+ }
1324
+ )
1325
+ ] })
1326
+ ] })
1327
+ ]
1328
+ }
1329
+ ) }),
1330
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { className: "w-32", children: [
1331
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => openEditDialog(provider), children: [
1332
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3" }),
1333
+ t("settings.speech.edit", "Edit")
1334
+ ] }),
1335
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
1336
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { variant: "destructive", onClick: () => handleDelete(provider.id), children: [
1337
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Trash, { className: "size-3" }),
1338
+ t("settings.speech.delete", "Delete")
1339
+ ] })
1340
+ ] })
1341
+ ]
1342
+ },
1343
+ provider.id
1344
+ )),
1345
+ providers.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "py-8 text-center text-sm text-muted-foreground", children: t("settings.speech.empty", "No speech providers configured") })
1346
+ ] }) }) }),
1347
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
1348
+ SettingsSpeechDialog,
1349
+ {
1350
+ open: dialogOpen,
1351
+ onOpenChange: (open) => {
1352
+ if (!open) closeDialog();
1353
+ else setDialogOpen(true);
1354
+ },
1355
+ initialProvider: dialogItem,
1356
+ provider: dialogProvider,
1357
+ seededName: dialogName,
1358
+ onProviderChange: (nextProvider, name) => {
1359
+ setDialogName(name);
1360
+ setDialogProvider(nextProvider);
1361
+ },
1362
+ onSave: upsertProvider
1363
+ }
1364
+ )
1365
+ ] });
1366
+ }
1367
+ export {
1368
+ SettingsSpeech
1369
+ };