lookatstudy-mobile 0.22.1 → 0.23.1

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 (143) hide show
  1. package/package.json +1 -1
  2. package/seed-course.json +15 -15
  3. package/server.cjs +309 -28
  4. package/web/assets/{CanvasStage--cO-dGou.js → CanvasStage-Ba-21anG.js} +1 -1
  5. package/web/assets/{CommandPalette-B9yujZKA.js → CommandPalette-SKnzQMcN.js} +1 -1
  6. package/web/assets/{CourseSearchPanel-C7Mz8cwp.js → CourseSearchPanel-BW3fNReR.js} +1 -1
  7. package/web/assets/{ExamView-CxgAmCWD.js → ExamView-BnH6BraN.js} +1 -1
  8. package/web/assets/{MindmapView-D2NywTY1.js → MindmapView-B4SeCLQj.js} +3 -3
  9. package/web/assets/{ReviewPanel-CLOe8uSS.js → ReviewPanel-DkGT8tNA.js} +1 -1
  10. package/web/assets/{SettingsView-Crx4fWxj.js → SettingsView-dExmRnIv.js} +3 -3
  11. package/web/assets/{VoicePanel-B9o8PTlU.js → VoicePanel-CxNeKn4V.js} +2 -7
  12. package/web/assets/{abnfDiagram-N423BO3Z-DlR3JtCi.js → abnfDiagram-N423BO3Z-B4kvB05N.js} +1 -1
  13. package/web/assets/{abnfDiagram-VCTEODGH-ODA7YWAP-Cc60_NCH.js → abnfDiagram-VCTEODGH-ODA7YWAP-B5zhG8XJ.js} +1 -1
  14. package/web/assets/{architectureDiagram-5GKGNRK7-C4PU3XN7-DxA8-TH0.js → architectureDiagram-5GKGNRK7-C4PU3XN7-ybcWxxhr.js} +1 -1
  15. package/web/assets/{architectureDiagram-T3A2C74G-b87f0Zfh.js → architectureDiagram-T3A2C74G-D5eb-etB.js} +1 -1
  16. package/web/assets/{arrow-right-B_6KkCJV.js → arrow-right-D4GV0Gpo.js} +1 -1
  17. package/web/assets/{blockDiagram-NRAW4CY4-UMJ6PMQQ-DujiZmu6.js → blockDiagram-NRAW4CY4-UMJ6PMQQ-DwEVReBp.js} +1 -1
  18. package/web/assets/{blockDiagram-VBNYF7ZC-BVvgfsGF.js → blockDiagram-VBNYF7ZC-DuM7ndnl.js} +1 -1
  19. package/web/assets/{c4Diagram-5PPSVZJV-5YSQGEVW.js → c4Diagram-5PPSVZJV-BQkRaO7S.js} +1 -1
  20. package/web/assets/{c4Diagram-UCG6FXSJ-75X3U2P3-DOEKYDP0.js → c4Diagram-UCG6FXSJ-75X3U2P3-Di1jNn7S.js} +1 -1
  21. package/web/assets/channel-KoPlHvUR.js +1 -0
  22. package/web/assets/{chunk-2GRJ4B5K-7x3UypsR.js → chunk-2GRJ4B5K-C7VAL2Yd.js} +1 -1
  23. package/web/assets/{chunk-2Q5K7J3B-5RQfakW9.js → chunk-2Q5K7J3B-Jpo34qVL.js} +1 -1
  24. package/web/assets/{chunk-5RXB4S5H-CX91mO_w.js → chunk-5RXB4S5H-CrW8aZl4.js} +1 -1
  25. package/web/assets/{chunk-5VM5RSS4-DhfIWqOK.js → chunk-5VM5RSS4-Dv4MffdC.js} +1 -1
  26. package/web/assets/{chunk-6Q2QTUOP-DyBMkImn.js → chunk-6Q2QTUOP-CI07iNTB.js} +1 -1
  27. package/web/assets/{chunk-7XDTSPCN-l_wcpmq6.js → chunk-7XDTSPCN-DsQtrF-N.js} +1 -1
  28. package/web/assets/{chunk-CTNIYPP6-Bej-ifE4.js → chunk-CTNIYPP6-CpdWBpIN.js} +1 -1
  29. package/web/assets/{chunk-CXNFBKHE-BymXgi-y.js → chunk-CXNFBKHE-BDCDRaZC.js} +1 -1
  30. package/web/assets/{chunk-GF5L2VYU-DeTnv5Qk.js → chunk-GF5L2VYU-DtpZkefy.js} +1 -1
  31. package/web/assets/{chunk-ISA7TJRJ-CFmR6SoA.js → chunk-ISA7TJRJ-C3LgQ-bA.js} +1 -1
  32. package/web/assets/{chunk-JWPE2WC7-BU-fMtWi.js → chunk-JWPE2WC7-DJM1SevB.js} +1 -1
  33. package/web/assets/{chunk-KBJHAD2P-BjlTMp1m.js → chunk-KBJHAD2P-7KeTMqC1.js} +1 -1
  34. package/web/assets/{chunk-LV3HUYFY-riE_n54k.js → chunk-LV3HUYFY-B2sGhGxz.js} +1 -1
  35. package/web/assets/{chunk-M3IUQBOH-DYx0J19K.js → chunk-M3IUQBOH-Dazbegdb.js} +1 -1
  36. package/web/assets/{chunk-NDIOYS4C-D34dHdEf.js → chunk-NDIOYS4C-Cx7mCz5-.js} +1 -1
  37. package/web/assets/{chunk-RE4WF27V-qx7CV25O.js → chunk-RE4WF27V-BNzpDJts.js} +1 -1
  38. package/web/assets/{chunk-RYQCIY6F-AqdEeieF.js → chunk-RYQCIY6F-Boq_29rU.js} +1 -1
  39. package/web/assets/{chunk-VII2H2IX-CzkbeZYY.js → chunk-VII2H2IX-kQVDZD-x.js} +1 -1
  40. package/web/assets/{chunk-X5GNSKZ3-DVqvzTCj.js → chunk-X5GNSKZ3-DT5Ja5IF.js} +1 -1
  41. package/web/assets/{chunk-XCWWM2C3-BJLKBAh0.js → chunk-XCWWM2C3-BAq7zpgL.js} +1 -1
  42. package/web/assets/{chunk-XXDRQBXY-Nz1f1JPS.js → chunk-XXDRQBXY-D3vcLngc.js} +1 -1
  43. package/web/assets/classDiagram-DTDB5LWJ-LWRDKZ5K-P8Aw4zHn.js +1 -0
  44. package/web/assets/classDiagram-JCYQIIEL-Dm2NSERp.js +1 -0
  45. package/web/assets/classDiagram-v2-JRS7N3AN-2BZHGRP2-P8Aw4zHn.js +1 -0
  46. package/web/assets/classDiagram-v2-OCEON4UE-Dm2NSERp.js +1 -0
  47. package/web/assets/{core-5AezUpt1.js → core-4d9vIKK9.js} +4 -4
  48. package/web/assets/{cose-bilkent-JH36ORCC-OB24KH3T-B46Ih9E8.js → cose-bilkent-JH36ORCC-OB24KH3T-DwFzf1xR.js} +1 -1
  49. package/web/assets/{cose-bilkent-JH36ORCC-Bwf1adzB.js → cose-bilkent-JH36ORCC-RoUdcSs7.js} +1 -1
  50. package/web/assets/{cynefin-OW5HDTMX-GVF3BKWE-DcR0n-8p.js → cynefin-OW5HDTMX-GVF3BKWE-Bdt2EF7g.js} +1 -1
  51. package/web/assets/{cynefin-VYW2F7L2-BtjjXqMe.js → cynefin-VYW2F7L2-Br1TXK2f.js} +1 -1
  52. package/web/assets/{cynefinDiagram-5FMLGOSQ-H3WIRU3N-CecBQ3WS.js → cynefinDiagram-5FMLGOSQ-H3WIRU3N-DFRlDIhn.js} +1 -1
  53. package/web/assets/{cynefinDiagram-MW4NZA55-CeLD6_7i.js → cynefinDiagram-MW4NZA55-DeqLH2Db.js} +1 -1
  54. package/web/assets/{dagre-3AP2YEHR-DCERTXHT-I_531Mm0.js → dagre-3AP2YEHR-DCERTXHT-wbCkJQSQ.js} +1 -1
  55. package/web/assets/{dagre-VZM6K2ZE-BYSfxtKs.js → dagre-VZM6K2ZE-X3laLObS.js} +1 -1
  56. package/web/assets/{diagram-7IWD3JNH-CfUUB3zT.js → diagram-7IWD3JNH-8bZxUpBi.js} +1 -1
  57. package/web/assets/{diagram-B4RE2ZJO-B4h2KVGE.js → diagram-B4RE2ZJO-CsGnKBa4.js} +1 -1
  58. package/web/assets/{diagram-LBJQPF4R-BycPUMao.js → diagram-LBJQPF4R-CxaNBwKI.js} +1 -1
  59. package/web/assets/{diagram-Q27KOJAE-nUmmLOWc.js → diagram-Q27KOJAE-CjVLD6gb.js} +1 -1
  60. package/web/assets/{diagram-S7CK7UJ4-MULGZGEL-YmP_5pu9.js → diagram-S7CK7UJ4-MULGZGEL-wKLcWkw4.js} +1 -1
  61. package/web/assets/{diagram-UB23O5K3-AbqPe_Lw.js → diagram-UB23O5K3-CUZ34yVE.js} +1 -1
  62. package/web/assets/{diagram-UQ7AKVKN-YQBY353J-CSBHhT_p.js → diagram-UQ7AKVKN-YQBY353J-B_ah6OV8.js} +1 -1
  63. package/web/assets/{diagram-VSXAHHWV-WLNH2ELY-BIWRzcG_.js → diagram-VSXAHHWV-WLNH2ELY-BhbJ7E_e.js} +1 -1
  64. package/web/assets/{diagram-VX7I27RA-XW6YQV5G-DOIsDS0u.js → diagram-VX7I27RA-XW6YQV5G-DnFEyO87.js} +1 -1
  65. package/web/assets/{diagram-Z3DM3KII-HG7RF65D-CL_RkrR1.js → diagram-Z3DM3KII-HG7RF65D-Vughovua.js} +1 -1
  66. package/web/assets/{ebnfDiagram-BXEA7PRR-CiCY0Nb_.js → ebnfDiagram-BXEA7PRR-B2ehf44X.js} +1 -1
  67. package/web/assets/{ebnfDiagram-PWID7BFC-OKY4VHYD-30_W7bxy.js → ebnfDiagram-PWID7BFC-OKY4VHYD-BjbgNq8R.js} +1 -1
  68. package/web/assets/{elk.bundled-CoJK8Y5o.js → elk.bundled-CktUbZ7z.js} +1 -1
  69. package/web/assets/{erDiagram-JOGREHBK-CiMrd6Dm.js → erDiagram-JOGREHBK-9wI_YE-7.js} +1 -1
  70. package/web/assets/{erDiagram-SSCWMZ5O-PIPKOIK7-DR-Xlax4.js → erDiagram-SSCWMZ5O-PIPKOIK7-V60k7zg6.js} +1 -1
  71. package/web/assets/{flowDiagram-A5DVABFB-2Z4AVO5R-Bm2DnZWS.js → flowDiagram-A5DVABFB-2Z4AVO5R-CJdwjvtN.js} +1 -1
  72. package/web/assets/{flowDiagram-UKHOOZJN-DlA7YU9i.js → flowDiagram-UKHOOZJN-B3XmqjMH.js} +1 -1
  73. package/web/assets/{ganttDiagram-EL5Y4UJY-JZNG7GOG-CycOiHbj.js → ganttDiagram-EL5Y4UJY-JZNG7GOG-2a6TiXM3.js} +1 -1
  74. package/web/assets/{ganttDiagram-PKOTCBZU-BT4d6R51.js → ganttDiagram-PKOTCBZU-B7B9nD6g.js} +1 -1
  75. package/web/assets/{gitGraphDiagram-DS77QQ5N-DyUz04eh.js → gitGraphDiagram-DS77QQ5N-VwKL0Ozk.js} +1 -1
  76. package/web/assets/{gitGraphDiagram-WWUBYQGX-DMWMLL3G-Cp635UIu.js → gitGraphDiagram-WWUBYQGX-DMWMLL3G-BMs5FYkE.js} +1 -1
  77. package/web/assets/{index-D619gSoN.js → index-D0FRqjBW.js} +2 -2
  78. package/web/assets/{index-ClPJ1xdX.js → index-DFryMRAp.js} +6 -6
  79. package/web/assets/{index-c6Br465X.css → index-DjoBjasB.css} +1 -1
  80. package/web/assets/{index-8JL6mw1y.js → index-DkjixD09.js} +1 -1
  81. package/web/assets/{index-BSXjRLsf.js → index-Vtc_VHiK.js} +1 -1
  82. package/web/assets/{infoDiagram-6WML65LV-rj50EKNC.js → infoDiagram-6WML65LV-CD6GNI7J.js} +1 -1
  83. package/web/assets/{infoDiagram-RXCK75RN-HANS5KVC-BHovTPxo.js → infoDiagram-RXCK75RN-HANS5KVC-k8vzCiSp.js} +1 -1
  84. package/web/assets/{ishikawaDiagram-5VMMS53U-7GCIT7WU-B0aX9dg0.js → ishikawaDiagram-5VMMS53U-7GCIT7WU-Ckl5jIU6.js} +1 -1
  85. package/web/assets/{ishikawaDiagram-WSZJBQD7-Cs68VzMS.js → ishikawaDiagram-WSZJBQD7-CEdvuK4K.js} +1 -1
  86. package/web/assets/{journeyDiagram-EYS64GPL-OAPELBT7-BaF1Okyl.js → journeyDiagram-EYS64GPL-OAPELBT7-DtCRso4h.js} +1 -1
  87. package/web/assets/{journeyDiagram-NVQOT4AX-CxamcAfg.js → journeyDiagram-NVQOT4AX-CxPjI9L-.js} +1 -1
  88. package/web/assets/{kanban-definition-27J2QSJJ-CqkEoxuc.js → kanban-definition-27J2QSJJ-DnuNCFkl.js} +1 -1
  89. package/web/assets/{kanban-definition-3QL26DDD-I7RKWQQY-KQq8LJIu.js → kanban-definition-3QL26DDD-I7RKWQQY-yNRn2nj0.js} +1 -1
  90. package/web/assets/{katex-N6JRN4PM-BRgAOu7M.js → katex-N6JRN4PM-B9dEOiMG.js} +1 -1
  91. package/web/assets/main-CGE6fm01.js +462 -0
  92. package/web/assets/{mermaid-layout-elk.core-CS6tfHSb.js → mermaid-layout-elk.core-BUAJJUsd.js} +2 -2
  93. package/web/assets/{mermaid.core-D_Bznvdr.js → mermaid.core-BD32Za4p.js} +4 -4
  94. package/web/assets/{mindmap-definition-FAOFIHXS-h9YeSHf4.js → mindmap-definition-FAOFIHXS-DX6VEGs_.js} +1 -1
  95. package/web/assets/{mindmap-definition-FBJOCRG2-KIYZG64Y-DT9Y6a9o.js → mindmap-definition-FBJOCRG2-KIYZG64Y-DYiBZnHG.js} +1 -1
  96. package/web/assets/{pegDiagram-VL7TDLO6-C--Hsstu.js → pegDiagram-VL7TDLO6-Big72xut.js} +1 -1
  97. package/web/assets/{pegDiagram-XKGWAZYB-OIP57N6J-CXtA7B8B.js → pegDiagram-XKGWAZYB-OIP57N6J-N0pgSR7W.js} +1 -1
  98. package/web/assets/{pet-BWlfq4I-.js → pet-DopPVlAf.js} +1 -1
  99. package/web/assets/{pieDiagram-7S7Q4E2Y-CVnsOokB.js → pieDiagram-7S7Q4E2Y-BLXLqOCg.js} +1 -1
  100. package/web/assets/{pieDiagram-E7YTZNPT-2UOTW327-DkYfAF2K.js → pieDiagram-E7YTZNPT-2UOTW327-BuB4rTS2.js} +1 -1
  101. package/web/assets/{quadrantDiagram-AXDQQJYC-SN3ASJJK-B3grZeFo.js → quadrantDiagram-AXDQQJYC-SN3ASJJK-4S-5LgOz.js} +1 -1
  102. package/web/assets/{quadrantDiagram-CIZ2JOQS-i1yx34JH.js → quadrantDiagram-CIZ2JOQS-BUwizsLb.js} +1 -1
  103. package/web/assets/{railroadDiagram-AXF67PYL-DJuiGlbf.js → railroadDiagram-AXF67PYL-D3qxyYSE.js} +1 -1
  104. package/web/assets/{railroadDiagram-O6MQD6OU-34742W6X-up2Y0ZV_.js → railroadDiagram-O6MQD6OU-34742W6X-CzT_bN34.js} +1 -1
  105. package/web/assets/{render-O7CIS3YK-Dn1e27o_.js → render-O7CIS3YK-DhYmSGoI.js} +7 -7
  106. package/web/assets/{requirementDiagram-EFPCY7ZU-NGAFFSMB-BI_BSQB1.js → requirementDiagram-EFPCY7ZU-NGAFFSMB-iWwnW8VG.js} +1 -1
  107. package/web/assets/{requirementDiagram-LRYGKXZP-nFTGE1MQ.js → requirementDiagram-LRYGKXZP-Cf95T2or.js} +1 -1
  108. package/web/assets/{rotate-ccw-nkiipcxH.js → rotate-ccw-natFwqj6.js} +1 -1
  109. package/web/assets/{sankeyDiagram-P5KCCOFB-3D3M4XPB-Bqf3rmL6.js → sankeyDiagram-P5KCCOFB-3D3M4XPB-CjA_LC6M.js} +1 -1
  110. package/web/assets/{sankeyDiagram-W5VNT64P-BIhgGHwI.js → sankeyDiagram-W5VNT64P-CeGCHk7F.js} +1 -1
  111. package/web/assets/{sequenceDiagram-SI44F4Z6-BASko1ED.js → sequenceDiagram-SI44F4Z6-BDsExCj2.js} +1 -1
  112. package/web/assets/{sequenceDiagram-WJ2MYXX4-Q2IOPB4R-BiNVA6gm.js → sequenceDiagram-WJ2MYXX4-Q2IOPB4R-DbWhuP8u.js} +1 -1
  113. package/web/assets/{sizeCapture-X5ZJPWSS-PSGVOMYM-TxBOTj1p.js → sizeCapture-X5ZJPWSS-PSGVOMYM-DB5JtURh.js} +1 -1
  114. package/web/assets/{sizeCapture-X5ZJPWSS-CGWs4y9a.js → sizeCapture-X5ZJPWSS-_5trx7u2.js} +1 -1
  115. package/web/assets/{stateDiagram-HBIQ2CUA-4M2S6MAN-BdhmANKG.js → stateDiagram-HBIQ2CUA-4M2S6MAN-CBEhL8_A.js} +1 -1
  116. package/web/assets/{stateDiagram-OKZ733FA-CkUDyLVf.js → stateDiagram-OKZ733FA-BPHwMfDA.js} +1 -1
  117. package/web/assets/stateDiagram-v2-4QOOHH4V-LBBLA2WV-lZeXiw9L.js +1 -0
  118. package/web/assets/stateDiagram-v2-UEYNNEHI-cH9YNExR.js +1 -0
  119. package/web/assets/{swimlanes-SLNWSIFB-CZxwkAvO.js → swimlanes-SLNWSIFB-CDgj9OM9.js} +2 -2
  120. package/web/assets/{swimlanes-XN3QIQJK-N6N2CCQ6-Zac8KNFb.js → swimlanes-XN3QIQJK-N6N2CCQ6-D3F0tmOR.js} +1 -1
  121. package/web/assets/swimlanesDiagram-ULZ7WXOC-C3faa0-8.js +8 -0
  122. package/web/assets/swimlanesDiagram-VK2B7HYN-E6N4H5SY-D5nVBF4q.js +8 -0
  123. package/web/assets/{timeline-definition-24CTP7MA-KN7RSRVM-DCu4MVvb.js → timeline-definition-24CTP7MA-KN7RSRVM-C0Ufqqk-.js} +1 -1
  124. package/web/assets/{timeline-definition-Z64GVDOM-DEFnQeMY.js → timeline-definition-Z64GVDOM-81O3UI2y.js} +1 -1
  125. package/web/assets/{vennDiagram-4TSXK5OY-AKJ7LXAN-Bi1vBY1O.js → vennDiagram-4TSXK5OY-AKJ7LXAN-Cwa7TjWJ.js} +1 -1
  126. package/web/assets/{vennDiagram-T6HMQDX7-Wls_-1IU.js → vennDiagram-T6HMQDX7-BfOTIcvk.js} +1 -1
  127. package/web/assets/{wardleyDiagram-T6FBY63Y-BSjNiv26.js → wardleyDiagram-T6FBY63Y-CYCyu4_S.js} +1 -1
  128. package/web/assets/{wardleyDiagram-VM6X3IG4-3B6A3BN5-BWtS3yVZ.js → wardleyDiagram-VM6X3IG4-3B6A3BN5-CHXrbpNv.js} +1 -1
  129. package/web/assets/{xychartDiagram-ELKLHX3M-B5qgODUp.js → xychartDiagram-ELKLHX3M-7mp6PB7p.js} +1 -1
  130. package/web/assets/{xychartDiagram-S5SC5T6Z-OBDNV6WG-j0XdC2zd.js → xychartDiagram-S5SC5T6Z-OBDNV6WG-Ch73fB_B.js} +1 -1
  131. package/web/index.html +3 -3
  132. package/web/pet.html +3 -3
  133. package/web/assets/channel-CWI530Vq.js +0 -1
  134. package/web/assets/classDiagram-DTDB5LWJ-LWRDKZ5K---3y6DiQ.js +0 -1
  135. package/web/assets/classDiagram-JCYQIIEL-CKDJ6TE8.js +0 -1
  136. package/web/assets/classDiagram-v2-JRS7N3AN-2BZHGRP2---3y6DiQ.js +0 -1
  137. package/web/assets/classDiagram-v2-OCEON4UE-CKDJ6TE8.js +0 -1
  138. package/web/assets/main-BBu4fQk-.js +0 -457
  139. package/web/assets/stateDiagram-v2-4QOOHH4V-LBBLA2WV-DLoWKuNC.js +0 -1
  140. package/web/assets/stateDiagram-v2-UEYNNEHI-C4uNy_P4.js +0 -1
  141. package/web/assets/swimlanesDiagram-ULZ7WXOC-Ch9trOTe.js +0 -8
  142. package/web/assets/swimlanesDiagram-VK2B7HYN-E6N4H5SY-DBYYfTTt.js +0 -8
  143. /package/web/assets/{index-C5s4t4ce.js → index-xynt7zMk.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lookatstudy-mobile",
3
- "version": "0.22.1",
3
+ "version": "0.23.1",
4
4
  "description": "LookatStudy Termux portable bundle (server.cjs + web frontend)",
5
5
  "repository": {
6
6
  "type": "git",
package/seed-course.json CHANGED
@@ -29,7 +29,7 @@
29
29
  "title": "欢迎使用 LookatStudy",
30
30
  "sourcePath": "ch1/lesson-1.md",
31
31
  "orderIdx": 0,
32
- "content": "# 欢迎使用 LookatStudy\n\n**LookatStudy** 是一个本地优先、AI 驱动的桌面学习平台。它能把任意 GitHub 学习仓库或本地文件夹变成一个多邻国式的互动课程——带有技能地图、AI 导师、间隔重复和游戏化激励。\n\n## 它能帮你做什么\n\n- 📚 **把任何仓库变课程**:粘贴 GitHub URL 或选择本地文件夹,10 种文档格式(Markdown / Jupyter / RST / PDF / PPTX / HTML 等)+ 30 多种代码语言自动解析成结构化课程,图片也能带进来\n- 🗺️ **技能地图导航**:多邻国风格的气球节点地图,随滚动从清晨飘到夜晚,逐课解锁,视觉化你的学习进度\n- 🤖 **AI 个人导师**:每个知识点独立追踪掌握度(BKT),AI 根据你的理解程度动态调整教学策略,还能看见你最近的卡点\n- 📝 **康奈尔笔记本**:三区设计(理解 / 笔记 / 练习),AI 生成概念图、对比表、流程图,你画线加笔记\n- 🔁 **间隔重复**:SM-2 算法安排复习,连续打卡 + XP + 皇冠激励持续学习\n\n## 设计理念\n\n- **本地优先**:所有数据存在本地 SQLite,你的学习记录永远在你手里\n- **BYO Key**:自带 LLM API Key,你的对话不经过任何中间服务器\n- **AI 起草、人确认**:AI 永远不直接修改你的学习记录——每次状态变更都通过 Propose → Apply 协议,你审批后才生效\n\n## 从哪里开始\n\n每次启动 LookatStudy 都从「未选课程」状态开始:在左侧「导入课程」面板里选择一门已导入的课程开始学习,或者导入新课程。点开下一课「导入你的第一个课程」了解全部导入方式!",
32
+ "content": "# 欢迎使用 LookatStudy\n\n**LookatStudy** 是一个本地优先、AI 驱动的桌面学习平台。它能把学习仓库、本地文件夹、网页链接、论文、视频或电子书变成一个多邻国式的互动课程——带有技能地图、AI 导师、间隔重复和游戏化激励。\n\n## 它能帮你做什么\n\n- 📚 **把几乎任何东西变课程**:GitHub 仓库、本地文件夹、网页文章、arXiv 论文、B站/YouTube 视频、EPUB 电子书、粘贴的文本、本地录音录像——12 种文档格式(Markdown / Jupyter / RST / PDF / PPTX / Word / EPUB 等)+ 30 多种代码语言自动解析成结构化课程,图片也能带进来\n- 🗺️ **技能地图导航**:多邻国风格的气球节点地图,随滚动从清晨飘到夜晚,逐课解锁,视觉化你的学习进度\n- 🤖 **AI 个人导师**:每个知识点独立追踪掌握度(BKT),AI 根据你的理解程度动态调整教学策略,还能看见你最近的卡点\n- 📝 **康奈尔笔记本**:三区设计(理解 / 笔记 / 练习),AI 生成概念图、对比表、流程图,你画线加笔记\n- 🔁 **间隔重复**:SM-2 算法安排复习,连续打卡 + XP + 皇冠激励持续学习\n\n## 设计理念\n\n- **本地优先**:所有数据存在本地 SQLite,你的学习记录永远在你手里\n- **BYO Key**:自带 LLM API Key,你的对话不经过任何中间服务器\n- **AI 起草、人确认**:AI 永远不直接修改你的学习记录——每次状态变更都通过 Propose → Apply 协议,你审批后才生效\n\n## 从哪里开始\n\n每次启动 LookatStudy 都从「未选课程」状态开始:在左侧「导入课程」面板里选择一门已导入的课程开始学习,或者导入新课程。点开下一课「导入你的第一个课程」了解全部导入方式!",
33
33
  "summary": "了解 LookatStudy 是什么、它能帮你做什么",
34
34
  "summaryEn": "What LookatStudy is and what it can do for you"
35
35
  },
@@ -40,9 +40,9 @@
40
40
  "title": "导入你的第一个课程",
41
41
  "sourcePath": "ch1/lesson-2.md",
42
42
  "orderIdx": 1,
43
- "content": "# 导入你的第一个课程\n\nLookatStudy 支持三种导入方式,覆盖几乎所有学习材料来源。\n\n## 方式一:GitHub URL\n\n在左侧「导入课程」面板粘贴 GitHub 仓库地址。智能导入管线会自动:拉取 README 识别课程大纲、扫描完整文件树(文档 + 代码 + 翻译)、AI 判断每个文件的角色、AI 设计章节结构、图片自动内联。\n\n## 方式二:本地文件夹\n\n点击本地文件夹按钮,选择一个包含学习材料的文件夹。支持递归扫描子目录,自动识别文档、代码、图片、翻译。\n\n适用场景:下载的课程包、本地 clone 的仓库、自己整理的学习笔记文件夹。\n\n## 方式三:粘贴 Markdown\n\n直接粘贴 Markdown 文本。适用场景:私有仓库、网络受限环境、快速把一段笔记变成课程。\n\n## 导入是后台任务\n\n点击导入后任务立即进入后台:进度窗口实时显示每一步和耗时,期间你可以切走继续浏览其他课程,导入完成后会弹通知提醒,不会强制跳转。中途可以随时取消。\n\n## 课程管理\n\n课程列表里悬浮课程行可以删除(就地弹确认卡片,不会跳界面);正在学习的课程也可以直接删——地图头课程名旁有删除按钮,删除后回到「未选课程」初始状态。删除会清掉该课程的全部学习记录,不可撤销。",
44
- "summary": "三种导入方式、后台导入任务、课程删除",
45
- "summaryEn": "Three import routes, background import jobs, and course removal"
43
+ "content": "# 导入你的第一个课程\n\nLookatStudy 支持五种导入方式,覆盖几乎所有学习材料来源。\n\n## 方式一:GitHub URL\n\n在左侧「导入课程」面板粘贴 GitHub 仓库地址。智能导入管线会自动:拉取 README 识别课程大纲、扫描完整文件树(文档 + 代码 + 翻译)、AI 判断每个文件的角色、AI 设计章节结构、图片自动内联。\n\n## 方式二:本地文件夹\n\n点击本地文件夹按钮,选择一个包含学习材料的文件夹。支持递归扫描子目录,自动识别文档、代码、图片、翻译。文件夹里的音频(.mp3/.m4a 等)和视频(.mp4 等)文件会在本地 Whisper 转写成课文,一节录音变成一节课。\n\n适用场景:下载的课程包、本地 clone 的仓库、自己整理的学习笔记文件夹。\n\n## 方式三:智能链接\n\n直接粘贴一个网页地址。文章页抽取正文成课;arXiv 论文下载 PDF 解析;视频链接(B站/YouTube/抖音)拉取音频转写,有字幕的视频优先用字幕、零转写——B站多分P整季导入,一集一课。\n\n## 方式四:粘贴 Markdown\n\n直接粘贴 Markdown 文本。适用场景:私有仓库、网络受限环境、快速把一段笔记变成课程。\n\n## 方式五:EPUB 电子书\n\n选择一个 .epub 文件,每章自动变成一节课,章节结构完整保留。\n\n## 导入是后台任务\n\n点击导入后任务立即进入后台:进度窗口实时显示每一步和耗时,期间你可以切走继续浏览其他课程,导入完成后会弹通知提醒,不会强制跳转。中途可以随时取消。\n\n## 课程管理\n\n课程列表里悬浮课程行可以删除(就地弹确认卡片,不会跳界面);正在学习的课程也可以直接删——地图头课程名旁有删除按钮,删除后回到「未选课程」初始状态。删除会清掉该课程的全部学习记录,不可撤销。",
44
+ "summary": "五种导入方式、后台导入任务、课程删除",
45
+ "summaryEn": "Five import routes, background import jobs, and course removal"
46
46
  },
