lookatstudy-mobile 0.37.2 → 0.38.0

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 (148) hide show
  1. package/model-catalog.json +9025 -0
  2. package/package.json +1 -1
  3. package/server.cjs +1075 -564
  4. package/web/assets/{CanvasStage-By84li0a.js → CanvasStage-vallbGco.js} +1 -1
  5. package/web/assets/{CommandPalette-DJpv5YLk.js → CommandPalette-Kyu6mhyt.js} +1 -1
  6. package/web/assets/{CompanionBotLab-BrjON5X5.js → CompanionBotLab-DHmGbQJd.js} +1 -1
  7. package/web/assets/{CourseSearchPanel-Dp-83TJq.js → CourseSearchPanel-CrpFIaU8.js} +2 -2
  8. package/web/assets/{ExamView-BiWyQCTQ.js → ExamView-BBwDRS1g.js} +1 -1
  9. package/web/assets/{MermaidArtifact-C-9JGr1S.js → MermaidArtifact-x5kLLb52.js} +3 -3
  10. package/web/assets/ModelManagerModal-CHz1i5v2.js +6 -0
  11. package/web/assets/{PersonalProfileModal-Bberh-21.js → PersonalProfileModal-DJdHOMH9.js} +2 -2
  12. package/web/assets/{ReviewPanel-D52vKY80.js → ReviewPanel-BJhoJAOK.js} +1 -1
  13. package/web/assets/SettingsView-COw_GSOo.js +15 -0
  14. package/web/assets/Toggle-Bkokw_WS.js +1 -0
  15. package/web/assets/{VoicePanel-Df6DgExP.js → VoicePanel-DPrlBZ48.js} +1 -1
  16. package/web/assets/{abnfDiagram-VCTEODGH-xWn5W_Em.js → abnfDiagram-VCTEODGH-DXAHXtdM.js} +1 -1
  17. package/web/assets/{abnfDiagram-VCTEODGH-ODA7YWAP-GEEhu7or.js → abnfDiagram-VCTEODGH-ODA7YWAP-BdHlSP1w.js} +1 -1
  18. package/web/assets/api-web-BhgWWd1h.js +1 -0
  19. package/web/assets/{architectureDiagram-5GKGNRK7-C4PU3XN7-JmOGh5LH.js → architectureDiagram-5GKGNRK7-C4PU3XN7-B4RCVI81.js} +1 -1
  20. package/web/assets/{architectureDiagram-5GKGNRK7-CvI35bTW.js → architectureDiagram-5GKGNRK7-DViQRgRS.js} +1 -1
  21. package/web/assets/{blockDiagram-I7D4REHJ-BMKUeuF0.js → blockDiagram-I7D4REHJ-Bm4Jv7XO.js} +1 -1
  22. package/web/assets/{blockDiagram-NRAW4CY4-UMJ6PMQQ-Dv4-Yiui.js → blockDiagram-NRAW4CY4-UMJ6PMQQ-dOUZFc-F.js} +1 -1
  23. package/web/assets/{c4Diagram-7LVT6UL2-DNalANVV.js → c4Diagram-7LVT6UL2-Cn_bbm4P.js} +1 -1
  24. package/web/assets/{c4Diagram-UCG6FXSJ-75X3U2P3-BMz228D6.js → c4Diagram-UCG6FXSJ-75X3U2P3-DgytixUD.js} +1 -1
  25. package/web/assets/channel-D_-re5YU.js +1 -0
  26. package/web/assets/{chunk-2Q5K7J3B-M3FYrmxX.js → chunk-2Q5K7J3B-hNQuZg4_.js} +1 -1
  27. package/web/assets/{chunk-5VM5RSS4-nbGREPjw.js → chunk-5VM5RSS4-DwAMOseZ.js} +1 -1
  28. package/web/assets/{chunk-7XDTSPCN-rYhyRTOx.js → chunk-7XDTSPCN-COFFwjaS.js} +1 -1
  29. package/web/assets/{chunk-CTNIYPP6-BgXYMFW5.js → chunk-CTNIYPP6-B3zyRQW8.js} +1 -1
  30. package/web/assets/{chunk-CXNFBKHE-CkmFhBAk.js → chunk-CXNFBKHE-C91q6lvg.js} +1 -1
  31. package/web/assets/{chunk-F27PBJKO-CAqAYmMM.js → chunk-F27PBJKO-ia4EagnF.js} +1 -1
  32. package/web/assets/{chunk-IMKFNOWR-pDBbu4GI.js → chunk-IMKFNOWR-vd22BhM5.js} +1 -1
  33. package/web/assets/{chunk-ISA7TJRJ-CHl4BhBt.js → chunk-ISA7TJRJ-BReqmCMw.js} +1 -1
  34. package/web/assets/{chunk-JWPE2WC7-DSVI_4gB.js → chunk-JWPE2WC7-Cjsal04r.js} +1 -1
  35. package/web/assets/{chunk-LV3HUYFY-Doco33ZI.js → chunk-LV3HUYFY-D2A9VNi8.js} +1 -1
  36. package/web/assets/{chunk-M3IUQBOH-RTAJkyza.js → chunk-M3IUQBOH-DZWUYlu1.js} +1 -1
  37. package/web/assets/{chunk-NDIOYS4C-DcWvuy8G.js → chunk-NDIOYS4C-Cg_gB3IQ.js} +1 -1
  38. package/web/assets/{chunk-POPQ4Y6H-yjjWWA8X.js → chunk-POPQ4Y6H-CpFBYm4R.js} +1 -1
  39. package/web/assets/{chunk-RE4WF27V-C32wZGPA.js → chunk-RE4WF27V-DJhALSJZ.js} +1 -1
  40. package/web/assets/{chunk-SVP7TREG-BdekvWAw.js → chunk-SVP7TREG-CLk3nYlu.js} +1 -1
  41. package/web/assets/{chunk-TICWLB2K-Cz68TTKA.js → chunk-TICWLB2K-CAAm7rEI.js} +1 -1
  42. package/web/assets/{chunk-VII2H2IX-fTD7U-xL.js → chunk-VII2H2IX-D9ZFtXPz.js} +1 -1
  43. package/web/assets/{chunk-X5GNSKZ3-16RMlpb5.js → chunk-X5GNSKZ3-BRpQXOuk.js} +1 -1
  44. package/web/assets/{chunk-XCWWM2C3-CO-wuQPY.js → chunk-XCWWM2C3-CGZOunzF.js} +1 -1
  45. package/web/assets/{chunk-XXDRQBXY-DPkBKESf.js → chunk-XXDRQBXY-IwMJhHxA.js} +1 -1
  46. package/web/assets/classDiagram-DTDB5LWJ-LWRDKZ5K-DsXVuA3q.js +1 -0
  47. package/web/assets/classDiagram-ZZMXUADV-mIT3v2vU.js +1 -0
  48. package/web/assets/classDiagram-v2-JRS7N3AN-2BZHGRP2-DsXVuA3q.js +1 -0
  49. package/web/assets/classDiagram-v2-VYDZK3BY-mIT3v2vU.js +1 -0
  50. package/web/assets/{core-CQhot3Yw.js → core-KfkXlXB0.js} +1 -1
  51. package/web/assets/{cose-bilkent-JH36ORCC-NQkKxkmm.js → cose-bilkent-JH36ORCC-CvvDvDJy.js} +1 -1
  52. package/web/assets/{cose-bilkent-JH36ORCC-OB24KH3T-71WGRXpy.js → cose-bilkent-JH36ORCC-OB24KH3T-C0vuvt-a.js} +1 -1
  53. package/web/assets/{cynefin-OW5HDTMX-Ycd8yaFB.js → cynefin-OW5HDTMX-BnU7sKRp.js} +1 -1
  54. package/web/assets/{cynefin-OW5HDTMX-GVF3BKWE-wLMpc-W6.js → cynefin-OW5HDTMX-GVF3BKWE-C0Fp61PQ.js} +1 -1
  55. package/web/assets/{cynefinDiagram-5FMLGOSQ-qdatKGJp.js → cynefinDiagram-5FMLGOSQ-Ci7ijXRa.js} +1 -1
  56. package/web/assets/{cynefinDiagram-5FMLGOSQ-H3WIRU3N-BqUnto1I.js → cynefinDiagram-5FMLGOSQ-H3WIRU3N-BG1dQkD8.js} +1 -1
  57. package/web/assets/{dagre-3AP2YEHR-DCERTXHT-DU7hl9mL.js → dagre-3AP2YEHR-DCERTXHT-SRdJ45ZG.js} +1 -1
  58. package/web/assets/{dagre-GXQ25YYZ-DXBvPLCC.js → dagre-GXQ25YYZ-a6zLLMCL.js} +1 -1
  59. package/web/assets/{diagram-S7CK7UJ4-CJndlA9d.js → diagram-S7CK7UJ4-DwGQoHs5.js} +1 -1
  60. package/web/assets/{diagram-S7CK7UJ4-MULGZGEL-ChZOJtIr.js → diagram-S7CK7UJ4-MULGZGEL-DFbcMEGe.js} +1 -1
  61. package/web/assets/{diagram-UQ7AKVKN-ByEgUbMO.js → diagram-UQ7AKVKN-DObuhRvP.js} +1 -1
  62. package/web/assets/{diagram-UQ7AKVKN-YQBY353J-CBg1xAIv.js → diagram-UQ7AKVKN-YQBY353J-f7iJnEEP.js} +1 -1
  63. package/web/assets/{diagram-VSXAHHWV-DG9QiDXM.js → diagram-VSXAHHWV-Ctso7LL9.js} +1 -1
  64. package/web/assets/{diagram-VSXAHHWV-WLNH2ELY-BmmwN3nm.js → diagram-VSXAHHWV-WLNH2ELY-DwsW9ccQ.js} +1 -1
  65. package/web/assets/{diagram-VX7I27RA-D5I8_1IH.js → diagram-VX7I27RA-B1-W9xu6.js} +1 -1
  66. package/web/assets/{diagram-VX7I27RA-XW6YQV5G-BpJ1XA39.js → diagram-VX7I27RA-XW6YQV5G-DckTcRvE.js} +1 -1
  67. package/web/assets/{diagram-Z3DM3KII-BgBYUzLO.js → diagram-Z3DM3KII-CvmndeRP.js} +1 -1
  68. package/web/assets/{diagram-Z3DM3KII-HG7RF65D-DvYaKe9o.js → diagram-Z3DM3KII-HG7RF65D-Cg1XNNOC.js} +1 -1
  69. package/web/assets/{ebnfDiagram-PWID7BFC-BvljgvDM.js → ebnfDiagram-PWID7BFC-Cs9GSL14.js} +1 -1
  70. package/web/assets/{ebnfDiagram-PWID7BFC-OKY4VHYD-Cnq_rs5C.js → ebnfDiagram-PWID7BFC-OKY4VHYD-C0q6BGVW.js} +1 -1
  71. package/web/assets/{elk.bundled-DuC4qO17.js → elk.bundled-Cez1bZui.js} +1 -1
  72. package/web/assets/{erDiagram-RLTQ6QDP-CuGCxm27.js → erDiagram-RLTQ6QDP-CvYV5Bmu.js} +1 -1
  73. package/web/assets/{erDiagram-SSCWMZ5O-PIPKOIK7-DWea4HYD.js → erDiagram-SSCWMZ5O-PIPKOIK7-Di0McTkf.js} +1 -1
  74. package/web/assets/{flowDiagram-A5DVABFB-2Z4AVO5R-Bt5oLSB0.js → flowDiagram-A5DVABFB-2Z4AVO5R-C_7fHJVS.js} +1 -1
  75. package/web/assets/{flowDiagram-HODETNUW-ChwXi3ep.js → flowDiagram-HODETNUW-CEwpjqJR.js} +1 -1
  76. package/web/assets/{ganttDiagram-EL5Y4UJY-Cip61aQW.js → ganttDiagram-EL5Y4UJY-Bjj2P85p.js} +1 -1
  77. package/web/assets/{ganttDiagram-EL5Y4UJY-JZNG7GOG-DIt3-EPi.js → ganttDiagram-EL5Y4UJY-JZNG7GOG-BWxHKrFA.js} +1 -1
  78. package/web/assets/{gitGraphDiagram-WWUBYQGX-DMWMLL3G-CsyX4tkZ.js → gitGraphDiagram-WWUBYQGX-DMWMLL3G-D4hn_rGb.js} +1 -1
  79. package/web/assets/{gitGraphDiagram-WWUBYQGX-BGE_KKwm.js → gitGraphDiagram-WWUBYQGX-DhH7fsJW.js} +1 -1
  80. package/web/assets/index-CS4Wtfwl.css +1 -0
  81. package/web/assets/{index-D3SI1A7X.js → index-DcWGv1Ix.js} +2 -2
  82. package/web/assets/{index-48coRDBX.js → index-eHVYJyBS.js} +4 -4
  83. package/web/assets/{index-CatQea2M.js → index-nwyPdk23.js} +1 -1
  84. package/web/assets/{infoDiagram-27XIBGKW-CHFCryER.js → infoDiagram-27XIBGKW-DDm2aahL.js} +1 -1
  85. package/web/assets/{infoDiagram-RXCK75RN-HANS5KVC-ocLW6L6_.js → infoDiagram-RXCK75RN-HANS5KVC-CwBcehVD.js} +1 -1
  86. package/web/assets/{ishikawaDiagram-5VMMS53U-7GCIT7WU-BUo_yhnm.js → ishikawaDiagram-5VMMS53U-7GCIT7WU-CBAcnlnt.js} +1 -1
  87. package/web/assets/{ishikawaDiagram-5VMMS53U-Bhg1TVZJ.js → ishikawaDiagram-5VMMS53U-BViel9G3.js} +1 -1
  88. package/web/assets/{journeyDiagram-3NMN7TZE-C3OfUgiV.js → journeyDiagram-3NMN7TZE-CO3lCO75.js} +1 -1
  89. package/web/assets/{journeyDiagram-EYS64GPL-OAPELBT7-DQESZnLZ.js → journeyDiagram-EYS64GPL-OAPELBT7-sBJrBBzK.js} +1 -1
  90. package/web/assets/{kanban-definition-3QL26DDD-I7RKWQQY-BF-ZXqR5.js → kanban-definition-3QL26DDD-I7RKWQQY-hit6oZsH.js} +1 -1
  91. package/web/assets/{kanban-definition-UXKFOSKX-CSI_GcJW.js → kanban-definition-UXKFOSKX-CKgCw87L.js} +1 -1
  92. package/web/assets/{katex-N6JRN4PM-CxrguQd-.js → katex-N6JRN4PM-D81co42V.js} +1 -1
  93. package/web/assets/{layout-CDbDCQeb.js → layout-Gnf9u57J.js} +1 -1
  94. package/web/assets/{main-jV_OilRs.js → main-C7vIrKEC.js} +120 -120
  95. package/web/assets/{mermaid-layout-elk.core-B1-o2tyd.js → mermaid-layout-elk.core-DfOj66Qv.js} +2 -2
  96. package/web/assets/{mermaid.core-37_hzSNp.js → mermaid.core-B8uFE6gu.js} +5 -5
  97. package/web/assets/{mindmap-definition-FBJOCRG2-KIYZG64Y-rppk7mo-.js → mindmap-definition-FBJOCRG2-KIYZG64Y-DdU7WsWK.js} +1 -1
  98. package/web/assets/{mindmap-definition-YA3MSWOX-BUzaoDCs.js → mindmap-definition-YA3MSWOX-Dlr3j6bz.js} +1 -1
  99. package/web/assets/{pegDiagram-XKGWAZYB-CQPL5MMj.js → pegDiagram-XKGWAZYB-DUukoOjY.js} +1 -1
  100. package/web/assets/{pegDiagram-XKGWAZYB-OIP57N6J-CngQPdjr.js → pegDiagram-XKGWAZYB-OIP57N6J-ClyIfOjy.js} +1 -1
  101. package/web/assets/{pet-xGooCXVY.js → pet-7_82JHov.js} +1 -1
  102. package/web/assets/{pieDiagram-E7YTZNPT-2UOTW327-DkHaDPtZ.js → pieDiagram-E7YTZNPT-2UOTW327-CXr_-LKy.js} +1 -1
  103. package/web/assets/{pieDiagram-E7YTZNPT-BDTdqFkm.js → pieDiagram-E7YTZNPT-BoX73GVV.js} +1 -1
  104. package/web/assets/{quadrantDiagram-AXDQQJYC-SN3ASJJK-KFKnY5SQ.js → quadrantDiagram-AXDQQJYC-SN3ASJJK-BfJPVLX8.js} +1 -1
  105. package/web/assets/{quadrantDiagram-AXDQQJYC-CXFhoJ1v.js → quadrantDiagram-AXDQQJYC-fWVY4hSA.js} +1 -1
  106. package/web/assets/{railroadDiagram-O6MQD6OU-34742W6X-BMHll5kZ.js → railroadDiagram-O6MQD6OU-34742W6X-LEvRYv_-.js} +1 -1
  107. package/web/assets/{railroadDiagram-O6MQD6OU-DdZMZ3P-.js → railroadDiagram-O6MQD6OU-BtJHgxH_.js} +1 -1
  108. package/web/assets/{render-O7CIS3YK-BUZqrLRp.js → render-O7CIS3YK-DU3B_ERD.js} +7 -7
  109. package/web/assets/{requirementDiagram-BXWQKSXE-WrY_I6-V.js → requirementDiagram-BXWQKSXE-DeBI9tYJ.js} +1 -1
  110. package/web/assets/{requirementDiagram-EFPCY7ZU-NGAFFSMB-CmLM20oA.js → requirementDiagram-EFPCY7ZU-NGAFFSMB-DDu5KaVc.js} +1 -1
  111. package/web/assets/{rotate-ccw-DZE_kYZu.js → rotate-ccw-DHjeGlQd.js} +1 -1
  112. package/web/assets/{sankeyDiagram-P5KCCOFB-3D3M4XPB-RJsf4h9t.js → sankeyDiagram-P5KCCOFB-3D3M4XPB-CuAwPvR9.js} +1 -1
  113. package/web/assets/{sankeyDiagram-P5KCCOFB-Bjyi_fcC.js → sankeyDiagram-P5KCCOFB-Cn7EgJJg.js} +1 -1
  114. package/web/assets/{sequenceDiagram-WJ2MYXX4-Co6SKGyz.js → sequenceDiagram-WJ2MYXX4-Cc4unhAQ.js} +1 -1
  115. package/web/assets/{sequenceDiagram-WJ2MYXX4-Q2IOPB4R-B5nuUy2h.js → sequenceDiagram-WJ2MYXX4-Q2IOPB4R-Bhw9XiPP.js} +1 -1
  116. package/web/assets/{sizeCapture-INFHLROL-CF0_wtm2.js → sizeCapture-INFHLROL-D5ATuvis.js} +1 -1
  117. package/web/assets/{sizeCapture-X5ZJPWSS-PSGVOMYM-xWY2H6Me.js → sizeCapture-X5ZJPWSS-PSGVOMYM-pk47pQ9r.js} +1 -1
  118. package/web/assets/{stateDiagram-D77RDMKH-5V-346Qd.js → stateDiagram-D77RDMKH-CQSVKJos.js} +1 -1
  119. package/web/assets/{stateDiagram-HBIQ2CUA-4M2S6MAN-B6gqxipM.js → stateDiagram-HBIQ2CUA-4M2S6MAN-CtK20myG.js} +1 -1
  120. package/web/assets/stateDiagram-v2-4QOOHH4V-LBBLA2WV-z3Zfnb5n.js +1 -0
  121. package/web/assets/stateDiagram-v2-MP3YSRHH-BEw4hFwV.js +1 -0
  122. package/web/assets/{swimlanes-42K2YHIH-D9gzHPsn.js → swimlanes-42K2YHIH-C_TtTWTU.js} +1 -1
  123. package/web/assets/{swimlanes-XN3QIQJK-N6N2CCQ6-rlPeyqTj.js → swimlanes-XN3QIQJK-N6N2CCQ6-BcUMswQj.js} +1 -1
  124. package/web/assets/swimlanesDiagram-VK2B7HYN-E6N4H5SY-D6SdGCA2.js +8 -0
  125. package/web/assets/swimlanesDiagram-VR7AAH4N-BCgYwpZp.js +8 -0
  126. package/web/assets/{timeline-definition-24CTP7MA-B2GfJfmd.js → timeline-definition-24CTP7MA-DUWrxPBR.js} +1 -1
  127. package/web/assets/{timeline-definition-24CTP7MA-KN7RSRVM-CKXP2kGU.js → timeline-definition-24CTP7MA-KN7RSRVM-guNGP5k9.js} +1 -1
  128. package/web/assets/{vennDiagram-4TSXK5OY-AKJ7LXAN-CybCMyEX.js → vennDiagram-4TSXK5OY-AKJ7LXAN-CqrpJGZz.js} +1 -1
  129. package/web/assets/{vennDiagram-4TSXK5OY-DkP-OS8t.js → vennDiagram-4TSXK5OY-DpAMU-X3.js} +1 -1
  130. package/web/assets/{wardleyDiagram-VM6X3IG4-3B6A3BN5-BdgAi1Gp.js → wardleyDiagram-VM6X3IG4-3B6A3BN5-CvLFmNdB.js} +1 -1
  131. package/web/assets/{wardleyDiagram-VM6X3IG4-DvRT9ehw.js → wardleyDiagram-VM6X3IG4-CwLky2tH.js} +1 -1
  132. package/web/assets/{xychartDiagram-S5SC5T6Z-D0gQ0QKw.js → xychartDiagram-S5SC5T6Z-C0uS7jlH.js} +1 -1
  133. package/web/assets/{xychartDiagram-S5SC5T6Z-OBDNV6WG-23Q1AKCq.js → xychartDiagram-S5SC5T6Z-OBDNV6WG-DUua3NqS.js} +1 -1
  134. package/web/index.html +3 -3
  135. package/web/pet.html +3 -3
  136. package/web/assets/SettingsView-BE8J-BR5.js +0 -20
  137. package/web/assets/api-web-ChIPnpHO.js +0 -1
  138. package/web/assets/channel-BsRXIHWg.js +0 -1
  139. package/web/assets/classDiagram-DTDB5LWJ-LWRDKZ5K-BwnHfZhN.js +0 -1
  140. package/web/assets/classDiagram-ZZMXUADV-BBeyyi3H.js +0 -1
  141. package/web/assets/classDiagram-v2-JRS7N3AN-2BZHGRP2-BwnHfZhN.js +0 -1
  142. package/web/assets/classDiagram-v2-VYDZK3BY-BBeyyi3H.js +0 -1
  143. package/web/assets/index-EInfxfl9.css +0 -1
  144. package/web/assets/stateDiagram-v2-4QOOHH4V-LBBLA2WV-DnphY6WO.js +0 -1
  145. package/web/assets/stateDiagram-v2-MP3YSRHH-DKtXGidN.js +0 -1
  146. package/web/assets/swimlanesDiagram-VK2B7HYN-E6N4H5SY-8pA5lT4C.js +0 -8
  147. package/web/assets/swimlanesDiagram-VR7AAH4N-B7BbPyRn.js +0 -8
  148. /package/web/assets/{index-C9fscARj.js → index-jKxnKPxh.js} +0 -0
