agim-cli 1.2.134 → 1.2.135

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 (186) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/dist/core/plan-intent.d.ts +14 -0
  3. package/dist/core/plan-intent.d.ts.map +1 -0
  4. package/dist/core/plan-intent.js +112 -0
  5. package/dist/core/plan-intent.js.map +1 -0
  6. package/dist/core/router.d.ts.map +1 -1
  7. package/dist/core/router.js +27 -1
  8. package/dist/core/router.js.map +1 -1
  9. package/dist/web/public/assets/{a2a-TmaKRhXV.js → a2a-oYRz4syc.js} +2 -2
  10. package/dist/web/public/assets/{a2a-TmaKRhXV.js.map → a2a-oYRz4syc.js.map} +1 -1
  11. package/dist/web/public/assets/{activity-Cckc7fGG.js → activity-CbMd52BC.js} +2 -2
  12. package/dist/web/public/assets/{activity-Cckc7fGG.js.map → activity-CbMd52BC.js.map} +1 -1
  13. package/dist/web/public/assets/{admins-1hMCDolP.js → admins-BtuJdXZX.js} +2 -2
  14. package/dist/web/public/assets/{admins-1hMCDolP.js.map → admins-BtuJdXZX.js.map} +1 -1
  15. package/dist/web/public/assets/{agents-3sUHlKzx.js → agents-Dm8fTAks.js} +2 -2
  16. package/dist/web/public/assets/{agents-3sUHlKzx.js.map → agents-Dm8fTAks.js.map} +1 -1
  17. package/dist/web/public/assets/{approvals-CY-_Lg4Y.js → approvals-Y7FCBVQR.js} +2 -2
  18. package/dist/web/public/assets/{approvals-CY-_Lg4Y.js.map → approvals-Y7FCBVQR.js.map} +1 -1
  19. package/dist/web/public/assets/{arrow-down-BkZ50IzL.js → arrow-down-BpfVJViL.js} +2 -2
  20. package/dist/web/public/assets/{arrow-down-BkZ50IzL.js.map → arrow-down-BpfVJViL.js.map} +1 -1
  21. package/dist/web/public/assets/{arrow-up-NWC5K6Jw.js → arrow-up-BQxFty9k.js} +2 -2
  22. package/dist/web/public/assets/{arrow-up-NWC5K6Jw.js.map → arrow-up-BQxFty9k.js.map} +1 -1
  23. package/dist/web/public/assets/{asks-VzAmpsEh.js → asks-CzeX-NCb.js} +2 -2
  24. package/dist/web/public/assets/{asks-VzAmpsEh.js.map → asks-CzeX-NCb.js.map} +1 -1
  25. package/dist/web/public/assets/{audit-fOn2LH4D.js → audit-DDonnB7I.js} +2 -2
  26. package/dist/web/public/assets/{audit-fOn2LH4D.js.map → audit-DDonnB7I.js.map} +1 -1
  27. package/dist/web/public/assets/{bell-FF7PJo1N.js → bell-QusEl0TB.js} +2 -2
  28. package/dist/web/public/assets/{bell-FF7PJo1N.js.map → bell-QusEl0TB.js.map} +1 -1
  29. package/dist/web/public/assets/{bgjobs-L0v-UwPW.js → bgjobs-BIx5fZe2.js} +2 -2
  30. package/dist/web/public/assets/{bgjobs-L0v-UwPW.js.map → bgjobs-BIx5fZe2.js.map} +1 -1
  31. package/dist/web/public/assets/{brain-CdkDpFr1.js → brain-CC9HwFtI.js} +2 -2
  32. package/dist/web/public/assets/{brain-CdkDpFr1.js.map → brain-CC9HwFtI.js.map} +1 -1
  33. package/dist/web/public/assets/{briefcase-BXbOdl7E.js → briefcase-DueOcW1K.js} +2 -2
  34. package/dist/web/public/assets/{briefcase-BXbOdl7E.js.map → briefcase-DueOcW1K.js.map} +1 -1
  35. package/dist/web/public/assets/{chat-BazMi-ik.js → chat-DahEFTcT.js} +2 -2
  36. package/dist/web/public/assets/{chat-BazMi-ik.js.map → chat-DahEFTcT.js.map} +1 -1
  37. package/dist/web/public/assets/{chevron-left-Di1Tz64J.js → chevron-left-CaGOVECz.js} +2 -2
  38. package/dist/web/public/assets/{chevron-left-Di1Tz64J.js.map → chevron-left-CaGOVECz.js.map} +1 -1
  39. package/dist/web/public/assets/{chevron-right-BLjhBkqs.js → chevron-right-BX3t8KY3.js} +2 -2
  40. package/dist/web/public/assets/{chevron-right-BLjhBkqs.js.map → chevron-right-BX3t8KY3.js.map} +1 -1
  41. package/dist/web/public/assets/{circle-check-BaxzYLlE.js → circle-check-BGjJhA0M.js} +2 -2
  42. package/dist/web/public/assets/{circle-check-BaxzYLlE.js.map → circle-check-BGjJhA0M.js.map} +1 -1
  43. package/dist/web/public/assets/{circle-check-big-C4BGLUvw.js → circle-check-big-CkxzVtPL.js} +2 -2
  44. package/dist/web/public/assets/{circle-check-big-C4BGLUvw.js.map → circle-check-big-CkxzVtPL.js.map} +1 -1
  45. package/dist/web/public/assets/{circle-x-THl-PO3_.js → circle-x-BziROBzb.js} +2 -2
  46. package/dist/web/public/assets/{circle-x-THl-PO3_.js.map → circle-x-BziROBzb.js.map} +1 -1
  47. package/dist/web/public/assets/{clock-iitpdQjZ.js → clock-80yAmtz6.js} +2 -2
  48. package/dist/web/public/assets/{clock-iitpdQjZ.js.map → clock-80yAmtz6.js.map} +1 -1
  49. package/dist/web/public/assets/{confirm-dialog-r9HgkIYf.js → confirm-dialog-DAfv5d0M.js} +2 -2
  50. package/dist/web/public/assets/{confirm-dialog-r9HgkIYf.js.map → confirm-dialog-DAfv5d0M.js.map} +1 -1
  51. package/dist/web/public/assets/{copy-DwyF4MOL.js → copy-CDQUdNjG.js} +2 -2
  52. package/dist/web/public/assets/{copy-DwyF4MOL.js.map → copy-CDQUdNjG.js.map} +1 -1
  53. package/dist/web/public/assets/{data-table-B80M8zdu.js → data-table-B_sUmaE2.js} +2 -2
  54. package/dist/web/public/assets/{data-table-B80M8zdu.js.map → data-table-B_sUmaE2.js.map} +1 -1
  55. package/dist/web/public/assets/{dialog-fGS0IXOo.js → dialog-DGdHPiTV.js} +2 -2
  56. package/dist/web/public/assets/{dialog-fGS0IXOo.js.map → dialog-DGdHPiTV.js.map} +1 -1
  57. package/dist/web/public/assets/{download-5ihiF2Gj.js → download-CTWGQ8nD.js} +2 -2
  58. package/dist/web/public/assets/{download-5ihiF2Gj.js.map → download-CTWGQ8nD.js.map} +1 -1
  59. package/dist/web/public/assets/{email-LmRMqLRU.js → email-D0CbEk1s.js} +2 -2
  60. package/dist/web/public/assets/{email-LmRMqLRU.js.map → email-D0CbEk1s.js.map} +1 -1
  61. package/dist/web/public/assets/{empty-state-CrPnUC6d.js → empty-state-CtWM3HCj.js} +2 -2
  62. package/dist/web/public/assets/{empty-state-CrPnUC6d.js.map → empty-state-CtWM3HCj.js.map} +1 -1
  63. package/dist/web/public/assets/{external-link-DIJK1MAH.js → external-link-eCDEU3zh.js} +2 -2
  64. package/dist/web/public/assets/{external-link-DIJK1MAH.js.map → external-link-eCDEU3zh.js.map} +1 -1
  65. package/dist/web/public/assets/{eye-DJJw0Ald.js → eye-BwZbiu9G.js} +2 -2
  66. package/dist/web/public/assets/{eye-DJJw0Ald.js.map → eye-BwZbiu9G.js.map} +1 -1
  67. package/dist/web/public/assets/{facts-BzImxpJD.js → facts-CilmUyo5.js} +2 -2
  68. package/dist/web/public/assets/{facts-BzImxpJD.js.map → facts-CilmUyo5.js.map} +1 -1
  69. package/dist/web/public/assets/{goals-C6p21B9N.js → goals-ClMqJOcZ.js} +2 -2
  70. package/dist/web/public/assets/{goals-C6p21B9N.js.map → goals-ClMqJOcZ.js.map} +1 -1
  71. package/dist/web/public/assets/{health-D-ugz2Gp.js → health-2Gc6vytU.js} +2 -2
  72. package/dist/web/public/assets/{health-D-ugz2Gp.js.map → health-2Gc6vytU.js.map} +1 -1
  73. package/dist/web/public/assets/{heart-pulse-DlZXcdL0.js → heart-pulse-f2ZP4fOw.js} +2 -2
  74. package/dist/web/public/assets/{heart-pulse-DlZXcdL0.js.map → heart-pulse-f2ZP4fOw.js.map} +1 -1
  75. package/dist/web/public/assets/{heartbeat-DSasg-3y.js → heartbeat-T5ecNv9f.js} +2 -2
  76. package/dist/web/public/assets/{heartbeat-DSasg-3y.js.map → heartbeat-T5ecNv9f.js.map} +1 -1
  77. package/dist/web/public/assets/{hot-D67pYtaV.js → hot-hTf3IoT7.js} +2 -2
  78. package/dist/web/public/assets/{hot-D67pYtaV.js.map → hot-hTf3IoT7.js.map} +1 -1
  79. package/dist/web/public/assets/{index-CqwhfPlr.js → index-D4Np2s3l.js} +23 -23
  80. package/dist/web/public/assets/{index-CqwhfPlr.js.map → index-D4Np2s3l.js.map} +1 -1
  81. package/dist/web/public/assets/{installed-CrIsSoQE.js → installed-3B4RqrKw.js} +2 -2
  82. package/dist/web/public/assets/{installed-CrIsSoQE.js.map → installed-3B4RqrKw.js.map} +1 -1
  83. package/dist/web/public/assets/{jobs-yAwphb1W.js → jobs-rdZMVduE.js} +2 -2
  84. package/dist/web/public/assets/{jobs-yAwphb1W.js.map → jobs-rdZMVduE.js.map} +1 -1
  85. package/dist/web/public/assets/{layout-cacmfseo.js → layout-CwEKQhrq.js} +2 -2
  86. package/dist/web/public/assets/{layout-cacmfseo.js.map → layout-CwEKQhrq.js.map} +1 -1
  87. package/dist/web/public/assets/{layout-BXZKGQAk.js → layout-DdSyLqXe.js} +2 -2
  88. package/dist/web/public/assets/{layout-BXZKGQAk.js.map → layout-DdSyLqXe.js.map} +1 -1
  89. package/dist/web/public/assets/{layout-awbFImGg.js → layout-DwNsrPtD.js} +2 -2
  90. package/dist/web/public/assets/{layout-awbFImGg.js.map → layout-DwNsrPtD.js.map} +1 -1
  91. package/dist/web/public/assets/{layout-CrtmlC8G.js → layout-cfySH7sc.js} +2 -2
  92. package/dist/web/public/assets/{layout-CrtmlC8G.js.map → layout-cfySH7sc.js.map} +1 -1
  93. package/dist/web/public/assets/{layout-CL5HFvHN.js → layout-ofBlvFCx.js} +2 -2
  94. package/dist/web/public/assets/{layout-CL5HFvHN.js.map → layout-ofBlvFCx.js.map} +1 -1
  95. package/dist/web/public/assets/{llm-C19AX6q2.js → llm-CBLl38AB.js} +2 -2
  96. package/dist/web/public/assets/{llm-C19AX6q2.js.map → llm-CBLl38AB.js.map} +1 -1
  97. package/dist/web/public/assets/{loader-circle-U-jPjmeD.js → loader-circle-BfXi9R6u.js} +2 -2
  98. package/dist/web/public/assets/{loader-circle-U-jPjmeD.js.map → loader-circle-BfXi9R6u.js.map} +1 -1
  99. package/dist/web/public/assets/{map-pin-4rE1NK87.js → map-pin-E83IWTEe.js} +2 -2
  100. package/dist/web/public/assets/{map-pin-4rE1NK87.js.map → map-pin-E83IWTEe.js.map} +1 -1
  101. package/dist/web/public/assets/{mcp-B94wc6Vi.js → mcp-B-NKHX-f.js} +2 -2
  102. package/dist/web/public/assets/{mcp-B94wc6Vi.js.map → mcp-B-NKHX-f.js.map} +1 -1
  103. package/dist/web/public/assets/{memos-CrG4zgfI.js → memos-CuY8Ai7a.js} +2 -2
  104. package/dist/web/public/assets/{memos-CrG4zgfI.js.map → memos-CuY8Ai7a.js.map} +1 -1
  105. package/dist/web/public/assets/{messengers-UWarJd_C.js → messengers-DGnu7I6n.js} +2 -2
  106. package/dist/web/public/assets/{messengers-UWarJd_C.js.map → messengers-DGnu7I6n.js.map} +1 -1
  107. package/dist/web/public/assets/{mobile-QhAUKqcJ.js → mobile-o-Aa_7VP.js} +2 -2
  108. package/dist/web/public/assets/{mobile-QhAUKqcJ.js.map → mobile-o-Aa_7VP.js.map} +1 -1
  109. package/dist/web/public/assets/native-agent-Ivct8avv.js +22 -0
  110. package/dist/web/public/assets/native-agent-Ivct8avv.js.map +1 -0
  111. package/dist/web/public/assets/{network-l6l5gLHO.js → network-B48dL6Y7.js} +2 -2
  112. package/dist/web/public/assets/{network-l6l5gLHO.js.map → network-B48dL6Y7.js.map} +1 -1
  113. package/dist/web/public/assets/{outbox-BenX_yUQ.js → outbox-CQutJNfH.js} +2 -2
  114. package/dist/web/public/assets/{outbox-BenX_yUQ.js.map → outbox-CQutJNfH.js.map} +1 -1
  115. package/dist/web/public/assets/{pagination-B4g1CBsi.js → pagination-rJwdesRS.js} +2 -2
  116. package/dist/web/public/assets/{pagination-B4g1CBsi.js.map → pagination-rJwdesRS.js.map} +1 -1
  117. package/dist/web/public/assets/{persona--3cjtl9q.js → persona-DJO6f_q5.js} +2 -2
  118. package/dist/web/public/assets/{persona--3cjtl9q.js.map → persona-DJO6f_q5.js.map} +1 -1
  119. package/dist/web/public/assets/{plans-DsHtDRlS.js → plans-D-Nf-jL2.js} +2 -2
  120. package/dist/web/public/assets/{plans-DsHtDRlS.js.map → plans-D-Nf-jL2.js.map} +1 -1
  121. package/dist/web/public/assets/{play-BG0hyTnO.js → play-DqmSNGi8.js} +2 -2
  122. package/dist/web/public/assets/{play-BG0hyTnO.js.map → play-DqmSNGi8.js.map} +1 -1
  123. package/dist/web/public/assets/{plus-Dof9AQvU.js → plus-CxClG9H0.js} +2 -2
  124. package/dist/web/public/assets/{plus-Dof9AQvU.js.map → plus-CxClG9H0.js.map} +1 -1
  125. package/dist/web/public/assets/{policy-BzHy4WbV.js → policy-Mqe38uiR.js} +2 -2
  126. package/dist/web/public/assets/{policy-BzHy4WbV.js.map → policy-Mqe38uiR.js.map} +1 -1
  127. package/dist/web/public/assets/{qr-code-yD_ztCf6.js → qr-code-BAEZ2Sel.js} +2 -2
  128. package/dist/web/public/assets/{qr-code-yD_ztCf6.js.map → qr-code-BAEZ2Sel.js.map} +1 -1
  129. package/dist/web/public/assets/{refresh-ccw-CBiHL1tY.js → refresh-ccw-C7VT3MFu.js} +2 -2
  130. package/dist/web/public/assets/{refresh-ccw-CBiHL1tY.js.map → refresh-ccw-C7VT3MFu.js.map} +1 -1
  131. package/dist/web/public/assets/{reminders-CDJlFR2Y.js → reminders--pCTIhTv.js} +2 -2
  132. package/dist/web/public/assets/{reminders-CDJlFR2Y.js.map → reminders--pCTIhTv.js.map} +1 -1
  133. package/dist/web/public/assets/{save-DVHI3V6o.js → save-B18KQmEd.js} +2 -2
  134. package/dist/web/public/assets/{save-DVHI3V6o.js.map → save-B18KQmEd.js.map} +1 -1
  135. package/dist/web/public/assets/{schedules-DYf64Fpr.js → schedules-CA4eHggo.js} +2 -2
  136. package/dist/web/public/assets/{schedules-DYf64Fpr.js.map → schedules-CA4eHggo.js.map} +1 -1
  137. package/dist/web/public/assets/{search-BYPDbBkC.js → search-CA_pO63g.js} +2 -2
  138. package/dist/web/public/assets/{search-BYPDbBkC.js.map → search-CA_pO63g.js.map} +1 -1
  139. package/dist/web/public/assets/{search-aw0y39Qs.js → search-ChcW6uXM.js} +2 -2
  140. package/dist/web/public/assets/{search-aw0y39Qs.js.map → search-ChcW6uXM.js.map} +1 -1
  141. package/dist/web/public/assets/{security-DhN1kRac.js → security-CeW9WxQO.js} +2 -2
  142. package/dist/web/public/assets/{security-DhN1kRac.js.map → security-CeW9WxQO.js.map} +1 -1
  143. package/dist/web/public/assets/{service-BhvI7Mb5.js → service-CJRR2q7Q.js} +2 -2
  144. package/dist/web/public/assets/{service-BhvI7Mb5.js.map → service-CJRR2q7Q.js.map} +1 -1
  145. package/dist/web/public/assets/{shield-alert-DjqqnTMk.js → shield-alert-0q3ul8GH.js} +2 -2
  146. package/dist/web/public/assets/{shield-alert-DjqqnTMk.js.map → shield-alert-0q3ul8GH.js.map} +1 -1
  147. package/dist/web/public/assets/{status-badge-nSFUUEfy.js → status-badge-CN17QMv6.js} +2 -2
  148. package/dist/web/public/assets/{status-badge-nSFUUEfy.js.map → status-badge-CN17QMv6.js.map} +1 -1
  149. package/dist/web/public/assets/{subtasks-C_x1RLJA.js → subtasks-gjO9Hf1a.js} +2 -2
  150. package/dist/web/public/assets/{subtasks-C_x1RLJA.js.map → subtasks-gjO9Hf1a.js.map} +1 -1
  151. package/dist/web/public/assets/{table-BNqo2xb8.js → table-C4P3KPbF.js} +2 -2
  152. package/dist/web/public/assets/{table-BNqo2xb8.js.map → table-C4P3KPbF.js.map} +1 -1
  153. package/dist/web/public/assets/{topn-NGtwNz38.js → topn-BMw-Uy1R.js} +2 -2
  154. package/dist/web/public/assets/{topn-NGtwNz38.js.map → topn-BMw-Uy1R.js.map} +1 -1
  155. package/dist/web/public/assets/{trash-2-BoFq2ZOF.js → trash-2-DOV8CHL9.js} +2 -2
  156. package/dist/web/public/assets/{trash-2-BoFq2ZOF.js.map → trash-2-DOV8CHL9.js.map} +1 -1
  157. package/dist/web/public/assets/{use-background-tasks-CY2gWPBZ.js → use-background-tasks-CgZBaDBR.js} +2 -2
  158. package/dist/web/public/assets/{use-background-tasks-CY2gWPBZ.js.map → use-background-tasks-CgZBaDBR.js.map} +1 -1
  159. package/dist/web/public/assets/{use-llm-admin-CA5tUbEU.js → use-llm-admin-BNwZKmJ9.js} +2 -2
  160. package/dist/web/public/assets/{use-llm-admin-CA5tUbEU.js.map → use-llm-admin-BNwZKmJ9.js.map} +1 -1
  161. package/dist/web/public/assets/{use-memory-CxasvYqR.js → use-memory-D4ViUoXw.js} +2 -2
  162. package/dist/web/public/assets/{use-memory-CxasvYqR.js.map → use-memory-D4ViUoXw.js.map} +1 -1
  163. package/dist/web/public/assets/{use-observability-BOepIjX5.js → use-observability-DJYRVPKp.js} +2 -2
  164. package/dist/web/public/assets/{use-observability-BOepIjX5.js.map → use-observability-DJYRVPKp.js.map} +1 -1
  165. package/dist/web/public/assets/{use-settings-DBXvAYm9.js → use-settings-XXVWFAv6.js} +2 -2
  166. package/dist/web/public/assets/{use-settings-DBXvAYm9.js.map → use-settings-XXVWFAv6.js.map} +1 -1
  167. package/dist/web/public/assets/{use-workspace-dw_69jpb.js → use-workspace-BgEM7e1m.js} +2 -2
  168. package/dist/web/public/assets/{use-workspace-dw_69jpb.js.map → use-workspace-BgEM7e1m.js.map} +1 -1
  169. package/dist/web/public/assets/{useQuery-Ds6-WURB.js → useQuery-B25CPtUF.js} +2 -2
  170. package/dist/web/public/assets/{useQuery-Ds6-WURB.js.map → useQuery-B25CPtUF.js.map} +1 -1
  171. package/dist/web/public/assets/{vector-C5WBAtlL.js → vector-Dh4Sp_ea.js} +2 -2
  172. package/dist/web/public/assets/{vector-C5WBAtlL.js.map → vector-Dh4Sp_ea.js.map} +1 -1
  173. package/dist/web/public/assets/{viewer-DQG9P7-t.js → viewer-B1vINzWu.js} +2 -2
  174. package/dist/web/public/assets/{viewer-DQG9P7-t.js.map → viewer-B1vINzWu.js.map} +1 -1
  175. package/dist/web/public/assets/{workspace-Dku83Qqr.js → workspace-uGVMiBxd.js} +2 -2
  176. package/dist/web/public/assets/{workspace-Dku83Qqr.js.map → workspace-uGVMiBxd.js.map} +1 -1
  177. package/dist/web/public/assets/{workspaces-ClLQ253x.js → workspaces-C8PjcrCq.js} +2 -2
  178. package/dist/web/public/assets/{workspaces-ClLQ253x.js.map → workspaces-C8PjcrCq.js.map} +1 -1
  179. package/dist/web/public/assets/{x-ClXUlQDe.js → x-CGfY-U_P.js} +2 -2
  180. package/dist/web/public/assets/{x-ClXUlQDe.js.map → x-CGfY-U_P.js.map} +1 -1
  181. package/dist/web/public/index.html +1 -1
  182. package/dist/web/server.js +3 -0
  183. package/dist/web/server.js.map +1 -1
  184. package/package.json +1 -1
  185. package/dist/web/public/assets/native-agent-DMf0u4dm.js +0 -22
  186. package/dist/web/public/assets/native-agent-DMf0u4dm.js.map +0 -1