47
47
  {
48
48
  "id": "guide-les-1-3",
@@ -51,7 +51,7 @@
51
51
  "title": "三栏布局导览",
52
52
  "sourcePath": "ch1/lesson-3.md",
53
53
  "orderIdx": 2,
54
- "content": "# 三栏布局导览\n\nLookatStudy 采用三栏布局,每一栏对应学习的不同环节。支持浅色 / 深色 / 跟随系统三种主题。\n\n## 左栏:课程地图与导入\n\n左栏顶部有两个标签:「导入课程」和「课程地图」。地图是多邻国风格的气球节点地图——每个气球代表一个课时,随着你向下学习,背景天空从清晨渐变到夜晚。\n\n地图标题卡显示课程名、整体掌握度百分比、待复习徽章、🌐 语言切换(多语言课程可在此切换原文/翻译)和删除当前课程按钮。\n\n## 中栏:AI 对话\n\n与 AI 导师的交互区域:顶部会话标签页(每个课时可以有多个对话线程)、对话流(AI 回复流式输出,提议卡、概念图等会持久保存)、底部输入区(含教学人设药丸、字号 A-/A+、四个巩固选择按钮)。\n\n按 Ctrl+K 打开命令面板,Ctrl+Tab 循环切换会话,Ctrl+B 折叠/展开左栏。\n\n## 右栏:康奈尔笔记本\n\n三区设计的笔记本:讲解 Tab 显示课时正文(Markdown 渲染),可以选中文字画线加笔记。笔记 Tab 包含三个区域——理解区(AI 产物)、笔记区(你的画线笔记)、练习区(测验 + 答题记录)。\n\n## 焦点锁定\n\n当 AI 正在回复时,切换课时和会话会被临时锁定——确保你不会在 AI 输出到一半时丢失上下文。",
54
+ "content": "# 三栏布局导览\n\nLookatStudy 采用三栏布局,每一栏对应学习的不同环节。支持浅色 / 深色 / 跟随系统三种主题。\n\n## 左栏:课程地图与导入\n\n左栏顶部有两个标签:「导入课程」和「课程地图」。地图是多邻国风格的气球节点地图——每个气球代表一个课时,随着你向下学习,背景天空从清晨渐变到夜晚。\n\n地图标题卡显示课程名、整体掌握度百分比、待复习徽章、🌐 语言切换(多语言课程可在此切换原文/翻译)和删除当前课程按钮。\n\n## 中栏:AI 对话\n\n与 AI 导师的交互区域:顶部会话标签页(每个课时可以有多个对话线程)、对话流(AI 回复流式输出,提议卡、概念图等会持久保存)、底部输入区(含教学人设药丸、字号 A-/A+、四个巩固选择按钮)。\n\n按 Ctrl+K 打开命令面板,Ctrl+Tab 循环切换会话,Ctrl+B 折叠/展开左栏。\n\n## 右栏:康奈尔笔记本\n\n三区设计的笔记本:讲解 Tab 显示课时正文(Markdown 渲染),可以选中文字画线加笔记。笔记 Tab 包含三个区域——理解区(AI 产物)、笔记区(你的画线笔记)、练习区(测验 + 答题记录)。\n\n## 异步会话\n\nAI 正在回复时也可以随意切换课时和会话。原对话在后台继续输出,会话标签和地图球上会转圈提示;切回来时,回答原样显示。同一段会话在一个回答结束前只接受一条提问,跨会话可以并行提问。",
55
55
  "summary": "技能地图 · AI 对话 · 康奈尔笔记本",
56
56
  "summaryEn": "Skill map, AI chat, and the Cornell notebook"
57
57
  },
