@ohmykreee/dsh-remote-control 0.0.0-stage → 1.0.3

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 (373) hide show
  1. package/AGENTS.md +556 -0
  2. package/INSTALLATION.md +310 -0
  3. package/LICENSE +21 -0
  4. package/README.md +195 -2
  5. package/client.js +3 -0
  6. package/components.json +20 -0
  7. package/cordis.patch.yml +3 -0
  8. package/docs/README.en.md +196 -0
  9. package/docs/screenshots/en/overview.png +0 -0
  10. package/docs/screenshots/en/question.png +0 -0
  11. package/docs/screenshots/zh/overview.png +0 -0
  12. package/docs/screenshots/zh/question.png +0 -0
  13. package/icon.svg +24 -0
  14. package/index.js +2 -0
  15. package/lib/account.js +1 -0
  16. package/lib/app-mapping.js +1 -0
  17. package/lib/i18n.js +1 -0
  18. package/lib/media-enrich.js +1 -0
  19. package/lib/notifications.js +1 -0
  20. package/lib/performance.js +1 -0
  21. package/lib/platform/index.js +1 -0
  22. package/lib/probe-adapter.js +1 -0
  23. package/lib/probe-daemon.js +1 -0
  24. package/lib/probe.js +1 -0
  25. package/lib/qr.js +1 -0
  26. package/lib/runtime.js +1 -0
  27. package/lib/service.js +1 -0
  28. package/lib/sessions.js +1 -0
  29. package/lib/settings.js +1 -0
  30. package/lib/types.js +1 -0
  31. package/lib/util.js +1 -0
  32. package/lib/weather.js +1 -0
  33. package/lib/ws.js +1 -0
  34. package/locale/en.json +6 -0
  35. package/locale/zh.json +6 -0
  36. package/package.json +118 -4
  37. package/scripts/browser-shot.mjs +217 -0
  38. package/scripts/build-dsh.mjs +228 -0
  39. package/scripts/build-rust.mjs +319 -0
  40. package/scripts/build-web.mjs +17 -0
  41. package/scripts/check-npm-package.mjs +322 -0
  42. package/scripts/mock-preview.py +574 -0
  43. package/scripts/screenshot-compose.py +89 -0
  44. package/scripts/screenshot-device.sh +75 -0
  45. package/src/dsh/client/api.ts +68 -0
  46. package/src/dsh/client/i18n.ts +573 -0
  47. package/src/dsh/client/icons.ts +56 -0
  48. package/src/dsh/client/index.ts +95 -0
  49. package/src/dsh/client/logic.ts +310 -0
  50. package/src/dsh/client/panel.ts +483 -0
  51. package/src/dsh/client/sections/apps.ts +40 -0
  52. package/src/dsh/client/sections/balance.ts +38 -0
  53. package/src/dsh/client/sections/connection.ts +97 -0
  54. package/src/dsh/client/sections/notifications.ts +43 -0
  55. package/src/dsh/client/sections/pomodoro.ts +184 -0
  56. package/src/dsh/client/sections/preferences.ts +138 -0
  57. package/src/dsh/client/sections/system.ts +120 -0
  58. package/src/dsh/client/sections/weather.ts +276 -0
  59. package/src/dsh/client/styles.ts +1119 -0
  60. package/src/dsh/client/types.ts +366 -0
  61. package/src/dsh/client/ui.ts +142 -0
  62. package/src/dsh/index.ts +108 -0
  63. package/src/dsh/lib/account.ts +520 -0
  64. package/src/dsh/lib/app-mapping.ts +366 -0
  65. package/src/dsh/lib/i18n.ts +82 -0
  66. package/src/dsh/lib/media-enrich.ts +202 -0
  67. package/src/dsh/lib/notifications.ts +322 -0
  68. package/src/dsh/lib/performance.ts +279 -0
  69. package/src/dsh/lib/platform/index.ts +43 -0
  70. package/src/dsh/lib/probe-adapter.ts +275 -0
  71. package/src/dsh/lib/probe-daemon.ts +359 -0
  72. package/src/dsh/lib/probe.ts +395 -0
  73. package/src/dsh/lib/qr.ts +42 -0
  74. package/src/dsh/lib/runtime.ts +126 -0
  75. package/src/dsh/lib/service.ts +1645 -0
  76. package/src/dsh/lib/sessions.ts +907 -0
  77. package/src/dsh/lib/settings.ts +468 -0
  78. package/src/dsh/lib/types.ts +231 -0
  79. package/src/dsh/lib/util.ts +115 -0
  80. package/src/dsh/lib/weather.ts +532 -0
  81. package/src/dsh/lib/ws.ts +328 -0
  82. package/src/dsh/types/qrcode-generator.d.ts +16 -0
  83. package/src/rust/Cargo.lock +1431 -0
  84. package/src/rust/Cargo.toml +68 -0
  85. package/src/rust/src/cli.rs +233 -0
  86. package/src/rust/src/daemon.rs +140 -0
  87. package/src/rust/src/location/linux.rs +118 -0
  88. package/src/rust/src/location/macos.rs +26 -0
  89. package/src/rust/src/location/mod.rs +170 -0
  90. package/src/rust/src/location/windows.rs +205 -0
  91. package/src/rust/src/main.rs +42 -0
  92. package/src/rust/src/media/catalog.rs +454 -0
  93. package/src/rust/src/media/linux.rs +350 -0
  94. package/src/rust/src/media/macos/accessibility.rs +59 -0
  95. package/src/rust/src/media/macos.rs +366 -0
  96. package/src/rust/src/media/mod.rs +298 -0
  97. package/src/rust/src/media/vendor/apple_music.rs +90 -0
  98. package/src/rust/src/media/vendor/common.rs +186 -0
  99. package/src/rust/src/media/vendor/kugou.rs +52 -0
  100. package/src/rust/src/media/vendor/kuwo.rs +49 -0
  101. package/src/rust/src/media/vendor/mod.rs +75 -0
  102. package/src/rust/src/media/vendor/netease.rs +1715 -0
  103. package/src/rust/src/media/vendor/qishui.rs +36 -0
  104. package/src/rust/src/media/vendor/qqmusic.rs +33 -0
  105. package/src/rust/src/media/vendor/spotify.rs +46 -0
  106. package/src/rust/src/media/vendor/wesing.rs +39 -0
  107. package/src/rust/src/media/vendor/youtube_music.rs +49 -0
  108. package/src/rust/src/media/windows/accessibility.rs +85 -0
  109. package/src/rust/src/media/windows/audio.rs +116 -0
  110. package/src/rust/src/media/windows/private.rs +291 -0
  111. package/src/rust/src/media/windows.rs +775 -0
  112. package/src/rust/src/notifications/linux.rs +276 -0
  113. package/src/rust/src/notifications/macos.rs +382 -0
  114. package/src/rust/src/notifications/mod.rs +244 -0
  115. package/src/rust/src/notifications/windows.rs +565 -0
  116. package/src/rust/src/perf/common.rs +109 -0
  117. package/src/rust/src/perf/linux.rs +282 -0
  118. package/src/rust/src/perf/macos.rs +28 -0
  119. package/src/rust/src/perf/mod.rs +157 -0
  120. package/src/rust/src/perf/windows.rs +981 -0
  121. package/src/rust/src/util.rs +360 -0
  122. package/src/rust/src/volume/linux.rs +195 -0
  123. package/src/rust/src/volume/macos.rs +54 -0
  124. package/src/rust/src/volume/mod.rs +116 -0
  125. package/src/rust/src/volume/windows.rs +75 -0
  126. package/src/rust/tests/cli.rs +79 -0
  127. package/src/rust/tests/daemon.rs +107 -0
  128. package/src/svelte/App.svelte +385 -0
  129. package/src/svelte/index.html +18 -0
  130. package/src/svelte/lib/billing.svelte.ts +228 -0
  131. package/src/svelte/lib/components/BalanceCard.svelte +173 -0
  132. package/src/svelte/lib/components/ClockCard.svelte +183 -0
  133. package/src/svelte/lib/components/CountdownCard.svelte +261 -0
  134. package/src/svelte/lib/components/CpuMemoryCard.svelte +238 -0
  135. package/src/svelte/lib/components/EmptyState.svelte +34 -0
  136. package/src/svelte/lib/components/GpuCard.svelte +245 -0
  137. package/src/svelte/lib/components/HomePage.svelte +34 -0
  138. package/src/svelte/lib/components/MusicControls.svelte +256 -0
  139. package/src/svelte/lib/components/MusicCover.svelte +88 -0
  140. package/src/svelte/lib/components/MusicPage.svelte +116 -0
  141. package/src/svelte/lib/components/NotificationsCard.svelte +109 -0
  142. package/src/svelte/lib/components/Panel.svelte +22 -0
  143. package/src/svelte/lib/components/PerformancePage.svelte +55 -0
  144. package/src/svelte/lib/components/PomodoroCard.svelte +250 -0
  145. package/src/svelte/lib/components/QuestionSheet.svelte +354 -0
  146. package/src/svelte/lib/components/RadialGauge.svelte +99 -0
  147. package/src/svelte/lib/components/Rail.svelte +217 -0
  148. package/src/svelte/lib/components/SectionHeader.svelte +40 -0
  149. package/src/svelte/lib/components/SeekBar.svelte +421 -0
  150. package/src/svelte/lib/components/SessionList.svelte +364 -0
  151. package/src/svelte/lib/components/SessionStats.svelte +98 -0
  152. package/src/svelte/lib/components/SessionsPage.svelte +61 -0
  153. package/src/svelte/lib/components/SpendCard.svelte +105 -0
  154. package/src/svelte/lib/components/ThermalCard.svelte +249 -0
  155. package/src/svelte/lib/components/Toast.svelte +32 -0
  156. package/src/svelte/lib/components/WeatherIcon.svelte +40 -0
  157. package/src/svelte/lib/components/WeatherPanel.svelte +420 -0
  158. package/src/svelte/lib/components/ui/alert/alert-action.svelte +20 -0
  159. package/src/svelte/lib/components/ui/alert/alert-description.svelte +23 -0
  160. package/src/svelte/lib/components/ui/alert/alert-title.svelte +23 -0
  161. package/src/svelte/lib/components/ui/alert/alert.svelte +43 -0
  162. package/src/svelte/lib/components/ui/alert/index.ts +17 -0
  163. package/src/svelte/lib/components/ui/avatar/avatar-badge.svelte +26 -0
  164. package/src/svelte/lib/components/ui/avatar/avatar-fallback.svelte +20 -0
  165. package/src/svelte/lib/components/ui/avatar/avatar-group-count.svelte +23 -0
  166. package/src/svelte/lib/components/ui/avatar/avatar-group.svelte +23 -0
  167. package/src/svelte/lib/components/ui/avatar/avatar-image.svelte +17 -0
  168. package/src/svelte/lib/components/ui/avatar/avatar.svelte +26 -0
  169. package/src/svelte/lib/components/ui/avatar/index.ts +22 -0
  170. package/src/svelte/lib/components/ui/badge/badge.svelte +49 -0
  171. package/src/svelte/lib/components/ui/badge/index.ts +2 -0
  172. package/src/svelte/lib/components/ui/button/button.svelte +82 -0
  173. package/src/svelte/lib/components/ui/button/index.ts +17 -0
  174. package/src/svelte/lib/components/ui/card/card-action.svelte +23 -0
  175. package/src/svelte/lib/components/ui/card/card-content.svelte +20 -0
  176. package/src/svelte/lib/components/ui/card/card-description.svelte +20 -0
  177. package/src/svelte/lib/components/ui/card/card-footer.svelte +20 -0
  178. package/src/svelte/lib/components/ui/card/card-header.svelte +23 -0
  179. package/src/svelte/lib/components/ui/card/card-title.svelte +20 -0
  180. package/src/svelte/lib/components/ui/card/card.svelte +22 -0
  181. package/src/svelte/lib/components/ui/card/index.ts +25 -0
  182. package/src/svelte/lib/components/ui/dialog/dialog-close.svelte +11 -0
  183. package/src/svelte/lib/components/ui/dialog/dialog-content.svelte +48 -0
  184. package/src/svelte/lib/components/ui/dialog/dialog-description.svelte +17 -0
  185. package/src/svelte/lib/components/ui/dialog/dialog-footer.svelte +32 -0
  186. package/src/svelte/lib/components/ui/dialog/dialog-header.svelte +20 -0
  187. package/src/svelte/lib/components/ui/dialog/dialog-overlay.svelte +17 -0
  188. package/src/svelte/lib/components/ui/dialog/dialog-portal.svelte +7 -0
  189. package/src/svelte/lib/components/ui/dialog/dialog-title.svelte +17 -0
  190. package/src/svelte/lib/components/ui/dialog/dialog-trigger.svelte +11 -0
  191. package/src/svelte/lib/components/ui/dialog/dialog.svelte +7 -0
  192. package/src/svelte/lib/components/ui/dialog/index.ts +34 -0
  193. package/src/svelte/lib/components/ui/empty/empty-content.svelte +23 -0
  194. package/src/svelte/lib/components/ui/empty/empty-description.svelte +23 -0
  195. package/src/svelte/lib/components/ui/empty/empty-header.svelte +20 -0
  196. package/src/svelte/lib/components/ui/empty/empty-media.svelte +41 -0
  197. package/src/svelte/lib/components/ui/empty/empty-title.svelte +20 -0
  198. package/src/svelte/lib/components/ui/empty/empty.svelte +23 -0
  199. package/src/svelte/lib/components/ui/empty/index.ts +22 -0
  200. package/src/svelte/lib/components/ui/input/index.ts +7 -0
  201. package/src/svelte/lib/components/ui/input/input.svelte +48 -0
  202. package/src/svelte/lib/components/ui/progress/index.ts +7 -0
  203. package/src/svelte/lib/components/ui/progress/progress.svelte +27 -0
  204. package/src/svelte/lib/components/ui/scroll-area/index.ts +10 -0
  205. package/src/svelte/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte +30 -0
  206. package/src/svelte/lib/components/ui/scroll-area/scroll-area.svelte +43 -0
  207. package/src/svelte/lib/components/ui/separator/index.ts +7 -0
  208. package/src/svelte/lib/components/ui/separator/separator.svelte +21 -0
  209. package/src/svelte/lib/components/ui/sheet/index.ts +34 -0
  210. package/src/svelte/lib/components/ui/sheet/sheet-close.svelte +7 -0
  211. package/src/svelte/lib/components/ui/sheet/sheet-content.svelte +55 -0
  212. package/src/svelte/lib/components/ui/sheet/sheet-description.svelte +17 -0
  213. package/src/svelte/lib/components/ui/sheet/sheet-footer.svelte +20 -0
  214. package/src/svelte/lib/components/ui/sheet/sheet-header.svelte +20 -0
  215. package/src/svelte/lib/components/ui/sheet/sheet-overlay.svelte +20 -0
  216. package/src/svelte/lib/components/ui/sheet/sheet-portal.svelte +7 -0
  217. package/src/svelte/lib/components/ui/sheet/sheet-title.svelte +17 -0
  218. package/src/svelte/lib/components/ui/sheet/sheet-trigger.svelte +7 -0
  219. package/src/svelte/lib/components/ui/sheet/sheet.svelte +7 -0
  220. package/src/svelte/lib/components/ui/skeleton/index.ts +7 -0
  221. package/src/svelte/lib/components/ui/skeleton/skeleton.svelte +17 -0
  222. package/src/svelte/lib/components/ui/slider/index.ts +7 -0
  223. package/src/svelte/lib/components/ui/slider/slider.svelte +52 -0
  224. package/src/svelte/lib/components/ui/tooltip/index.ts +19 -0
  225. package/src/svelte/lib/components/ui/tooltip/tooltip-content.svelte +51 -0
  226. package/src/svelte/lib/components/ui/tooltip/tooltip-portal.svelte +7 -0
  227. package/src/svelte/lib/components/ui/tooltip/tooltip-provider.svelte +7 -0
  228. package/src/svelte/lib/components/ui/tooltip/tooltip-trigger.svelte +7 -0
  229. package/src/svelte/lib/components/ui/tooltip/tooltip.svelte +7 -0
  230. package/src/svelte/lib/countdown.svelte.ts +252 -0
  231. package/src/svelte/lib/format.ts +199 -0
  232. package/src/svelte/lib/i18n.svelte.ts +583 -0
  233. package/src/svelte/lib/media.ts +32 -0
  234. package/src/svelte/lib/pages.ts +18 -0
  235. package/src/svelte/lib/pomodoro.svelte.ts +223 -0
  236. package/src/svelte/lib/session-tree.ts +80 -0
  237. package/src/svelte/lib/state.svelte.ts +359 -0
  238. package/src/svelte/lib/timer-alarm.svelte.ts +319 -0
  239. package/src/svelte/lib/types.ts +306 -0
  240. package/src/svelte/lib/utils.ts +8 -0
  241. package/src/svelte/lib/weather.ts +84 -0
  242. package/src/svelte/lib/ws.ts +104 -0
  243. package/src/svelte/main.ts +13 -0
  244. package/src/svelte/styles/global.css +315 -0
  245. package/src/svelte/vite-env.d.ts +12 -0
  246. package/static/fonts/LICENSE.txt +287 -0
  247. package/static/icon.svg +24 -0
  248. package/static/manifest.webmanifest +18 -0
  249. package/svelte.config.js +5 -0
  250. package/tsconfig.dsh-client.json +18 -0
  251. package/tsconfig.dsh.json +21 -0
  252. package/tsconfig.json +20 -0
  253. package/vite.config.js +31 -0
  254. package/web/assets/index-DLdSfnJ3.css +1 -0
  255. package/web/assets/index-YNE8X0Uy.js +6 -0
  256. package/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  257. package/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  258. package/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  259. package/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  260. package/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  261. package/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  262. package/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  263. package/web/assets/jetbrains-mono-cyrillic-ext-wght-normal-EocZY2iu.woff2 +0 -0
  264. package/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  265. package/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  266. package/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  267. package/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  268. package/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  269. package/web/assets/noto-sans-sc-100-wght-normal-DluiXYzi.woff2 +0 -0
  270. package/web/assets/noto-sans-sc-101-wght-normal-CPkZHnw0.woff2 +0 -0
  271. package/web/assets/noto-sans-sc-102-wght-normal-gzIulUH6.woff2 +0 -0
  272. package/web/assets/noto-sans-sc-103-wght-normal-CJfSBxFo.woff2 +0 -0
  273. package/web/assets/noto-sans-sc-104-wght-normal-B3QMglgE.woff2 +0 -0
  274. package/web/assets/noto-sans-sc-105-wght-normal-xXh_OMfk.woff2 +0 -0
  275. package/web/assets/noto-sans-sc-106-wght-normal-B9n3jMjP.woff2 +0 -0
  276. package/web/assets/noto-sans-sc-107-wght-normal-D7fvVprN.woff2 +0 -0
  277. package/web/assets/noto-sans-sc-108-wght-normal-J0_LhxVo.woff2 +0 -0
  278. package/web/assets/noto-sans-sc-109-wght-normal-Dsp-De_0.woff2 +0 -0
  279. package/web/assets/noto-sans-sc-110-wght-normal-DE_6NUrb.woff2 +0 -0
  280. package/web/assets/noto-sans-sc-111-wght-normal-C4S-TlTn.woff2 +0 -0
  281. package/web/assets/noto-sans-sc-112-wght-normal-BcFuP3w6.woff2 +0 -0
  282. package/web/assets/noto-sans-sc-113-wght-normal-Dk932kmj.woff2 +0 -0
  283. package/web/assets/noto-sans-sc-114-wght-normal-CO_5Xo-i.woff2 +0 -0
  284. package/web/assets/noto-sans-sc-115-wght-normal-BWy07H14.woff2 +0 -0
  285. package/web/assets/noto-sans-sc-116-wght-normal-B4HVAfHo.woff2 +0 -0
  286. package/web/assets/noto-sans-sc-117-wght-normal-siZzFqgK.woff2 +0 -0
  287. package/web/assets/noto-sans-sc-118-wght-normal-xhBB7f6V.woff2 +0 -0
  288. package/web/assets/noto-sans-sc-119-wght-normal-Ck_g2FGz.woff2 +0 -0
  289. package/web/assets/noto-sans-sc-21-wght-normal-D0x9-yBt.woff2 +0 -0
  290. package/web/assets/noto-sans-sc-22-wght-normal-BBUVTShg.woff2 +0 -0
  291. package/web/assets/noto-sans-sc-23-wght-normal-Du1oYWkE.woff2 +0 -0
  292. package/web/assets/noto-sans-sc-24-wght-normal-CmWjJ0gt.woff2 +0 -0
  293. package/web/assets/noto-sans-sc-25-wght-normal-BFHiqilg.woff2 +0 -0
  294. package/web/assets/noto-sans-sc-26-wght-normal-C0sF2Z2f.woff2 +0 -0
  295. package/web/assets/noto-sans-sc-27-wght-normal-COFdrquJ.woff2 +0 -0
  296. package/web/assets/noto-sans-sc-28-wght-normal-DMgdNu1o.woff2 +0 -0
  297. package/web/assets/noto-sans-sc-29-wght-normal-Cmq8em30.woff2 +0 -0
  298. package/web/assets/noto-sans-sc-30-wght-normal-CZWqZ3yU.woff2 +0 -0
  299. package/web/assets/noto-sans-sc-31-wght-normal-Wfi_lutW.woff2 +0 -0
  300. package/web/assets/noto-sans-sc-32-wght-normal-BRJQ4PY5.woff2 +0 -0
  301. package/web/assets/noto-sans-sc-33-wght-normal-CUVQXNAJ.woff2 +0 -0
  302. package/web/assets/noto-sans-sc-34-wght-normal-Bspba0wC.woff2 +0 -0
  303. package/web/assets/noto-sans-sc-35-wght-normal-K8fX_YPG.woff2 +0 -0
  304. package/web/assets/noto-sans-sc-36-wght-normal-CkITyjoT.woff2 +0 -0
  305. package/web/assets/noto-sans-sc-37-wght-normal-WCZ2zfEe.woff2 +0 -0
  306. package/web/assets/noto-sans-sc-38-wght-normal-DeM7CUce.woff2 +0 -0
  307. package/web/assets/noto-sans-sc-39-wght-normal-BMZNLWQU.woff2 +0 -0
  308. package/web/assets/noto-sans-sc-4-wght-normal-AR5bdDjz.woff2 +0 -0
  309. package/web/assets/noto-sans-sc-40-wght-normal-BQ5xpS5j.woff2 +0 -0
  310. package/web/assets/noto-sans-sc-41-wght-normal-Hthm7FFi.woff2 +0 -0
  311. package/web/assets/noto-sans-sc-42-wght-normal-eaS2gKds.woff2 +0 -0
  312. package/web/assets/noto-sans-sc-43-wght-normal-o-T53XXV.woff2 +0 -0
  313. package/web/assets/noto-sans-sc-44-wght-normal-BJH5J4Ez.woff2 +0 -0
  314. package/web/assets/noto-sans-sc-45-wght-normal-BKuxSCOJ.woff2 +0 -0
  315. package/web/assets/noto-sans-sc-46-wght-normal-BR_5Mu6e.woff2 +0 -0
  316. package/web/assets/noto-sans-sc-47-wght-normal-CyY7gKNX.woff2 +0 -0
  317. package/web/assets/noto-sans-sc-48-wght-normal-BNMfTR6k.woff2 +0 -0
  318. package/web/assets/noto-sans-sc-49-wght-normal-DX-0y7wg.woff2 +0 -0
  319. package/web/assets/noto-sans-sc-5-wght-normal-CfWugllB.woff2 +0 -0
  320. package/web/assets/noto-sans-sc-50-wght-normal-DAOGW-Dr.woff2 +0 -0
  321. package/web/assets/noto-sans-sc-51-wght-normal-BlFLOjcP.woff2 +0 -0
  322. package/web/assets/noto-sans-sc-52-wght-normal-OZjrybnw.woff2 +0 -0
  323. package/web/assets/noto-sans-sc-53-wght-normal-CwyWNT6x.woff2 +0 -0
  324. package/web/assets/noto-sans-sc-54-wght-normal-DM0nRe18.woff2 +0 -0
  325. package/web/assets/noto-sans-sc-55-wght-normal-DBK2wUOR.woff2 +0 -0
  326. package/web/assets/noto-sans-sc-56-wght-normal-C-VKK1LS.woff2 +0 -0
  327. package/web/assets/noto-sans-sc-57-wght-normal-Cdbfh5kq.woff2 +0 -0
  328. package/web/assets/noto-sans-sc-58-wght-normal-CflMKARZ.woff2 +0 -0
  329. package/web/assets/noto-sans-sc-59-wght-normal-BS4Kwzxx.woff2 +0 -0
  330. package/web/assets/noto-sans-sc-6-wght-normal-ChnZIQfQ.woff2 +0 -0
  331. package/web/assets/noto-sans-sc-60-wght-normal-B7QOYsXJ.woff2 +0 -0
  332. package/web/assets/noto-sans-sc-61-wght-normal-C8JjQS7w.woff2 +0 -0
  333. package/web/assets/noto-sans-sc-62-wght-normal-bS4wq1Gg.woff2 +0 -0
  334. package/web/assets/noto-sans-sc-63-wght-normal-BJr8P-OB.woff2 +0 -0
  335. package/web/assets/noto-sans-sc-64-wght-normal-DVB11t7j.woff2 +0 -0
  336. package/web/assets/noto-sans-sc-65-wght-normal-DMPCXBvK.woff2 +0 -0
  337. package/web/assets/noto-sans-sc-66-wght-normal-BobaG10V.woff2 +0 -0
  338. package/web/assets/noto-sans-sc-67-wght-normal-Dzk7WhCR.woff2 +0 -0
  339. package/web/assets/noto-sans-sc-68-wght-normal-DGbCD9xu.woff2 +0 -0
  340. package/web/assets/noto-sans-sc-69-wght-normal-Ctrv1EqA.woff2 +0 -0
  341. package/web/assets/noto-sans-sc-70-wght-normal-RgTO941D.woff2 +0 -0
  342. package/web/assets/noto-sans-sc-71-wght-normal-D9sG-CWv.woff2 +0 -0
  343. package/web/assets/noto-sans-sc-72-wght-normal-C4oWy3ul.woff2 +0 -0
  344. package/web/assets/noto-sans-sc-73-wght-normal-B1ZoOTgM.woff2 +0 -0
  345. package/web/assets/noto-sans-sc-74-wght-normal-F7dH_rZJ.woff2 +0 -0
  346. package/web/assets/noto-sans-sc-75-wght-normal-Cp2wp4si.woff2 +0 -0
  347. package/web/assets/noto-sans-sc-76-wght-normal-B494D7xS.woff2 +0 -0
  348. package/web/assets/noto-sans-sc-77-wght-normal-B3MVY9Ax.woff2 +0 -0
  349. package/web/assets/noto-sans-sc-78-wght-normal-5jX7iNMC.woff2 +0 -0
  350. package/web/assets/noto-sans-sc-79-wght-normal-BIoZy8fr.woff2 +0 -0
  351. package/web/assets/noto-sans-sc-80-wght-normal-Bje1Fxy1.woff2 +0 -0
  352. package/web/assets/noto-sans-sc-81-wght-normal-B2NN7Qi3.woff2 +0 -0
  353. package/web/assets/noto-sans-sc-82-wght-normal-CUggNZi4.woff2 +0 -0
  354. package/web/assets/noto-sans-sc-83-wght-normal-99rD8YO-.woff2 +0 -0
  355. package/web/assets/noto-sans-sc-84-wght-normal-zMBmUocm.woff2 +0 -0
  356. package/web/assets/noto-sans-sc-85-wght-normal-CjI3qdxG.woff2 +0 -0
  357. package/web/assets/noto-sans-sc-86-wght-normal-BHY8TVEH.woff2 +0 -0
  358. package/web/assets/noto-sans-sc-87-wght-normal-DioZSHnU.woff2 +0 -0
  359. package/web/assets/noto-sans-sc-88-wght-normal-BXYxwf2t.woff2 +0 -0
  360. package/web/assets/noto-sans-sc-89-wght-normal-ClMFrFaL.woff2 +0 -0
  361. package/web/assets/noto-sans-sc-90-wght-normal-BnOlPreP.woff2 +0 -0
  362. package/web/assets/noto-sans-sc-91-wght-normal-DTr9RQcS.woff2 +0 -0
  363. package/web/assets/noto-sans-sc-97-wght-normal-9u6Aiav-.woff2 +0 -0
  364. package/web/assets/noto-sans-sc-98-wght-normal-BR-H2C0V.woff2 +0 -0
  365. package/web/assets/noto-sans-sc-99-wght-normal-BI6XPoxp.woff2 +0 -0
  366. package/web/assets/noto-sans-sc-cyrillic-wght-normal-BGmsQlw-.woff2 +0 -0
  367. package/web/assets/noto-sans-sc-latin-ext-wght-normal-DuJTpTg_.woff2 +0 -0
  368. package/web/assets/noto-sans-sc-latin-wght-normal-DDW8mKAR.woff2 +0 -0
  369. package/web/assets/noto-sans-sc-vietnamese-wght-normal-Bi3ATJ76.woff2 +0 -0
  370. package/web/fonts/LICENSE.txt +287 -0
  371. package/web/icon.svg +24 -0
  372. package/web/index.html +19 -0
  373. package/web/manifest.webmanifest +18 -0