@@ -1,7 +1,7 @@
1
- import{n as I,u as k,j as e,B as y,k as T,L as f,S as L,f as B,g as H,h as E,i as R,I as N,l as m}from"./index-CqwhfPlr.js";import{r as b}from"./react-Cb2sDjhD.js";import{T as _,a as $,b as U,c as j,d as z,e as g}from"./table-BNqo2xb8.js";import{u as q,a as F,b as M,c as O,d as V}from"./use-llm-admin-CA5tUbEU.js";import{L as K}from"./loader-circle-U-jPjmeD.js";import{R as D}from"./refresh-ccw-CBiHL1tY.js";import{T as W}from"./trash-2-BoFq2ZOF.js";import{P as Z}from"./plus-Dof9AQvU.js";import"./useQuery-Ds6-WURB.js";/**
1
+ import{n as I,u as k,j as e,B as y,k as T,L as f,S as L,f as B,g as H,h as E,i as R,I as N,l as m}from"./index-D4Np2s3l.js";import{r as b}from"./react-Cb2sDjhD.js";import{T as _,a as $,b as U,c as j,d as z,e as g}from"./table-C4P3KPbF.js";import{u as q,a as F,b as M,c as O,d as V}from"./use-llm-admin-BNwZKmJ9.js";import{L as K}from"./loader-circle-BfXi9R6u.js";import{R as D}from"./refresh-ccw-C7VT3MFu.js";import{T as W}from"./trash-2-DOV8CHL9.js";import{P as Z}from"./plus-CxClG9H0.js";import"./useQuery-B25CPtUF.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const Q=I("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),Y=["cheap","evaluator","native-chat"],P="__unbind__",w=["deepseek","moonshot","zhipu","openai","anthropic","custom"],v=[{provider:"openai-compat",baseUrl:"https://api.deepseek.com/v1",modelHint:"deepseek-chat"},{provider:"openai-compat",baseUrl:"https://api.moonshot.cn/v1",modelHint:"moonshot-v1-8k"},{provider:"openai-compat",baseUrl:"https://open.bigmodel.cn/api/paas/v4",modelHint:"glm-4-air"},{provider:"openai-compat",baseUrl:"https://api.openai.com/v1",modelHint:"gpt-4o-mini"},{provider:"anthropic",baseUrl:"https://api.anthropic.com/v1",modelHint:"claude-3-5-sonnet-20241022"},{provider:"openai-compat",baseUrl:"",modelHint:""}];function ce(){const{t:a}=k(["settings","common"]),s=q();return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-6",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:a("llm.title")}),e.jsxs(y,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void s.refetch(),disabled:s.isFetching,"aria-label":a("actions.refresh",{ns:"common"}),children:[s.isFetching?e.jsx(K,{className:"h-4 w-4 animate-spin"}):e.jsx(D,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:a("llm.refresh")})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:a("llm.subtitle")}),s.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx(G,{data:s.data}),e.jsx(J,{data:s.data}),e.jsx(X,{})]})]})}function G({data:a}){const{t:s}=k(["settings","common"]),x=F(),p=M(),[i,h]=b.useState({});async function r(t){if(confirm(s("llm.removeConfirm",{name:t})))try{const l=await x.mutateAsync(t);m.success(s("llm.removedToast",{count:l.removedRoles}))}catch(l){m.error(l?.message??String(l))}}async function o(t){h(l=>({...l,[t]:s("llm.pinging")}));try{const l=await p.mutateAsync(t),u=l.ok?`✓ ${l.durationMs}ms · tokens ${l.tokensIn}→${l.tokensOut}`:`✗ ${l.error}`;h(S=>({...S,[t]:u}))}catch(l){h(u=>({...u,[t]:`✗ ${l?.message??String(l)}`}))}}const d=a?.backends??[];return d.length===0?e.jsx("section",{className:"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim",children:s("llm.backendsEmpty")}):e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsx("header",{className:"border-b border-border px-4 py-3",children:e.jsx("h2",{className:"text-sm font-semibold",children:s("llm.backendsTitle",{count:d.length})})}),e.jsxs(_,{children:[e.jsx($,{children:e.jsxs(U,{children:[e.jsx(j,{children:s("llm.col.name")}),e.jsx(j,{children:s("llm.col.provider")}),e.jsx(j,{children:s("llm.col.model")}),e.jsx(j,{children:s("llm.col.baseUrl")}),e.jsx(j,{children:s("llm.col.apiKey")}),e.jsx(j,{children:s("llm.col.actions")})]})}),e.jsx(z,{children:d.map(t=>{const l=t.secret.source==="none"?e.jsx(T,{variant:"outline",children:s("llm.secretMissing")}):e.jsx(T,{variant:"success",children:t.secret.source});return e.jsxs(U,{children:[e.jsx(g,{className:"font-mono text-xs",children:t.name}),e.jsx(g,{children:t.provider}),e.jsx(g,{className:"font-mono text-xs",children:t.model}),e.jsx(g,{className:"break-all font-mono text-[11px] text-text-dim",children:t.baseUrl??"—"}),e.jsx(g,{children:l}),e.jsxs(g,{className:"flex flex-col gap-1 sm:flex-row sm:items-center",children:[e.jsxs(y,{variant:"ghost",size:"sm",onClick:()=>void o(t.name),disabled:p.isPending||t.secret.source==="none",title:t.secret.source==="none"?s("llm.setKeyFirst"):s("llm.pingHint"),children:[e.jsx(Q,{className:"h-4 w-4"}),e.jsx("span",{children:s("llm.ping")})]}),e.jsxs(y,{variant:"ghost",size:"sm",onClick:()=>void r(t.name),disabled:x.isPending,className:"text-danger hover:text-danger",children:[e.jsx(W,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("llm.remove")})]}),i[t.name]&&e.jsx("span",{className:"ml-2 text-[11px] text-text-dim",children:i[t.name]})]})]},t.name)})})]})]})}function J({data:a}){const{t:s}=k(["settings","common"]),x=O(),p=(a?.backends??[]).map(r=>r.name),i=a?.roles??{};async function h(r,o){const d={[r]:o===P?null:o};try{await x.mutateAsync(d),m.success(s("llm.roleUpdated",{role:r}))}catch(t){m.error(t?.message??String(t))}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsx("header",{className:"border-b border-border px-4 py-3",children:e.jsx("h2",{className:"text-sm font-semibold",children:s("llm.rolesTitle")})}),e.jsx("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3",children:Y.map(r=>e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(f,{className:"text-xs font-medium",children:r}),e.jsxs(L,{value:i[r]??P,onValueChange:o=>void h(r,o),disabled:p.length===0||x.isPending,children:[e.jsx(B,{className:"font-mono text-xs",children:e.jsx(H,{placeholder:s("llm.unset")})}),e.jsxs(E,{children:[e.jsx(R,{value:P,children:s("llm.unbound")}),p.map(o=>e.jsx(R,{value:o,children:o},o))]})]}),e.jsx("p",{className:"text-[11px] text-text-dim",children:s(`llm.roleHint.${r}`)})]},r))})]})}function X(){const{t:a}=k(["settings","common"]),s=V(),[x,p]=b.useState(0),[i,h]=b.useState(""),[r,o]=b.useState(v[0]?.baseUrl??""),[d,t]=b.useState(v[0]?.modelHint??""),[l,u]=b.useState("");function S(n){p(n);const c=v[n];c&&(o(c.baseUrl),t(c.modelHint))}async function A(n){n.preventDefault();const c=v[x];if(!c){m.error(a("llm.invalidPreset"));return}if(!i.trim()){m.error(a("llm.nameRequired"));return}if(!r.trim()){m.error(a("llm.baseUrlRequired"));return}if(!d.trim()){m.error(a("llm.modelRequired"));return}try{await s.mutateAsync({name:i.trim(),provider:c.provider,baseUrl:r.trim(),model:d.trim(),...l.trim()?{apiKey:l.trim()}:{}}),m.success(l.trim()?a("llm.addedWithKey",{name:i.trim()}):a("llm.addedNoKey",{name:i.trim()})),h(""),u("")}catch(C){m.error(C?.message??String(C))}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsx("header",{className:"border-b border-border px-4 py-3",children:e.jsx("h2",{className:"text-sm font-semibold",children:a("llm.addTitle")})}),e.jsxs("form",{onSubmit:n=>void A(n),className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(f,{className:"text-xs font-medium",children:a("llm.preset")}),e.jsxs(L,{value:String(x),onValueChange:n=>S(Number(n)),children:[e.jsx(B,{children:e.jsx(H,{})}),e.jsx(E,{children:v.map((n,c)=>e.jsx(R,{value:String(c),children:a(`llm.presets.${w[c]}`)},w[c]))})]})]}),e.jsxs("div",{children:[e.jsx(f,{className:"text-xs font-medium",children:a("llm.name")}),e.jsx(N,{value:i,onChange:n=>h(n.target.value),placeholder:a("llm.namePlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(f,{className:"text-xs font-medium",children:a("llm.baseUrl")}),e.jsx(N,{value:r,onChange:n=>o(n.target.value),placeholder:a("llm.baseUrlPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(f,{className:"text-xs font-medium",children:a("llm.model")}),e.jsx(N,{value:d,onChange:n=>t(n.target.value),placeholder:a("llm.modelPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(f,{className:"text-xs font-medium",children:a("llm.apiKeyOptional")}),e.jsx(N,{type:"password",value:l,onChange:n=>u(n.target.value),placeholder:a("llm.apiKeyPlaceholder"),className:"font-mono text-xs",autoComplete:"off"})]}),e.jsx("div",{className:"sm:col-span-2 flex",children:e.jsxs(y,{type:"submit",disabled:s.isPending,className:"ml-auto",children:[s.isPending?e.jsx(K,{className:"h-4 w-4 animate-spin"}):e.jsx(Z,{className:"h-4 w-4"}),a("llm.addBackend")]})})]})]})}export{ce as default};
7
- //# sourceMappingURL=llm-C19AX6q2.js.map
7
+ //# sourceMappingURL=llm-CBLl38AB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-C19AX6q2.js","sources":["../../node_modules/lucide-react/dist/esm/icons/zap.js","../../src/routes/settings/llm.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Zap = createLucideIcon(\"Zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n","/**\n * /settings/llm — native LLM backends + role bindings (Stage 6).\n *\n * Front-end for the `/api/llm/*` REST surface that landed in Stage 4.\n * Operators add an OpenAI-compatible or Anthropic backend, paste an\n * API key, bind it to a role (cheap / evaluator / native-chat), and\n * ping-test the connection — all without hand-editing\n * ~/.agim/config.json.\n *\n * Intentionally minimal styling — focused on doing the job; matches\n * the existing settings pages' shadcn look without bespoke chrome.\n */\n\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { CheckCircle2, Loader2, Plus, RefreshCcw, Trash2, Zap } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n} from '@/components/ui/select'\nimport {\n Table, TableBody, TableCell, TableHead, TableHeader, TableRow,\n} from '@/components/ui/table'\nimport {\n useLlmList, useLlmAddBackend, useLlmRemoveBackend, useLlmPutRoles, useLlmPing,\n} from '@/hooks/use-llm-admin'\n\nconst KNOWN_ROLES = ['cheap', 'evaluator', 'native-chat'] as const\nconst UNBIND_SENTINEL = '__unbind__'\n\ninterface ProviderPreset {\n provider: 'openai-compat' | 'anthropic'\n baseUrl: string\n modelHint: string\n}\n\nconst PRESET_KEYS = ['deepseek', 'moonshot', 'zhipu', 'openai', 'anthropic', 'custom'] as const\n\nconst PRESETS: ProviderPreset[] = [\n { provider: 'openai-compat',\n baseUrl: 'https://api.deepseek.com/v1', modelHint: 'deepseek-chat' },\n { provider: 'openai-compat',\n baseUrl: 'https://api.moonshot.cn/v1', modelHint: 'moonshot-v1-8k' },\n { provider: 'openai-compat',\n baseUrl: 'https://open.bigmodel.cn/api/paas/v4', modelHint: 'glm-4-air' },\n { provider: 'openai-compat',\n baseUrl: 'https://api.openai.com/v1', modelHint: 'gpt-4o-mini' },\n { provider: 'anthropic',\n baseUrl: 'https://api.anthropic.com/v1', modelHint: 'claude-3-5-sonnet-20241022' },\n { provider: 'openai-compat',\n baseUrl: '', modelHint: '' },\n]\n\nexport default function SettingsLlmRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const listQuery = useLlmList()\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-6\">\n <header className=\"flex items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('llm.title')}</h1>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('llm.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('llm.subtitle')}</p>\n\n {listQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n <BackendsCard data={listQuery.data} />\n <RolesCard data={listQuery.data} />\n <AddBackendCard />\n </>\n )}\n </div>\n )\n}\n\n/* ─────────────── Backends list ─────────────── */\n\nfunction BackendsCard({ data }: { data: ReturnType<typeof useLlmList>['data'] }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const removeBackend = useLlmRemoveBackend()\n const ping = useLlmPing()\n const [pingResults, setPingResults] = useState<Record<string, string>>({})\n\n async function onRemove(name: string): Promise<void> {\n if (!confirm(t('llm.removeConfirm', { name }))) return\n try {\n const r = await removeBackend.mutateAsync(name)\n toast.success(t('llm.removedToast', { count: r.removedRoles }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n async function onPing(name: string): Promise<void> {\n setPingResults((m) => ({ ...m, [name]: t('llm.pinging') }))\n try {\n const r = await ping.mutateAsync(name)\n const msg = r.ok\n ? `✓ ${r.durationMs}ms · tokens ${r.tokensIn}→${r.tokensOut}`\n : `✗ ${r.error}`\n setPingResults((m) => ({ ...m, [name]: msg }))\n } catch (err) {\n setPingResults((m) => ({ ...m, [name]: `✗ ${((err as Error)?.message ?? String(err))}` }))\n }\n }\n\n const rows = data?.backends ?? []\n if (rows.length === 0) {\n return (\n <section className=\"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim\">\n {t('llm.backendsEmpty')}\n </section>\n )\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.backendsTitle', { count: rows.length })}</h2>\n </header>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('llm.col.name')}</TableHead>\n <TableHead>{t('llm.col.provider')}</TableHead>\n <TableHead>{t('llm.col.model')}</TableHead>\n <TableHead>{t('llm.col.baseUrl')}</TableHead>\n <TableHead>{t('llm.col.apiKey')}</TableHead>\n <TableHead>{t('llm.col.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((b) => {\n const keyBadge = b.secret.source === 'none'\n ? <Badge variant=\"outline\">{t('llm.secretMissing')}</Badge>\n : <Badge variant=\"success\">{b.secret.source}</Badge>\n return (\n <TableRow key={b.name}>\n <TableCell className=\"font-mono text-xs\">{b.name}</TableCell>\n <TableCell>{b.provider}</TableCell>\n <TableCell className=\"font-mono text-xs\">{b.model}</TableCell>\n <TableCell className=\"break-all font-mono text-[11px] text-text-dim\">{b.baseUrl ?? '—'}</TableCell>\n <TableCell>{keyBadge}</TableCell>\n <TableCell className=\"flex flex-col gap-1 sm:flex-row sm:items-center\">\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onPing(b.name)}\n disabled={ping.isPending || b.secret.source === 'none'}\n title={b.secret.source === 'none' ? t('llm.setKeyFirst') : t('llm.pingHint')}\n >\n <Zap className=\"h-4 w-4\" />\n <span>{t('llm.ping')}</span>\n </Button>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onRemove(b.name)}\n disabled={removeBackend.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <Trash2 className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{t('llm.remove')}</span>\n </Button>\n {pingResults[b.name] && (\n <span className=\"ml-2 text-[11px] text-text-dim\">{pingResults[b.name]}</span>\n )}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </section>\n )\n}\n\n/* ─────────────── Role bindings ─────────────── */\n\nfunction RolesCard({ data }: { data: ReturnType<typeof useLlmList>['data'] }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const putRoles = useLlmPutRoles()\n const backendNames = (data?.backends ?? []).map((b) => b.name)\n const current = data?.roles ?? {}\n\n async function onChangeRole(role: string, value: string): Promise<void> {\n const next: Record<string, string | null> = {\n [role]: value === UNBIND_SENTINEL ? null : value,\n }\n try {\n await putRoles.mutateAsync(next)\n toast.success(t('llm.roleUpdated', { role }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.rolesTitle')}</h2>\n </header>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3\">\n {KNOWN_ROLES.map((role) => (\n <div key={role} className=\"flex flex-col gap-1\">\n <Label className=\"text-xs font-medium\">{role}</Label>\n <Select\n value={current[role] ?? UNBIND_SENTINEL}\n onValueChange={(v) => void onChangeRole(role, v)}\n disabled={backendNames.length === 0 || putRoles.isPending}\n >\n <SelectTrigger className=\"font-mono text-xs\">\n <SelectValue placeholder={t('llm.unset')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={UNBIND_SENTINEL}>{t('llm.unbound')}</SelectItem>\n {backendNames.map((n) => (\n <SelectItem key={n} value={n}>{n}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-[11px] text-text-dim\">\n {t(`llm.roleHint.${role}`)}\n </p>\n </div>\n ))}\n </div>\n </section>\n )\n}\n\n/* ─────────────── Add backend form ─────────────── */\n\nfunction AddBackendCard(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const addBackend = useLlmAddBackend()\n const [presetIdx, setPresetIdx] = useState(0)\n const [name, setName] = useState('')\n const [baseUrl, setBaseUrl] = useState(PRESETS[0]?.baseUrl ?? '')\n const [model, setModel] = useState(PRESETS[0]?.modelHint ?? '')\n const [apiKey, setApiKey] = useState('')\n\n function onPickPreset(idx: number): void {\n setPresetIdx(idx)\n const p = PRESETS[idx]\n if (!p) return\n setBaseUrl(p.baseUrl)\n setModel(p.modelHint)\n }\n\n async function onSubmit(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n const p = PRESETS[presetIdx]\n if (!p) { toast.error(t('llm.invalidPreset')); return }\n if (!name.trim()) { toast.error(t('llm.nameRequired')); return }\n if (!baseUrl.trim()) { toast.error(t('llm.baseUrlRequired')); return }\n if (!model.trim()) { toast.error(t('llm.modelRequired')); return }\n try {\n await addBackend.mutateAsync({\n name: name.trim(),\n provider: p.provider,\n baseUrl: baseUrl.trim(),\n model: model.trim(),\n ...(apiKey.trim() ? { apiKey: apiKey.trim() } : {}),\n })\n toast.success(\n apiKey.trim()\n ? t('llm.addedWithKey', { name: name.trim() })\n : t('llm.addedNoKey', { name: name.trim() }),\n )\n setName(''); setApiKey('')\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.addTitle')}</h2>\n </header>\n <form onSubmit={(e) => void onSubmit(e)} className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.preset')}</Label>\n <Select value={String(presetIdx)} onValueChange={(v) => onPickPreset(Number(v))}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {PRESETS.map((_p, i) => (\n <SelectItem key={PRESET_KEYS[i]} value={String(i)}>\n {t(`llm.presets.${PRESET_KEYS[i]}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.name')}</Label>\n <Input\n value={name} onChange={(e) => setName(e.target.value)}\n placeholder={t('llm.namePlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div className=\"sm:col-span-2\">\n <Label className=\"text-xs font-medium\">{t('llm.baseUrl')}</Label>\n <Input\n value={baseUrl} onChange={(e) => setBaseUrl(e.target.value)}\n placeholder={t('llm.baseUrlPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.model')}</Label>\n <Input\n value={model} onChange={(e) => setModel(e.target.value)}\n placeholder={t('llm.modelPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.apiKeyOptional')}</Label>\n <Input\n type=\"password\"\n value={apiKey} onChange={(e) => setApiKey(e.target.value)}\n placeholder={t('llm.apiKeyPlaceholder')}\n className=\"font-mono text-xs\"\n autoComplete=\"off\"\n />\n </div>\n <div className=\"sm:col-span-2 flex\">\n <Button\n type=\"submit\"\n disabled={addBackend.isPending}\n className=\"ml-auto\"\n >\n {addBackend.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Plus className=\"h-4 w-4\" />}\n {t('llm.addBackend')}\n </Button>\n </div>\n </form>\n </section>\n )\n}\n\n/* helper — toast tag passthrough */\nfunction _unused(): typeof CheckCircle2 { return CheckCircle2 }\nvoid _unused\n"],"names":["Zap","createLucideIcon","KNOWN_ROLES","UNBIND_SENTINEL","PRESET_KEYS","PRESETS","SettingsLlmRoute","t","useTranslation","listQuery","useLlmList","jsxs","jsx","Button","Loader2","RefreshCcw","Fragment","BackendsCard","RolesCard","AddBackendCard","data","removeBackend","useLlmRemoveBackend","ping","useLlmPing","pingResults","setPingResults","useState","onRemove","name","r","toast","err","onPing","m","msg","rows","Table","TableHeader","TableRow","TableHead","TableBody","b","keyBadge","Badge","TableCell","Trash2","putRoles","useLlmPutRoles","backendNames","current","onChangeRole","role","value","next","Label","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","n","addBackend","useLlmAddBackend","presetIdx","setPresetIdx","setName","baseUrl","setBaseUrl","model","setModel","apiKey","setApiKey","onPickPreset","idx","p","onSubmit","e","_p","i","Input","Plus"],"mappings":"ygBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAMC,EAAiB,MAAO,CAClC,CACE,OACA,CACE,EAAG,8JACH,IAAK,QACX,CACA,CACA,CAAC,ECeKC,EAAc,CAAC,QAAS,YAAa,aAAa,EAClDC,EAAkB,aAQlBC,EAAc,CAAC,WAAY,WAAY,QAAS,SAAU,YAAa,QAAQ,EAE/EC,EAA4B,CAChC,CAAE,SAAU,gBACV,QAAS,8BAA+B,UAAW,eAAA,EACrD,CAAE,SAAU,gBACV,QAAS,6BAA8B,UAAW,gBAAA,EACpD,CAAE,SAAU,gBACV,QAAS,uCAAwC,UAAW,WAAA,EAC9D,CAAE,SAAU,gBACV,QAAS,4BAA6B,UAAW,aAAA,EACnD,CAAE,SAAU,YACV,QAAS,+BAAgC,UAAW,4BAAA,EACtD,CAAE,SAAU,gBACV,QAAS,GAAI,UAAW,EAAA,CAC5B,EAEA,SAAwBC,IAAgC,CACtD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,CAAC,WAAY,QAAQ,CAAC,EAC7CC,EAAYC,EAAA,EAClB,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,0BAChB,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAL,EAAE,WAAW,EAAE,EACtDI,EAAAA,KAACE,EAAA,CACC,QAAQ,QAAQ,KAAK,KAAK,UAAU,UACpC,QAAS,IAAM,KAAKJ,EAAU,QAAA,EAC9B,SAAUA,EAAU,WACpB,aAAYF,EAAE,kBAAmB,CAAE,GAAI,SAAU,EAEhD,SAAA,CAAAE,EAAU,iBACNK,EAAA,CAAQ,UAAU,uBAAuB,EAC1CF,EAAAA,IAACG,EAAA,CAAW,UAAU,SAAA,CAAU,QACnC,OAAA,CAAK,UAAU,mBAAoB,SAAAR,EAAE,aAAa,CAAA,CAAE,CAAA,CAAA,CAAA,CACvD,EACF,QACC,IAAA,CAAE,UAAU,wBAAyB,SAAAA,EAAE,cAAc,EAAE,EAEvDE,EAAU,UACTG,MAAC,OAAI,UAAU,4CAAA,CAA6C,EAE5DD,EAAAA,KAAAK,EAAAA,SAAA,CACE,SAAA,CAAAJ,EAAAA,IAACK,EAAA,CAAa,KAAMR,EAAU,IAAA,CAAM,EACpCG,EAAAA,IAACM,EAAA,CAAU,KAAMT,EAAU,IAAA,CAAM,QAChCU,EAAA,CAAA,CAAe,CAAA,CAAA,CAClB,CAAA,EAEJ,CAEJ,CAIA,SAASF,EAAa,CAAE,KAAAG,GAAsE,CAC5F,KAAM,CAAE,EAAAb,CAAA,EAAMC,EAAe,CAAC,WAAY,QAAQ,CAAC,EAC7Ca,EAAgBC,EAAA,EAChBC,EAAOC,EAAA,EACP,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAAiC,CAAA,CAAE,EAEzE,eAAeC,EAASC,EAA6B,CACnD,GAAK,QAAQtB,EAAE,oBAAqB,CAAE,KAAAsB,CAAA,CAAM,CAAC,EAC7C,GAAI,CACF,MAAMC,EAAI,MAAMT,EAAc,YAAYQ,CAAI,EAC9CE,EAAM,QAAQxB,EAAE,mBAAoB,CAAE,MAAOuB,EAAE,YAAA,CAAc,CAAC,CAChE,OAASE,EAAK,CACZD,EAAM,MAAQC,GAAe,SAAW,OAAOA,CAAG,CAAE,CACtD,CACF,CAEA,eAAeC,EAAOJ,EAA6B,CACjDH,EAAgBQ,IAAO,CAAE,GAAGA,EAAG,CAACL,CAAI,EAAGtB,EAAE,aAAa,CAAA,EAAI,EAC1D,GAAI,CACF,MAAMuB,EAAI,MAAMP,EAAK,YAAYM,CAAI,EAC/BM,EAAML,EAAE,GACV,KAAKA,EAAE,UAAU,eAAeA,EAAE,QAAQ,IAAIA,EAAE,SAAS,GACzD,KAAKA,EAAE,KAAK,GAChBJ,EAAgBQ,IAAO,CAAE,GAAGA,EAAG,CAACL,CAAI,EAAGM,CAAA,EAAM,CAC/C,OAASH,EAAK,CACZN,EAAgBQ,IAAO,CAAE,GAAGA,EAAG,CAACL,CAAI,EAAG,KAAOG,GAAe,SAAW,OAAOA,CAAG,CAAE,IAAK,CAC3F,CACF,CAEA,MAAMI,EAAOhB,GAAM,UAAY,CAAA,EAC/B,OAAIgB,EAAK,SAAW,QAEf,UAAA,CAAQ,UAAU,mFAChB,SAAA7B,EAAE,mBAAmB,EACxB,EAKFI,EAAAA,KAAC,UAAA,CAAQ,UAAU,6CACjB,SAAA,CAAAC,MAAC,SAAA,CAAO,UAAU,mCAChB,SAAAA,EAAAA,IAAC,MAAG,UAAU,wBAAyB,SAAAL,EAAE,oBAAqB,CAAE,MAAO6B,EAAK,MAAA,CAAQ,EAAE,EACxF,SACCC,EAAA,CACC,SAAA,CAAAzB,EAAAA,IAAC0B,EAAA,CACC,gBAACC,EAAA,CACC,SAAA,CAAA3B,EAAAA,IAAC4B,EAAA,CAAW,SAAAjC,EAAE,cAAc,CAAA,CAAE,EAC9BK,EAAAA,IAAC4B,EAAA,CAAW,SAAAjC,EAAE,kBAAkB,CAAA,CAAE,EAClCK,EAAAA,IAAC4B,EAAA,CAAW,SAAAjC,EAAE,eAAe,CAAA,CAAE,EAC/BK,EAAAA,IAAC4B,EAAA,CAAW,SAAAjC,EAAE,iBAAiB,CAAA,CAAE,EACjCK,EAAAA,IAAC4B,EAAA,CAAW,SAAAjC,EAAE,gBAAgB,CAAA,CAAE,EAChCK,EAAAA,IAAC4B,EAAA,CAAW,SAAAjC,EAAE,iBAAiB,CAAA,CAAE,CAAA,CAAA,CACnC,CAAA,CACF,EACAK,EAAAA,IAAC6B,EAAA,CACE,SAAAL,EAAK,IAAKM,GAAM,CACf,MAAMC,EAAWD,EAAE,OAAO,SAAW,OACjC9B,EAAAA,IAACgC,GAAM,QAAQ,UAAW,WAAE,mBAAmB,EAAE,EACjDhC,MAACgC,EAAA,CAAM,QAAQ,UAAW,SAAAF,EAAE,OAAO,MAAA,CAAO,EAC9C,cACGH,EAAA,CACC,SAAA,CAAA3B,EAAAA,IAACiC,EAAA,CAAU,UAAU,oBAAqB,SAAAH,EAAE,KAAK,EACjD9B,EAAAA,IAACiC,EAAA,CAAW,SAAAH,EAAE,QAAA,CAAS,EACvB9B,EAAAA,IAACiC,EAAA,CAAU,UAAU,oBAAqB,WAAE,MAAM,QACjDA,EAAA,CAAU,UAAU,gDAAiD,SAAAH,EAAE,SAAW,IAAI,EACvF9B,EAAAA,IAACiC,GAAW,SAAAF,CAAA,CAAS,EACrBhC,EAAAA,KAACkC,EAAA,CAAU,UAAU,kDACnB,SAAA,CAAAlC,EAAAA,KAACE,EAAA,CACC,QAAQ,QAAQ,KAAK,KACrB,QAAS,IAAM,KAAKoB,EAAOS,EAAE,IAAI,EACjC,SAAUnB,EAAK,WAAamB,EAAE,OAAO,SAAW,OAChD,MAAOA,EAAE,OAAO,SAAW,OAASnC,EAAE,iBAAiB,EAAIA,EAAE,cAAc,EAE3E,SAAA,CAAAK,EAAAA,IAACZ,EAAA,CAAI,UAAU,SAAA,CAAU,EACzBY,EAAAA,IAAC,OAAA,CAAM,SAAAL,EAAE,UAAU,CAAA,CAAE,CAAA,CAAA,CAAA,EAEvBI,EAAAA,KAACE,EAAA,CACC,QAAQ,QAAQ,KAAK,KACrB,QAAS,IAAM,KAAKe,EAASc,EAAE,IAAI,EACnC,SAAUrB,EAAc,UACxB,UAAU,gCAEV,SAAA,CAAAT,EAAAA,IAACkC,EAAA,CAAO,UAAU,SAAA,CAAU,QAC3B,OAAA,CAAK,UAAU,mBAAoB,SAAAvC,EAAE,YAAY,CAAA,CAAE,CAAA,CAAA,CAAA,EAErDkB,EAAYiB,EAAE,IAAI,GACjB9B,EAAAA,IAAC,OAAA,CAAK,UAAU,iCAAkC,SAAAa,EAAYiB,EAAE,IAAI,CAAA,CAAE,CAAA,CAAA,CAE1E,CAAA,CAAA,EA5BaA,EAAE,IA6BjB,CAEJ,CAAC,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,CAEJ,CAIA,SAASxB,EAAU,CAAE,KAAAE,GAAsE,CACzF,KAAM,CAAE,EAAAb,CAAA,EAAMC,EAAe,CAAC,WAAY,QAAQ,CAAC,EAC7CuC,EAAWC,EAAA,EACXC,GAAgB7B,GAAM,UAAY,CAAA,GAAI,IAAKsB,GAAMA,EAAE,IAAI,EACvDQ,EAAU9B,GAAM,OAAS,CAAA,EAE/B,eAAe+B,EAAaC,EAAcC,EAA8B,CACtE,MAAMC,EAAsC,CAC1C,CAACF,CAAI,EAAGC,IAAUlD,EAAkB,KAAOkD,CAAA,EAE7C,GAAI,CACF,MAAMN,EAAS,YAAYO,CAAI,EAC/BvB,EAAM,QAAQxB,EAAE,kBAAmB,CAAE,KAAA6C,CAAA,CAAM,CAAC,CAC9C,OAASpB,EAAK,CACZD,EAAM,MAAQC,GAAe,SAAW,OAAOA,CAAG,CAAE,CACtD,CACF,CAEA,OACErB,EAAAA,KAAC,UAAA,CAAQ,UAAU,6CACjB,SAAA,CAAAC,EAAAA,IAAC,SAAA,CAAO,UAAU,mCAChB,SAAAA,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAL,EAAE,gBAAgB,CAAA,CAAE,EAC7D,EACAK,EAAAA,IAAC,MAAA,CAAI,UAAU,4CACZ,SAAAV,EAAY,IAAKkD,GAChBzC,EAAAA,KAAC,MAAA,CAAe,UAAU,sBACxB,SAAA,CAAAC,EAAAA,IAAC2C,EAAA,CAAM,UAAU,sBAAuB,SAAAH,EAAK,EAC7CzC,EAAAA,KAAC6C,EAAA,CACC,MAAON,EAAQE,CAAI,GAAKjD,EACxB,cAAgBsD,GAAM,KAAKN,EAAaC,EAAMK,CAAC,EAC/C,SAAUR,EAAa,SAAW,GAAKF,EAAS,UAEhD,SAAA,CAAAnC,EAAAA,IAAC8C,EAAA,CAAc,UAAU,oBACvB,SAAA9C,EAAAA,IAAC+C,GAAY,YAAapD,EAAE,WAAW,CAAA,CAAG,CAAA,CAC5C,SACCqD,EAAA,CACC,SAAA,CAAAhD,MAACiD,EAAA,CAAW,MAAO1D,EAAkB,SAAAI,EAAE,aAAa,EAAE,EACrD0C,EAAa,IAAKa,GACjBlD,EAAAA,IAACiD,GAAmB,MAAOC,EAAI,SAAAA,CAAA,EAAdA,CAAgB,CAClC,CAAA,CAAA,CACH,CAAA,CAAA,CAAA,EAEFlD,EAAAA,IAAC,KAAE,UAAU,4BACV,WAAE,gBAAgBwC,CAAI,EAAE,CAAA,CAC3B,CAAA,CAAA,EAnBQA,CAoBV,CACD,CAAA,CACH,CAAA,EACF,CAEJ,CAIA,SAASjC,GAA8B,CACrC,KAAM,CAAE,EAAAZ,CAAA,EAAMC,EAAe,CAAC,WAAY,QAAQ,CAAC,EAC7CuD,EAAaC,EAAA,EACb,CAACC,EAAWC,CAAY,EAAIvC,EAAAA,SAAS,CAAC,EACtC,CAACE,EAAMsC,CAAO,EAAIxC,EAAAA,SAAS,EAAE,EAC7B,CAACyC,EAASC,CAAU,EAAI1C,EAAAA,SAAStB,EAAQ,CAAC,GAAG,SAAW,EAAE,EAC1D,CAACiE,EAAOC,CAAQ,EAAI5C,EAAAA,SAAStB,EAAQ,CAAC,GAAG,WAAa,EAAE,EACxD,CAACmE,EAAQC,CAAS,EAAI9C,EAAAA,SAAS,EAAE,EAEvC,SAAS+C,EAAaC,EAAmB,CACvCT,EAAaS,CAAG,EAChB,MAAMC,EAAIvE,EAAQsE,CAAG,EAChBC,IACLP,EAAWO,EAAE,OAAO,EACpBL,EAASK,EAAE,SAAS,EACtB,CAEA,eAAeC,EAASC,EAAmC,CACzDA,EAAE,eAAA,EACF,MAAMF,EAAIvE,EAAQ4D,CAAS,EAC3B,GAAI,CAACW,EAAG,CAAE7C,EAAM,MAAMxB,EAAE,mBAAmB,CAAC,EAAG,MAAO,CACtD,GAAI,CAACsB,EAAK,OAAQ,CAAEE,EAAM,MAAMxB,EAAE,kBAAkB,CAAC,EAAG,MAAO,CAC/D,GAAI,CAAC6D,EAAQ,OAAQ,CAAErC,EAAM,MAAMxB,EAAE,qBAAqB,CAAC,EAAG,MAAO,CACrE,GAAI,CAAC+D,EAAM,OAAQ,CAAEvC,EAAM,MAAMxB,EAAE,mBAAmB,CAAC,EAAG,MAAO,CACjE,GAAI,CACF,MAAMwD,EAAW,YAAY,CAC3B,KAAMlC,EAAK,KAAA,EACX,SAAU+C,EAAE,SACZ,QAASR,EAAQ,KAAA,EACjB,MAAOE,EAAM,KAAA,EACb,GAAIE,EAAO,OAAS,CAAE,OAAQA,EAAO,KAAA,GAAW,CAAA,CAAC,CAClD,EACDzC,EAAM,QACJyC,EAAO,KAAA,EACHjE,EAAE,mBAAoB,CAAE,KAAMsB,EAAK,KAAA,EAAQ,EAC3CtB,EAAE,iBAAkB,CAAE,KAAMsB,EAAK,OAAQ,CAAA,EAE/CsC,EAAQ,EAAE,EAAGM,EAAU,EAAE,CAC3B,OAASzC,EAAK,CACZD,EAAM,MAAQC,GAAe,SAAW,OAAOA,CAAG,CAAE,CACtD,CACF,CAEA,OACErB,EAAAA,KAAC,UAAA,CAAQ,UAAU,6CACjB,SAAA,CAAAC,EAAAA,IAAC,SAAA,CAAO,UAAU,mCAChB,SAAAA,EAAAA,IAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAL,EAAE,cAAc,CAAA,CAAE,EAC3D,EACAI,EAAAA,KAAC,OAAA,CAAK,SAAWmE,GAAM,KAAKD,EAASC,CAAC,EAAG,UAAU,4CACjD,SAAA,CAAAnE,OAAC,MAAA,CACC,SAAA,CAAAC,MAAC2C,EAAA,CAAM,UAAU,sBAAuB,SAAAhD,EAAE,YAAY,EAAE,EACxDI,EAAAA,KAAC6C,EAAA,CAAO,MAAO,OAAOS,CAAS,EAAG,cAAgBR,GAAMiB,EAAa,OAAOjB,CAAC,CAAC,EAC5E,SAAA,CAAA7C,EAAAA,IAAC8C,EAAA,CAAc,SAAA9C,EAAAA,IAAC+C,EAAA,CAAA,CAAY,EAAE,EAC9B/C,EAAAA,IAACgD,EAAA,CACE,SAAAvD,EAAQ,IAAI,CAAC0E,EAAIC,IAChBpE,EAAAA,IAACiD,EAAA,CAAgC,MAAO,OAAOmB,CAAC,EAC7C,SAAAzE,EAAE,eAAeH,EAAY4E,CAAC,CAAC,EAAE,GADnB5E,EAAY4E,CAAC,CAE9B,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,EACF,SACC,MAAA,CACC,SAAA,CAAApE,MAAC2C,EAAA,CAAM,UAAU,sBAAuB,SAAAhD,EAAE,UAAU,EAAE,EACtDK,EAAAA,IAACqE,EAAA,CACC,MAAOpD,EAAM,SAAWiD,GAAMX,EAAQW,EAAE,OAAO,KAAK,EACpD,YAAavE,EAAE,qBAAqB,EACpC,UAAU,mBAAA,CAAA,CACZ,EACF,EACAI,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAC,MAAC2C,EAAA,CAAM,UAAU,sBAAuB,SAAAhD,EAAE,aAAa,EAAE,EACzDK,EAAAA,IAACqE,EAAA,CACC,MAAOb,EAAS,SAAWU,GAAMT,EAAWS,EAAE,OAAO,KAAK,EAC1D,YAAavE,EAAE,wBAAwB,EACvC,UAAU,mBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAK,MAAC2C,EAAA,CAAM,UAAU,sBAAuB,SAAAhD,EAAE,WAAW,EAAE,EACvDK,EAAAA,IAACqE,EAAA,CACC,MAAOX,EAAO,SAAWQ,GAAMP,EAASO,EAAE,OAAO,KAAK,EACtD,YAAavE,EAAE,sBAAsB,EACrC,UAAU,mBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAK,MAAC2C,EAAA,CAAM,UAAU,sBAAuB,SAAAhD,EAAE,oBAAoB,EAAE,EAChEK,EAAAA,IAACqE,EAAA,CACC,KAAK,WACL,MAAOT,EAAQ,SAAWM,GAAML,EAAUK,EAAE,OAAO,KAAK,EACxD,YAAavE,EAAE,uBAAuB,EACtC,UAAU,oBACV,aAAa,KAAA,CAAA,CACf,EACF,EACAK,EAAAA,IAAC,MAAA,CAAI,UAAU,qBACb,SAAAD,EAAAA,KAACE,EAAA,CACC,KAAK,SACL,SAAUkD,EAAW,UACrB,UAAU,UAET,SAAA,CAAAA,EAAW,gBAAajD,EAAA,CAAQ,UAAU,uBAAuB,EAAKF,EAAAA,IAACsE,EAAA,CAAK,UAAU,SAAA,CAAU,EAChG3E,EAAE,gBAAgB,CAAA,CAAA,CAAA,CACrB,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"llm-CBLl38AB.js","sources":["../../node_modules/lucide-react/dist/esm/icons/zap.js","../../src/routes/settings/llm.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Zap = createLucideIcon(\"Zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n","/**\n * /settings/llm — native LLM backends + role bindings (Stage 6).\n *\n * Front-end for the `/api/llm/*` REST surface that landed in Stage 4.\n * Operators add an OpenAI-compatible or Anthropic backend, paste an\n * API key, bind it to a role (cheap / evaluator / native-chat), and\n * ping-test the connection — all without hand-editing\n * ~/.agim/config.json.\n *\n * Intentionally minimal styling — focused on doing the job; matches\n * the existing settings pages' shadcn look without bespoke chrome.\n */\n\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { CheckCircle2, Loader2, Plus, RefreshCcw, Trash2, Zap } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n} from '@/components/ui/select'\nimport {\n Table, TableBody, TableCell, TableHead, TableHeader, TableRow,\n} from '@/components/ui/table'\nimport {\n useLlmList, useLlmAddBackend, useLlmRemoveBackend, useLlmPutRoles, useLlmPing,\n} from '@/hooks/use-llm-admin'\n\nconst KNOWN_ROLES = ['cheap', 'evaluator', 'native-chat'] as const\nconst UNBIND_SENTINEL = '__unbind__'\n\ninterface ProviderPreset {\n provider: 'openai-compat' | 'anthropic'\n baseUrl: string\n modelHint: string\n}\n\nconst PRESET_KEYS = ['deepseek', 'moonshot', 'zhipu', 'openai', 'anthropic', 'custom'] as const\n\nconst PRESETS: ProviderPreset[] = [\n { provider: 'openai-compat',\n baseUrl: 'https://api.deepseek.com/v1', modelHint: 'deepseek-chat' },\n { provider: 'openai-compat',\n baseUrl: 'https://api.moonshot.cn/v1', modelHint: 'moonshot-v1-8k' },\n { provider: 'openai-compat',\n baseUrl: 'https://open.bigmodel.cn/api/paas/v4', modelHint: 'glm-4-air' },\n { provider: 'openai-compat',\n baseUrl: 'https://api.openai.com/v1', modelHint: 'gpt-4o-mini' },\n { provider: 'anthropic',\n baseUrl: 'https://api.anthropic.com/v1', modelHint: 'claude-3-5-sonnet-20241022' },\n { provider: 'openai-compat',\n baseUrl: '', modelHint: '' },\n]\n\nexport default function SettingsLlmRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const listQuery = useLlmList()\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-6\">\n <header className=\"flex items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('llm.title')}</h1>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('llm.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('llm.subtitle')}</p>\n\n {listQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n <BackendsCard data={listQuery.data} />\n <RolesCard data={listQuery.data} />\n <AddBackendCard />\n </>\n )}\n </div>\n )\n}\n\n/* ─────────────── Backends list ─────────────── */\n\nfunction BackendsCard({ data }: { data: ReturnType<typeof useLlmList>['data'] }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const removeBackend = useLlmRemoveBackend()\n const ping = useLlmPing()\n const [pingResults, setPingResults] = useState<Record<string, string>>({})\n\n async function onRemove(name: string): Promise<void> {\n if (!confirm(t('llm.removeConfirm', { name }))) return\n try {\n const r = await removeBackend.mutateAsync(name)\n toast.success(t('llm.removedToast', { count: r.removedRoles }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n async function onPing(name: string): Promise<void> {\n setPingResults((m) => ({ ...m, [name]: t('llm.pinging') }))\n try {\n const r = await ping.mutateAsync(name)\n const msg = r.ok\n ? `✓ ${r.durationMs}ms · tokens ${r.tokensIn}→${r.tokensOut}`\n : `✗ ${r.error}`\n setPingResults((m) => ({ ...m, [name]: msg }))\n } catch (err) {\n setPingResults((m) => ({ ...m, [name]: `✗ ${((err as Error)?.message ?? String(err))}` }))\n }\n }\n\n const rows = data?.backends ?? []\n if (rows.length === 0) {\n return (\n <section className=\"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim\">\n {t('llm.backendsEmpty')}\n </section>\n )\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.backendsTitle', { count: rows.length })}</h2>\n </header>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('llm.col.name')}</TableHead>\n <TableHead>{t('llm.col.provider')}</TableHead>\n <TableHead>{t('llm.col.model')}</TableHead>\n <TableHead>{t('llm.col.baseUrl')}</TableHead>\n <TableHead>{t('llm.col.apiKey')}</TableHead>\n <TableHead>{t('llm.col.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((b) => {\n const keyBadge = b.secret.source === 'none'\n ? <Badge variant=\"outline\">{t('llm.secretMissing')}</Badge>\n : <Badge variant=\"success\">{b.secret.source}</Badge>\n return (\n <TableRow key={b.name}>\n <TableCell className=\"font-mono text-xs\">{b.name}</TableCell>\n <TableCell>{b.provider}</TableCell>\n <TableCell className=\"font-mono text-xs\">{b.model}</TableCell>\n <TableCell className=\"break-all font-mono text-[11px] text-text-dim\">{b.baseUrl ?? '—'}</TableCell>\n <TableCell>{keyBadge}</TableCell>\n <TableCell className=\"flex flex-col gap-1 sm:flex-row sm:items-center\">\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onPing(b.name)}\n disabled={ping.isPending || b.secret.source === 'none'}\n title={b.secret.source === 'none' ? t('llm.setKeyFirst') : t('llm.pingHint')}\n >\n <Zap className=\"h-4 w-4\" />\n <span>{t('llm.ping')}</span>\n </Button>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onRemove(b.name)}\n disabled={removeBackend.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <Trash2 className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{t('llm.remove')}</span>\n </Button>\n {pingResults[b.name] && (\n <span className=\"ml-2 text-[11px] text-text-dim\">{pingResults[b.name]}</span>\n )}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </section>\n )\n}\n\n/* ─────────────── Role bindings ─────────────── */\n\nfunction RolesCard({ data }: { data: ReturnType<typeof useLlmList>['data'] }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const putRoles = useLlmPutRoles()\n const backendNames = (data?.backends ?? []).map((b) => b.name)\n const current = data?.roles ?? {}\n\n async function onChangeRole(role: string, value: string): Promise<void> {\n const next: Record<string, string | null> = {\n [role]: value === UNBIND_SENTINEL ? null : value,\n }\n try {\n await putRoles.mutateAsync(next)\n toast.success(t('llm.roleUpdated', { role }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.rolesTitle')}</h2>\n </header>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3\">\n {KNOWN_ROLES.map((role) => (\n <div key={role} className=\"flex flex-col gap-1\">\n <Label className=\"text-xs font-medium\">{role}</Label>\n <Select\n value={current[role] ?? UNBIND_SENTINEL}\n onValueChange={(v) => void onChangeRole(role, v)}\n disabled={backendNames.length === 0 || putRoles.isPending}\n >\n <SelectTrigger className=\"font-mono text-xs\">\n <SelectValue placeholder={t('llm.unset')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={UNBIND_SENTINEL}>{t('llm.unbound')}</SelectItem>\n {backendNames.map((n) => (\n <SelectItem key={n} value={n}>{n}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-[11px] text-text-dim\">\n {t(`llm.roleHint.${role}`)}\n </p>\n </div>\n ))}\n </div>\n </section>\n )\n}\n\n/* ─────────────── Add backend form ─────────────── */\n\nfunction AddBackendCard(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const addBackend = useLlmAddBackend()\n const [presetIdx, setPresetIdx] = useState(0)\n const [name, setName] = useState('')\n const [baseUrl, setBaseUrl] = useState(PRESETS[0]?.baseUrl ?? '')\n const [model, setModel] = useState(PRESETS[0]?.modelHint ?? '')\n const [apiKey, setApiKey] = useState('')\n\n function onPickPreset(idx: number): void {\n setPresetIdx(idx)\n const p = PRESETS[idx]\n if (!p) return\n setBaseUrl(p.baseUrl)\n setModel(p.modelHint)\n }\n\n async function onSubmit(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n const p = PRESETS[presetIdx]\n if (!p) { toast.error(t('llm.invalidPreset')); return }\n if (!name.trim()) { toast.error(t('llm.nameRequired')); return }\n if (!baseUrl.trim()) { toast.error(t('llm.baseUrlRequired')); return }\n if (!model.trim()) { toast.error(t('llm.modelRequired')); return }\n try {\n await addBackend.mutateAsync({\n name: name.trim(),\n provider: p.provider,\n baseUrl: baseUrl.trim(),\n model: model.trim(),\n ...(apiKey.trim() ? { apiKey: apiKey.trim() } : {}),\n })\n toast.success(\n apiKey.trim()\n ? t('llm.addedWithKey', { name: name.trim() })\n : t('llm.addedNoKey', { name: name.trim() }),\n )\n setName(''); setApiKey('')\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.addTitle')}</h2>\n </header>\n <form onSubmit={(e) => void onSubmit(e)} className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.preset')}</Label>\n <Select value={String(presetIdx)} onValueChange={(v) => onPickPreset(Number(v))}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {PRESETS.map((_p, i) => (\n <SelectItem key={PRESET_KEYS[i]} value={String(i)}>\n {t(`llm.presets.${PRESET_KEYS[i]}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.name')}</Label>\n <Input\n value={name} onChange={(e) => setName(e.target.value)}\n placeholder={t('llm.namePlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div className=\"sm:col-span-2\">\n <Label className=\"text-xs font-medium\">{t('llm.baseUrl')}</Label>\n <Input\n value={baseUrl} onChange={(e) => setBaseUrl(e.target.value)}\n placeholder={t('llm.baseUrlPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.model')}</Label>\n <Input\n value={model} onChange={(e) => setModel(e.target.value)}\n placeholder={t('llm.modelPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.apiKeyOptional')}</Label>\n <Input\n type=\"password\"\n value={apiKey} onChange={(e) => setApiKey(e.target.value)}\n placeholder={t('llm.apiKeyPlaceholder')}\n className=\"font-mono text-xs\"\n autoComplete=\"off\"\n />\n </div>\n <div className=\"sm:col-span-2 flex\">\n <Button\n type=\"submit\"\n disabled={addBackend.isPending}\n className=\"ml-auto\"\n >\n {addBackend.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Plus className=\"h-4 w-4\" />}\n {t('llm.addBackend')}\n </Button>\n </div>\n </form>\n </section>\n )\n}\n\n/* helper — toast tag passthrough */\nfunction _unused(): typeof CheckCircle2 { return CheckCircle2 }\nvoid _unused\n"],"names":["Zap","createLucideIcon","KNOWN_ROLES","UNBIND_SENTINEL","PRESET_KEYS","PRESETS","SettingsLlmRoute","t","useTranslation","listQuery","useLlmList","jsxs","jsx","Button","Loader2","RefreshCcw","Fragment","BackendsCard","RolesCard","AddBackendCard","data","removeBackend","useLlmRemoveBackend","ping","useLlmPing","pingResults","setPingResults","useState","onRemove","name","r","toast","err","onPing","m","msg","rows","Table","TableHeader","TableRow","TableHead","TableBody","b","keyBadge","Badge","TableCell","Trash2","putRoles","useLlmPutRoles","backendNames","current","onChangeRole","role","value","next","Label","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","n","addBackend","useLlmAddBackend","presetIdx","setPresetIdx","setName","baseUrl","setBaseUrl","model","setModel","apiKey","setApiKey","onPickPreset","idx","p","onSubmit","e","_p","i","Input","Plus"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,7 +1,7 @@
1
- import{n as e}from"./index-CqwhfPlr.js";/**
1
+ import{n as e}from"./index-D4Np2s3l.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const r=e("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);export{r as L};
7
- //# sourceMappingURL=loader-circle-U-jPjmeD.js.map
7
+ //# sourceMappingURL=loader-circle-BfXi9R6u.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader-circle-U-jPjmeD.js","sources":["../../node_modules/lucide-react/dist/esm/icons/loader-circle.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n"],"names":["LoaderCircle","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,8BAA+B,IAAK,QAAQ,CAAE,CAC9D,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"loader-circle-BfXi9R6u.js","sources":["../../node_modules/lucide-react/dist/esm/icons/loader-circle.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n"],"names":["LoaderCircle","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,8BAA+B,IAAK,QAAQ,CAAE,CAC9D,CAAC","x_google_ignoreList":[0]}
@@ -1,7 +1,7 @@
1
- import{n as c}from"./index-CqwhfPlr.js";/**
1
+ import{n as c}from"./index-D4Np2s3l.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const r=c("MapPin",[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);export{r as M};
7
- //# sourceMappingURL=map-pin-4rE1NK87.js.map
7
+ //# sourceMappingURL=map-pin-E83IWTEe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-pin-4rE1NK87.js","sources":["../../node_modules/lucide-react/dist/esm/icons/map-pin.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst MapPin = createLucideIcon(\"MapPin\", [\n [\n \"path\",\n {\n d: \"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\",\n key: \"1r0f0z\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"10\", r: \"3\", key: \"ilqhr7\" }]\n]);\n\nexport { MapPin as default };\n//# sourceMappingURL=map-pin.js.map\n"],"names":["MapPin","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CACE,OACA,CACE,EAAG,uGACH,IAAK,QACX,CACA,EACE,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAQ,CAAE,CAC1D,CAAC","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"map-pin-E83IWTEe.js","sources":["../../node_modules/lucide-react/dist/esm/icons/map-pin.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst MapPin = createLucideIcon(\"MapPin\", [\n [\n \"path\",\n {\n d: \"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\",\n key: \"1r0f0z\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"10\", r: \"3\", key: \"ilqhr7\" }]\n]);\n\nexport { MapPin as default };\n//# sourceMappingURL=map-pin.js.map\n"],"names":["MapPin","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CACE,OACA,CACE,EAAG,uGACH,IAAK,QACX,CACA,EACE,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAQ,CAAE,CAC1D,CAAC","x_google_ignoreList":[0]}
@@ -1,7 +1,7 @@
1
- import{n as A,u as L,j as e,B as k,k as C,L as x,I as v,S as M,f as q,g as z,h as B,i as R,l as o}from"./index-CqwhfPlr.js";import{r as l}from"./react-Cb2sDjhD.js";import{T as F,a as I,b as H,c as b,d as O,e as N}from"./table-BNqo2xb8.js";import{e as $,f as E,g as D,h as J}from"./use-llm-admin-CA5tUbEU.js";import{L as P}from"./loader-circle-U-jPjmeD.js";import{R as V}from"./refresh-ccw-CBiHL1tY.js";import{A as U}from"./activity-Cckc7fGG.js";import{T as Q}from"./trash-2-BoFq2ZOF.js";import{P as W}from"./plus-Dof9AQvU.js";import"./useQuery-Ds6-WURB.js";/**
1
+ import{n as A,u as L,j as e,B as k,k as C,L as x,I as v,S as M,f as q,g as z,h as B,i as R,l as o}from"./index-D4Np2s3l.js";import{r as l}from"./react-Cb2sDjhD.js";import{T as F,a as I,b as H,c as b,d as O,e as N}from"./table-C4P3KPbF.js";import{e as $,f as E,g as D,h as J}from"./use-llm-admin-BNwZKmJ9.js";import{L as P}from"./loader-circle-BfXi9R6u.js";import{R as V}from"./refresh-ccw-C7VT3MFu.js";import{A as U}from"./activity-CbMd52BC.js";import{T as Q}from"./trash-2-DOV8CHL9.js";import{P as W}from"./plus-CxClG9H0.js";import"./useQuery-B25CPtUF.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
6
  */const G=A("ServerCog",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5",key:"tn8das"}],["path",{d:"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5",key:"1g2pve"}],["path",{d:"M6 6h.01",key:"1utrut"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"m15.7 13.4-.9-.3",key:"1jwmzr"}],["path",{d:"m9.2 10.9-.9-.3",key:"qapnim"}],["path",{d:"m10.6 15.7.3-.9",key:"quwk0k"}],["path",{d:"m13.6 15.7-.4-1",key:"cb9xp7"}],["path",{d:"m10.8 9.3-.4-1",key:"1uaiz5"}],["path",{d:"m8.3 13.6 1-.4",key:"s6srou"}],["path",{d:"m14.7 10.8 1-.4",key:"4d31cq"}],["path",{d:"m13.4 8.3-.3.9",key:"1bm987"}]]);function me(){const{t}=L(["settings","common"]),s=$();return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-6",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx(G,{className:"h-5 w-5 text-text-dim"}),e.jsx("h1",{className:"text-xl font-semibold",children:t("mcp.title")}),e.jsxs(k,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void s.refetch(),disabled:s.isFetching,"aria-label":t("actions.refresh",{ns:"common"}),children:[s.isFetching?e.jsx(P,{className:"h-4 w-4 animate-spin"}):e.jsx(V,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:t("mcp.refresh")})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:t("mcp.subtitle")}),s.isLoading?e.jsx("div",{className:"h-48 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx(K,{data:s.data}),e.jsx(Y,{})]})]})}function K({data:t}){const{t:s}=L(["settings","common"]),m=E(),p=D(),[i,u]=l.useState({});async function j(r){if(confirm(s("mcp.removeConfirm",{name:r})))try{await m.mutateAsync(r),o.success(s("mcp.removedToast",{name:r}))}catch(a){o.error(a?.message??String(a))}}async function y(r){u(a=>({...a,[r]:s("mcp.probing")}));try{const a=await p.mutateAsync(r),c=a.connected?`✓ ${a.toolCount===1?s("mcp.runtimeConnectedOne",{count:a.toolCount}):s("mcp.runtimeConnected",{count:a.toolCount})}`:`✗ ${a.lastError??s("mcp.runtimeDisconnected")}`;u(h=>({...h,[r]:c}))}catch(a){u(c=>({...c,[r]:`✗ ${a?.message??String(a)}`}))}}const d=t?.servers??[],S=t?.runtime?.servers??[];return d.length===0?e.jsx("section",{className:"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim",children:s("mcp.serversEmpty")}):e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx("h2",{className:"text-sm font-semibold",children:s("mcp.serversTitle",{count:d.length})}),t?.runtime&&e.jsx(C,{variant:"info",children:s("mcp.totalTools",{count:t.runtime.totalTools})})]}),e.jsxs(F,{children:[e.jsx(I,{children:e.jsxs(H,{children:[e.jsx(b,{children:s("mcp.col.name")}),e.jsx(b,{children:s("mcp.col.transport")}),e.jsx(b,{children:s("mcp.col.target")}),e.jsx(b,{children:s("mcp.col.runtime")}),e.jsx(b,{children:s("mcp.col.actions")})]})}),e.jsx(O,{children:d.map(r=>{const a=S.find(n=>n.name===r.name),c=X(r,s),h=r.command?`${r.command} ${(r.args??[]).join(" ")}`.trim():r.url??"—",w=a?a.connected?e.jsx(C,{variant:"success",children:a.toolCount===1?s("mcp.runtimeConnectedOne",{count:a.toolCount}):s("mcp.runtimeConnected",{count:a.toolCount})}):e.jsx(C,{variant:"danger",children:s("mcp.runtimeDisconnected")}):e.jsx(C,{variant:"outline",children:s("mcp.runtimeUnknown")});return e.jsxs(H,{children:[e.jsx(N,{className:"font-mono text-xs",children:r.name}),e.jsx(N,{children:c}),e.jsx(N,{className:"break-all font-mono text-[11px] text-text-dim",children:h}),e.jsx(N,{children:w}),e.jsxs(N,{className:"flex flex-col gap-1 sm:flex-row sm:items-center",children:[e.jsxs(k,{variant:"ghost",size:"sm",onClick:()=>void y(r.name),disabled:p.isPending,children:[e.jsx(U,{className:"h-4 w-4"}),e.jsx("span",{children:s("mcp.health")})]}),e.jsxs(k,{variant:"ghost",size:"sm",onClick:()=>void j(r.name),disabled:m.isPending,className:"text-danger hover:text-danger",children:[e.jsx(Q,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("mcp.remove")})]}),i[r.name]&&e.jsx("span",{className:"ml-2 text-[11px] text-text-dim",children:i[r.name]})]})]},r.name)})})]})]})}function X(t,s){return t.command?s("mcp.transportStdio"):t.url?t.url.endsWith("/sse")?s("mcp.transportSse"):s("mcp.transportHttp"):"—"}function Y(){const{t}=L(["settings","common"]),s=J(),[m,p]=l.useState(""),[i,u]=l.useState("stdio"),[j,y]=l.useState(""),[d,S]=l.useState(""),[r,a]=l.useState(""),[c,h]=l.useState("");async function w(n){if(n.preventDefault(),!m.trim()){o.error(t("mcp.nameRequired"));return}let T;if(c.trim())try{T=JSON.parse(c)}catch{o.error(t("mcp.headersInvalid"));return}const g={name:m.trim()};if(i==="stdio"){if(!j.trim()){o.error(t("mcp.commandRequired"));return}g.command=j.trim();const f=d.split(/\s+/).filter(Boolean);f.length>0&&(g.args=f)}else{if(!r.trim()){o.error(t("mcp.urlRequired"));return}g.url=r.trim(),T&&(g.headers=T)}try{await s.mutateAsync(g),o.success(t("mcp.addedToast",{name:m.trim()})),p(""),y(""),S(""),a(""),h("")}catch(f){o.error(f?.message??String(f))}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsx("header",{className:"border-b border-border px-4 py-3",children:e.jsx("h2",{className:"text-sm font-semibold",children:t("mcp.addTitle")})}),e.jsxs("form",{onSubmit:n=>void w(n),className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.nameLabel")}),e.jsx(v,{value:m,onChange:n=>p(n.target.value),placeholder:t("mcp.namePlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.transportLabel")}),e.jsxs(M,{value:i,onValueChange:n=>u(n),children:[e.jsx(q,{children:e.jsx(z,{})}),e.jsxs(B,{children:[e.jsx(R,{value:"stdio",children:t("mcp.transportStdioOption")}),e.jsx(R,{value:"http",children:t("mcp.transportHttpOption")})]})]})]}),i==="stdio"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.commandLabel")}),e.jsx(v,{value:j,onChange:n=>y(n.target.value),placeholder:t("mcp.commandPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.argsLabel")}),e.jsx(v,{value:d,onChange:n=>S(n.target.value),placeholder:"-y @modelcontextprotocol/server-filesystem /data",className:"font-mono text-xs"})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.urlLabel")}),e.jsx(v,{value:r,onChange:n=>a(n.target.value),placeholder:t("mcp.urlPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.headersLabel")}),e.jsx(v,{value:c,onChange:n=>h(n.target.value),placeholder:t("mcp.headersPlaceholder"),className:"font-mono text-xs"})]})]}),e.jsx("div",{className:"sm:col-span-2 flex",children:e.jsxs(k,{type:"submit",disabled:s.isPending,className:"ml-auto",children:[s.isPending?e.jsx(P,{className:"h-4 w-4 animate-spin"}):e.jsx(W,{className:"h-4 w-4"}),t("mcp.addServer")]})})]})]})}export{me as default};