@@ -106,7 +106,7 @@
106
106
  "title": "章节考试:生成、限时与结算",
107
107
  "sourcePath": "ch2/lesson-3.md",
108
108
  "orderIdx": 2,
109
- "content": "# 章节考试\n\n章节考试是每章的关底 boss:🎯 节点,考过显示 1-3 星。整章所有课时掌握度达标后解锁。\n\n## 后台生成题库\n\n点开考试节点后,AI 按本章知识点分批出题,进度显示「已覆盖 X / Y 个知识点」。生成期间你可以切去看别的课时——任务在后台继续,完成后弹通知提醒。回来后看到就绪页:N 道题、覆盖 M 个知识点、预计时长,点「开始考试」才真正开始。\n\n## 每题限时\n\n每道题独立倒计时:普通题 60 秒,长题干或含代码的题 90 秒。到时自动记录当前选择并进入下一题。\n\n## 离开即终止\n\n考试进行中切换课时或课程会弹出警告:确认离开则本次考试终止,未答的题按答错计分。\n\n## 结算页\n\n提交后看到结算:星数、正确率、**按知识点分组的成绩分解**(薄弱知识点会标注建议复习)、逐题回顾(你的答案 vs 正确答案 + 解析)。切回考试节点默认显示上次成绩,也可以看到历史最好星数和考试次数。\n\n## 重新考试\n\n可以无限次重考。重考使用同一题库,但题目顺序和选项顺序都会重新打乱——考的是理解不是记忆。\n\n## 考试不影响学习模型\n\n考试是独立检验:结果只更新星数和 XP,**不回写**知识点掌握度。你的 BKT 学习记录只由日常答题和自评驱动,不会被一次考试搅动。",
109
+ "content": "# 章节考试\n\n章节考试是每章的关底 boss:🎯 节点,考过显示 1-3 星。整章所有课时掌握度达标后解锁。\n\n## 后台生成题库\n\n点开考试节点后,AI 按本章知识点分批出题,进度显示「已覆盖 X / Y 个知识点」。生成期间你可以切去看别的课时——任务在后台继续,完成后弹通知提醒。回来后看到就绪页:N 道题、覆盖 M 个知识点、预计时长,点「开始考试」才真正开始。\n\n## 每题限时\n\n每道题独立倒计时,时长按题目本身估算——题干越长、选项越多、含代码或公式,时间越多,下限 60 秒、上限 5 分钟。到时自动记录当前选择并进入下一题。\n\n## 离开即终止\n\n考试进行中切换课时或课程会弹出警告:确认离开则本次考试终止,未答的题按答错计分。\n\n## 结算页\n\n提交后看到结算:星数、正确率、**按知识点分组的成绩分解**(薄弱知识点会标注建议复习)、逐题回顾(你的答案 vs 正确答案 + 解析)。切回考试节点默认显示上次成绩,也可以看到历史最好星数和考试次数。\n\n## 重新考试\n\n可以无限次重考。重考使用同一题库,但题目顺序和选项顺序都会重新打乱——考的是理解不是记忆。\n\n## 考试不影响学习模型\n\n考试是独立检验:结果只更新星数和 XP,**不回写**知识点掌握度。你的 BKT 学习记录只由日常答题和自评驱动,不会被一次考试搅动。",
110
110
  "summary": "后台按知识点出题、每题限时、星级结算与重考",