@@ -0,0 +1 @@
1
+ import{r as n,j as t}from"./index-jKxnKPxh.js";import{u as E,C as M,b as R,a as j}from"./main-C7vIrKEC.js";const c="bg-ink/[0.04] text-ink-strong text-label rounded-lg border border-transparent focus:border-accent focus:bg-ink/[0.06] transition-colors placeholder:text-ink-faint";function B({kind:o,showProtocol:d=!0,testPrefix:a="custom",titleKey:p="settings.custom.form_title",modelPhKey:k="settings.custom.model_ph",testOverride:h,onSaved:N,onCancel:v}){const s=E(),[r,w]=n.useState(""),[b,C]=n.useState("openai-compatible"),[i,$]=n.useState(""),[u,S]=n.useState(""),[l,_]=n.useState(""),[f,K]=n.useState(!1),[x,y]=n.useState(!1),[m,g]=n.useState(null),T=async()=>{if(!(!i.trim()||!l.trim()||x)){y(!0),g(null);try{const e=h?await h({baseUrl:i.trim(),apiKey:u.trim(),model:l.trim()}):await j.testCustomProvider({label:r||s("settings.custom.test_label"),protocol:b,baseUrl:i.trim(),apiKey:u.trim()||void 0,defaultModel:l.trim()});g({ok:e.ok,detail:e.detail})}catch(e){g({ok:!1,detail:e instanceof Error?e.message:String(e)})}finally{y(!1)}}},U=async()=>{if(!(!r.trim()||!i.trim()||!l.trim()))try{const e=await j.createCustomProvider({label:r.trim(),kind:o,protocol:d?b:"openai-compatible",baseUrl:i.trim(),apiKey:u.trim()||void 0,defaultModel:l.trim(),vision:o==="llm"?f:void 0});N(e)}catch{}};return t.jsxs("div",{className:"space-y-2.5","data-testid":`${a}-provider-form`,children:[t.jsx("div",{className:"text-label font-bold text-ink-strong",children:s(p)}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("input",{type:"text",value:r,onChange:e=>w(e.target.value),placeholder:s("settings.custom.label_ph"),"data-testid":`${a}-label`,className:`${c} min-w-0 flex-1 px-2.5 py-1.5`}),d&&t.jsxs("select",{value:b,onChange:e=>C(e.target.value),"data-testid":`${a}-protocol`,className:`${c} px-2 py-1.5`,children:[t.jsx("option",{value:"openai-compatible",children:s("settings.proto.openai")}),t.jsx("option",{value:"anthropic",children:"Anthropic"}),t.jsx("option",{value:"google",children:"Google"})]})]}),t.jsx("input",{type:"text",value:i,onChange:e=>$(e.target.value),placeholder:s("settings.custom.baseurl_ph"),"data-testid":`${a}-baseurl`,className:`${c} w-full px-2.5 py-1.5 font-mono`}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("input",{type:"text",value:l,onChange:e=>_(e.target.value),placeholder:s(k),"data-testid":`${a}-model`,className:`${c} min-w-0 flex-1 px-2.5 py-1.5 font-mono`}),t.jsx("input",{type:"password",value:u,onChange:e=>S(e.target.value),placeholder:s("settings.custom.apikey_ph"),"data-testid":`${a}-apikey`,className:`${c} min-w-0 flex-1 px-2.5 py-1.5`})]}),o==="llm"&&t.jsxs("label",{className:"inline-flex items-center gap-2 text-label cursor-pointer select-none","data-testid":`${a}-vision`,children:[t.jsx("input",{type:"checkbox",checked:f,onChange:e=>K(e.target.checked),className:"w-4 h-4 rounded accent-brand"}),t.jsx("span",{className:"text-ink-strong",children:s("settings.custom.vision")}),t.jsx("span",{className:"text-ink-faint",children:s("settings.custom.visionHint")})]}),m&&t.jsxs("div",{className:`text-label rounded p-2 inline-flex items-start gap-1.5 ${m.ok?"bg-brand/10 text-brand":"bg-warning/10 text-warning"}`,children:[m.ok?t.jsx(M,{className:"w-4 h-4 mt-px shrink-0","aria-hidden":"true"}):t.jsx(R,{className:"w-4 h-4 mt-px shrink-0","aria-hidden":"true"}),t.jsx("span",{className:"break-words",children:m.detail})]}),t.jsxs("div",{className:"flex gap-2",children:[t.jsx("button",{onClick:()=>void T(),disabled:!i.trim()||!l.trim()||x,"data-testid":`${a}-test`,className:"btn-3d-neutral px-3 py-1.5 text-label disabled:opacity-40",children:s(x?"settings.testing":"settings.test")}),t.jsx("button",{onClick:()=>void U(),disabled:!r.trim()||!i.trim()||!l.trim(),"data-testid":`${a}-save`,className:"btn-3d-brand px-3 py-1.5 text-label disabled:opacity-40",children:s("settings.custom.save")}),v&&t.jsx("button",{onClick:v,className:"text-label text-ink-muted hover:text-ink-strong px-3 py-1.5 transition-colors",children:s("action.cancel")})]})]})}function F({checked:o,onChange:d,label:a,testid:p}){return t.jsx("button",{type:"button",role:"switch","aria-checked":o,"aria-label":a,onClick:d,"data-testid":p,className:`relative w-12 h-6 rounded-full transition-colors shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand/60 focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--surface-2)] ${o?"bg-brand":"bg-ink/20 hover:bg-ink/25"}`,children:t.jsx("span",{className:`absolute left-0.5 top-1/2 -translate-y-1/2 w-5 h-5 rounded-full bg-white shadow transition-transform ${o?"translate-x-6":""}`})})}export{B as C,F as T};
@@ -1,4 +1,4 @@
1
- import{r as n,j as e}from"./index-C9fscARj.js";import{c as f,u as h,e as b,f as g}from"./main-jV_OilRs.js";import{R as j}from"./rotate-ccw-DZE_kYZu.js";/**
1
+ import{r as n,j as e}from"./index-jKxnKPxh.js";import{c as f,u as h,f as b,g}from"./main-C7vIrKEC.js";import{R as j}from"./rotate-ccw-DHjeGlQd.js";/**
2
2
  * @license lucide-react v0.468.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-SVP7TREG-BdekvWAw.js";import{p as f}from"./chunk-JWPE2WC7-DSVI_4gB.js";import{_ as n,l as o}from"./mermaid.core-37_hzSNp.js";import"./transform-Bd_a5eGM.js";import{M as c,b as d}from"./cynefin-OW5HDTMX-Ycd8yaFB.js";import"./main-jV_OilRs.js";import"./index-C9fscARj.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},I={parser:R,db:a,renderer:u,styles:p};export{I as diagram};
1
+ import{g as p,r as u,d as a}from"./chunk-SVP7TREG-CLk3nYlu.js";import{p as f}from"./chunk-JWPE2WC7-Cjsal04r.js";import{_ as n,l as o}from"./mermaid.core-B8uFE6gu.js";import"./transform-Bd_a5eGM.js";import{M as c,b as d}from"./cynefin-OW5HDTMX-BnU7sKRp.js";import"./main-C7vIrKEC.js";import"./index-jKxnKPxh.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},I={parser:R,db:a,renderer:u,styles:p};export{I as diagram};
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-XCWWM2C3-CO-wuQPY.js";import{p as f}from"./chunk-VII2H2IX-fTD7U-xL.js";import{M as c,b as d}from"./cynefin-OW5HDTMX-GVF3BKWE-wLMpc-W6.js";import{_ as n,l as o}from"./render-O7CIS3YK-BUZqrLRp.js";import"./transform-Bd_a5eGM.js";import"./mermaid-layout-elk.core-B1-o2tyd.js";import"./main-jV_OilRs.js";import"./index-C9fscARj.js";import"./_commonjs-dynamic-modules-TDtrdbi3.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),m=t?parseInt(t,10):0,l=s?parseInt(s,10):1/0;return{min:m,max:l}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},D={parser:R,db:a,renderer:u,styles:p};export{D as diagram};
1
+ import{g as p,r as u,d as a}from"./chunk-XCWWM2C3-CGZOunzF.js";import{p as f}from"./chunk-VII2H2IX-D9ZFtXPz.js";import{M as c,b as d}from"./cynefin-OW5HDTMX-GVF3BKWE-C0Fp61PQ.js";import{_ as n,l as o}from"./render-O7CIS3YK-DU3B_ERD.js";import"./transform-Bd_a5eGM.js";import"./mermaid-layout-elk.core-DfOj66Qv.js";import"./main-C7vIrKEC.js";import"./index-jKxnKPxh.js";import"./_commonjs-dynamic-modules-TDtrdbi3.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),m=t?parseInt(t,10):0,l=s?parseInt(s,10):1/0;return{min:m,max:l}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},D={parser:R,db:a,renderer:u,styles:p};export{D as diagram};
@@ -0,0 +1 @@
1
+ var P=Object.defineProperty;var f=(o,t,e)=>t in o?P(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e;var u=(o,t,e)=>f(o,typeof t!="symbol"?t+"":t,e);const y={listCourses:"course:list",getCourseTree:"course:getTree",importCourseFromRepo:"course:importFromRepo",detectLanguages:"course:detectLanguages",getCourseLanguages:"course:getLanguages",setCourseLanguage:"course:setLanguage",getCourseLanguage:"course:getLanguage",analyzeRepo:"course:analyzeRepo",importAnalyzed:"course:importAnalyzed",importLocalFolder:"import:localFolder",importGithub:"import:github",importUrl:"import:url",importText:"import:text",importEpub:"import:epub",importAudio:"import:audio",importCancel:"import:cancel",importResume:"import:resume",importPack:"import:importPack",exportPack:"import:exportPack",generateCourseFromMarkdown:"course:generateFromMarkdown",deleteCourse:"course:delete",restructureCourse:"course:restructure",generateSummaries:"course:generateSummaries",getStarterPrompts:"course:getStarterPrompts",getNodeContent:"course:getNodeContent",getNodeSummary:"course:getNodeSummary",getPracticeForLesson:"course:getPracticeForLesson",getLessonForPractice:"course:getLessonForPractice",listAssetsByNode:"asset:listByNode",listAssetsByCourse:"asset:listByCourse",getAssetDataUrl:"asset:getDataUrl",repairMermaidDiagram:"artifact:repairMermaid",getProgress:"progress:get",updateProgress:"progress:update",markNodeAttempted:"progress:markAttempted",generateExercise:"exercise:generate",listExercises:"exercise:list",submitExerciseAnswer:"exercise:submit",examPrepare:"exam:prepare",examRegenerate:"exam:regenerate",examGetStatus:"exam:getStatus",examStartAttempt:"exam:startAttempt",examRecordAnswer:"exam:recordAnswer",examSubmitAttempt:"exam:submitAttempt",getDueReviews:"srs:getDue",getAllSrsItems:"srs:getAll",recordReview:"srs:record",getStreak:"streak:get",touchStreakToday:"streak:touchToday",listSouls:"soul:list",getSoul:"soul:get",createSoul:"soul:create",setActiveSoul:"soul:setActive",getActiveSoul:"soul:getActive",agentChat:"agent:chat",abortAgentChat:"agent:abort",getChatHistory:"agent:getHistory",clearChatHistory:"agent:clearHistory",agentChatThread:"agent:chatThread",abortAgentChatThread:"agent:abortThread",getContextUsage:"agent:getContextUsage",getSpeechModelStatus:"speech:getModelStatus",ensureSpeechModel:"speech:ensureModel",deleteSpeechModel:"speech:deleteModel",ttsSpeak:"speech:ttsSpeak",ttsStop:"speech:ttsStop",asrTranscribe:"speech:asrTranscribe",testCustomTts:"speech:testCustomTts",testCustomAsr:"speech:testCustomAsr",getAttachmentDataUrl:"attachment:getDataUrl",isAgentReady:"agent:isReady",getProviderPresets:"agent:getProviderPresets",testLlmConnection:"agent:testConnection",testCustomProvider:"agent:testCustomProvider",testProvider:"agent:testProvider",discoverModels:"agent:discoverModels",discoverProviderModels:"agent:discoverProviderModels",discoverModelsFor:"agent:discoverModelsFor",getModelMeta:"agent:getModelMeta",getModelOverlay:"agent:getModelOverlay",setModelOverlay:"agent:setModelOverlay",refreshModelCatalog:"agent:refreshModelCatalog",listCustomProviders:"customProvider:list",createCustomProvider:"customProvider:create",updateCustomProvider:"customProvider:update",deleteCustomProvider:"customProvider:delete",listPendingProposals:"proposal:listPending",applyProposal:"proposal:apply",rejectProposal:"proposal:reject",recordQuizAnswer:"quiz:recordAnswer",logFriction:"friction:log",getDashboard:"dashboard:get",searchContent:"search:content",updateMemory:"memory:update",getMemory:"memory:get",consolidateMemory:"consolidate:run",getSetting:"settings:get",hasSetting:"settings:has",setSetting:"settings:set",profileGet:"profile:get",profileSet:"profile:set",bootGetState:"boot:getState",profileListProposals:"profile:listProposals",memoryListAll:"memory:listAll",memoryDeleteSlot:"memory:deleteSlot",companionPetSetClickThrough:"companionPet:setClickThrough",getUpdateInfo:"app:getUpdateInfo",dshImportDetect:"dsh:detect",dshImportFromPath:"dsh:importFromPath",dshImportFromText:"dsh:importFromText",companionPackCutFromImage:"companionPack:cutFromImage",companionPackApplyPack:"companionPack:applyPack",companionPackGetActive:"companionPack:getActive",companionPackList:"companionPack:list",companionPackActivate:"companionPack:activate",companionPackDelete:"companionPack:delete",shimejiImportZip:"shimeji:importZip",shimejiConfirmImport:"shimeji:confirmImport",shimejiList:"shimeji:list",shimejiGetActive:"shimeji:getActive",shimejiGetFrame:"shimeji:getFrame",shimejiActivate:"shimeji:activate",shimejiDelete:"shimeji:delete",shimejiSetVehicle:"shimeji:setVehicle",companionPackSetVehicle:"companionPack:setVehicle",getXpStatus:"xp:getStatus",exportCourse:"course:export",canvasList:"canvas:list",canvasSave:"canvas:save",canvasDelete:"canvas:delete",canvasTogglePin:"canvas:togglePin",canvasSaveUserNote:"canvas:saveUserNote",canvasRecordQuizResult:"canvas:recordQuizResult",canvasUpdateUserNoteComment:"canvas:updateUserNoteComment",threadList:"thread:list",threadCreate:"thread:create",threadUpdate:"thread:update",threadDelete:"thread:delete",threadGetMessages:"thread:getMessages",threadFindRecentByNode:"thread:findRecentByNode"},h=1,p="ls-serve-token";function S(){const o=new URLSearchParams(window.location.search).get("token");if(o){try{window.localStorage.setItem(p,o)}catch{}return o}try{return window.localStorage.getItem(p)??""}catch{return""}}class g{constructor(){u(this,"ws",null);u(this,"everOpened",!1);u(this,"pending",new Map);u(this,"listeners",new Map);u(this,"connectPromise",null)}connect(){return this.ws&&this.ws.readyState===WebSocket.OPEN?Promise.resolve(this.ws):this.connectPromise?this.connectPromise:(this.connectPromise=new Promise((t,e)=>{const c=window.location.protocol==="https:"?"wss:":"ws:",s=S(),n=`${c}//${window.location.host}/?token=${encodeURIComponent(s)}`;let i=!1;const l=new WebSocket(n);this.ws=l;const m=window.setTimeout(()=>{i||(i=!0,this.connectPromise=null,e(new Error("连接学习服务超时(serve 未启动?)")))},5e3);l.addEventListener("open",()=>{this.everOpened=!0,window.clearTimeout(m),i||(i=!0,this.connectPromise=null,t(l))}),l.addEventListener("message",d=>{let r=null;try{r=JSON.parse(String(d.data))}catch{return}if(!(!r||r.v!==h)){if(r.type==="res"){const a=this.pending.get(r.id);if(!a)return;this.pending.delete(r.id),window.clearTimeout(a.timer),r.ok?a.resolve(r.result):a.reject(new Error(r.error))}else if(r.type==="event"){const a=this.listeners.get(r.channel);if(a)for(const v of a)v(...r.args)}}}),l.addEventListener("close",d=>{if(this.connectPromise=null,this.ws===l&&(this.ws=null),!i){i=!0,window.clearTimeout(m),e(new Error(k(d)));return}const r=d.code===4001?"学习服务拒绝了连接(token 无效)——请用启动时打印的带 token 链接打开":"与服务端的连接已断开";for(const[,a]of this.pending)window.clearTimeout(a.timer),a.reject(new Error(r));if(d.code===4001&&(this.everOpened=!1),this.pending.clear(),d.code===4001){window.dispatchEvent(new CustomEvent(C));return}this.everOpened&&window.setTimeout(()=>void this.connect().catch(()=>{}),2e3)}),l.addEventListener("error",()=>{})}),this.connectPromise)}static bytesToB64(t){const e=new Uint8Array(t);let c="";const s=32768;for(let n=0;n<e.length;n+=s)c+=String.fromCharCode(...e.subarray(n,n+s));return btoa(c)}async invoke(t,...e){var n,i;const c=await this.connect(),s=((i=(n=globalThis.crypto)==null?void 0:n.randomUUID)==null?void 0:i.call(n))??String(Math.random()).slice(2);return new Promise((l,m)=>{const d=window.setTimeout(()=>{this.pending.delete(s),m(new Error(`调用 ${t} 超时`))},3e5);this.pending.set(s,{resolve:l,reject:m,timer:d});const r=t==="speech:asrTranscribe"&&e[0]instanceof ArrayBuffer?[g.bytesToB64(e[0]),...e.slice(1)]:e;c.send(JSON.stringify({v:h,type:"req",id:s,channel:t,args:r}))})}on(t,e){const c=t==="speech:ttsAudio"?(...n)=>{const i=n[0];if(i&&typeof i.wavBase64=="string"){const l=atob(i.wavBase64),m=new Uint8Array(l.length);for(let a=0;a<l.length;a++)m[a]=l.charCodeAt(a);const{wavBase64:d,...r}=i;e({...r,wavBytes:m.buffer})}else e(...n)}:e;let s=this.listeners.get(t);return s||(s=new Set,this.listeners.set(t,s)),s.add(c),this.connect().catch(()=>{}),()=>{s.delete(c)}}}function T(){if(typeof window>"u")return!1;if(new URLSearchParams(window.location.search).get("token"))return!0;try{return!!window.localStorage.getItem(p)}catch{return!1}}function b(o){let t=!0;try{window.localStorage.setItem(p,o)}catch{t=!1}const e=new URL(window.location.href);t?e.searchParams.delete("token"):e.searchParams.set("token",o),window.history.replaceState(null,"",e.toString())}const C="ls-web-token-rejected";function k(o){return o.code===4001?"学习服务拒绝了连接(token 无效)——请用启动时打印的带 token 链接打开":"无法连接学习服务(serve 未启动?)"}let w=!1;async function M(){if(w||window.api)return;w=!0;const o=new g,t={};for(const[e,c]of Object.entries(y))t[e]=(...s)=>o.invoke(c,...s);t.on=(e,c)=>o.on(e,c),window.api=t,window.__lookatstudyWeb=!0}function x(){return new g}export{C as TOKEN_REJECTED_EVENT,x as createWebTransportForTest,T as hasWebToken,M as installWebApi,b as setWebToken};