7
- //# sourceMappingURL=mcp-B94wc6Vi.js.map
7
+ //# sourceMappingURL=mcp-B-NKHX-f.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-B94wc6Vi.js","sources":["../../node_modules/lucide-react/dist/esm/icons/server-cog.js","../../src/routes/settings/mcp.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ServerCog = createLucideIcon(\"ServerCog\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\n \"path\",\n {\n d: \"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5\",\n key: \"tn8das\"\n }\n ],\n [\n \"path\",\n {\n d: \"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5\",\n key: \"1g2pve\"\n }\n ],\n [\"path\", { d: \"M6 6h.01\", key: \"1utrut\" }],\n [\"path\", { d: \"M6 18h.01\", key: \"uhywen\" }],\n [\"path\", { d: \"m15.7 13.4-.9-.3\", key: \"1jwmzr\" }],\n [\"path\", { d: \"m9.2 10.9-.9-.3\", key: \"qapnim\" }],\n [\"path\", { d: \"m10.6 15.7.3-.9\", key: \"quwk0k\" }],\n [\"path\", { d: \"m13.6 15.7-.4-1\", key: \"cb9xp7\" }],\n [\"path\", { d: \"m10.8 9.3-.4-1\", key: \"1uaiz5\" }],\n [\"path\", { d: \"m8.3 13.6 1-.4\", key: \"s6srou\" }],\n [\"path\", { d: \"m14.7 10.8 1-.4\", key: \"4d31cq\" }],\n [\"path\", { d: \"m13.4 8.3-.3.9\", key: \"1bm987\" }]\n]);\n\nexport { ServerCog as default };\n//# sourceMappingURL=server-cog.js.map\n","/**\n * /settings/mcp — external MCP servers admin (Stage 6).\n *\n * Front-end for the `/api/mcp/*` REST surface. List configured servers,\n * see their connection status + tool count, add stdio / HTTP / SSE\n * servers, probe per-server health, remove.\n *\n * The native agent loop consumes any tools advertised here; CLI agents\n * have their own MCP configs and ignore this list. See\n * docs/llm-backends.md § External MCP servers.\n */\n\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Loader2, Plus, RefreshCcw, ServerCog, Trash2, Activity } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n} from '@/components/ui/select'\nimport {\n Table, TableBody, TableCell, TableHead, TableHeader, TableRow,\n} from '@/components/ui/table'\nimport {\n useMcpList, useMcpAddServer, useMcpRemoveServer, useMcpHealth,\n type McpServerRow,\n} from '@/hooks/use-llm-admin'\n\nexport default function SettingsMcpRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const listQuery = useMcpList()\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-6\">\n <header className=\"flex items-center gap-3\">\n <ServerCog className=\"h-5 w-5 text-text-dim\" />\n <h1 className=\"text-xl font-semibold\">{t('mcp.title')}</h1>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('mcp.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('mcp.subtitle')}</p>\n\n {listQuery.isLoading ? (\n <div className=\"h-48 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n <ServersCard data={listQuery.data} />\n <AddServerCard />\n </>\n )}\n </div>\n )\n}\n\n/* ─────────────── Servers list ─────────────── */\n\nfunction ServersCard({ data }: { data: ReturnType<typeof useMcpList>['data'] }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const removeServer = useMcpRemoveServer()\n const health = useMcpHealth()\n const [healthResults, setHealthResults] = useState<Record<string, string>>({})\n\n async function onRemove(name: string): Promise<void> {\n if (!confirm(t('mcp.removeConfirm', { name }))) return\n try {\n await removeServer.mutateAsync(name)\n toast.success(t('mcp.removedToast', { name }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n async function onHealth(name: string): Promise<void> {\n setHealthResults((m) => ({ ...m, [name]: t('mcp.probing') }))\n try {\n const r = await health.mutateAsync(name)\n const msg = r.connected\n ? `✓ ${r.toolCount === 1\n ? t('mcp.runtimeConnectedOne', { count: r.toolCount })\n : t('mcp.runtimeConnected', { count: r.toolCount })}`\n : `✗ ${r.lastError ?? t('mcp.runtimeDisconnected')}`\n setHealthResults((m) => ({ ...m, [name]: msg }))\n } catch (err) {\n setHealthResults((m) => ({ ...m, [name]: `✗ ${((err as Error)?.message ?? String(err))}` }))\n }\n }\n\n const rows = data?.servers ?? []\n const runtime = data?.runtime?.servers ?? []\n if (rows.length === 0) {\n return (\n <section className=\"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim\">\n {t('mcp.serversEmpty')}\n </section>\n )\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('mcp.serversTitle', { count: rows.length })}</h2>\n {data?.runtime && (\n <Badge variant=\"info\">{t('mcp.totalTools', { count: data.runtime.totalTools })}</Badge>\n )}\n </header>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('mcp.col.name')}</TableHead>\n <TableHead>{t('mcp.col.transport')}</TableHead>\n <TableHead>{t('mcp.col.target')}</TableHead>\n <TableHead>{t('mcp.col.runtime')}</TableHead>\n <TableHead>{t('mcp.col.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((s) => {\n const rt = runtime.find((r) => r.name === s.name)\n const transport = transportLabel(s, t)\n const target = s.command\n ? `${s.command} ${(s.args ?? []).join(' ')}`.trim()\n : (s.url ?? '—')\n const runtimeBadge = !rt\n ? <Badge variant=\"outline\">{t('mcp.runtimeUnknown')}</Badge>\n : rt.connected\n ? <Badge variant=\"success\">\n {rt.toolCount === 1\n ? t('mcp.runtimeConnectedOne', { count: rt.toolCount })\n : t('mcp.runtimeConnected', { count: rt.toolCount })}\n </Badge>\n : <Badge variant=\"danger\">{t('mcp.runtimeDisconnected')}</Badge>\n return (\n <TableRow key={s.name}>\n <TableCell className=\"font-mono text-xs\">{s.name}</TableCell>\n <TableCell>{transport}</TableCell>\n <TableCell className=\"break-all font-mono text-[11px] text-text-dim\">{target}</TableCell>\n <TableCell>{runtimeBadge}</TableCell>\n <TableCell className=\"flex flex-col gap-1 sm:flex-row sm:items-center\">\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onHealth(s.name)}\n disabled={health.isPending}\n >\n <Activity className=\"h-4 w-4\" />\n <span>{t('mcp.health')}</span>\n </Button>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onRemove(s.name)}\n disabled={removeServer.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <Trash2 className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{t('mcp.remove')}</span>\n </Button>\n {healthResults[s.name] && (\n <span className=\"ml-2 text-[11px] text-text-dim\">{healthResults[s.name]}</span>\n )}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </section>\n )\n}\n\nfunction transportLabel(\n s: McpServerRow,\n t: (key: string) => string,\n): string {\n if (s.command) return t('mcp.transportStdio')\n if (s.url) return s.url.endsWith('/sse') ? t('mcp.transportSse') : t('mcp.transportHttp')\n return '—'\n}\n\n/* ─────────────── Add server form ─────────────── */\n\nfunction AddServerCard(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const addServer = useMcpAddServer()\n const [name, setName] = useState('')\n const [transport, setTransport] = useState<'stdio' | 'http'>('stdio')\n const [command, setCommand] = useState('')\n const [args, setArgs] = useState('')\n const [url, setUrl] = useState('')\n const [headersJson, setHeadersJson] = useState('')\n\n async function onSubmit(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n if (!name.trim()) { toast.error(t('mcp.nameRequired')); return }\n let headers: Record<string, string> | undefined\n if (headersJson.trim()) {\n try { headers = JSON.parse(headersJson) }\n catch { toast.error(t('mcp.headersInvalid')); return }\n }\n const body: Parameters<typeof addServer.mutateAsync>[0] = { name: name.trim() }\n if (transport === 'stdio') {\n if (!command.trim()) { toast.error(t('mcp.commandRequired')); return }\n body.command = command.trim()\n const splitArgs = args.split(/\\s+/).filter(Boolean)\n if (splitArgs.length > 0) body.args = splitArgs\n } else {\n if (!url.trim()) { toast.error(t('mcp.urlRequired')); return }\n body.url = url.trim()\n if (headers) body.headers = headers\n }\n try {\n await addServer.mutateAsync(body)\n toast.success(t('mcp.addedToast', { name: name.trim() }))\n setName(''); setCommand(''); setArgs(''); setUrl(''); setHeadersJson('')\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('mcp.addTitle')}</h2>\n </header>\n <form onSubmit={(e) => void onSubmit(e)} className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <div>\n <Label className=\"text-xs font-medium\">{t('mcp.nameLabel')}</Label>\n <Input\n value={name} onChange={(e) => setName(e.target.value)}\n placeholder={t('mcp.namePlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('mcp.transportLabel')}</Label>\n <Select value={transport} onValueChange={(v) => setTransport(v as 'stdio' | 'http')}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"stdio\">{t('mcp.transportStdioOption')}</SelectItem>\n <SelectItem value=\"http\">{t('mcp.transportHttpOption')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n {transport === 'stdio' ? (\n <>\n <div>\n <Label className=\"text-xs font-medium\">{t('mcp.commandLabel')}</Label>\n <Input\n value={command} onChange={(e) => setCommand(e.target.value)}\n placeholder={t('mcp.commandPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('mcp.argsLabel')}</Label>\n <Input\n value={args} onChange={(e) => setArgs(e.target.value)}\n placeholder=\"-y @modelcontextprotocol/server-filesystem /data\"\n className=\"font-mono text-xs\"\n />\n </div>\n </>\n ) : (\n <>\n <div className=\"sm:col-span-2\">\n <Label className=\"text-xs font-medium\">{t('mcp.urlLabel')}</Label>\n <Input\n value={url} onChange={(e) => setUrl(e.target.value)}\n placeholder={t('mcp.urlPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div className=\"sm:col-span-2\">\n <Label className=\"text-xs font-medium\">{t('mcp.headersLabel')}</Label>\n <Input\n value={headersJson} onChange={(e) => setHeadersJson(e.target.value)}\n placeholder={t('mcp.headersPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n </>\n )}\n <div className=\"sm:col-span-2 flex\">\n <Button type=\"submit\" disabled={addServer.isPending} className=\"ml-auto\">\n {addServer.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Plus className=\"h-4 w-4\" />}\n {t('mcp.addServer')}\n </Button>\n </div>\n </form>\n </section>\n )\n}\n"],"names":["ServerCog","createLucideIcon","SettingsMcpRoute","useTranslation","listQuery","useMcpList","jsxs","jsx","Button","Loader2","RefreshCcw","Fragment","ServersCard","AddServerCard","data","t","removeServer","useMcpRemoveServer","health","useMcpHealth","healthResults","setHealthResults","useState","onRemove","name","toast","err","onHealth","m","r","msg","rows","runtime","Badge","Table","TableHeader","TableRow","TableHead","TableBody","s","rt","transport","transportLabel","target","runtimeBadge","TableCell","Activity","Trash2","addServer","useMcpAddServer","setName","setTransport","command","setCommand","args","setArgs","url","setUrl","headersJson","setHeadersJson","onSubmit","e","headers","body","splitArgs","Label","Input","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","Plus"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"mcp-B-NKHX-f.js","sources":["../../node_modules/lucide-react/dist/esm/icons/server-cog.js","../../src/routes/settings/mcp.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ServerCog = createLucideIcon(\"ServerCog\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\n \"path\",\n {\n d: \"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5\",\n key: \"tn8das\"\n }\n ],\n [\n \"path\",\n {\n d: \"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5\",\n key: \"1g2pve\"\n }\n ],\n [\"path\", { d: \"M6 6h.01\", key: \"1utrut\" }],\n [\"path\", { d: \"M6 18h.01\", key: \"uhywen\" }],\n [\"path\", { d: \"m15.7 13.4-.9-.3\", key: \"1jwmzr\" }],\n [\"path\", { d: \"m9.2 10.9-.9-.3\", key: \"qapnim\" }],\n [\"path\", { d: \"m10.6 15.7.3-.9\", key: \"quwk0k\" }],\n [\"path\", { d: \"m13.6 15.7-.4-1\", key: \"cb9xp7\" }],\n [\"path\", { d: \"m10.8 9.3-.4-1\", key: \"1uaiz5\" }],\n [\"path\", { d: \"m8.3 13.6 1-.4\", key: \"s6srou\" }],\n [\"path\", { d: \"m14.7 10.8 1-.4\", key: \"4d31cq\" }],\n [\"path\", { d: \"m13.4 8.3-.3.9\", key: \"1bm987\" }]\n]);\n\nexport { ServerCog as default };\n//# sourceMappingURL=server-cog.js.map\n","/**\n * /settings/mcp — external MCP servers admin (Stage 6).\n *\n * Front-end for the `/api/mcp/*` REST surface. List configured servers,\n * see their connection status + tool count, add stdio / HTTP / SSE\n * servers, probe per-server health, remove.\n *\n * The native agent loop consumes any tools advertised here; CLI agents\n * have their own MCP configs and ignore this list. See\n * docs/llm-backends.md § External MCP servers.\n */\n\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Loader2, Plus, RefreshCcw, ServerCog, Trash2, Activity } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n} from '@/components/ui/select'\nimport {\n Table, TableBody, TableCell, TableHead, TableHeader, TableRow,\n} from '@/components/ui/table'\nimport {\n useMcpList, useMcpAddServer, useMcpRemoveServer, useMcpHealth,\n type McpServerRow,\n} from '@/hooks/use-llm-admin'\n\nexport default function SettingsMcpRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const listQuery = useMcpList()\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-6\">\n <header className=\"flex items-center gap-3\">\n <ServerCog className=\"h-5 w-5 text-text-dim\" />\n <h1 className=\"text-xl font-semibold\">{t('mcp.title')}</h1>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('mcp.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('mcp.subtitle')}</p>\n\n {listQuery.isLoading ? (\n <div className=\"h-48 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n <ServersCard data={listQuery.data} />\n <AddServerCard />\n </>\n )}\n </div>\n )\n}\n\n/* ─────────────── Servers list ─────────────── */\n\nfunction ServersCard({ data }: { data: ReturnType<typeof useMcpList>['data'] }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const removeServer = useMcpRemoveServer()\n const health = useMcpHealth()\n const [healthResults, setHealthResults] = useState<Record<string, string>>({})\n\n async function onRemove(name: string): Promise<void> {\n if (!confirm(t('mcp.removeConfirm', { name }))) return\n try {\n await removeServer.mutateAsync(name)\n toast.success(t('mcp.removedToast', { name }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n async function onHealth(name: string): Promise<void> {\n setHealthResults((m) => ({ ...m, [name]: t('mcp.probing') }))\n try {\n const r = await health.mutateAsync(name)\n const msg = r.connected\n ? `✓ ${r.toolCount === 1\n ? t('mcp.runtimeConnectedOne', { count: r.toolCount })\n : t('mcp.runtimeConnected', { count: r.toolCount })}`\n : `✗ ${r.lastError ?? t('mcp.runtimeDisconnected')}`\n setHealthResults((m) => ({ ...m, [name]: msg }))\n } catch (err) {\n setHealthResults((m) => ({ ...m, [name]: `✗ ${((err as Error)?.message ?? String(err))}` }))\n }\n }\n\n const rows = data?.servers ?? []\n const runtime = data?.runtime?.servers ?? []\n if (rows.length === 0) {\n return (\n <section className=\"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim\">\n {t('mcp.serversEmpty')}\n </section>\n )\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('mcp.serversTitle', { count: rows.length })}</h2>\n {data?.runtime && (\n <Badge variant=\"info\">{t('mcp.totalTools', { count: data.runtime.totalTools })}</Badge>\n )}\n </header>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('mcp.col.name')}</TableHead>\n <TableHead>{t('mcp.col.transport')}</TableHead>\n <TableHead>{t('mcp.col.target')}</TableHead>\n <TableHead>{t('mcp.col.runtime')}</TableHead>\n <TableHead>{t('mcp.col.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((s) => {\n const rt = runtime.find((r) => r.name === s.name)\n const transport = transportLabel(s, t)\n const target = s.command\n ? `${s.command} ${(s.args ?? []).join(' ')}`.trim()\n : (s.url ?? '—')\n const runtimeBadge = !rt\n ? <Badge variant=\"outline\">{t('mcp.runtimeUnknown')}</Badge>\n : rt.connected\n ? <Badge variant=\"success\">\n {rt.toolCount === 1\n ? t('mcp.runtimeConnectedOne', { count: rt.toolCount })\n : t('mcp.runtimeConnected', { count: rt.toolCount })}\n </Badge>\n : <Badge variant=\"danger\">{t('mcp.runtimeDisconnected')}</Badge>\n return (\n <TableRow key={s.name}>\n <TableCell className=\"font-mono text-xs\">{s.name}</TableCell>\n <TableCell>{transport}</TableCell>\n <TableCell className=\"break-all font-mono text-[11px] text-text-dim\">{target}</TableCell>\n <TableCell>{runtimeBadge}</TableCell>\n <TableCell className=\"flex flex-col gap-1 sm:flex-row sm:items-center\">\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onHealth(s.name)}\n disabled={health.isPending}\n >\n <Activity className=\"h-4 w-4\" />\n <span>{t('mcp.health')}</span>\n </Button>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onRemove(s.name)}\n disabled={removeServer.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <Trash2 className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{t('mcp.remove')}</span>\n </Button>\n {healthResults[s.name] && (\n <span className=\"ml-2 text-[11px] text-text-dim\">{healthResults[s.name]}</span>\n )}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </section>\n )\n}\n\nfunction transportLabel(\n s: McpServerRow,\n t: (key: string) => string,\n): string {\n if (s.command) return t('mcp.transportStdio')\n if (s.url) return s.url.endsWith('/sse') ? t('mcp.transportSse') : t('mcp.transportHttp')\n return '—'\n}\n\n/* ─────────────── Add server form ─────────────── */\n\nfunction AddServerCard(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const addServer = useMcpAddServer()\n const [name, setName] = useState('')\n const [transport, setTransport] = useState<'stdio' | 'http'>('stdio')\n const [command, setCommand] = useState('')\n const [args, setArgs] = useState('')\n const [url, setUrl] = useState('')\n const [headersJson, setHeadersJson] = useState('')\n\n async function onSubmit(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n if (!name.trim()) { toast.error(t('mcp.nameRequired')); return }\n let headers: Record<string, string> | undefined\n if (headersJson.trim()) {\n try { headers = JSON.parse(headersJson) }\n catch { toast.error(t('mcp.headersInvalid')); return }\n }\n const body: Parameters<typeof addServer.mutateAsync>[0] = { name: name.trim() }\n if (transport === 'stdio') {\n if (!command.trim()) { toast.error(t('mcp.commandRequired')); return }\n body.command = command.trim()\n const splitArgs = args.split(/\\s+/).filter(Boolean)\n if (splitArgs.length > 0) body.args = splitArgs\n } else {\n if (!url.trim()) { toast.error(t('mcp.urlRequired')); return }\n body.url = url.trim()\n if (headers) body.headers = headers\n }\n try {\n await addServer.mutateAsync(body)\n toast.success(t('mcp.addedToast', { name: name.trim() }))\n setName(''); setCommand(''); setArgs(''); setUrl(''); setHeadersJson('')\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('mcp.addTitle')}</h2>\n </header>\n <form onSubmit={(e) => void onSubmit(e)} className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <div>\n <Label className=\"text-xs font-medium\">{t('mcp.nameLabel')}</Label>\n <Input\n value={name} onChange={(e) => setName(e.target.value)}\n placeholder={t('mcp.namePlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('mcp.transportLabel')}</Label>\n <Select value={transport} onValueChange={(v) => setTransport(v as 'stdio' | 'http')}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"stdio\">{t('mcp.transportStdioOption')}</SelectItem>\n <SelectItem value=\"http\">{t('mcp.transportHttpOption')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n {transport === 'stdio' ? (\n <>\n <div>\n <Label className=\"text-xs font-medium\">{t('mcp.commandLabel')}</Label>\n <Input\n value={command} onChange={(e) => setCommand(e.target.value)}\n placeholder={t('mcp.commandPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('mcp.argsLabel')}</Label>\n <Input\n value={args} onChange={(e) => setArgs(e.target.value)}\n placeholder=\"-y @modelcontextprotocol/server-filesystem /data\"\n className=\"font-mono text-xs\"\n />\n </div>\n </>\n ) : (\n <>\n <div className=\"sm:col-span-2\">\n <Label className=\"text-xs font-medium\">{t('mcp.urlLabel')}</Label>\n <Input\n value={url} onChange={(e) => setUrl(e.target.value)}\n placeholder={t('mcp.urlPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div className=\"sm:col-span-2\">\n <Label className=\"text-xs font-medium\">{t('mcp.headersLabel')}</Label>\n <Input\n value={headersJson} onChange={(e) => setHeadersJson(e.target.value)}\n placeholder={t('mcp.headersPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n </>\n )}\n <div className=\"sm:col-span-2 flex\">\n <Button type=\"submit\" disabled={addServer.isPending} className=\"ml-auto\">\n {addServer.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Plus className=\"h-4 w-4\" />}\n {t('mcp.addServer')}\n </Button>\n </div>\n </form>\n </section>\n )\n}\n"],"names":["ServerCog","createLucideIcon","SettingsMcpRoute","useTranslation","listQuery","useMcpList","jsxs","jsx","Button","Loader2","RefreshCcw","Fragment","ServersCard","AddServerCard","data","t","removeServer","useMcpRemoveServer","health","useMcpHealth","healthResults","setHealthResults","useState","onRemove","name","toast","err","onHealth","m","r","msg","rows","runtime","Badge","Table","TableHeader","TableRow","TableHead","TableBody","s","rt","transport","transportLabel","target","runtimeBadge","TableCell","Activity","Trash2","addServer","useMcpAddServer","setName","setTransport","command","setCommand","args","setArgs","url","setUrl","headersJson","setHeadersJson","onSubmit","e","headers","body","splitArgs","Label","Input","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","Plus"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import{n as Pe,s as he,t as Te,v as pe,j as o,P as T,w,x as U,y as Ae,z as Oe,A as xe,D as we,E as Ut,F as Bt,G as ke,H as oe,J as Vt,K as Yt,M as zt,Q as Ht,U as Wt,V as qt,W as Xt,X as Qt,Y as Zt,c as A,q as Jt,a as en,b as tn,d as Fe,u as Le,e as nn,k as on,B as Ie,T as rn,I as ue,L as Ee,l as Se,m as an}from"./index-CqwhfPlr.js";import{r as s}from"./react-Cb2sDjhD.js";import{D as sn}from"./data-table-B80M8zdu.js";import{E as cn}from"./empty-state-CrPnUC6d.js";import{C as ln}from"./confirm-dialog-r9HgkIYf.js";import{C as un}from"./chevron-right-BLjhBkqs.js";import{u as dn}from"./useQuery-Ds6-WURB.js";import{T as pn}from"./trash-2-BoFq2ZOF.js";import{R as fn}from"./refresh-ccw-CBiHL1tY.js";import{S as mn}from"./search-aw0y39Qs.js";import{M as hn}from"./map-pin-4rE1NK87.js";import"./table-BNqo2xb8.js";import"./arrow-up-NWC5K6Jw.js";import"./arrow-down-BkZ50IzL.js";import"./dialog-fGS0IXOo.js";import"./x-ClXUlQDe.js";/**
1
+ import{n as Pe,s as he,t as Te,v as pe,j as o,P as T,w,x as U,y as Ae,z as Oe,A as xe,D as we,E as Ut,F as Bt,G as ke,H as oe,J as Vt,K as Yt,M as zt,Q as Ht,U as Wt,V as qt,W as Xt,X as Qt,Y as Zt,c as A,q as Jt,a as en,b as tn,d as Fe,u as Le,e as nn,k as on,B as Ie,T as rn,I as ue,L as Ee,l as Se,m as an}from"./index-D4Np2s3l.js";import{r as s}from"./react-Cb2sDjhD.js";import{D as sn}from"./data-table-B_sUmaE2.js";import{E as cn}from"./empty-state-CtWM3HCj.js";import{C as ln}from"./confirm-dialog-DAfv5d0M.js";import{C as un}from"./chevron-right-BX3t8KY3.js";import{u as dn}from"./useQuery-B25CPtUF.js";import{T as pn}from"./trash-2-DOV8CHL9.js";import{R as fn}from"./refresh-ccw-C7VT3MFu.js";import{S as mn}from"./search-ChcW6uXM.js";import{M as hn}from"./map-pin-E83IWTEe.js";import"./table-C4P3KPbF.js";import"./arrow-up-BQxFty9k.js";import"./arrow-down-BpfVJViL.js";import"./dialog-DGdHPiTV.js";import"./x-CGfY-U_P.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -9,4 +9,4 @@ import{n as Pe,s as he,t as Te,v as pe,j as o,P as T,w,x as U,y as Ae,z as Oe,A
9
9
  * This source code is licensed under the ISC license.