111
111
  "summaryEn": "Questions generated per knowledge point in the background, a timer per question, star scoring and retakes"
112
112
  },
@@ -194,7 +194,7 @@
194
194
  "title": "三区设计:理解 / 笔记 / 练习",
195
195
  "sourcePath": "ch4/lesson-1.md",
196
196
  "orderIdx": 0,
197
- "content": "# 三区设计:理解 / 笔记 / 练习\n\nLookatStudy 的右栏笔记本基于康奈尔笔记法(Cornell Notes),分为三个区域。\n\n## 🗺️ 理解区(AI 产物)\n\nAI 生成的可视化学习辅助:概念图(知识点关系网络)、对比表(相似概念异同对比)、流程图(步骤可视化)、代码讲解(逐行注释)。这些是 AI 在你学习时自动生成的。\n\n## ✏️ 笔记区(你的画线笔记)\n\n你在讲解页面上选中文字画线加笔记的所有标记:每条画线保留原始文字,可以添加批注,点击画线可以溯源跳转回原文对应位置。\n\n## 📝 练习区(测验 + 答题记录)\n\n该课时的练习题和你的答题历史:AI 生成的测验题,每次答题结果都保留,答错的题目会在间隔重复系统中安排复习。\n\n## 两个 Tab\n\n右栏顶部有两个 Tab:讲解 Tab 显示课时正文(Markdown 渲染),笔记 Tab 展示上述三区。讲解和笔记分开,让你在阅读正文时不被笔记干扰。",
197
+ "content": "# 三区设计:理解 / 笔记 / 练习\n\nLookatStudy 的右栏笔记本基于康奈尔笔记法(Cornell Notes),分为三个区域。\n\n## 🗺️ 理解区(AI 产物)\n\nAI 生成的可视化学习辅助:概念图(知识点关系网络)、对比表(相似概念异同对比)、流程图(步骤可视化)、代码讲解(逐行注释)。这些是 AI 在你学习时自动生成的。\n\n## ✏️ 笔记区(你的画线笔记)\n\n你在讲解页面上选中文字画线加笔记的所有标记:每条画线保留原始文字,可以添加批注,点击画线可以溯源跳转回原文对应位置。\n\n## 📝 练习区(测验 + 答题记录)\n\n该课时的练习题和你的答题历史:AI 生成的测验题,每次答题结果都保留,答错的题目会在间隔重复系统中安排复习。\n\n## 三个 Tab\n\n右栏顶部有三个 Tab:讲解 Tab 显示课时正文(Markdown 渲染,可切脑图总览),笔记 Tab 展示上述三区,黑板 Tab 是对话中最新重产物(概念图/流程图/对比表/代码讲解)的大画布,可缩放平移,AI 生成新图时自动翻过去。讲解和笔记分开,让你在阅读正文时不被笔记干扰。",
198
198
  "summary": "康奈尔笔记法在 LookatStudy 的实现",
