lookatstudy-mobile 0.17.0 → 0.19.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 (133) hide show
  1. package/install-termux.sh +109 -26
  2. package/package.json +1 -1
  3. package/server.cjs +165 -2
  4. package/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  5. package/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  6. package/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  7. package/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  8. package/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  9. package/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  10. package/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  11. package/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  12. package/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  13. package/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  14. package/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  15. package/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  16. package/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  17. package/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  18. package/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  19. package/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  20. package/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  21. package/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  22. package/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  23. package/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  24. package/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  25. package/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  26. package/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  27. package/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  28. package/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  29. package/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  30. package/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  31. package/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  32. package/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  33. package/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  34. package/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  35. package/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  36. package/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  37. package/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  38. package/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  39. package/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  40. package/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  41. package/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  42. package/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  43. package/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  44. package/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  45. package/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  46. package/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  47. package/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  48. package/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  49. package/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  50. package/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  51. package/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  52. package/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  53. package/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  54. package/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  55. package/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  56. package/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  57. package/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  58. package/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  59. package/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  60. package/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  61. package/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  62. package/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  63. package/web/assets/{abnfDiagram-N423BO3Z-DEPbDjND.js → abnfDiagram-N423BO3Z-DRLqlsQe.js} +1 -1
  64. package/web/assets/{arc-BdnEbtZD.js → arc-DX37qc14.js} +1 -1
  65. package/web/assets/{architectureDiagram-T3A2C74G-2LUkfdBV.js → architectureDiagram-T3A2C74G-4mH-M23W.js} +1 -1
  66. package/web/assets/{blockDiagram-VBNYF7ZC-CCe1iJWW.js → blockDiagram-VBNYF7ZC-CfFl91r9.js} +1 -1
  67. package/web/assets/{c4Diagram-5PPSVZJV-BRjp2_ep.js → c4Diagram-5PPSVZJV-CoYqbpkG.js} +1 -1
  68. package/web/assets/channel-DwTlw7UU.js +1 -0
  69. package/web/assets/{chunk-2GRJ4B5K-D3jR_gkO.js → chunk-2GRJ4B5K-DdZFJzXx.js} +1 -1
  70. package/web/assets/{chunk-2Q5K7J3B-BYL8Mj1H.js → chunk-2Q5K7J3B-CjvT22rq.js} +1 -1
  71. package/web/assets/{chunk-5RXB4S5H-BmdtCOUM.js → chunk-5RXB4S5H-BO3dLHxP.js} +1 -1
  72. package/web/assets/{chunk-5VM5RSS4-BElAuyeD.js → chunk-5VM5RSS4-BRWuBMF-.js} +1 -1
  73. package/web/assets/{chunk-6Q2QTUOP-DD5GiOn2.js → chunk-6Q2QTUOP-BBL9yZr5.js} +1 -1
  74. package/web/assets/{chunk-GF5L2VYU-DEXR2XHl.js → chunk-GF5L2VYU-BzgRNoMK.js} +1 -1
  75. package/web/assets/{chunk-JWPE2WC7-BnQRJatb.js → chunk-JWPE2WC7-Rx7velok.js} +1 -1
  76. package/web/assets/{chunk-KBJHAD2P-DWr3zlUn.js → chunk-KBJHAD2P-BUmqDQFS.js} +1 -1
  77. package/web/assets/{chunk-RYQCIY6F-DEwEVB-X.js → chunk-RYQCIY6F-DiWSKlNj.js} +1 -1
  78. package/web/assets/{chunk-XXDRQBXY-fSX2AkEZ.js → chunk-XXDRQBXY-BaIS0itG.js} +1 -1
  79. package/web/assets/classDiagram-JCYQIIEL-CoMu7USw.js +1 -0
  80. package/web/assets/classDiagram-v2-OCEON4UE-CoMu7USw.js +1 -0
  81. package/web/assets/{cose-bilkent-JH36ORCC-CzFzhaR6.js → cose-bilkent-JH36ORCC-BbQclxlG.js} +1 -1
  82. package/web/assets/{cynefin-VYW2F7L2-DkGVzNSQ.js → cynefin-VYW2F7L2-BoAEtYBt.js} +1 -1
  83. package/web/assets/{cynefinDiagram-MW4NZA55-DsCoCXNB.js → cynefinDiagram-MW4NZA55-1NTeoXpW.js} +1 -1
  84. package/web/assets/{dagre-VZM6K2ZE-5iQ0Vlad.js → dagre-VZM6K2ZE-D1IJUP3L.js} +1 -1
  85. package/web/assets/{diagram-7IWD3JNH-BNse2wL1.js → diagram-7IWD3JNH-Bq4zahZs.js} +1 -1
  86. package/web/assets/{diagram-B4RE2ZJO-otdSZlNZ.js → diagram-B4RE2ZJO-DwR-n08L.js} +1 -1
  87. package/web/assets/{diagram-LBJQPF4R-Cu9AIxYr.js → diagram-LBJQPF4R-x8ddz6fv.js} +1 -1
  88. package/web/assets/{diagram-Q27KOJAE-BDy_SsNa.js → diagram-Q27KOJAE-BQvPuANj.js} +1 -1
  89. package/web/assets/{diagram-UB23O5K3-Dj9VK1f8.js → diagram-UB23O5K3-2HRRnPaM.js} +1 -1
  90. package/web/assets/{ebnfDiagram-BXEA7PRR-B86BfBHU.js → ebnfDiagram-BXEA7PRR-C6w-Hol8.js} +1 -1
  91. package/web/assets/{erDiagram-JOGREHBK-BYPttEDR.js → erDiagram-JOGREHBK-D0B9HX21.js} +1 -1
  92. package/web/assets/{flowDiagram-UKHOOZJN-BiQj7CX4.js → flowDiagram-UKHOOZJN-BAFPos1j.js} +1 -1
  93. package/web/assets/{ganttDiagram-PKOTCBZU-BHHFGprI.js → ganttDiagram-PKOTCBZU-cEfBlMbu.js} +1 -1
  94. package/web/assets/{gitGraphDiagram-DS77QQ5N-CMV6VrQV.js → gitGraphDiagram-DS77QQ5N-kEgMAveq.js} +1 -1
  95. package/web/assets/index-D8iAKGNi.css +1 -0
  96. package/web/assets/index-DFfbtrtQ.js +53 -0
  97. package/web/assets/{infoDiagram-6WML65LV-a_LG2_IJ.js → infoDiagram-6WML65LV-B3O-sBT9.js} +1 -1
  98. package/web/assets/{ishikawaDiagram-WSZJBQD7-DNaQdaG3.js → ishikawaDiagram-WSZJBQD7-Lltvy9NV.js} +1 -1
  99. package/web/assets/{journeyDiagram-NVQOT4AX-DnlltTZa.js → journeyDiagram-NVQOT4AX-CoTpdbQG.js} +1 -1
  100. package/web/assets/{kanban-definition-27J2QSJJ-fRW60JCZ.js → kanban-definition-27J2QSJJ-C6MlEhKf.js} +1 -1
  101. package/web/assets/{linear-DivBiqV_.js → linear-BOCC78Hx.js} +1 -1
  102. package/web/assets/main-BXa7WYYr.css +1 -0
  103. package/web/assets/main-_hK--hbF.js +792 -0
  104. package/web/assets/{mermaid.core-BhIcHd-X.js → mermaid.core-BnzH2M4g.js} +4 -4
  105. package/web/assets/{mindmap-definition-FAOFIHXS-wFGzI1GW.js → mindmap-definition-FAOFIHXS-2aXmimCX.js} +1 -1
  106. package/web/assets/{pegDiagram-VL7TDLO6-g8lPC9jo.js → pegDiagram-VL7TDLO6-BUgOGs18.js} +1 -1
  107. package/web/assets/{pet-auCGJOK0.js → pet-a4xGZJ4o.js} +1 -1
  108. package/web/assets/{pieDiagram-7S7Q4E2Y-C5VJiY2V.js → pieDiagram-7S7Q4E2Y-QH3MSwJC.js} +1 -1
  109. package/web/assets/{quadrantDiagram-CIZ2JOQS-BUCplORK.js → quadrantDiagram-CIZ2JOQS-BHgzjRDJ.js} +1 -1
  110. package/web/assets/{railroadDiagram-AXF67PYL-CXOqC1jS.js → railroadDiagram-AXF67PYL-eT-6KI97.js} +1 -1
  111. package/web/assets/{requirementDiagram-LRYGKXZP-D77Fdqkd.js → requirementDiagram-LRYGKXZP-SCqCciaJ.js} +1 -1
  112. package/web/assets/{sankeyDiagram-W5VNT64P-DCRQPRof.js → sankeyDiagram-W5VNT64P-X7ftmy-X.js} +1 -1
  113. package/web/assets/{sequenceDiagram-SI44F4Z6-CKFv7rwK.js → sequenceDiagram-SI44F4Z6-CJiMe-ST.js} +1 -1
  114. package/web/assets/{sizeCapture-X5ZJPWSS-DkXWYyxk.js → sizeCapture-X5ZJPWSS-D0BOwnXt.js} +1 -1
  115. package/web/assets/{stateDiagram-OKZ733FA-BT3rvlSZ.js → stateDiagram-OKZ733FA-BiPOcNEG.js} +1 -1
  116. package/web/assets/stateDiagram-v2-UEYNNEHI-URZ9UNRl.js +1 -0
  117. package/web/assets/swimlanes-SLNWSIFB-CtLG2CHX.js +2 -0
  118. package/web/assets/swimlanesDiagram-ULZ7WXOC-CdA8x7iG.js +8 -0
  119. package/web/assets/{timeline-definition-Z64GVDOM-Byr_G_qH.js → timeline-definition-Z64GVDOM-NOUkxoIk.js} +1 -1
  120. package/web/assets/{vennDiagram-T6HMQDX7-cJwjkqtI.js → vennDiagram-T6HMQDX7-jIX0UihP.js} +1 -1
  121. package/web/assets/{wardleyDiagram-T6FBY63Y-2mUDEXFT.js → wardleyDiagram-T6FBY63Y-BWfUG4_t.js} +1 -1
  122. package/web/assets/{xychartDiagram-ELKLHX3M-CweyVwyd.js → xychartDiagram-ELKLHX3M-CVZ-lb3j.js} +1 -1
  123. package/web/index.html +4 -3
  124. package/web/pet.html +3 -3
  125. package/web/assets/channel-DXyVa_LM.js +0 -1
  126. package/web/assets/classDiagram-JCYQIIEL-D93mjgH9.js +0 -1
  127. package/web/assets/classDiagram-v2-OCEON4UE-D93mjgH9.js +0 -1
  128. package/web/assets/index-BKXGqAJP.js +0 -53
  129. package/web/assets/index-C0z4TGfi.css +0 -1
  130. package/web/assets/main-XmO4BzRy.js +0 -518
  131. package/web/assets/stateDiagram-v2-UEYNNEHI-BgeHQ9bA.js +0 -1
  132. package/web/assets/swimlanes-SLNWSIFB-CzxJLsll.js +0 -2
  133. package/web/assets/swimlanesDiagram-ULZ7WXOC-BQOu93XJ.js +0 -8