10
10
  * See the LICENSE file in the root directory of this source tree.
11
11
  */const wn=Pe("NotebookText",[["path",{d:"M2 6h4",key:"aawbzj"}],["path",{d:"M2 10h4",key:"l0bgd4"}],["path",{d:"M2 14h4",key:"1gsvsf"}],["path",{d:"M2 18h4",key:"1bu2t1"}],["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",key:"1nb95v"}],["path",{d:"M9.5 8h5",key:"11mslq"}],["path",{d:"M9.5 12H16",key:"ktog6x"}],["path",{d:"M9.5 16H14",key:"p1seyn"}]]);var de="rovingFocusGroup.onEntryFocus",gn={bubbles:!1,cancelable:!0},X="RovingFocusGroup",[fe,Ge,vn]=Te(X),[Mn,Ke]=he(X,[vn]),[Cn,bn]=Mn(X),$e=s.forwardRef((e,t)=>o.jsx(fe.Provider,{scope:e.__scopeRovingFocusGroup,children:o.jsx(fe.Slot,{scope:e.__scopeRovingFocusGroup,children:o.jsx(yn,{...e,ref:t})})}));$e.displayName=X;var yn=s.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:a=!1,dir:c,currentTabStopId:l,defaultCurrentTabStopId:u,onCurrentTabStopIdChange:f,onEntryFocus:m,preventScrollOnEntryFocus:d=!1,...i}=e,x=s.useRef(null),M=U(t,x),g=Ae(c),[N,v]=Oe({prop:l,defaultProp:u??null,onChange:f,caller:X}),[C,P]=s.useState(!1),b=xe(m),I=Ge(n),O=s.useRef(!1),[p,_]=s.useState(0);return s.useEffect(()=>{const y=x.current;if(y)return y.addEventListener(de,b),()=>y.removeEventListener(de,b)},[b]),o.jsx(Cn,{scope:n,orientation:r,dir:g,loop:a,currentTabStopId:N,onItemFocus:s.useCallback(y=>v(y),[v]),onItemShiftTab:s.useCallback(()=>P(!0),[]),onFocusableItemAdd:s.useCallback(()=>_(y=>y+1),[]),onFocusableItemRemove:s.useCallback(()=>_(y=>y-1),[]),children:o.jsx(T.div,{tabIndex:C||p===0?-1:0,"data-orientation":r,...i,ref:M,style:{outline:"none",...e.style},onMouseDown:w(e.onMouseDown,()=>{O.current=!0}),onFocus:w(e.onFocus,y=>{const j=!O.current;if(y.target===y.currentTarget&&j&&!C){const k=new CustomEvent(de,gn);if(y.currentTarget.dispatchEvent(k),!k.defaultPrevented){const B=I().filter(D=>D.focusable),V=B.find(D=>D.active),J=B.find(D=>D.id===N),ce=[V,J,...B].filter(Boolean).map(D=>D.ref.current);Ve(ce,d)}}O.current=!1}),onBlur:w(e.onBlur,()=>P(!1))})})}),Ue="RovingFocusGroupItem",Be=s.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:a=!1,tabStopId:c,children:l,...u}=e,f=pe(),m=c||f,d=bn(Ue,n),i=d.currentTabStopId===m,x=Ge(n),{onFocusableItemAdd:M,onFocusableItemRemove:g,currentTabStopId:N}=d;return s.useEffect(()=>{if(r)return M(),()=>g()},[r,M,g]),o.jsx(fe.ItemSlot,{scope:n,id:m,focusable:r,active:a,children:o.jsx(T.span,{tabIndex:i?0:-1,"data-orientation":d.orientation,...u,ref:t,onMouseDown:w(e.onMouseDown,v=>{r?d.onItemFocus(m):v.preventDefault()}),onFocus:w(e.onFocus,()=>d.onItemFocus(m)),onKeyDown:w(e.onKeyDown,v=>{if(v.key==="Tab"&&v.shiftKey){d.onItemShiftTab();return}if(v.target!==v.currentTarget)return;const C=Nn(v,d.orientation,d.dir);if(C!==void 0){if(v.metaKey||v.ctrlKey||v.altKey||v.shiftKey)return;v.preventDefault();let b=x().filter(I=>I.focusable).map(I=>I.ref.current);if(C==="last")b.reverse();else if(C==="prev"||C==="next"){C==="prev"&&b.reverse();const I=b.indexOf(v.currentTarget);b=d.loop?In(b,I+1):b.slice(I+1)}setTimeout(()=>Ve(b))}}),children:typeof l=="function"?l({isCurrentTabStop:i,hasTabStop:N!=null}):l})})});Be.displayName=Ue;var _n={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function Rn(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function Nn(e,t,n){const r=Rn(e.key,n);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(r))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(r)))return _n[r]}function Ve(e,t=!1){const n=document.activeElement;for(const r of e)if(r===n||(r.focus({preventScroll:t}),document.activeElement!==n))return}function In(e,t){return e.map((n,r)=>e[(t+r)%e.length])}var En=$e,Sn=Be;function jn(e){const t=Dn(e),n=s.forwardRef((r,a)=>{const{children:c,...l}=r,u=s.Children.toArray(c),f=u.find(Tn);if(f){const m=f.props.children,d=u.map(i=>i===f?s.Children.count(m)>1?s.Children.only(null):s.isValidElement(m)?m.props.children:null:i);return o.jsx(t,{...l,ref:a,children:s.isValidElement(m)?s.cloneElement(m,void 0,d):null})}return o.jsx(t,{...l,ref:a,children:c})});return n.displayName=`${e}.Slot`,n}function Dn(e){const t=s.forwardRef((n,r)=>{const{children:a,...c}=n;if(s.isValidElement(a)){const l=On(a),u=An(c,a.props);return a.type!==s.Fragment&&(u.ref=r?we(r,l):l),s.cloneElement(a,u)}return s.Children.count(a)>1?s.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var Pn=Symbol("radix.slottable");function Tn(e){return s.isValidElement(e)&&typeof e.type=="function"&&"__radixId"in e.type&&e.type.__radixId===Pn}function An(e,t){const n={...t};for(const r in t){const a=e[r],c=t[r];/^on[A-Z]/.test(r)?a&&c?n[r]=(...u)=>{const f=c(...u);return a(...u),f}:a&&(n[r]=a):r==="style"?n[r]={...a,...c}:r==="className"&&(n[r]=[a,c].filter(Boolean).join(" "))}return{...e,...n}}function On(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var me=["Enter"," "],kn=["ArrowDown","PageUp","Home"],Ye=["ArrowUp","PageDown","End"],Fn=[...kn,...Ye],Ln={ltr:[...me,"ArrowRight"],rtl:[...me,"ArrowLeft"]},Gn={ltr:["ArrowLeft"],rtl:["ArrowRight"]},Q="Menu",[W,Kn,$n]=Te(Q),[L,ze]=he(Q,[$n,ke,Ke]),re=ke(),He=Ke(),[Un,G]=L(Q),[Bn,Z]=L(Q),We=e=>{const{__scopeMenu:t,open:n=!1,children:r,dir:a,onOpenChange:c,modal:l=!0}=e,u=re(t),[f,m]=s.useState(null),d=s.useRef(!1),i=xe(c),x=Ae(a);return s.useEffect(()=>{const M=()=>{d.current=!0,document.addEventListener("pointerdown",g,{capture:!0,once:!0}),document.addEventListener("pointermove",g,{capture:!0,once:!0})},g=()=>d.current=!1;return document.addEventListener("keydown",M,{capture:!0}),()=>{document.removeEventListener("keydown",M,{capture:!0}),document.removeEventListener("pointerdown",g,{capture:!0}),document.removeEventListener("pointermove",g,{capture:!0})}},[]),o.jsx(Ut,{...u,children:o.jsx(Un,{scope:t,open:n,onOpenChange:i,content:f,onContentChange:m,children:o.jsx(Bn,{scope:t,onClose:s.useCallback(()=>i(!1),[i]),isUsingKeyboardRef:d,dir:x,modal:l,children:r})})})};We.displayName=Q;var Vn="MenuAnchor",ge=s.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e,a=re(n);return o.jsx(Bt,{...a,...r,ref:t})});ge.displayName=Vn;var ve="MenuPortal",[Yn,qe]=L(ve,{forceMount:void 0}),Xe=e=>{const{__scopeMenu:t,forceMount:n,children:r,container:a}=e,c=G(ve,t);return o.jsx(Yn,{scope:t,forceMount:n,children:o.jsx(oe,{present:n||c.open,children:o.jsx(Vt,{asChild:!0,container:a,children:r})})})};Xe.displayName=ve;var S="MenuContent",[zn,Me]=L(S),Qe=s.forwardRef((e,t)=>{const n=qe(S,e.__scopeMenu),{forceMount:r=n.forceMount,...a}=e,c=G(S,e.__scopeMenu),l=Z(S,e.__scopeMenu);return o.jsx(W.Provider,{scope:e.__scopeMenu,children:o.jsx(oe,{present:r||c.open,children:o.jsx(W.Slot,{scope:e.__scopeMenu,children:l.modal?o.jsx(Hn,{...a,ref:t}):o.jsx(Wn,{...a,ref:t})})})})}),Hn=s.forwardRef((e,t)=>{const n=G(S,e.__scopeMenu),r=s.useRef(null),a=U(t,r);return s.useEffect(()=>{const c=r.current;if(c)return Yt(c)},[]),o.jsx(Ce,{...e,ref:a,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:w(e.onFocusOutside,c=>c.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)})}),Wn=s.forwardRef((e,t)=>{const n=G(S,e.__scopeMenu);return o.jsx(Ce,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)})}),qn=jn("MenuContent.ScrollLock"),Ce=s.forwardRef((e,t)=>{const{__scopeMenu:n,loop:r=!1,trapFocus:a,onOpenAutoFocus:c,onCloseAutoFocus:l,disableOutsidePointerEvents:u,onEntryFocus:f,onEscapeKeyDown:m,onPointerDownOutside:d,onFocusOutside:i,onInteractOutside:x,onDismiss:M,disableOutsideScroll:g,...N}=e,v=G(S,n),C=Z(S,n),P=re(n),b=He(n),I=Kn(n),[O,p]=s.useState(null),_=s.useRef(null),y=U(t,_,v.onContentChange),j=s.useRef(0),k=s.useRef(""),B=s.useRef(0),V=s.useRef(null),J=s.useRef("right"),ee=s.useRef(0),ce=g?Wt:s.Fragment,D=g?{as:qn,allowPinchZoom:!0}:void 0,$t=h=>{const $=k.current+h,F=I().filter(E=>!E.disabled),Y=document.activeElement,ie=F.find(E=>E.ref.current===Y)?.textValue,le=F.map(E=>E.textValue),Re=co(le,$,ie),z=F.find(E=>E.textValue===Re)?.ref.current;(function E(Ne){k.current=Ne,window.clearTimeout(j.current),Ne!==""&&(j.current=window.setTimeout(()=>E(""),1e3))})($),z&&setTimeout(()=>z.focus())};s.useEffect(()=>()=>window.clearTimeout(j.current),[]),Ht();const K=s.useCallback(h=>J.current===V.current?.side&&lo(h,V.current?.area),[]);return o.jsx(zn,{scope:n,searchRef:k,onItemEnter:s.useCallback(h=>{K(h)&&h.preventDefault()},[K]),onItemLeave:s.useCallback(h=>{K(h)||(_.current?.focus(),p(null))},[K]),onTriggerLeave:s.useCallback(h=>{K(h)&&h.preventDefault()},[K]),pointerGraceTimerRef:B,onPointerGraceIntentChange:s.useCallback(h=>{V.current=h},[]),children:o.jsx(ce,{...D,children:o.jsx(qt,{asChild:!0,trapped:a,onMountAutoFocus:w(c,h=>{h.preventDefault(),_.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:l,children:o.jsx(Xt,{asChild:!0,disableOutsidePointerEvents:u,onEscapeKeyDown:m,onPointerDownOutside:d,onFocusOutside:i,onInteractOutside:x,onDismiss:M,children:o.jsx(En,{asChild:!0,...b,dir:C.dir,orientation:"vertical",loop:r,currentTabStopId:O,onCurrentTabStopIdChange:p,onEntryFocus:w(f,h=>{C.isUsingKeyboardRef.current||h.preventDefault()}),preventScrollOnEntryFocus:!0,children:o.jsx(Qt,{role:"menu","aria-orientation":"vertical","data-state":ft(v.open),"data-radix-menu-content":"",dir:C.dir,...P,...N,ref:y,style:{outline:"none",...N.style},onKeyDown:w(N.onKeyDown,h=>{const F=h.target.closest("[data-radix-menu-content]")===h.currentTarget,Y=h.ctrlKey||h.altKey||h.metaKey,ie=h.key.length===1;F&&(h.key==="Tab"&&h.preventDefault(),!Y&&ie&&$t(h.key));const le=_.current;if(h.target!==le||!Fn.includes(h.key))return;h.preventDefault();const z=I().filter(E=>!E.disabled).map(E=>E.ref.current);Ye.includes(h.key)&&z.reverse(),ao(z)}),onBlur:w(e.onBlur,h=>{h.currentTarget.contains(h.target)||(window.clearTimeout(j.current),k.current="")}),onPointerMove:w(e.onPointerMove,q(h=>{const $=h.target,F=ee.current!==h.clientX;if(h.currentTarget.contains($)&&F){const Y=h.clientX>ee.current?"right":"left";J.current=Y,ee.current=h.clientX}}))})})})})})})});Qe.displayName=S;var Xn="MenuGroup",be=s.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return o.jsx(T.div,{role:"group",...r,ref:t})});be.displayName=Xn;var Qn="MenuLabel",Ze=s.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return o.jsx(T.div,{...r,ref:t})});Ze.displayName=Qn;var te="MenuItem",je="menu.itemSelect",ae=s.forwardRef((e,t)=>{const{disabled:n=!1,onSelect:r,...a}=e,c=s.useRef(null),l=Z(te,e.__scopeMenu),u=Me(te,e.__scopeMenu),f=U(t,c),m=s.useRef(!1),d=()=>{const i=c.current;if(!n&&i){const x=new CustomEvent(je,{bubbles:!0,cancelable:!0});i.addEventListener(je,M=>r?.(M),{once:!0}),zt(i,x),x.defaultPrevented?m.current=!1:l.onClose()}};return o.jsx(Je,{...a,ref:f,disabled:n,onClick:w(e.onClick,d),onPointerDown:i=>{e.onPointerDown?.(i),m.current=!0},onPointerUp:w(e.onPointerUp,i=>{m.current||i.currentTarget?.click()}),onKeyDown:w(e.onKeyDown,i=>{const x=u.searchRef.current!=="";n||x&&i.key===" "||me.includes(i.key)&&(i.currentTarget.click(),i.preventDefault())})})});ae.displayName=te;var Je=s.forwardRef((e,t)=>{const{__scopeMenu:n,disabled:r=!1,textValue:a,...c}=e,l=Me(te,n),u=He(n),f=s.useRef(null),m=U(t,f),[d,i]=s.useState(!1),[x,M]=s.useState("");return s.useEffect(()=>{const g=f.current;g&&M((g.textContent??"").trim())},[c.children]),o.jsx(W.ItemSlot,{scope:n,disabled:r,textValue:a??x,children:o.jsx(Sn,{asChild:!0,...u,focusable:!r,children:o.jsx(T.div,{role:"menuitem","data-highlighted":d?"":void 0,"aria-disabled":r||void 0,"data-disabled":r?"":void 0,...c,ref:m,onPointerMove:w(e.onPointerMove,q(g=>{r?l.onItemLeave(g):(l.onItemEnter(g),g.defaultPrevented||g.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:w(e.onPointerLeave,q(g=>l.onItemLeave(g))),onFocus:w(e.onFocus,()=>i(!0)),onBlur:w(e.onBlur,()=>i(!1))})})})}),Zn="MenuCheckboxItem",et=s.forwardRef((e,t)=>{const{checked:n=!1,onCheckedChange:r,...a}=e;return o.jsx(at,{scope:e.__scopeMenu,checked:n,children:o.jsx(ae,{role:"menuitemcheckbox","aria-checked":ne(n)?"mixed":n,...a,ref:t,"data-state":_e(n),onSelect:w(a.onSelect,()=>r?.(ne(n)?!0:!n),{checkForDefaultPrevented:!1})})})});et.displayName=Zn;var tt="MenuRadioGroup",[Jn,eo]=L(tt,{value:void 0,onValueChange:()=>{}}),nt=s.forwardRef((e,t)=>{const{value:n,onValueChange:r,...a}=e,c=xe(r);return o.jsx(Jn,{scope:e.__scopeMenu,value:n,onValueChange:c,children:o.jsx(be,{...a,ref:t})})});nt.displayName=tt;var ot="MenuRadioItem",rt=s.forwardRef((e,t)=>{const{value:n,...r}=e,a=eo(ot,e.__scopeMenu),c=n===a.value;return o.jsx(at,{scope:e.__scopeMenu,checked:c,children:o.jsx(ae,{role:"menuitemradio","aria-checked":c,...r,ref:t,"data-state":_e(c),onSelect:w(r.onSelect,()=>a.onValueChange?.(n),{checkForDefaultPrevented:!1})})})});rt.displayName=ot;var ye="MenuItemIndicator",[at,to]=L(ye,{checked:!1}),st=s.forwardRef((e,t)=>{const{__scopeMenu:n,forceMount:r,...a}=e,c=to(ye,n);return o.jsx(oe,{present:r||ne(c.checked)||c.checked===!0,children:o.jsx(T.span,{...a,ref:t,"data-state":_e(c.checked)})})});st.displayName=ye;var no="MenuSeparator",ct=s.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e;return o.jsx(T.div,{role:"separator","aria-orientation":"horizontal",...r,ref:t})});ct.displayName=no;var oo="MenuArrow",it=s.forwardRef((e,t)=>{const{__scopeMenu:n,...r}=e,a=re(n);return o.jsx(Zt,{...a,...r,ref:t})});it.displayName=oo;var ro="MenuSub",[Cr,lt]=L(ro),H="MenuSubTrigger",ut=s.forwardRef((e,t)=>{const n=G(H,e.__scopeMenu),r=Z(H,e.__scopeMenu),a=lt(H,e.__scopeMenu),c=Me(H,e.__scopeMenu),l=s.useRef(null),{pointerGraceTimerRef:u,onPointerGraceIntentChange:f}=c,m={__scopeMenu:e.__scopeMenu},d=s.useCallback(()=>{l.current&&window.clearTimeout(l.current),l.current=null},[]);return s.useEffect(()=>d,[d]),s.useEffect(()=>{const i=u.current;return()=>{window.clearTimeout(i),f(null)}},[u,f]),o.jsx(ge,{asChild:!0,...m,children:o.jsx(Je,{id:a.triggerId,"aria-haspopup":"menu","aria-expanded":n.open,"aria-controls":a.contentId,"data-state":ft(n.open),...e,ref:we(t,a.onTriggerChange),onClick:i=>{e.onClick?.(i),!(e.disabled||i.defaultPrevented)&&(i.currentTarget.focus(),n.open||n.onOpenChange(!0))},onPointerMove:w(e.onPointerMove,q(i=>{c.onItemEnter(i),!i.defaultPrevented&&!e.disabled&&!n.open&&!l.current&&(c.onPointerGraceIntentChange(null),l.current=window.setTimeout(()=>{n.onOpenChange(!0),d()},100))})),onPointerLeave:w(e.onPointerLeave,q(i=>{d();const x=n.content?.getBoundingClientRect();if(x){const M=n.content?.dataset.side,g=M==="right",N=g?-5:5,v=x[g?"left":"right"],C=x[g?"right":"left"];c.onPointerGraceIntentChange({area:[{x:i.clientX+N,y:i.clientY},{x:v,y:x.top},{x:C,y:x.top},{x:C,y:x.bottom},{x:v,y:x.bottom}],side:M}),window.clearTimeout(u.current),u.current=window.setTimeout(()=>c.onPointerGraceIntentChange(null),300)}else{if(c.onTriggerLeave(i),i.defaultPrevented)return;c.onPointerGraceIntentChange(null)}})),onKeyDown:w(e.onKeyDown,i=>{const x=c.searchRef.current!=="";e.disabled||x&&i.key===" "||Ln[r.dir].includes(i.key)&&(n.onOpenChange(!0),n.content?.focus(),i.preventDefault())})})})});ut.displayName=H;var dt="MenuSubContent",pt=s.forwardRef((e,t)=>{const n=qe(S,e.__scopeMenu),{forceMount:r=n.forceMount,...a}=e,c=G(S,e.__scopeMenu),l=Z(S,e.__scopeMenu),u=lt(dt,e.__scopeMenu),f=s.useRef(null),m=U(t,f);return o.jsx(W.Provider,{scope:e.__scopeMenu,children:o.jsx(oe,{present:r||c.open,children:o.jsx(W.Slot,{scope:e.__scopeMenu,children:o.jsx(Ce,{id:u.contentId,"aria-labelledby":u.triggerId,...a,ref:m,align:"start",side:l.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:d=>{l.isUsingKeyboardRef.current&&f.current?.focus(),d.preventDefault()},onCloseAutoFocus:d=>d.preventDefault(),onFocusOutside:w(e.onFocusOutside,d=>{d.target!==u.trigger&&c.onOpenChange(!1)}),onEscapeKeyDown:w(e.onEscapeKeyDown,d=>{l.onClose(),d.preventDefault()}),onKeyDown:w(e.onKeyDown,d=>{const i=d.currentTarget.contains(d.target),x=Gn[l.dir].includes(d.key);i&&x&&(c.onOpenChange(!1),u.trigger?.focus(),d.preventDefault())})})})})})});pt.displayName=dt;function ft(e){return e?"open":"closed"}function ne(e){return e==="indeterminate"}function _e(e){return ne(e)?"indeterminate":e?"checked":"unchecked"}function ao(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function so(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function co(e,t,n){const a=t.length>1&&Array.from(t).every(m=>m===t[0])?t[0]:t,c=n?e.indexOf(n):-1;let l=so(e,Math.max(c,0));a.length===1&&(l=l.filter(m=>m!==n));const f=l.find(m=>m.toLowerCase().startsWith(a.toLowerCase()));return f!==n?f:void 0}function io(e,t){const{x:n,y:r}=e;let a=!1;for(let c=0,l=t.length-1;c<t.length;l=c++){const u=t[c],f=t[l],m=u.x,d=u.y,i=f.x,x=f.y;d>r!=x>r&&n<(i-m)*(r-d)/(x-d)+m&&(a=!a)}return a}function lo(e,t){if(!t)return!1;const n={x:e.clientX,y:e.clientY};return io(n,t)}function q(e){return t=>t.pointerType==="mouse"?e(t):void 0}var uo=We,po=ge,fo=Xe,mo=Qe,ho=be,xo=Ze,wo=ae,go=et,vo=nt,Mo=rt,Co=st,bo=ct,yo=it,_o=ut,Ro=pt,se="DropdownMenu",[No]=he(se,[ze]),R=ze(),[Io,mt]=No(se),ht=e=>{const{__scopeDropdownMenu:t,children:n,dir:r,open:a,defaultOpen:c,onOpenChange:l,modal:u=!0}=e,f=R(t),m=s.useRef(null),[d,i]=Oe({prop:a,defaultProp:c??!1,onChange:l,caller:se});return o.jsx(Io,{scope:t,triggerId:pe(),triggerRef:m,contentId:pe(),open:d,onOpenChange:i,onOpenToggle:s.useCallback(()=>i(x=>!x),[i]),modal:u,children:o.jsx(uo,{...f,open:d,onOpenChange:i,dir:r,modal:u,children:n})})};ht.displayName=se;var xt="DropdownMenuTrigger",wt=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,disabled:r=!1,...a}=e,c=mt(xt,n),l=R(n);return o.jsx(po,{asChild:!0,...l,children:o.jsx(T.button,{type:"button",id:c.triggerId,"aria-haspopup":"menu","aria-expanded":c.open,"aria-controls":c.open?c.contentId:void 0,"data-state":c.open?"open":"closed","data-disabled":r?"":void 0,disabled:r,...a,ref:we(t,c.triggerRef),onPointerDown:w(e.onPointerDown,u=>{!r&&u.button===0&&u.ctrlKey===!1&&(c.onOpenToggle(),c.open||u.preventDefault())}),onKeyDown:w(e.onKeyDown,u=>{r||(["Enter"," "].includes(u.key)&&c.onOpenToggle(),u.key==="ArrowDown"&&c.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(u.key)&&u.preventDefault())})})})});wt.displayName=xt;var Eo="DropdownMenuPortal",gt=e=>{const{__scopeDropdownMenu:t,...n}=e,r=R(t);return o.jsx(fo,{...r,...n})};gt.displayName=Eo;var vt="DropdownMenuContent",Mt=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=mt(vt,n),c=R(n),l=s.useRef(!1);return o.jsx(mo,{id:a.contentId,"aria-labelledby":a.triggerId,...c,...r,ref:t,onCloseAutoFocus:w(e.onCloseAutoFocus,u=>{l.current||a.triggerRef.current?.focus(),l.current=!1,u.preventDefault()}),onInteractOutside:w(e.onInteractOutside,u=>{const f=u.detail.originalEvent,m=f.button===0&&f.ctrlKey===!0,d=f.button===2||m;(!a.modal||d)&&(l.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});Mt.displayName=vt;var So="DropdownMenuGroup",jo=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(ho,{...a,...r,ref:t})});jo.displayName=So;var Do="DropdownMenuLabel",Ct=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(xo,{...a,...r,ref:t})});Ct.displayName=Do;var Po="DropdownMenuItem",bt=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(wo,{...a,...r,ref:t})});bt.displayName=Po;var To="DropdownMenuCheckboxItem",yt=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(go,{...a,...r,ref:t})});yt.displayName=To;var Ao="DropdownMenuRadioGroup",Oo=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(vo,{...a,...r,ref:t})});Oo.displayName=Ao;var ko="DropdownMenuRadioItem",_t=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(Mo,{...a,...r,ref:t})});_t.displayName=ko;var Fo="DropdownMenuItemIndicator",Rt=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(Co,{...a,...r,ref:t})});Rt.displayName=Fo;var Lo="DropdownMenuSeparator",Nt=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(bo,{...a,...r,ref:t})});Nt.displayName=Lo;var Go="DropdownMenuArrow",Ko=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(yo,{...a,...r,ref:t})});Ko.displayName=Go;var $o="DropdownMenuSubTrigger",It=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(_o,{...a,...r,ref:t})});It.displayName=$o;var Uo="DropdownMenuSubContent",Et=s.forwardRef((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,a=R(n);return o.jsx(Ro,{...a,...r,ref:t,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});Et.displayName=Uo;var Bo=ht,Vo=wt,Yo=gt,St=Mt,jt=Ct,Dt=bt,Pt=yt,Tt=_t,At=Rt,Ot=Nt,kt=It,Ft=Et;const zo=Bo,Ho=Vo,Wo=s.forwardRef(({className:e,inset:t,children:n,...r},a)=>o.jsxs(kt,{ref:a,className:A("flex cursor-default select-none items-center gap-2 rounded px-2 py-1.5 text-sm outline-none","focus:bg-surface-hover data-[state=open]:bg-surface-hover",t&&"pl-8",e),...r,children:[n,o.jsx(un,{className:"ml-auto h-4 w-4"})]}));Wo.displayName=kt.displayName;const qo=s.forwardRef(({className:e,...t},n)=>o.jsx(Ft,{ref:n,className:A("z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-surface p-1 shadow-md","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0","data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",e),...t}));qo.displayName=Ft.displayName;const Lt=s.forwardRef(({className:e,sideOffset:t=4,...n},r)=>o.jsx(Yo,{children:o.jsx(St,{ref:r,sideOffset:t,className:A("z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-surface p-1 shadow-md","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0","data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",e),...n})}));Lt.displayName=St.displayName;const Gt=s.forwardRef(({className:e,inset:t,...n},r)=>o.jsx(Dt,{ref:r,className:A("relative flex cursor-default select-none items-center gap-2 rounded px-2 py-1.5 text-sm outline-none","focus:bg-surface-hover focus:text-text","data-[disabled]:pointer-events-none data-[disabled]:opacity-50",t&&"pl-8",e),...n}));Gt.displayName=Dt.displayName;const Xo=s.forwardRef(({className:e,children:t,checked:n,...r},a)=>o.jsxs(Pt,{ref:a,className:A("relative flex cursor-default select-none items-center rounded py-1.5 pl-8 pr-2 text-sm outline-none","focus:bg-surface-hover","data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:n,...r,children:[o.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:o.jsx(At,{children:o.jsx(Jt,{className:"h-4 w-4"})})}),t]}));Xo.displayName=Pt.displayName;const Qo=s.forwardRef(({className:e,children:t,...n},r)=>o.jsxs(Tt,{ref:r,className:A("relative flex cursor-default select-none items-center rounded py-1.5 pl-8 pr-2 text-sm outline-none","focus:bg-surface-hover","data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...n,children:[o.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:o.jsx(At,{children:o.jsx(xn,{className:"h-2 w-2 fill-current"})})}),t]}));Qo.displayName=Tt.displayName;const Zo=s.forwardRef(({className:e,inset:t,...n},r)=>o.jsx(jt,{ref:r,className:A("px-2 py-1.5 text-xs font-semibold uppercase tracking-wide text-text-muted",t&&"pl-8",e),...n}));Zo.displayName=jt.displayName;const Jo=s.forwardRef(({className:e,...t},n)=>o.jsx(Ot,{ref:n,className:A("-mx-1 my-1 h-px bg-border",e),...t}));Jo.displayName=Ot.displayName;const Kt={all:["memos"],list:e=>["memos","list",e]};function er(e){return dn({queryKey:Kt.list(e),queryFn:()=>Fe.listMemos(e)})}function tr(){const e=en();return tn({mutationFn:t=>Fe.deleteMemo(t),onSuccess:()=>e.invalidateQueries({queryKey:Kt.all})})}const nr=300;function br(){const{t:e}=Le(["memos","common"]),[t,n]=nn(),r=t.get("q")??"",a=t.get("who")??"",c=t.get("what")??"",l=t.get("has_location")==="1",u=t.get("include_expired")==="1",[f,m]=s.useState(r);s.useEffect(()=>{if(f===r)return;const p=window.setTimeout(()=>{b({q:f||null})},nr);return()=>window.clearTimeout(p)},[f]);const d=s.useMemo(()=>({...r?{query:r}:{},...a?{who:a}:{},...c?{what:c}:{},...l?{has_location:!0}:{},...u?{include_expired:!0}:{},limit:200}),[r,a,c,l,u]),{data:i,isLoading:x,isFetching:M,refetch:g}=er(d),N=i?.memos??[],v=tr(),[C,P]=s.useState(null);function b(p){const _=new URLSearchParams(t);for(const[y,j]of Object.entries(p))j==null||j===""?_.delete(y):_.set(y,j);n(_,{replace:!0})}async function I(){if(C!=null)try{await v.mutateAsync(C),Se.success(e("toast.deleted"))}catch(p){const{message:_}=an(p,e);throw Se.error(_),p}}const O=s.useMemo(()=>[{id:"id",header:e("col.id"),cell:p=>o.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",p.id]}),headClassName:"w-16"},{id:"what",header:e("col.what"),cell:p=>o.jsx("span",{className:"line-clamp-2",children:p.memo?o.jsx("span",{className:"text-text",children:p.memo}):o.jsx("span",{className:"font-medium text-text",children:p.what})}),asCardTitle:!0},{id:"who",header:e("col.who"),cell:p=>p.who?o.jsx(on,{variant:"secondary",children:p.who}):o.jsx("span",{className:"text-text-muted",children:"—"}),headClassName:"w-32"},{id:"when",header:e("col.when"),cell:p=>o.jsx("span",{className:"text-text-dim",children:p.whenText||(p.whenAt?De(p.whenAt):"—")}),headClassName:"w-36"},{id:"where",header:e("col.where"),cell:p=>p.where_label||p.where_lat!=null&&p.where_lng!=null?o.jsx(rr,{memo:p}):o.jsx("span",{className:"text-text-muted",children:"—"}),headClassName:"w-44"},{id:"platform",header:e("col.platform"),cell:p=>o.jsx("span",{className:"text-text-dim",children:p.platform}),headClassName:"w-24",hideOnMobile:!0},{id:"createdAt",header:e("col.createdAt"),cell:p=>o.jsx("span",{className:"text-text-dim",children:De(p.createdAt)}),headClassName:"w-36",hideOnMobile:!0},{id:"actions",header:"",cell:p=>o.jsx("div",{className:"flex justify-end",children:o.jsxs(Ie,{variant:"ghost",size:"sm",onClick:_=>{_.stopPropagation(),P(p.id)},disabled:v.isPending,"aria-label":e("action.delete"),children:[o.jsx(pn,{className:"h-3 w-3"}),o.jsx("span",{className:"sr-only sm:not-sr-only sm:ml-1",children:e("action.delete")})]})}),headClassName:"w-24"}],[e,v.isPending]);return o.jsxs("div",{className:"flex min-h-dvh flex-col bg-bg",children:[o.jsx(rn,{}),o.jsxs("main",{className:"mx-auto flex w-full max-w-7xl flex-1 flex-col gap-4 px-3 py-4 sm:px-4 pb-safe",children:[o.jsxs("header",{className:"flex flex-col gap-1",children:[o.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[o.jsx("h1",{className:"text-xl font-semibold",children:e("pageTitle")}),o.jsxs(Ie,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>g(),disabled:M,"aria-label":e("actions.refresh",{ns:"common"}),children:[o.jsx(fn,{className:`h-4 w-4 ${M?"animate-spin":""}`}),o.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),o.jsx("p",{className:"text-sm text-text-dim",children:e("subtitle")})]}),o.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-end",children:[o.jsxs("div",{className:"relative flex-1 max-w-md",children:[o.jsx(mn,{className:"pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 h-4 w-4 text-text-muted"}),o.jsx(ue,{value:f,onChange:p=>m(p.target.value),placeholder:e("search.placeholder"),className:"pl-7"})]}),o.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:flex sm:items-end",children:[o.jsxs("div",{className:"flex flex-col gap-1",children:[o.jsx(Ee,{htmlFor:"who-filter",className:"text-xs text-text-dim",children:e("search.who")}),o.jsx(ue,{id:"who-filter",value:a,onChange:p=>b({who:p.target.value||null}),className:"w-36"})]}),o.jsxs("div",{className:"flex flex-col gap-1",children:[o.jsx(Ee,{htmlFor:"what-filter",className:"text-xs text-text-dim",children:e("search.what")}),o.jsx(ue,{id:"what-filter",value:c,onChange:p=>b({what:p.target.value||null}),className:"w-36"})]})]}),o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs("label",{className:"inline-flex items-center gap-1 text-sm text-text-dim",children:[o.jsx("input",{type:"checkbox",checked:l,onChange:p=>b({has_location:p.target.checked?"1":null}),className:"h-4 w-4 accent-accent"}),e("search.hasLocation")]}),o.jsxs("label",{className:"inline-flex items-center gap-1 text-sm text-text-dim",children:[o.jsx("input",{type:"checkbox",checked:u,onChange:p=>b({include_expired:p.target.checked?"1":null}),className:"h-4 w-4 accent-accent"}),e("search.includeExpired")]})]})]}),o.jsx(sn,{columns:O,rows:N,getRowId:p=>String(p.id),loading:x,emptyState:o.jsx(cn,{icon:o.jsx(wn,{}),title:e("empty.title"),description:e("empty.description")})}),o.jsx(ln,{open:C!=null,onOpenChange:p=>{p||P(null)},title:e("action.confirmDelete"),description:e("action.confirmDeleteDesc"),intent:"danger",confirmLabel:e("action.delete"),onConfirm:I})]})]})}const or={baidu:"openMap.baidu",apple:"openMap.apple",google:"openMap.google",osm:"openMap.osm"};function rr({memo:e}){const{t}=Le("memos"),n=e.where_label||`${e.where_lat}, ${e.where_lng}`,r=Object.entries(e.mapUrls??{});return r.length===0?o.jsx("span",{className:"text-text-dim",children:n}):o.jsxs(zo,{children:[o.jsx(Ho,{asChild:!0,children:o.jsxs("button",{type:"button",className:"inline-flex items-center gap-1 text-sm text-text-dim hover:text-accent",onClick:a=>a.stopPropagation(),children:[o.jsx(hn,{className:"h-3 w-3"}),o.jsx("span",{className:"line-clamp-1 underline-offset-2 hover:underline",children:n})]})}),o.jsx(Lt,{children:r.map(([a,c])=>o.jsx(Gt,{asChild:!0,children:o.jsx("a",{href:c,target:"_blank",rel:"noopener noreferrer",children:t(or[a]??"openMap.label",{defaultValue:a})})},a))})]})}function De(e){try{const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{br as default};
12
- //# sourceMappingURL=memos-CrG4zgfI.js.map
12
+ //# sourceMappingURL=memos-CuY8Ai7a.js.map