199
199
  "summaryEn": "How the Cornell note-taking method is realized in LookatStudy"
200
200
  },
@@ -216,7 +216,7 @@
216
216
  "title": "生成式 UI:概念图 / 对比表 / 流程图",
217
217
  "sourcePath": "ch4/lesson-3.md",
218
218
  "orderIdx": 2,
219
- "content": "# 生成式 UI\n\nLookatStudy 的 AI 导师不只会输出文字——它会生成交互式可视化组件。\n\n## 六种生成式组件\n\n| 组件 | 用途 |\n|------|------|\n| 🗺️ 概念图 | 展示知识点之间的关系 |\n| 📊 对比表 | 并列对比多个概念 |\n| 📐 流程图 | 可视化步骤或流程 |\n| 💻 代码讲解 | 逐行解释代码 |\n| 📝 测验 | 即时生成练习题 |\n| 🤔 二选一猜测 | 学习开场的无风险小猜测(不计分)|\n\n## 怎么触发\n\nAI 自动生成(判断知识点适合可视化时调用),你主动请求(在对话中说画个概念图),或点巩固选择按钮(考考我 / 举个例子)。\n\n## 生成式 UI 存在哪\n\n所有 AI 生成的组件出现在中栏对话流和右栏笔记 Tab 的理解区(持久保存)。AI 生成的概念图不是聊完就消失——它们留在你的笔记本里随时回顾。",
219
+ "content": "# 生成式 UI\n\nLookatStudy 的 AI 导师不只会输出文字——它会生成交互式可视化组件。\n\n## 六种生成式组件\n\n| 组件 | 用途 |\n|------|------|\n| 🗺️ 概念图 | 展示知识点之间的关系 |\n| 📊 对比表 | 并列对比多个概念 |\n| 📐 流程图 | 可视化步骤或流程 |\n| 💻 代码讲解 | 逐行解释代码 |\n| 📝 测验 | 即时生成练习题 |\n| 🤔 二选一猜测 | 学习开场的无风险小猜测(不计分)|\n\n## 怎么触发\n\nAI 自动生成(判断知识点适合可视化时调用),你主动请求(在对话中说画个概念图),或点巩固选择按钮(考考我 / 举个例子)。\n\n## 生成式 UI 存在哪\n\n所有 AI 生成的组件出现在中栏对话流和右栏笔记 Tab 的理解区(持久保存),四类重产物还会登上黑板 Tab 的大画布。AI 生成的概念图不是聊完就消失——它们留在你的笔记本里随时回顾。",
220
220
  "summary": "AI 动态生成的可视化学习工具",