package/install-termux.sh CHANGED
@@ -5,7 +5,9 @@
5
5
  # bash ~/lookatstudy/stop.sh # 停止
6
6
  # bash ~/lookatstudy/status.sh # 状态 + 访问链接
7
7
  # bash ~/lookatstudy/update.sh # 更新便携包并重启
8
- # 不在本机跑 npm:便携包与语音引擎包的 tarball 主源 npmmirror(自动同步 npmjs),未同步/失败回退 GitHub Release 直连+代理链。
8
+ # 不在本机跑 npm。安装与升级(update.sh)走同一条下载链:
9
+ # npmmirror 主源(+滞后守卫) → npm 官方源 → GitHub Release 直连 → gh 代理链。
10
+ # update.sh 的函数体与本文件逐字同源(verify-termux-voice T7 守链序与两份同步)。
9
11
  set -euo pipefail
10
12
 
11
13
  PORT="${LOOKATSTUDY_PORT:-17890}"
@@ -18,24 +20,34 @@ DL_PREFIXES=("" "https://gh-proxy.com/" "https://ghproxy.net/" "https://ghfast.t
18
20
 
19
21
  # npmmirror(阿里,自动同步 npm)解析包的 latest tarball 地址;空输出=未同步/网络失败。
20
22
  # 同步滞后守卫:刚发版的头几分钟镜像 latest 可能还指向上一个版本,静默拿到旧包
21
- # —— 版本落后于 GitHub 最新 release 时按"未命中"处理,走 GitHub 回退链(GitHub
22
- # releases/latest/download 永远指向最新版)。GitHub 版本探测失败(网络)则信任镜像,
23
- # 不因 GitHub 不可达惩罚国内直连的镜像主源。
23
+ # —— 版本落后于 GitHub 最新 release 时按"未命中"处理,让位 npm 官方源/GitHub
24
+ # (GitHub 的 releases/latest/download 永远指向最新版)。GitHub 版本探测失败(网络)
25
+ # 则信任镜像,不因 GitHub 不可达惩罚国内直连的镜像主源。
26
+ # 契约:恒 exit 0,空输出=未命中 —— 调用方都是 tb=$(npm_tarball …) 裸赋值,老写法
27
+ # miss 返回 1 会把 set -e 的脚本整个静默杀掉(eeeada1 的滞后守卫实际从未走到回退链的根因)。
24
28
  npm_tarball() {
25
29
  local json ver gh
26
30
  json=$(curl -sfL --connect-timeout 8 --max-time 20 "https://registry.npmmirror.com/$1/latest" || true)
27
- [ -n "$json" ] || return 1
31
+ [ -n "$json" ] || return 0
28
32
  ver=$(printf '%s' "$json" | sed -n 's/.*"version":"\([^"]*\)".*/\1/p')
29
33
  if [ -n "$ver" ]; then
30
34
  gh=$(gh_latest_version)
31
35
  if [ -n "$gh" ] && ! ver_ge "$ver" "$gh"; then
32
- info "npm 镜像同步滞后(镜像 v${ver} < GitHub v${gh}),走 GitHub 链…"
33
- return 1
36
+ info "npm 镜像同步滞后(镜像 v${ver} < GitHub v${gh}),换 npm 官方源…"
37
+ return 0
34
38
  fi
35
39
  fi
36
40
  printf '%s' "$json" | sed -n 's/.*"tarball":"\([^"]*\)".*/\1/p'
37
41
  }
38
42
 
43
+ # npm 官方源(权威、零同步滞后):镜像未命中/滞后时的第一兜底,先于 GitHub 链。
44
+ # 同一契约:恒 exit 0,空输出=未命中。
45
+ npm_tarball_official() {
46
+ local json
47
+ json=$(curl -sfL --connect-timeout 8 --max-time 20 "https://registry.npmjs.org/$1/latest" || true)
48
+ printf '%s' "$json" | sed -n 's/.*"tarball":"\([^"]*\)".*/\1/p'
49
+ }
50
+
39
51
  # GitHub 最新 release 版本号(仅数字串;空=探测失败)。releases/latest/download 会 302 到
40
52
  # 带 tag 的最终资产 URL,HEAD 一次读 url_effective 即得,不用碰 api.github.com。
41
53
  gh_latest_version() {
@@ -115,7 +127,15 @@ download_bundle() {
115
127
  ok "便携包就位(npm 镜像): $APP_DIR"
116
128
  return 0
117
129
  fi
118
- info "npm 镜像未命中,回退 GitHub 直连+代理链..."
130
+ # 次选:npm 官方源(权威零滞后,接住镜像同步窗口)
131
+ tb=$(npm_tarball_official lookatstudy-mobile)
132
+ if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o mobile.tgz "$tb"; then
133
+ tar -xzf mobile.tgz --strip-components=1
134
+ rm -f mobile.tgz
135
+ ok "便携包就位(npm 官方源): $APP_DIR"
136
+ return 0
137
+ fi
138
+ info "npm 源未命中,回退 GitHub 直连+代理链..."
119
139
  local dl_ok=0 p=""
120
140
  for p in "${DL_PREFIXES[@]}"; do
121
141
  if curl -fL --connect-timeout 10 --retry 2 -o ls.zip "${p}${GH_ASSET}"; then
@@ -147,7 +167,15 @@ install_voice() {
147
167
  info "装完模型重启服务生效: bash ~/lookatstudy/start.sh"
148
168
  return 0
149
169
  fi
150
- info "npm 镜像未命中,回退 GitHub 直连+代理链..."
170
+ # 次选:npm 官方源(权威零滞后,接住镜像同步窗口)
171
+ tb=$(npm_tarball_official lookatstudy-termux-voice)
172
+ if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o voice.tgz "$tb"; then
173
+ tar -xzf voice.tgz --strip-components=1 -C "$APP_DIR/node_modules"
174
+ rm -f voice.tgz
175
+ ok "语音引擎就位(npm 官方源): $APP_DIR/node_modules/sherpa-onnx-node"
176
+ return 0
177
+ fi
178
+ info "npm 源未命中,回退 GitHub 直连+代理链..."
151
179
  local dl_ok=0 p=""
152
180
  for p in "${DL_PREFIXES[@]}"; do
153
181
  if curl -fL --connect-timeout 10 --retry 2 -o voice.tar.gz "${p}${GH_VOICE}"; then
@@ -253,27 +281,82 @@ fi
253
281
  exit 0
254
282
  EOS
255
283
 
256
- cat > "$APP_DIR/update.sh" <<EOS
257
- #!/data/data/com.termux/files/usr/bin/bash
258
- # 更新便携包并重启(下载源带回退链,与 install-termux.sh 同款)
259
- set -euo pipefail
260
- APP_DIR="${APP_DIR}"
261
- GH_ASSET="${GH_ASSET}"
262
- cd "\$APP_DIR"
284
+ # update.sh 与安装器同一条下载链(npmmirror+滞后守卫 → npm 官方 → GitHub 直连 → gh 代理):
285
+ # 头部三行配置用 printf %q 烤入;函数体放引号 heredoc —— 零转义、与上面定义逐字同源,
286
+ # 改链时两处一起改(verify-termux-voice T7 守链序与两份同步)
287
+ {
288
+ printf '#!/data/data/com.termux/files/usr/bin/bash\n'
289
+ printf 'set -euo pipefail\n'
290
+ printf 'APP_DIR=%q PORT=%q GH_ASSET=%q\n\n' "$APP_DIR" "$PORT" "$GH_ASSET"
291
+ cat <<'UPDATE_EOF'
292
+ # 更新便携包并重启(下载链与 install-termux.sh 同源:npmmirror+滞后守卫 → npm 官方 → GitHub 直连 → gh 代理)
293
+ info() { printf '\033[1m[*]\033[0m %s\n' "$*"; }
294
+
295
+ # ↓↓ 与 install-termux.sh 逐字同源的四个函数(契约:恒 exit 0,空输出=未命中)↓↓
296
+ npm_tarball() {
297
+ local json ver gh
298
+ json=$(curl -sfL --connect-timeout 8 --max-time 20 "https://registry.npmmirror.com/$1/latest" || true)
299
+ [ -n "$json" ] || return 0
300
+ ver=$(printf '%s' "$json" | sed -n 's/.*"version":"\([^"]*\)".*/\1/p')
301
+ if [ -n "$ver" ]; then
302
+ gh=$(gh_latest_version)
303
+ if [ -n "$gh" ] && ! ver_ge "$ver" "$gh"; then
304
+ info "npm 镜像同步滞后(镜像 v${ver} < GitHub v${gh}),换 npm 官方源…"
305
+ return 0
306
+ fi
307
+ fi
308
+ printf '%s' "$json" | sed -n 's/.*"tarball":"\([^"]*\)".*/\1/p'
309
+ }
310
+ npm_tarball_official() {
311
+ local json
312
+ json=$(curl -sfL --connect-timeout 8 --max-time 20 "https://registry.npmjs.org/$1/latest" || true)
313
+ printf '%s' "$json" | sed -n 's/.*"tarball":"\([^"]*\)".*/\1/p'
314
+ }
315
+ gh_latest_version() {
316
+ local final
317
+ final=$(curl -sIL --connect-timeout 8 --max-time 20 -o /dev/null -w '%{url_effective}' \
318
+ "https://github.com/Kaiji-Z/LookatStudy/releases/latest/download/probe" 2>/dev/null || true)
319
+ printf '%s' "$final" | sed -n 's#.*/download/v\([0-9][0-9.]*\)/.*#\1#p'
320
+ }
321
+ ver_ge() {
322
+ local a b
323
+ a=$(printf '%s' "$1" | tr -d 'v' | awk -F. '{printf "%02d%02d%02d", $1, $2, $3}')
324
+ b=$(printf '%s' "$2" | tr -d 'v' | awk -F. '{printf "%02d%02d%02d", $1, $2, $3}')
325
+ [ -n "$a" ] && [ -n "$b" ] && [ "$a" -ge "$b" ] 2>/dev/null
326
+ }
327
+ # ↑↑ 同源函数区结束 ↑↑
328
+
329
+ cd "$APP_DIR"
263
330
  echo "==> 停止旧服务..."
264
- pkill -f "server.cjs --port ${PORT}" 2>/dev/null || true
331
+ pkill -f "server.cjs --port $PORT" 2>/dev/null || true
265
332
  sleep 1
266
333
  echo "==> 下载最新便携包..."
267
- dl_ok=0
268
- for p in "" "https://gh-proxy.com/" "https://ghproxy.net/" "https://ghfast.top/"; do
269
- if curl -fL --connect-timeout 10 --retry 2 -o ls.zip "\${p}\${GH_ASSET}"; then dl_ok=1; break; fi
270
- echo " \${p:-直连}失败,换下一个源..."
271
- done
272
- [ "\$dl_ok" = 1 ] || { echo "下载失败,保持原版本。"; exit 1; }
273
- unzip -o ls.zip && rm -f ls.zip
334
+ src=""
335
+ tb=$(npm_tarball lookatstudy-mobile)
336
+ if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o mobile.tgz "$tb"; then
337
+ src="npm 镜像"
338
+ else
339
+ tb=$(npm_tarball_official lookatstudy-mobile)
340
+ if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o mobile.tgz "$tb"; then
341
+ src="npm 官方源"
342
+ fi
343
+ fi
344
+ if [ -n "$src" ]; then
345
+ tar -xzf mobile.tgz --strip-components=1 && rm -f mobile.tgz
346
+ echo "[✓] 已更新($src)"
347
+ else
348
+ dl_ok=0
349
+ for p in "" "https://gh-proxy.com/" "https://ghproxy.net/" "https://ghfast.top/"; do
350
+ if curl -fL --connect-timeout 10 --retry 2 -o ls.zip "${p}${GH_ASSET}"; then dl_ok=1; break; fi
351
+ echo " ${p:-GitHub 直连}失败,换下一个源..."
352
+ done
353
+ [ "$dl_ok" = 1 ] || { echo "下载失败,保持原版本。"; exit 1; }
354
+ unzip -o ls.zip && rm -f ls.zip
355
+ fi
274
356
  echo "==> 重启..."
275
- exec bash "\$APP_DIR/start.sh"
276
- EOS
357
+ exec bash "$APP_DIR/start.sh"
358
+ UPDATE_EOF
359
+ } > "$APP_DIR/update.sh"
277
360
 
278
361
  chmod 755 "$APP_DIR"/{start,stop,status,update}.sh
279
362
  ok "常用脚本就位: ~/lookatstudy/{start,stop,status,update}.sh"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lookatstudy-mobile",
3
- "version": "0.17.0",
3
+ "version": "0.19.0",
4
4
  "description": "LookatStudy Termux portable bundle (server.cjs + web frontend)",
5
5
  "repository": {
6
6
  "type": "git",
package/server.cjs CHANGED
@@ -517676,6 +517676,16 @@ function htmlToMarkdown(html, opts = {}) {
517676
517676
  if (!document2.body || document2.body.childNodes.length === 0) {
517677
517677
  document2 = parseHTML(`<html><body>${html}</body></html>`).document;
517678
517678
  }
517679
+ for (const el of Array.from(document2.querySelectorAll("script[type='math/tex']"))) {
517680
+ const tex = (el.textContent ?? "").trim();
517681
+ if (tex)
517682
+ el.replaceWith(document2.createTextNode(tex.includes("\n") ? `$$${tex}$$` : `$${tex}$`));
517683
+ }
517684
+ for (const el of Array.from(document2.querySelectorAll(".katex"))) {
517685
+ const tex = (el.querySelector("annotation")?.textContent ?? "").trim();
517686
+ if (tex)
517687
+ el.replaceWith(document2.createTextNode(tex.includes("\n") ? `$$${tex}$$` : `$${tex}$`));
517688
+ }
517679
517689
  for (const tag of ["script", "style", "head"]) {
517680
517690
  for (const el of document2.querySelectorAll(tag))
517681
517691
  el.remove();
@@ -526237,6 +526247,153 @@ function splitSentences(text3, opts = {}) {
526237
526247
  return { sentences: out, rest: flush ? "" : rest };
526238
526248
  }
526239
526249
 
526250
+ // shared/math-speech.ts
526251
+ var SYMBOLS = [
526252
+ ["\\leq", "\u5C0F\u4E8E\u7B49\u4E8E"],
526253
+ ["\\le", "\u5C0F\u4E8E\u7B49\u4E8E"],
526254
+ ["\\geq", "\u5927\u4E8E\u7B49\u4E8E"],
526255
+ ["\\ge", "\u5927\u4E8E\u7B49\u4E8E"],
526256
+ ["\\neq", "\u4E0D\u7B49\u4E8E"],
526257
+ ["\\ne", "\u4E0D\u7B49\u4E8E"],
526258
+ ["\\approx", "\u7EA6\u7B49\u4E8E"],
526259
+ ["\\equiv", "\u6052\u7B49\u4E8E"],
526260
+ ["\\pm", "\u6B63\u8D1F"],
526261
+ ["\\times", "\u4E58\u4EE5"],
526262
+ ["\\cdot", "\u70B9\u4E58"],
526263
+ ["\\div", "\u9664\u4EE5"],
526264
+ ["\\to", "\u8D8B\u4E8E"],
526265
+ ["\\rightarrow", "\u8D8B\u4E8E"],
526266
+ ["\\Rightarrow", "\u63A8\u51FA"],
526267
+ ["\\infty", "\u65E0\u7A77"],
526268
+ ["\\sum", "\u6C42\u548C"],
526269
+ ["\\prod", "\u8FDE\u4E58"],
526270
+ ["\\int", "\u79EF\u5206"],
526271
+ ["\\lim", "\u6781\u9650"],
526272
+ ["\\log", "\u5BF9\u6570"],
526273
+ ["\\ln", "\u81EA\u7136\u5BF9\u6570"],
526274
+ ["\\exp", "\u6307\u6570"],
526275
+ ["\\in", "\u5C5E\u4E8E"],
526276
+ ["\\subset", "\u5305\u542B\u4E8E"],
526277
+ ["\\cup", "\u5E76"],
526278
+ ["\\cap", "\u4EA4"],
526279
+ ["\\forall", "\u4EFB\u610F"],
526280
+ ["\\exists", "\u5B58\u5728"],
526281
+ ["\\partial", "\u504F\u5BFC"],
526282
+ ["\\nabla", "\u68AF\u5EA6"],
526283
+ ["\\angle", "\u89D2"],
526284
+ ["\\degree", "\u5EA6"],
526285
+ ["\\cdots", "\u70B9\u70B9\u70B9"],
526286
+ ["\\ldots", "\u70B9\u70B9\u70B9"]
526287
+ ];
526288
+ var GREEK = {
526289
+ alpha: "\u963F\u5C14\u6CD5",
526290
+ beta: "\u8D1D\u5854",
526291
+ gamma: "\u4F3D\u9A6C",
526292
+ delta: "\u5FB7\u5C14\u5854",
526293
+ epsilon: "\u827E\u666E\u897F\u9686",
526294
+ zeta: "\u6CFD\u5854",
526295
+ eta: "\u4F0A\u5854",
526296
+ theta: "\u897F\u5854",
526297
+ iota: "\u7EA6\u5854",
526298
+ kappa: "\u5361\u5E15",
526299
+ lambda: "\u62C9\u59C6\u8FBE",
526300
+ mu: "\u7F2A",
526301
+ nu: "\u7EBD",
526302
+ xi: "\u514B\u897F",
526303
+ pi: "\u6D3E",
526304
+ rho: "\u67D4",
526305
+ sigma: "\u897F\u683C\u9A6C",
526306
+ tau: "\u9676",
526307
+ phi: "\u6590",
526308
+ chi: "\u51EF",
526309
+ psi: "\u666E\u897F",
526310
+ omega: "\u6B27\u7C73\u4F3D"
526311
+ };
526312
+ function readGroup(s, i) {
526313
+ if (s[i] !== "{")
526314
+ return null;
526315
+ let depth = 0;
526316
+ for (let j = i; j < s.length; j++) {
526317
+ if (s[j] === "{")
526318
+ depth++;
526319
+ else if (s[j] === "}") {
526320
+ depth--;
526321
+ if (depth === 0)
526322
+ return { body: s.slice(i + 1, j), end: j + 1 };
526323
+ }
526324
+ }
526325
+ return null;
526326
+ }
526327
+ function readAtom(s, i) {
526328
+ const g = readGroup(s, i);
526329
+ if (g)
526330
+ return g;
526331
+ return { body: s[i] ?? "", end: i + 1 };
526332
+ }
526333
+ function mathToSpokenZH(tex) {
526334
+ let s = tex;
526335
+ s = s.replace(/\\(?:left|right|displaystyle|limits)\b/g, " ");
526336
+ s = s.replace(/\\[,;!\s]|\\quad|\\qquad|~/g, " ");
526337
+ for (let guard = 0; guard < 12; guard++) {
526338
+ let next = s;
526339
+ next = next.replace(/\\[dt]?frac(?![A-Za-z])/g, "\\frac");
526340
+ {
526341
+ let i;
526342
+ while ((i = next.indexOf("\\frac")) >= 0) {
526343
+ const a = readAtom(next, i + 5);
526344
+ const b = readAtom(next, a.end);
526345
+ next = next.slice(0, i) + `${a.body} \u5206\u4E4B ${b.body} ` + next.slice(b.end);
526346
+ }
526347
+ }
526348
+ {
526349
+ let i;
526350
+ while ((i = next.indexOf("\\binom")) >= 0) {
526351
+ const a = readAtom(next, i + 6);
526352
+ const b = readAtom(next, a.end);
526353
+ next = next.slice(0, i) + `${a.body} \u53D6 ${b.body} ` + next.slice(b.end);
526354
+ }
526355
+ }
526356
+ next = next.replace(/\\sqrt\s*\[( {[^{}]*} |[^\s\\]+)\s*\]\s*/g, (_m, n) => `${n.trim()} \u6B21\u6839\u53F7 `);
526357
+ {
526358
+ let i;
526359
+ while ((i = next.indexOf("\\sqrt")) >= 0) {
526360
+ const a = readAtom(next, i + 5);
526361
+ next = next.slice(0, i) + `\u6839\u53F7 ${a.body} ` + next.slice(a.end);
526362
+ }
526363
+ }
526364
+ next = next.replace(/\\(?:mathbf|mathbb|mathrm|mathit|boldsymbol|text|operatorname)\s*/g, (m) => m.startsWith("\\text") ? "" : " ");
526365
+ if (next === s) {
526366
+ s = next;
526367
+ break;
526368
+ }
526369
+ s = next;
526370
+ }
526371
+ for (let guard = 0; guard < 8; guard++) {
526372
+ const next = s.replace(
526373
+ /(\\frac|[\w)\]}]|\s)\s*\^\s*(\{[^{}]*\}|[^\s])|(\\frac|[\w)\]}]| )\s*_\s*(\{[^{}]*\}|[^\s])/g,
526374
+ (_m, base1, sup, base2, sub) => {
526375
+ if (sup !== void 0)
526376
+ return `${base1} \u7684 ${sup.replace(/[{}]/g, "")} \u6B21\u65B9`;
526377
+ return `${base2} \u4E0B\u6807 ${sub.replace(/[{}]/g, "")}`;
526378
+ }
526379
+ );
526380
+ if (next === s)
526381
+ break;
526382
+ s = next;
526383
+ }
526384
+ for (const [cmd, zh2] of SYMBOLS)
526385
+ s = s.split(cmd).join(` ${zh2} `);
526386
+ s = s.replace(/\\([A-Za-z]+)\b/g, (_m, name18) => ` ${GREEK[name18] ?? name18} `);
526387
+ s = s.replace(/[{}]/g, " ");
526388
+ return s.replace(/\s+/g, " ").trim();
526389
+ }
526390
+ function speakMathInSentence(sentence) {
526391
+ return sentence.replace(/\$\$([^$]+)\$\$|\$([^$]+)\$/g, (_m, block, inline) => {
526392
+ const spoken = mathToSpokenZH(block ?? inline ?? "");
526393
+ return spoken ? ` ${spoken} ` : "";
526394
+ });
526395
+ }
526396
+
526240
526397
  // src/main/services/speech/tts-service.ts
526241
526398
  init_speech_model_manifest();
526242
526399
  init_speech_model_service();
@@ -550884,13 +551041,14 @@ function speedToRatePercent(speed) {
550884
551041
  function resolveTtsTier(settings2) {
550885
551042
  const engineRaw = settings2.tts_engine?.trim() ?? "";
550886
551043
  const isCustom = engineRaw.startsWith("custom-");
550887
- const engine = isCustom || engineRaw === "azure" || engineRaw === "local" || engineRaw === "edge" ? isCustom ? "custom" : engineRaw : DEFAULT_TTS_ENGINE;
551044
+ const engine = isCustom || engineRaw === "azure" || engineRaw === "local" || engineRaw === "edge" || engineRaw === "system" ? isCustom ? "custom" : engineRaw : DEFAULT_TTS_ENGINE;
550888
551045
  const voice = engine === "azure" ? settings2.azure_tts_voice?.trim() || DEFAULT_AZURE_TTS_VOICE : settings2.tts_voice_edge?.trim() || DEFAULT_EDGE_VOICE;
550889
551046
  return {
550890
551047
  engine,
550891
551048
  customProviderId: isCustom ? engineRaw : null,
550892
551049
  voice,
550893
551050
  customVoice: settings2.tts_custom_voice?.trim() || null,
551051
+ systemVoice: settings2.tts_system_voice?.trim() || null,
550894
551052
  speed: clampSpeed(settings2.tts_speed),
550895
551053
  azureKey: settings2.azure_tts_api_key?.trim() || null,
550896
551054
  azureRegion: settings2.azure_tts_region?.trim() || null
@@ -551106,6 +551264,9 @@ async function speakMessage(emit2, dataDir, settings2, messageId, rawText, deps
551106
551264
  const sid = parseSid(settings2.tts_sid_local);
551107
551265
  const synth = deps.synth ?? synthSentence;
551108
551266
  const isLocalReady = deps.localReady ?? localModelReady;
551267
+ if (cfg.engine === "system") {
551268
+ return { ok: false, reason: "engine-unavailable" };
551269
+ }
551109
551270
  if (cfg.engine === "local") {
551110
551271
  if (!isSpeechEngineLoadable())
551111
551272
  return { ok: false, reason: "engine-unavailable" };
@@ -551137,7 +551298,7 @@ async function speakMessage(emit2, dataDir, settings2, messageId, rawText, deps
551137
551298
  if (running)
551138
551299
  return running;
551139
551300
  const sentence = sentences[i];
551140
- const p = synth(dataDir, cfg, engine, sentence, {
551301
+ const p = synth(dataDir, cfg, engine, speakMathInSentence(sentence), {
551141
551302
  sid,
551142
551303
  onChunk: () => !mine.stopped && active === mine,
551143
551304
  custom: deps.custom ?? void 0
@@ -554380,6 +554541,7 @@ function buildGenerationPrompt(title, content, type, outLang) {
554380
554541
  ``,
554381
554542
  `\u51FA\u9898\u7EA2\u7EBF:`,
554382
554543
  `- \u7B54\u6848\u5FC5\u987B\u5728\u63D0\u4F9B\u7684\u5B66\u4E60\u5185\u5BB9\u4E2D\u6709\u4F9D\u636E\uFF0C\u4E0D\u53EF\u7F16\u9020\u5185\u5BB9\u91CC\u6CA1\u6709\u7684\u77E5\u8BC6`,
554544
+ `- \u6570\u5B66\u8868\u8FBE\u5F0F\u7528\u884C\u5185 $..$ \u6216\u884C\u95F4 $$..$$ \u7684 LaTeX \u8BB0\u6CD5\u4E66\u5199\uFF0C\u4E0D\u8981\u7528\u7EAF\u6587\u672C\u8FD1\u4F3C\uFF08\u754C\u9762\u4F1A\u6E32\u67D3\u6210\u516C\u5F0F\uFF09`,
554383
554545
  questionLanguageLine(outLang),
554384
554546
  `- \u5E72\u6270\u9879 plausible \u4F46 definitely wrong\uFF08\u4E0D\u80FD\u6709\u4E89\u8BAE\uFF09`,
554385
554547
  ``,
@@ -554897,6 +555059,7 @@ ${l.content || "(\u8BFE\u65F6\u65E0\u6B63\u6587)"}`
554897
555059
  `- \u9898\u5E72\u8003"\u7406\u89E3"\u548C"\u5E94\u7528",\u4E0D\u8981\u51FA\u6B7B\u8BB0\u786C\u80CC\u7684\u5B9A\u4E49\u9898`,
554898
555060
  `- \u5E72\u6270\u9879 plausible \u4F46 definitely wrong(\u57FA\u4E8E\u5B66\u4E60\u8005\u5E38\u72AF\u7684\u771F\u5B9E\u8BEF\u89E3)`,
554899
555061
  `- \u7B54\u6848\u5FC5\u987B\u5728\u63D0\u4F9B\u7684\u8BFE\u7A0B\u5185\u5BB9\u4E2D\u6709\u4F9D\u636E`,
555062
+ `- \u6570\u5B66\u8868\u8FBE\u5F0F\u7528\u884C\u5185 $..$ \u6216\u884C\u95F4 $$..$$ \u7684 LaTeX \u8BB0\u6CD5\u4E66\u5199,\u4E0D\u8981\u7528\u7EAF\u6587\u672C\u8FD1\u4F3C(\u754C\u9762\u4F1A\u6E32\u67D3\u6210\u516C\u5F0F)`,
554900
555063
  questionLanguageLine(outLang),
554901
555064
  ``,
554902
555065
  `\u4E25\u683C\u6309\u4EE5\u4E0B JSON \u683C\u5F0F\u8FD4\u56DE,\u4E0D\u8981\u52A0 markdown \u4EE3\u7801\u5757\u6807\u8BB0\u3001\u4E0D\u8981\u89E3\u91CA:`,
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-DD5GiOn2.js";import{p as f}from"./chunk-JWPE2WC7-BnQRJatb.js";import{_ as n,l as o}from"./mermaid.core-BhIcHd-X.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-DkGVzNSQ.js";import"./main-XmO4BzRy.js";import"./index-BKXGqAJP.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}},F={parser:R,db:a,renderer:u,styles:p};export{F as diagram};
1
+ import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-BBL9yZr5.js";import{p as f}from"./chunk-JWPE2WC7-Rx7velok.js";import{_ as n,l as o}from"./mermaid.core-BnzH2M4g.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-BoAEtYBt.js";import"./main-_hK--hbF.js";import"./index-DFfbtrtQ.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}},F={parser:R,db:a,renderer:u,styles:p};export{F as diagram};
@@ -1 +1 @@
1
- import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-BhIcHd-X.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
1
+ import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-BnzH2M4g.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};