@@ -0,0 +1,310 @@
1
+ # 安装、更新与卸载
2
+
3
+ 两种安装方式:
4
+
5
+ | 方式 | 适合 | 得到什么 |
6
+ |---|---|---|
7
+ | A. 从 npm 安装(推荐) | 只想用 | 编译好的插件,装完即可配对使用;媒体、音量、通知、GPU / 温度与系统定位需要另在本机构建一次组件 |
8
+ | B. 源码 + `link:` | 改代码、参与开发 | 全部功能,构建一次即可 |
9
+
10
+ 功能说明见 [`README.md`](README.md),架构与开发说明见 [`AGENTS.md`](AGENTS.md)。
11
+
12
+ ## 前置条件
13
+
14
+ | 组件 | 要求 | 说明 |
15
+ |---|---|---|
16
+ | DSH | 支持第三方 bundle(已在 `0.2.2-rc.1` 验证) | DSH Desktop 或 `dsh web` profile |
17
+ | 网络 | npm registry;方式 B 还要 github.com | 构建 Rust 探针还需 crates.io / `static.rust-lang.org` |
18
+ | Node.js | `>= 22` | 方式 B 与构建探针需要;方式 A 不需要 |
19
+ | pnpm | 10 或更新(CI 固定 `12.8.1`) | 方式 B 需要;DSH 安装插件时用它自己的 pnpm |
20
+ | git | 任意较新版本 | 方式 B 与构建探针需要 |
21
+ | Rust(可选) | `1.89+` + C 工具链 | 只有构建 `dsh-probe` 时需要;不构建也能安装插件 |
22
+ | 权限 | 安装目录可写 | Linux 安装 gcc 需要 `sudo`;Windows 构建探针建议用普通终端 |
23
+
24
+ ## 方式 A:从 npm 安装(推荐)
25
+
26
+ 插件已经发布到 npm,DSH 的插件管理器完成下载与安装,不需要 Node.js、pnpm 或 git。
27
+
28
+ **方式 A-1:DSH 插件管理器**
29
+
30
+ 1. 打开 DSH 设置 → 插件管理 → 安装插件。
31
+ 2. 填包名 `@ohmykreee/dsh-remote-control`(可加版本,如 `@ohmykreee/dsh-remote-control@1.0.3`)。
32
+ 3. 安装并启用,重启 DSH(或重新加载插件)。侧边栏会出现 **远程控制台**。
33
+
34
+ **方式 A-2:DSH CLI(DSH 未运行时)**
35
+
36
+ ```powershell
37
+ dsh plugin --profile desktop add @ohmykreee/dsh-remote-control
38
+ ```
39
+
40
+ ```bash
41
+ dsh plugin --profile web add @ohmykreee/dsh-remote-control
42
+ ```
43
+
44
+ `desktop` 对应 DSH Desktop,`web` 对应 `dsh web`。安装后 profile 的 `package.json` 会包含:
45
+
46
+ ```json
47
+ {
48
+ "dependencies": { "@ohmykreee/dsh-remote-control": "^1.0.3" },
49
+ "dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "@ohmykreee/dsh-remote-control"] } }
50
+ }
51
+ ```
52
+
53
+ 装好即可使用:时钟、天气、通知、会话、余额、远程回答、音乐信息、音量与性能页。
54
+
55
+ **这个包不含本机探测组件,也不声明任何安装脚本。** DSH 用 pnpm 安装组合包,pnpm 默认不执行依赖的构建脚本,所以「装完自动编译」不会发生。媒体、音量、通知、GPU / 温度与系统定位需要按 [构建原生探针](#rust-原生探针可选) 在本机构建一次;没有它时这些位置显示不可用,其余功能不受影响。
56
+
57
+ ## 方式 B:从源码构建并注册
58
+
59
+ 适合改代码或需要完整功能、又不想单独指定探针路径的场景。
60
+
61
+ ### 1. 克隆到固定目录
62
+
63
+ ```powershell
64
+ # Windows PowerShell
65
+ git clone https://github.com/ohmykreee/dsh-remote-control.git "$env:USERPROFILE\.dsh\plugins-src\dsh-remote-control"
66
+ ```
67
+
68
+ ```bash
69
+ # Linux / macOS
70
+ git clone https://github.com/ohmykreee/dsh-remote-control.git "$HOME/.dsh/plugins-src/dsh-remote-control"
71
+ ```
72
+
73
+ 不要克隆到临时目录、`node_modules` 或会被 agent 清理的 workspace;后面注册的是这个目录的绝对路径。路径建议保持 ASCII、无空格,Windows 的 `link:` spec 用正斜杠更稳(`link:D:/path/to/dsh-remote-control`)。已克隆过时用 `git pull --ff-only` 更新,不要重复 clone。
74
+
75
+ ### 2. 构建
76
+
77
+ ```powershell
78
+ cd "$env:USERPROFILE\.dsh\plugins-src\dsh-remote-control"
79
+ pnpm install
80
+ pnpm build
81
+ ```
82
+
83
+ `pnpm install` 只装依赖,`pnpm build` 编译 Host(`index.js`、`lib/`)与手机端(`web/`)、侧边栏(`client.js`)。退出码为 0 且根目录出现 `index.js`、`client.js`、`lib/`、`web/` 即成功。
84
+
85
+ 探针可选,按需构建:
86
+
87
+ ```powershell
88
+ pnpm build:rust
89
+ ```
90
+
91
+ 没有 Rust 时会失败,跳过这一步也能安装插件,只是媒体、音量、通知、GPU / 温度与系统定位不可用。
92
+
93
+ > 构建必须在源码目录里做。在 DSH profile 目录执行 `pnpm build` 会报 `Missing script: "build"`。
94
+
95
+ ### 3. 注册到 DSH
96
+
97
+ **先构建,再安装 / 启用。** 未构建的 bundle 一旦启用,DSH 启动会直接报 import 错误。
98
+
99
+ **方式 B-1:DSH 插件管理器**
100
+
101
+ 1. 打开 DSH 设置 → 插件管理 → 安装插件。
102
+ 2. 选择「从本地目录 / 路径安装」,spec 填 `link:D:/path/to/dsh-remote-control`(换成第 1 步的绝对路径;Linux/macOS 示例 `link:/home/you/.dsh/plugins-src/dsh-remote-control`)。
103
+ 3. 安装并启用,重启 DSH(或重新加载插件)。
104
+
105
+ 如果让 DSH 里的 agent 代装,让它调用插件管理器的 `install_bundle`,target 同样是上面的 `link:` spec。
106
+
107
+ **方式 B-2:DSH CLI(DSH 未运行时)**
108
+
109
+ ```powershell
110
+ dsh plugin --profile desktop add "link:D:/path/to/dsh-remote-control"
111
+ ```
112
+
113
+ ```bash
114
+ dsh plugin --profile web add "link:$HOME/.dsh/plugins-src/dsh-remote-control"
115
+ ```
116
+
117
+ CLI 只负责加入 profile 依赖;如果插件管理器里没有自动出现,请在管理器里启用一次,或确认 profile 的 `package.json` 中 `dsh.profile.bundles` 已包含 `@ohmykreee/dsh-remote-control`。DSH 正在运行时优先用管理器,避免 profile 文件锁。
118
+
119
+ 安装后 profile 的 `package.json` 应包含:
120
+
121
+ ```json
122
+ {
123
+ "dependencies": { "@ohmykreee/dsh-remote-control": "link:D:/path/to/dsh-remote-control" },
124
+ "dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "@ohmykreee/dsh-remote-control"] } }
125
+ }
126
+ ```
127
+
128
+ ### 4. 验收
129
+
130
+ 1. 重启 DSH 后打开设置,侧边栏应出现 **远程控制台**。
131
+ 2. 进入「连接」页,能看到二维码、控制台地址和「链接验证」开关。
132
+ 3. 手机与电脑在同一局域网,扫码打开控制台;页面、`/assets/` 资源和 WebSocket 都应正常。
133
+ 4. 在「系统信息」里确认服务状态为运行中,并检查 `dsh-probe` 与 Node.js 能力。
134
+
135
+ 手机打开返回 401 说明链接缺少令牌:重新扫码,或使用「连接」页复制的完整地址。
136
+
137
+ ## Rust 原生探针(可选)
138
+
139
+ 探针 `dsh-probe` 提供媒体、音量、性能 / GPU / 温度、通知和系统定位。不构建它不影响插件加载:
140
+
141
+ | 未构建探针时 | 状态 |
142
+ |---|---|
143
+ | 时钟、番茄钟、天气(IP / 时区回退)、会话、余额、设置、配对、HTTPS | 可用 |
144
+ | 媒体、音量、通知 | 显示「探针不可用」 |
145
+ | GPU、温度 | 空 / 错误状态 |
146
+ | CPU、内存 | Node 的 `os.cpus()` / `os.totalmem()` 兜底 |
147
+ | 系统定位 | 回退 IP / 时区 |
148
+
149
+ 探针是按平台编译的二进制,不随 npm 包分发。方式 B 构建一次即可;继续用方式 A 时按下面两步补上:
150
+
151
+ 1. 把仓库克隆到任意固定目录,`pnpm install` 后执行 `pnpm build:rust`,产物在 `native/bin/<platform>-<arch>/dsh-probe[.exe]`。
152
+ 2. 把环境变量 `DSH_RC_PROBE` 设为该产物的绝对路径(Windows 在「系统属性 → 环境变量」里添加,Linux / macOS 写进 shell 配置),然后完全退出并重启 DSH。
153
+
154
+ 也可以在 DSH 安装插件的目录里直接构建,但插件一更新就会被覆盖,不推荐。
155
+
156
+ ### Windows
157
+
158
+ 需要 Rust(MSVC 工具链)和 Visual Studio Build Tools 的「使用 C++ 的桌面开发」组件(会编译内置 SQLite)。
159
+
160
+ ```powershell
161
+ # 在普通 PowerShell 中执行,不要用被沙箱限制的终端
162
+ node scripts/build-rust.mjs
163
+ # 产物:native\bin\win32-x64\dsh-probe.exe
164
+ ```
165
+
166
+ 脚本会自动查找并加载 `vcvars64.bat`,可用 `DSH_RC_VCVARS` 指定路径。如果在沙箱 / 低完整性终端里构建过,`.build`、`lib` 可能带上拒绝删除的 ACL,之后 `pnpm build` 会报 `EPERM`;在普通终端删除 `.build` 后重试即可。等价手动命令(Developer PowerShell):`cargo build --release --manifest-path src/rust/Cargo.toml`。
167
+
168
+ ### Linux
169
+
170
+ ```bash
171
+ # Fedora / RHEL
172
+ sudo dnf install -y gcc gcc-c++ make
173
+ # Debian / Ubuntu: sudo apt install build-essential
174
+
175
+ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
176
+ source "$HOME/.cargo/env"
177
+ node scripts/build-rust.mjs
178
+ # 产物:native/bin/linux-x64/dsh-probe
179
+ ```
180
+
181
+ MPRIS 需要会话 D-Bus;GeoClue2 需要 `geoclue2` 服务和桌面授权;音量按 `wpctl` → `pactl` → `amixer` 顺序探测;NVIDIA 需要 `nvidia-smi`(可选)。
182
+
183
+ ### macOS
184
+
185
+ ```bash
186
+ xcode-select --install
187
+ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
188
+ source "$HOME/.cargo/env"
189
+ node scripts/build-rust.mjs
190
+ ```
191
+
192
+ macOS 仅提供源码级实现,未在实机或 CI 验证;GPU / 温度不实现;AX 读进度需要给运行 `dsh-probe` 的父进程授予「辅助功能」权限。
193
+
194
+ ### 网易云音乐 CDP(可选,红心/精确进度)
195
+
196
+ 新版网易云的 SMTC 只提供歌曲信息与播放状态,不汇报进度。若需要手机端显示精确进度并点击红心,让网易云带 Chromium 远程调试端口启动。
197
+
198
+ 1. 完全退出网易云音乐(包括托盘图标)。
199
+ 2. 右键桌面快捷方式 →「属性」→「目标」,在末尾追加(前面有空格):
200
+ ```text
201
+ /remote-debugging-port=2015
202
+ ```
203
+ 或直接运行:
204
+ ```powershell
205
+ & 'C:\Program Files\Netease\CloudMusic\cloudmusic.exe' /remote-debugging-port=2015
206
+ ```
207
+ 3. 访问 `http://127.0.0.1:2015/json`,能看到 `orpheus://orpheus/pub/app.html` 即成功。
208
+ 4. 重启 DSH(或等下一次媒体轮询)。音乐页会显示精确进度;登录后红心可点击。
209
+
210
+ 其他端口在启动 DSH 前设置 `DSH_RC_NETEASE_CDP_PORT`(探针继承该变量)。SMTC 可用时 CDP 只补进度和红心,传输控制仍走 SMTC;SMTC 不可用时 CDP 接管歌曲信息、封面与播放控制。未开启 CDP 时,进度回退到窗口 / UIA,红心显示为未知且不读取本地数据库。CDP 只监听回环地址,不调用外部数据接口、不导出 Cookie;删除快捷方式参数并重启网易云即可关闭。
211
+
212
+ ### 验证探针
213
+
214
+ ```powershell
215
+ .\native\bin\win32-x64\dsh-probe.exe version
216
+ ```
217
+
218
+ ```bash
219
+ ./native/bin/linux-x64/dsh-probe version
220
+ ```
221
+
222
+ 应输出一行 JSON,包含 `"ok": true` 和 `"name": "dsh-probe"`。之后重启 DSH,或在「系统信息」里确认能力状态。用 `DSH_RC_PROBE` 指向其他位置时,同样可以直接执行那个路径验证。
223
+
224
+ ### Windows 低完整性工作区(定位被拒绝)
225
+
226
+ Windows 只允许 Medium 完整性及以上的进程访问定位。插件目录若由低完整性进程创建,会带上 `Low Mandatory Level`,`dsh-probe.exe` 继承后 WinRT 直接返回 `Denied`,即使系统位置开关已打开。
227
+
228
+ ```powershell
229
+ icacls . # 出现 "Mandatory Label\Low Mandatory Level" 即命中
230
+ native\bin\win32-x64\dsh-probe.exe location request # 返回 "lowIntegrity": true
231
+ ```
232
+
233
+ `node scripts/build-rust.mjs` 会自动把项目根目录提升到 Medium,并在必要时重建 `native/`。父目录本身是 Low 时需要管理员执行:
234
+
235
+ ```powershell
236
+ icacls "D:\path\to\dsh-remote-control" /setintegritylevel "(OI)(CI)Medium" /T
237
+ node scripts/build-rust.mjs
238
+ ```
239
+
240
+ 也可以把插件放到没有 Low 标签的普通目录(如 `%LOCALAPPDATA%`)重新构建。修复后仍被拒绝,再到「天气设置 → 请求定位权限」开启系统隐私开关。
241
+
242
+ ## 更新
243
+
244
+ **方式 A:** 在 DSH 插件管理器里升级 **远程控制台**;没有升级入口时,用 CLI 装一次目标版本:
245
+
246
+ ```powershell
247
+ dsh plugin --profile desktop add @ohmykreee/dsh-remote-control@1.0.3 # 换成目标版本
248
+ ```
249
+
250
+ 更新后重启 DSH。插件目录里的 `native/bin` 不随包更新,用 `DSH_RC_PROBE` 指向外部探针时无需重建。
251
+
252
+ **方式 B:** profile 链接的是源码目录,更新不需要重新安装:
253
+
254
+ ```powershell
255
+ $Repo = "D:\path\to\dsh-remote-control" # 换成第 1 步的克隆目录
256
+ git -C $Repo pull --ff-only
257
+ pnpm -C $Repo install
258
+ pnpm -C $Repo build
259
+ ```
260
+
261
+ 探针也要重编时再加 `pnpm -C $Repo build:rust`。然后重启 DSH(或在插件管理器里重新加载插件)。只改文档不需要重启。
262
+
263
+ ## 卸载
264
+
265
+ 1. 在 DSH 插件管理器中卸载 / 禁用 **远程控制台**。
266
+ 2. DSH 无法启动或需要手动清理时,编辑对应 profile 的 `package.json`(Windows 默认 `%USERPROFILE%\.dsh\profiles\desktop\package.json`,Web profile 为 `~/.dsh/profiles/web/package.json`):从 `dsh.profile.bundles` 和 `dependencies` 中删除 `"@ohmykreee/dsh-remote-control"`,在该 profile 目录执行 `pnpm install`,然后重启 DSH。
267
+ 3. 方式 B 还要删除源码目录。
268
+ 4. 如需清除令牌、页面配置和软件映射,删除 `DSH_HOME/remote-control/`(存在 `DSH_PROFILE_DIR` 时优先使用 `<DSH_PROFILE_DIR>/remote-control/`)。
269
+
270
+ ## 故障排查
271
+
272
+ | 现象 | 处理 |
273
+ |---|---|
274
+ | `Failed to load plugins`、`web boot: 1 entry did not activate`、`import failed` | bundle 已启用但 `index.js` 缺失或加载失败。方式 B 先 `pnpm build`;仍失败时按「从加载失败中恢复」处理 |
275
+ | `ERR_MODULE_NOT_FOUND` 指向 `index.js` | 构建产物缺失:方式 B 重新构建;方式 A 重新安装插件 |
276
+ | 插件管理器里搜不到本插件 | 直接填完整包名 `@ohmykreee/dsh-remote-control`;确认网络能访问 npm registry |
277
+ | 安装时报 `build-blocked` / `Ignored build scripts` | 本插件不声明安装脚本。待批准的脚本来自其他包,确认来源后再决定是否授权 |
278
+ | `dsh: pnpm was not found` 或退出码 127 | 安装 pnpm 或 `corepack enable pnpm`(DSH 自带的 pnpm 不经过 `PATH` 时会用到) |
279
+ | `spawnSync cargo ENOENT` | 没有 Rust 工具链,这是可选的;安装后重跑 `pnpm build:rust` |
280
+ | `native probe not built` | 未构建探针:按上文构建并(方式 A)设置 `DSH_RC_PROBE`。媒体 / 音量 / 通知 / GPU / 温度 / 定位会不可用 |
281
+ | `EPERM` / 无法删除 `.build`、`lib` | 目录带拒绝删除 ACL;在普通终端删除 `.build` 后重试 |
282
+ | `Missing script: "build"` | 在 DSH profile 目录里构建;回到源码目录 |
283
+ | 侧边栏没有「远程控制台」 | 检查 bundle 是否启用、`client.js` 是否存在,重启 DSH |
284
+ | 手机打不开 / 一直转圈 | 检查同一局域网、防火墙、开放网卡与令牌;放行端口后重新扫码 |
285
+ | 页面 401 | 地址缺少令牌;用二维码或「连接」页复制的完整地址 |
286
+ | 系统定位被拒绝 | 用「请求定位权限」;低完整性按上文修复 |
287
+ | 端口被占用 | 设置 `DSH_REMOTE_CONTROL_PORT`;服务也会回退随机端口 |
288
+
289
+ ### 从加载失败中恢复
290
+
291
+ 1. 完全退出 DSH。
292
+ 2. 备份并编辑对应 profile 的 `package.json`,从 `dsh.profile.bundles` 移除 `"@ohmykreee/dsh-remote-control"`(只移除这一项)。若 DSH 仍无法启动,再从 `dependencies` 移除并在该目录执行 `pnpm install`。
293
+ 3. 启动 DSH,确认能进入设置。插件已停用。
294
+ 4. 方式 B:回到源码目录重新构建,确认 `index.js`、`client.js`、`lib/`、`web/` 都存在。方式 A:重新安装插件。
295
+ 5. 重新注册 / 启用,重启 DSH。
296
+
297
+ 插件管理器还能打开时,优先在界面里禁用 / 卸载。
298
+
299
+ ## 不支持的安装方式
300
+
301
+ | 方式 | 结果 |
302
+ |---|---|
303
+ | `npm install -g @ohmykreee/dsh-remote-control` | 全局包不属于任何 profile,DSH 不会加载 |
304
+ | `dsh plugin add github:ohmykreee/dsh-remote-control` | 走 git 依赖,不会构建,缺 `index.js` 时 bundle 无法加载 |
305
+ | 把 GitHub 地址填进插件安装框 | 同上 |
306
+ | 只复制构建产物到 profile | 更新、探针和路径解析都会失效 |
307
+ | 在 profile 里只 `pnpm add` 而不注册 bundle | 依赖装上了,但 DSH 不会加载 |
308
+ | 指望 `npm install` / 插件安装时自动编译探针 | 包不声明安装脚本,pnpm 也不会执行依赖的构建脚本 |
309
+
310
+ 正确做法:**从 DSH 插件管理器安装 npm 包**,或者 **clone 源码 → 在源码目录构建 → 用 `link:` 注册这个目录**。
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 TurboKre
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,196 @@
1
- # Temporary Holding Version
1
+ <p align="center">
2
+ <img src="icon.svg" alt="dsh-remote-control" width="80" height="80">
3
+ </p>
2
4
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
5
+ <h1 align="center">dsh-remote-control</h1>
6
+
7
+ <div align="center">
8
+ <p><strong>把局域网里的手机变成 DSH 的触屏中控台</strong></p>
9
+ <p><em>A touch-first LAN console for DeepSeek Harness</em></p>
10
+
11
+ <p>
12
+ <a href="https://github.com/deepseek-ai/deepseek-harness"><img src="https://img.shields.io/badge/powered_by-dsh-4D6BFE?style=flat&logo=deepseek&logoColor=white" alt="由 dsh 驱动"></a>
13
+ <a href="https://github.com/ohmykreee/dsh-remote-control/actions/workflows/checks.yml"><img src="https://github.com/ohmykreee/dsh-remote-control/actions/workflows/checks.yml/badge.svg" alt="Checks"></a>
14
+ <a href="https://www.npmjs.com/package/@ohmykreee/dsh-remote-control"><img src="https://img.shields.io/npm/v/@ohmykreee/dsh-remote-control?style=flat&color=4D6BFE" alt="npm"></a>
15
+ <img src="https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-4D6BFE?style=flat" alt="Windows / Linux / macOS">
16
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=flat" alt="MIT 许可证"></a>
17
+ </p>
18
+
19
+ <p>
20
+ 安装步骤 → <a href="INSTALLATION.md">INSTALLATION.md</a>
21
+ </p>
22
+
23
+ <p>
24
+ <strong>简体中文</strong> · <a href="docs/README.en.md">English</a>
25
+ </p>
26
+ </div>
27
+
28
+ ---
29
+
30
+ 手机与电脑在同一局域网时,用手机浏览器打开控制台地址,就能在触屏上查看时钟、天气和系统通知,掌握会话与余额,控制正在播放的音乐和系统音量,并在会话等待回答时直接回复。
31
+
32
+ ## 界面
33
+
34
+ 四页各管一件事:
35
+
36
+ | 页面 | 内容 |
37
+ |---|---|
38
+ | 首页 | 大号时钟与日期、当前天气和小时 / 7 天预报、番茄钟或倒计时、系统通知 |
39
+ | 会话 | 账户余额、今日 / 本周消费、作为卡片背景的 7 日消费柱、实时会话与子代理、远程回答 |
40
+ | 音乐 | 全屏模糊封面、歌曲信息、进度与 seek、上一首 / 下一首、播放暂停、系统音量与静音、网易云红心 |
41
+ | 性能 | CPU / 内存与 GPU / 显存圆环、频率与运行时间、最高温度与传感器列表 |
42
+
43
+ <p align="center">
44
+ <img src="docs/screenshots/zh/overview.png" alt="首页、会话、音乐与性能" width="1000">
45
+ <br>
46
+ <em>首页 / 会话 / 音乐 / 性能(左上 / 右上 / 左下 / 右下)。每张截图沿右上到左下分割:上方暗色,下方亮色。</em>
47
+ </p>
48
+
49
+ <p align="center">
50
+ <img src="docs/screenshots/zh/question.png" alt="远程提问" width="640">
51
+ <br>
52
+ <em>远程提问:选项、推荐标记与自定义回复。</em>
53
+ </p>
54
+
55
+ - 四页可左右循环滑动,一次手势最多前进 / 后退一页;页面顺序、开关与导航栏位置在 DSH 设置页配置。
56
+ - 关闭的页面不会显示在手机导航栏。
57
+ - 横屏下每页固定一屏高,通知、会话、温度传感器列表在卡片内部滚动;竖屏时整页上下滚动。
58
+ - 手机端提供简体中文与英文,选择 **跟随 DSH** 时使用 DSH 当前语言。
59
+ - 小屏使用大字号与易点按的触控目标。
60
+ - 左下角有快速刷新与全屏按钮。
61
+
62
+ ## 安装
63
+
64
+ **推荐:让 DSH 里的 agent 代装。** 打开一个新的 DSH 会话,把下面这句发给它:
65
+
66
+ > 安装 `@ohmykreee/dsh-remote-control` 插件;装好以后先读它包里的 README.md 与 INSTALLATION.md,再按里面的说明把媒体、音量、通知、性能与定位需要的本机组件构建好。
67
+
68
+ agent 会装好插件、读文档、构建本机组件,再提示你重启 DSH;缺少构建工具时它会说明缺什么。
69
+
70
+ **手动安装**:先读 [`INSTALLATION.md`](INSTALLATION.md),npm 安装、源码安装、组件构建、更新与排障都在那里。
71
+
72
+ ## 连接
73
+
74
+ - 打开侧边栏 **远程控制台 → 连接**,用手机扫描配对二维码,或复制页面上的控制台地址。手机与电脑需要在同一局域网。
75
+ - 默认开启访问验证:首次打开需要扫码链接,缺少验证会显示错误页。验证可以关闭或刷新,刷新后已连接设备会断开。
76
+ - 可以只允许指定网卡 / 子网访问。
77
+ - 可选 HTTPS:填写证书与私钥文件路径;证书无效时仍使用 HTTP,并在连接页显示错误。
78
+ - 端口被占用时会自动选择可用端口,实际地址以连接页显示为准。
79
+
80
+ ## 设置
81
+
82
+ 侧边栏 **远程控制台** 的菜单:
83
+
84
+ | 菜单 | 内容 |
85
+ |---|---|
86
+ | 连接 | 二维码、控制台地址、允许访问的网卡、访问验证、HTTPS |
87
+ | 偏好设置 | 插件语言、温度单位、主题、页面顺序与开关、导航栏位置 |
88
+ | 番茄钟/倒计时 | 启用开关(互斥)、专注 / 休息时长、倒计时预设、提示音 |
89
+ | 天气设置 | 定位方式、城市搜索、小时 / 7 天显示、定位权限 |
90
+ | 余额显示 | 统计窗口、低余额提醒线、峰谷标记 |
91
+ | 通知设置 | 应用开关、显示数量、远程回答 |
92
+ | 软件映射 | 修改应用显示名称或恢复默认 |
93
+ | 系统信息 | 服务状态、诊断信息与已连接设备 |
94
+
95
+ 修改后点击右上方 **保存设置**;应用改名、主题、令牌刷新和断开设备会立即生效。
96
+
97
+ ## 番茄钟与倒计时
98
+
99
+ 两者都显示在手机端时钟与天气之间,**互斥**,只能启用一个;关闭后从手机端移除。计时在手机浏览器中运行,刷新或关闭页面会丢失当前计时。
100
+
101
+ | | 番茄钟 | 倒计时 |
102
+ |---|---|---|
103
+ | 配置 | 专注 / 休息时长,可选「循环响铃直到停止」 | 1–5 个快速预设,默认 3 个 |
104
+ | 结束 | 播放提示音,可循环到手动停止 | 卡片变红并显示「时间到」,必须点「确认结束」 |
105
+ | 操作 | 开始、暂停、重置 | 选预设、开始、暂停、重置;结束后重置与选预设不可用 |
106
+
107
+ - 提示音可在 DSH 中配置本机音频文件或 http(s) 链接,留空使用内置的轻柔琶音;倒计时与番茄钟共用。
108
+ - 专注与休息时长支持 2 位小数;倒计时预设按「分」「秒」填写,秒数达到 60 会自动进位到分钟。
109
+ - 输入超出范围时会自动调整到允许的上下限:番茄钟 0.1–180 分钟(休息 0.1–120),倒计时预设 1–86400 秒。
110
+ - 时间到时主页 tab 和浏览器标签页都会显示绿色提示点,倒计时还会触发手机振动(浏览器支持时)。
111
+
112
+ ## 天气
113
+
114
+ - 自动模式使用本机位置;被拒绝或不可用时使用网络定位,再失败则按所在时区显示。
115
+ - Windows 定位可能被系统隐私开关阻挡。设置页 **天气设置 → 请求定位权限** 会发起申请;被拒绝时自动打开系统「位置」设置页,授权成功后刷新天气。
116
+ - 手动模式可搜索城市并自动填入坐标,也可以直接编辑纬度与经度。
117
+ - 城市搜索与预报会访问外部天气服务,不需要账户或密钥。温度单位支持摄氏度与华氏度,切换后天气、预报与性能页传感器统一使用完整单位符号。
118
+ - 自动模式(本机位置)下,手动位置输入框不可编辑。
119
+
120
+ ## 会话与余额
121
+
122
+ - 余额来自 DSH 账户;用量支持 **本周**(周一 00:00 至今)与 **最近 7 天**(今天及之前 6 个自然日)两种统计窗口。
123
+ - 会话页显示近 7 日每日消费柱,柱子作为消费卡背景,最高金额日为 100% 高度。
124
+ - 会话状态包括运行中(绿)、等待回答(黄)、错误(红)与已结束;导航图标在等待回答或错误时显示黄 / 红提醒点。
125
+ - 子代理会话嵌套在派发它的主代理卡片内并向右缩进;运行中的会话显示累计已运行时间。
126
+ - 余额卡片右上角有高峰 / 低谷标记:工作日北京时间 9:00–12:00、14:00–18:00 为高峰;其余时间、周末与法定节假日为低谷(价格为高峰的一半)。标记可在 **余额显示** 中关闭。
127
+
128
+ ### 远程回答
129
+
130
+ 开启 **推送问询** 后,等待回答的会话会出现「回答」入口:点击弹出居中的触屏对话框,展示全部问题、选项与自定义回复输入框。单选题点选项即可回复,多选题可多选后提交,也可以填写自定义回复或跳过该题。
131
+
132
+ - 手机端只处理 DSH 正常的用户问题;工具审批仍需在 DSH 中处理。
133
+ - 远程回答后,DSH 中的提问卡片可能仍需手动关闭。
134
+ - 关闭该开关时,会话页保持只读。
135
+
136
+ ## 音乐
137
+
138
+ - 已适配网易云音乐、QQ 音乐、酷狗音乐、酷我音乐、汽水音乐、全民 K 歌、Spotify、Apple Music、YouTube Music,以及浏览器 / 其他常见播放器。
139
+ - 音乐页显示专辑封面、全屏模糊背景、歌曲信息、进度、上一首 / 下一首、播放暂停、系统音量与静音;网易云红心在可用时可点击切换。
140
+ - 能否拖动进度取决于播放器是否支持定位;部分播放器只显示进度,无法拖动。读不到进度时不会伪造。
141
+ - 网易云音乐的红心与精确进度需要额外开启可选功能,步骤见 [`INSTALLATION.md`](INSTALLATION.md)。
142
+ - 封面或歌曲信息不可用时会显示占位,不会编造内容。
143
+
144
+ ## 性能
145
+
146
+ - 左侧两张卡片分别显示 CPU / 内存和 GPU / 显存,占用率使用圆环;下方小卡片显示当前频率、运行时间、已用 / 可用内存、显存和核心 / 显存频率。
147
+ - 右侧温度栏保留大号最高温度与传感器热区背景,GPU 核心温度、磁盘温度与 ACPI 热区在同一列表内;传感器多时在卡片内滚动。
148
+ - 读不到的读数会显示「未提供」,不会伪造。
149
+ - 部分系统功能在安装后可能显示不可用,请按 [`INSTALLATION.md`](INSTALLATION.md) 检查。
150
+
151
+ ## 通知与软件映射
152
+
153
+ - 通知来自系统通知中心;手机端显示应用名称、标题、正文、头像与时间。
154
+ - 常见应用内置中文名称,其他应用会自动推导名称。
155
+ - **软件映射** 可逐个改名或恢复默认,保存后立即用于手机端通知与音乐来源。
156
+ - **通知设置** 可为每个应用单独开关通知、限制显示数量(1–20),并控制是否推送问询。
157
+
158
+ ## 安全与隐私
159
+
160
+ - 默认开启随机访问验证;可关闭或刷新,刷新后所有已连接设备会断开。可限制允许访问的网卡 / 子网。
161
+ - 可选 HTTPS;证书无效时回退 HTTP 并显示错误。
162
+ - 设置只保存在本机。仓库不包含本机路径、验证信息、证书或通知内容,没有遥测。
163
+ - 天气、网络定位与法定节假日查询会访问外部服务;其余数据只在你的电脑与手机之间传输。
164
+
165
+ ## 平台支持
166
+
167
+ | 平台 | 支持情况 |
168
+ |---|---|
169
+ | Windows | 完整支持媒体、音量、性能、通知与定位。 |
170
+ | Linux | 完整支持媒体、音量、性能与通知;GPU 支持 NVIDIA / AMD。 |
171
+ | macOS | 尚未在实机与 CI 验证;GPU 与温度不可用。 |
172
+ | 手机端 | 现代浏览器;布局优先 1280×800 横屏。 |
173
+
174
+ ## 已知限制
175
+
176
+ - 媒体、音量、通知、GPU / 温度与系统定位需要在你自己的电脑上构建一次;未构建时这些功能显示不可用,CPU / 内存仍可查看。
177
+ - Windows 定位需要系统隐私授权;授权被拒绝时可能需要在系统设置中手动开启。
178
+ - 只有支持定位的播放器才能拖动进度;部分播放器只能显示进度或全部控制。
179
+ - 网易云音乐的红心与精确进度需要额外开启可选功能;页面刷新后可能暂时读取不到,稍后恢复。
180
+ - 会话页只读;媒体与音量可写;工具审批不能远程处理。
181
+ - 番茄钟与倒计时只在手机浏览器中运行,刷新或关闭页面会丢失。
182
+ - 布局优先保证 1280×800 横屏;竖屏为紧凑模式。
183
+
184
+ ## 文档
185
+
186
+ | 文件 | 内容 |
187
+ |---|---|
188
+ | [`INSTALLATION.md`](INSTALLATION.md) | 安装、更新、卸载与故障恢复 |
189
+ | [`docs/README.en.md`](docs/README.en.md) | English README |
190
+ | [`AGENTS.md`](AGENTS.md) | 面向开发者与 agent 的开发说明 |
191
+
192
+ 缺陷与需求走仓库 Issues。
193
+
194
+ ## 许可证
195
+
196
+ [MIT](LICENSE)。Inter、Noto Sans SC、JetBrains Mono 使用 SIL Open Font License 1.1(`static/fonts/LICENSE.txt`,构建后位于 `web/fonts/LICENSE.txt`)。界面组件来自 MIT 许可的 shadcn-svelte 与 bits-ui,图标来自 ISC 许可的 Lucide;部分媒体适配思路参考 [Widdit/now-playing-service](https://github.com/Widdit/now-playing-service)(MIT)。