221
221
  "summaryEn": "Visual learning tools the AI generates on the fly"
222
222
  },
@@ -315,7 +315,7 @@
315
315
  "title": "多语言翻译支持",
316
316
  "sourcePath": "ch6/lesson-2.md",
317
317
  "orderIdx": 1,
318
- "content": "# 多语言翻译支持\n\nLookatStudy 能自动识别仓库的翻译结构,让你用偏好的语言学习。\n\n## 语言偏好设置\n\n在 Settings 里设置你的偏好语言。首次启动时按系统语言自动检测默认值。\n\n## 自动翻译决策\n\n导入课程时系统自动判断仓库原文语言,检测仓库有哪些翻译版本,按偏好语言 + 原文语言决定导入哪个翻译。严格 fallback:仓库没有你偏好的翻译就用原文。\n\n## 课内语言切换\n\n多语言课程在地图标题卡上有 🌐 切换器,随时在原文和已导入翻译之间切换——讲解正文、标题全部跟随。\n\n## 支持的翻译布局\n\n系统自动检测三种翻译目录约定:translations/语言代码/(微软风格)、语言代码/平行目录(Vue/Docusaurus 风格)、文件名.语言代码.md 后缀风格(博客风格)。\n\n## 翻译图片处理\n\n翻译版正文里的图片不另外下载(机翻图片质量差),而是按出现位置替换成原文对应位置的图片。结果:翻译正文 = 翻译文字 + 原文图片。",
318
+ "content": "# 多语言翻译支持\n\nLookatStudy 能自动识别仓库的翻译结构,让你用偏好的语言学习。\n\n## 语言偏好设置\n\n在 Settings 里设置你的偏好语言。首次启动时按系统语言自动检测默认值。\n\n## 自动翻译决策\n\n导入课程时系统自动判断仓库原文语言,检测仓库有哪些翻译版本,按偏好语言 + 原文语言决定导入哪个翻译。严格 fallback:仓库没有你偏好的翻译就用原文。\n\n## 课内语言切换\n\n多语言课程在地图标题卡上有 🌐 切换器,随时在原文和已导入翻译之间切换——讲解正文、标题全部跟随。\n\n## 支持的翻译布局\n\n系统自动检测三种翻译目录约定:translations/语言代码/(微软风格)、语言代码/平行目录(Vue/Docusaurus 风格)、文件名.语言代码.md 后缀风格(博客风格)。\n\n## 翻译图片处理\n\n翻译版正文里的图片不另外下载(机翻图片质量差),而是按出现位置替换成原文对应位置的图片。结果:翻译正文 = 翻译文字 + 原文图片。\n顺便一提:你正在读的这篇使用指南本身就是双语的——上文说的 🌐 切换器就在它的地图标题卡上,可以直接试。",
319
319
  "summary": "自动检测翻译约定,按偏好语言导入与切换",
320
320
  "summaryEn": "Translation conventions auto-detected; import and switch by preferred language"
321
321
  },
@@ -505,19 +505,19 @@
505
505
  "nodeId": "guide-les-1-1",
506
506
  "locale": "en",
507
507
  "title": "Welcome to LookatStudy",
508
- "content": "# Welcome to LookatStudy\n\n**LookatStudy** is a local-first, AI-driven desktop learning platform. It turns any GitHub learning repo or local folder into a Duolingo-style interactive course — complete with a skill map, an AI tutor, spaced repetition, and playful incentives.\n\n## What it can do for you\n\n- 📚 **Turn any repo into a course**: paste a GitHub URL or pick a local folder; 10 document formats (Markdown / Jupyter / RST / PDF / PPTX / HTML and more) plus 30+ code languages are parsed into a structured course, images included\n- 🗺️ **Skill map navigation**: a Duolingo-style balloon map whose sky drifts from morning to night as you scroll; lessons unlock one by one and visualize your progress\n- 🤖 **A personal AI tutor**: every knowledge point carries its own mastery estimate (BKT); the AI adapts its teaching to your understanding and can see where you recently struggled\n- 📝 **A Cornell notebook**: three zones (understand / notes / practice); the AI generates concept maps, compare tables and flow diagrams while you highlight and annotate\n- 🔁 **Spaced repetition**: SM-2 schedules your reviews; streaks + XP + crowns keep you coming back\n\n## Design philosophy\n\n- **Local first**: all data lives in a local SQLite file — your learning record stays in your hands\n- **BYO Key**: bring your own LLM API key; your conversations never pass through a middleman server\n- **AI drafts, you decide**: the AI never edits your learning record directly — every state change goes through the Propose → Apply protocol and takes effect only after you approve\n\n## Where to start\n\nLookatStudy always opens in the “no course selected” state: pick an imported course in the “Import courses” panel on the left, or import something new. Open the next lesson, “Import Your First Course”, for all the ways in!"
508
+ "content": "# Welcome to LookatStudy\n\n**LookatStudy** is a local-first, AI-driven desktop learning platform. It turns a repo, a local folder, a web article, a paper, a video, or an e-book into a Duolingo-style interactive course — complete with a skill map, an AI tutor, spaced repetition, and playful incentives.\n\n## What it can do for you\n\n- 📚 **Turn almost anything into a course**: a GitHub repo, a local folder, a web article, an arXiv paper, a Bilibili/YouTube video, an EPUB book, pasted text, or local recordings 12 document formats (Markdown / Jupyter / RST / PDF / PPTX / Word / EPUB and more) plus 30+ code languages are parsed into a structured course, images included\n- 🗺️ **Skill map navigation**: a Duolingo-style balloon map whose sky drifts from morning to night as you scroll; lessons unlock one by one and visualize your progress\n- 🤖 **A personal AI tutor**: every knowledge point carries its own mastery estimate (BKT); the AI adapts its teaching to your understanding and can see where you recently struggled\n- 📝 **A Cornell notebook**: three zones (understand / notes / practice); the AI generates concept maps, compare tables and flow diagrams while you highlight and annotate\n- 🔁 **Spaced repetition**: SM-2 schedules your reviews; streaks + XP + crowns keep you coming back\n\n## Design philosophy\n\n- **Local first**: all data lives in a local SQLite file — your learning record stays in your hands\n- **BYO Key**: bring your own LLM API key; your conversations never pass through a middleman server\n- **AI drafts, you decide**: the AI never edits your learning record directly — every state change goes through the Propose → Apply protocol and takes effect only after you approve\n\n## Where to start\n\nLookatStudy always opens in the “no course selected” state: pick an imported course in the “Import courses” panel on the left, or import something new. Open the next lesson, “Import Your First Course”, for all the ways in!"
509
509
  },
510
510
  {
511
511
  "nodeId": "guide-les-1-2",
512
512
  "locale": "en",
513
513
  "title": "Import Your First Course",
514
- "content": "# Import Your First Course\n\nLookatStudy supports three import paths that cover nearly every source of learning material.\n\n## Path 1: GitHub URL\n\nPaste a GitHub repo address into the “Import courses” panel on the left. The smart pipeline automatically fetches the README to find the course outline, scans the full file tree (documents + code + translations), has AI classify each file's role, has AI design the chapter structure, and inlines images.\n\n## Path 2: Local folder\n\nClick the local-folder button and pick a folder of learning material. Subdirectories are scanned recursively; documents, code, images and translations are recognized automatically.\n\nGood for: downloaded course bundles, locally cloned repos, or a folder of notes you curated yourself.\n\n## Path 3: Pasted Markdown\n\nPaste Markdown text directly. Good for: private repos, network-restricted environments, or quickly turning a block of notes into a course.\n\n## Imports run in the background\n\nClick import and the job goes to the background immediately: a progress window shows each step and how long it took, you can switch away and keep browsing other courses, and a notification pops when the import finishes — no forced jump. You can cancel at any point.\n\n## Managing courses\n\nHovering a course row in the course list shows a delete button (inline confirm card, no screen change); the course you are studying can be deleted too — the button sits next to the course name on the map title card, and deleting returns you to the “no course selected” state. Deleting wipes every learning record of that course and cannot be undone."
514
+ "content": "# Import Your First Course\n\nLookatStudy supports five import paths that cover nearly every source of learning material.\n\n## Path 1: GitHub URL\n\nPaste a GitHub repo address into the “Import courses” panel on the left. The smart pipeline automatically fetches the README to find the course outline, scans the full file tree (documents + code + translations), has AI classify each file's role, has AI design the chapter structure, and inlines images.\n\n## Path 2: Local folder\n\nClick the local-folder button and pick a folder of learning material. Subdirectories are scanned recursively; documents, code, images and translations are recognized automatically. Audio files (.mp3, .m4a, and friends) and videos (.mp4, ...) inside the folder are transcribed into lessons by local Whisper — one recording becomes one lesson.\n\nGood for: downloaded course bundles, locally cloned repos, or a folder of notes you curated yourself.\n\n## Path 3: Smart links\n\nPaste any web address. Articles are extracted into lessons, arXiv papers download and parse their PDFs, and video links (Bilibili / YouTube / Douyin) pull the audio for transcription — subtitled videos prefer subtitles, zero transcription. A multi-part Bilibili series imports as a whole season, one part per lesson.\n\n## Path 4: Pasted Markdown\n\nPaste Markdown text directly. Good for: private repos, network-restricted environments, or quickly turning a block of notes into a course.\n\n## Path 5: EPUB books\n\nPick an .epub file; each chapter becomes a lesson, with the book structure preserved.\n\n## Imports run in the background\n\nClick import and the job goes to the background immediately: a progress window shows each step and how long it took, you can switch away and keep browsing other courses, and a notification pops when the import finishes — no forced jump. You can cancel at any point.\n\n## Managing courses\n\nHovering a course row in the course list shows a delete button (inline confirm card, no screen change); the course you are studying can be deleted too — the button sits next to the course name on the map title card, and deleting returns you to the “no course selected” state. Deleting wipes every learning record of that course and cannot be undone."
515
515
  },
516
516
  {
517
517
  "nodeId": "guide-les-1-3",
518
518
  "locale": "en",
519
519
  "title": "Tour of the Three-Pane Layout",
520
- "content": "# Tour of the Three-Pane Layout\n\nLookatStudy uses a three-pane layout; each pane covers a different part of studying. Light / dark / follow-system themes are all supported.\n\n## Left pane: course map and import\n\nThe top of the left pane has two tabs: “Import courses” and “Course map”. The map is a Duolingo-style balloon map — each balloon is a lesson, and as you work your way down, the sky in the background shifts from morning to night.\n\nThe map title card shows the course name, overall mastery percentage, a due-for-review badge, the 🌐 language switch (multilingual courses toggle between original and translated text here), and the delete-course button.\n\n## Middle pane: AI chat\n\nWhere you talk to the AI tutor: thread tabs on top (each lesson can hold several conversation threads), the chat stream in the middle (AI replies stream in; proposal cards and concept maps persist), and the input area at the bottom (with the teaching-persona pill, the A-/A+ font size controls, and four consolidation buttons).\n\nCtrl+K opens the command palette, Ctrl+Tab cycles threads, Ctrl+B collapses the left pane.\n\n## Right pane: the Cornell notebook\n\nA notebook in three zones: the Lesson tab renders the lesson body (Markdown), and you can select text to highlight and annotate. The Notes tab holds the three zones — Understand (AI artifacts), Notes (your highlights), Practice (quizzes + answer history).\n\n## Focus lock\n\nWhile the AI is replying, switching lessons or threads is temporarily locked so you never lose context mid-answer."
520
+ "content": "# Tour of the Three-Pane Layout\n\nLookatStudy uses a three-pane layout; each pane covers a different part of studying. Light / dark / follow-system themes are all supported.\n\n## Left pane: course map and import\n\nThe top of the left pane has two tabs: “Import courses” and “Course map”. The map is a Duolingo-style balloon map — each balloon is a lesson, and as you work your way down, the sky in the background shifts from morning to night.\n\nThe map title card shows the course name, overall mastery percentage, a due-for-review badge, the 🌐 language switch (multilingual courses toggle between original and translated text here), and the delete-course button.\n\n## Middle pane: AI chat\n\nWhere you talk to the AI tutor: thread tabs on top (each lesson can hold several conversation threads), the chat stream in the middle (AI replies stream in; proposal cards and concept maps persist), and the input area at the bottom (with the teaching-persona pill, the A-/A+ font size controls, and four consolidation buttons).\n\nCtrl+K opens the command palette, Ctrl+Tab cycles threads, Ctrl+B collapses the left pane.\n\n## Right pane: the Cornell notebook\n\nA notebook in three zones: the Lesson tab renders the lesson body (Markdown), and you can select text to highlight and annotate. The Notes tab holds the three zones — Understand (AI artifacts), Notes (your highlights), Practice (quizzes + answer history).\n\n## Async sessions\n\nWhile the AI is replying you are free to switch lessons or threads. The conversation keeps streaming in the background, with a spinner on its tab and on its map node, and the answer is right there when you come back. Within one thread only one send runs at a time; across threads you can ask in parallel."
521
521
  },
522
522
  {
523
523
  "nodeId": "guide-exam-1",
@@ -547,7 +547,7 @@
547
547
  "nodeId": "guide-les-2-3",
548
548
  "locale": "en",
549
549
  "title": "Chapter Exams: Generation, Timers, and Results",
550
- "content": "# Chapter Exams\n\nThe chapter exam is the boss at the end of each chapter: a 🎯 node that shows 1-3 stars once passed. It unlocks when every lesson in the chapter clears the mastery bar.\n\n## The question bank generates in the background\n\nOpen the exam node and the AI writes questions in batches by knowledge point, with progress shown as “X / Y knowledge points covered”. While it generates you can go study something else — the job keeps running in the background and notifies you when it is done. Coming back, you see the ready page: N questions, M knowledge points covered, estimated duration; the exam itself only starts when you click “Start exam”.\n\n## A timer on every question\n\nEach question runs its own countdown: 60 seconds for normal questions, 90 for long stems or questions with code. When time runs out, the current choice is recorded and the exam moves on.\n\n## Leaving terminates the attempt\n\nSwitching lessons or courses mid-exam pops a warning: confirm leaving and the attempt terminates, with unanswered questions scored as wrong.\n\n## The results page\n\nAfter submitting you see: stars, accuracy, **a per-knowledge-point breakdown** (weak points are flagged for review), and a question-by-question review (your answer vs the correct one, plus explanations). Returning to the exam node later shows your latest result by default, along with your best star count and total attempts.\n\n## Retakes\n\nRetake as many times as you like. Retakes reuse the same bank, but question order and option order are reshuffled each time — it tests understanding, not memory.\n\n## Exams never touch the learning model\n\nExams are an independent check: results only update stars and XP and **never write back** into knowledge-point mastery. Your BKT record is driven by everyday answers and self-ratings, never shaken by a single exam."
550
+ "content": "# Chapter Exams\n\nThe chapter exam is the boss at the end of each chapter: a 🎯 node that shows 1-3 stars once passed. It unlocks when every lesson in the chapter clears the mastery bar.\n\n## The question bank generates in the background\n\nOpen the exam node and the AI writes questions in batches by knowledge point, with progress shown as “X / Y knowledge points covered”. While it generates you can go study something else — the job keeps running in the background and notifies you when it is done. Coming back, you see the ready page: N questions, M knowledge points covered, estimated duration; the exam itself only starts when you click “Start exam”.\n\n## A timer on every question\n\nEach question runs its own countdown, sized to the question itself — a longer stem, more options, code, or formulas each buy more time, clamped between 60 seconds and five minutes. When time runs out, the current choice is recorded and the exam moves on.\n\n## Leaving terminates the attempt\n\nSwitching lessons or courses mid-exam pops a warning: confirm leaving and the attempt terminates, with unanswered questions scored as wrong.\n\n## The results page\n\nAfter submitting you see: stars, accuracy, **a per-knowledge-point breakdown** (weak points are flagged for review), and a question-by-question review (your answer vs the correct one, plus explanations). Returning to the exam node later shows your latest result by default, along with your best star count and total attempts.\n\n## Retakes\n\nRetake as many times as you like. Retakes reuse the same bank, but question order and option order are reshuffled each time — it tests understanding, not memory.\n\n## Exams never touch the learning model\n\nExams are an independent check: results only update stars and XP and **never write back** into knowledge-point mastery. Your BKT record is driven by everyday answers and self-ratings, never shaken by a single exam."
551
551
  },
552
552
  {
553
553
  "nodeId": "guide-exam-2",
@@ -595,7 +595,7 @@
595
595
  "nodeId": "guide-les-4-1",
596
596
  "locale": "en",
597
597
  "title": "Three Zones: Understand / Notes / Practice",
598
- "content": "# Three Zones: Understand / Notes / Practice\n\nThe right-pane notebook is built on the Cornell Notes method, in three zones.\n\n## 🗺️ Understand (AI artifacts)\n\nAI-generated visual study aids: concept maps (how ideas relate), compare tables (similar concepts side by side), flow diagrams (steps made visible), code walkthroughs (line-by-line annotation). The AI generates them as you learn.\n\n## ✏️ Notes (your highlights)\n\nEvery highlight you made by selecting text on the lesson page: each entry keeps the original wording, can carry an annotation, and clicking one jumps back to the exact spot in the source.\n\n## 📝 Practice (quizzes + history)\n\nThe lesson's exercises and your answer history: AI-generated quiz questions, every attempt kept, wrong answers scheduled for review by the spaced-repetition system.\n\n## Two tabs\n\nThe top of the right pane has two tabs: the Lesson tab shows the lesson body (rendered Markdown); the Notes tab shows the three zones above. Keeping lesson and notes separate lets you read without clutter."
598
+ "content": "# Three Zones: Understand / Notes / Practice\n\nThe right-pane notebook is built on the Cornell Notes method, in three zones.\n\n## 🗺️ Understand (AI artifacts)\n\nAI-generated visual study aids: concept maps (how ideas relate), compare tables (similar concepts side by side), flow diagrams (steps made visible), code walkthroughs (line-by-line annotation). The AI generates them as you learn.\n\n## ✏️ Notes (your highlights)\n\nEvery highlight you made by selecting text on the lesson page: each entry keeps the original wording, can carry an annotation, and clicking one jumps back to the exact spot in the source.\n\n## 📝 Practice (quizzes + history)\n\nThe lesson's exercises and your answer history: AI-generated quiz questions, every attempt kept, wrong answers scheduled for review by the spaced-repetition system.\n\n## Three tabs\n\nThe top of the right pane has three tabs: the Lesson tab shows the lesson body (rendered Markdown, with a mind-map overview toggle); the Notes tab shows the three zones above; and the Board tab is a zoomable canvas for the latest heavy artifact from the chat (concept map, flow diagram, compare table, or code walkthrough) — it flips over by itself when the AI produces a new one. Keeping lesson and notes separate lets you read without clutter."
599
599
  },
600
600
  {
601
601
  "nodeId": "guide-les-4-2",
@@ -607,7 +607,7 @@
607
607
  "nodeId": "guide-les-4-3",
608
608
  "locale": "en",
609
609
  "title": "Generative UI: Concept Maps / Compare Tables / Flow Diagrams",
610
- "content": "# Generative UI\n\nThe AI tutor does not only output text — it emits interactive visual components.\n\n## Six generative components\n\n| Component | Use |\n|------|------|\n| 🗺️ Concept map | shows how ideas relate |\n| 📊 Compare table | contrasts several concepts |\n| 📐 Flow diagram | visualizes steps or pipelines |\n| 💻 Code walkthrough | explains code line by line |\n| 📝 Quiz | generates practice on the spot |\n| 🤔 Two-option guess | risk-free opener guess (unscored) |\n\n## What triggers them\n\nThe AI generates them on its own (when a concept suits visualization), on your request (“draw a concept map”), or from the consolidation buttons (Quiz me / Give me an example).\n\n## Where they live\n\nGenerated components appear in the middle-pane chat stream and in the Understand zone of the Notes tab (persisted). An AI concept map does not vanish when the chat ends — it stays in your notebook for review."
610
+ "content": "# Generative UI\n\nThe AI tutor does not only output text — it emits interactive visual components.\n\n## Six generative components\n\n| Component | Use |\n|------|------|\n| 🗺️ Concept map | shows how ideas relate |\n| 📊 Compare table | contrasts several concepts |\n| 📐 Flow diagram | visualizes steps or pipelines |\n| 💻 Code walkthrough | explains code line by line |\n| 📝 Quiz | generates practice on the spot |\n| 🤔 Two-option guess | risk-free opener guess (unscored) |\n\n## What triggers them\n\nThe AI generates them on its own (when a concept suits visualization), on your request (“draw a concept map”), or from the consolidation buttons (Quiz me / Give me an example).\n\n## Where they live\n\nGenerated components appear in the middle-pane chat stream and in the Understand zone of the Notes tab (persisted), and the four heavy artifacts also land on the Board canvas. An AI concept map does not vanish when the chat ends — it stays in your notebook for review."
611
611
  },
612
612
  {
613
613
  "nodeId": "guide-exam-4",