@marktrue/dsh-mobile-remote 3.2.1-alpha.3 → 3.2.1-rc.1-app

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 (349) hide show
  1. package/DSH-Remote-v3.2.1.apk +4 -0
  2. package/README.md +6 -253
  3. package/manifest.json +21 -0
  4. package/package.json +12 -65
  5. package/CHANGELOG.md +0 -810
  6. package/CONTRIBUTING.md +0 -59
  7. package/FAQ.md +0 -111
  8. package/cordis.patch.yml +0 -14
  9. package/docs/00-/345/274/200/345/217/221/346/200/273/347/272/262.md +0 -122
  10. package/docs/01-PRD.md +0 -148
  11. package/docs/02-architecture.md +0 -249
  12. package/docs/03-api.md +0 -816
  13. package/docs/04-security.md +0 -96
  14. package/docs/05-test-cases.md +0 -326
  15. package/docs/06-install-run.md +0 -308
  16. package/docs/07-user-manual.md +0 -65
  17. package/docs/08-/346/211/251/345/261/225/345/274/200/345/217/221/346/214/207/345/215/227.md +0 -86
  18. package/docs/09-compatibility.md +0 -195
  19. package/docs/10-release.md +0 -927
  20. package/docs/screenshots/01-home.png +0 -0
  21. package/docs/screenshots/02-notifications.png +0 -0
  22. package/docs/screenshots/03-sessions.png +0 -0
  23. package/docs/screenshots/04-chat.png +0 -0
  24. package/docs/screenshots/05-settings.png +0 -0
  25. package/docs/screenshots/06-new-session.png +0 -0
  26. package/docs/screenshots/pgy-appstore.jpg +0 -0
  27. package/docs/screenshots/pgy-mobile-app.jpg +0 -0
  28. package/docs/screenshots/pgy-pc-client.jpg +0 -0
  29. package/lib/account-usage.js +0 -145
  30. package/lib/app-alignment.js +0 -112
  31. package/lib/app-carrier-store.js +0 -1972
  32. package/lib/app-carrier.js +0 -602
  33. package/lib/client.js +0 -706
  34. package/lib/desktop-form.js +0 -738
  35. package/lib/endpoint-registry.js +0 -162
  36. package/lib/git-read-bundled-provider.js +0 -255
  37. package/lib/git-read-service.js +0 -322
  38. package/lib/index.js +0 -9292
  39. package/lib/plugin-content-digest.js +0 -80
  40. package/lib/plugin-self-update.js +0 -758
  41. package/lib/plugin-update-controller.js +0 -95
  42. package/lib/plugin-update-transaction.js +0 -322
  43. package/lib/plugin-update.js +0 -309
  44. package/lib/runtime-dependency-snapshot.js +0 -345
  45. package/lib/session-title-cache.js +0 -123
  46. package/lib/session-title-refresh.js +0 -261
  47. package/lib/update-fetch.js +0 -24
  48. package/lib/update-lock-arbiter.js +0 -158
  49. package/lib/update-supervisor.js +0 -312
  50. package/node_modules/ansi-regex/index.d.ts +0 -37
  51. package/node_modules/ansi-regex/index.js +0 -10
  52. package/node_modules/ansi-regex/license +0 -9
  53. package/node_modules/ansi-regex/package.json +0 -55
  54. package/node_modules/ansi-regex/readme.md +0 -78
  55. package/node_modules/ansi-styles/index.d.ts +0 -345
  56. package/node_modules/ansi-styles/index.js +0 -163
  57. package/node_modules/ansi-styles/license +0 -9
  58. package/node_modules/ansi-styles/package.json +0 -56
  59. package/node_modules/ansi-styles/readme.md +0 -152
  60. package/node_modules/camelcase/index.d.ts +0 -63
  61. package/node_modules/camelcase/index.js +0 -76
  62. package/node_modules/camelcase/license +0 -9
  63. package/node_modules/camelcase/package.json +0 -43
  64. package/node_modules/camelcase/readme.md +0 -99
  65. package/node_modules/cliui/CHANGELOG.md +0 -76
  66. package/node_modules/cliui/LICENSE.txt +0 -14
  67. package/node_modules/cliui/README.md +0 -115
  68. package/node_modules/cliui/index.js +0 -354
  69. package/node_modules/cliui/package.json +0 -65
  70. package/node_modules/color-convert/CHANGELOG.md +0 -54
  71. package/node_modules/color-convert/LICENSE +0 -21
  72. package/node_modules/color-convert/README.md +0 -68
  73. package/node_modules/color-convert/conversions.js +0 -839
  74. package/node_modules/color-convert/index.js +0 -81
  75. package/node_modules/color-convert/package.json +0 -48
  76. package/node_modules/color-convert/route.js +0 -97
  77. package/node_modules/color-name/LICENSE +0 -8
  78. package/node_modules/color-name/README.md +0 -11
  79. package/node_modules/color-name/index.js +0 -152
  80. package/node_modules/color-name/package.json +0 -28
  81. package/node_modules/decamelize/index.js +0 -13
  82. package/node_modules/decamelize/license +0 -21
  83. package/node_modules/decamelize/package.json +0 -38
  84. package/node_modules/decamelize/readme.md +0 -48
  85. package/node_modules/dijkstrajs/.travis.yml +0 -4
  86. package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
  87. package/node_modules/dijkstrajs/LICENSE.md +0 -19
  88. package/node_modules/dijkstrajs/README.md +0 -18
  89. package/node_modules/dijkstrajs/dijkstra.js +0 -165
  90. package/node_modules/dijkstrajs/package.json +0 -60
  91. package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
  92. package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
  93. package/node_modules/emoji-regex/README.md +0 -73
  94. package/node_modules/emoji-regex/es2015/index.js +0 -6
  95. package/node_modules/emoji-regex/es2015/text.js +0 -6
  96. package/node_modules/emoji-regex/index.d.ts +0 -23
  97. package/node_modules/emoji-regex/index.js +0 -6
  98. package/node_modules/emoji-regex/package.json +0 -50
  99. package/node_modules/emoji-regex/text.js +0 -6
  100. package/node_modules/find-up/index.d.ts +0 -137
  101. package/node_modules/find-up/index.js +0 -89
  102. package/node_modules/find-up/license +0 -9
  103. package/node_modules/find-up/package.json +0 -53
  104. package/node_modules/find-up/readme.md +0 -156
  105. package/node_modules/get-caller-file/LICENSE.md +0 -6
  106. package/node_modules/get-caller-file/README.md +0 -41
  107. package/node_modules/get-caller-file/index.d.ts +0 -2
  108. package/node_modules/get-caller-file/index.js +0 -22
  109. package/node_modules/get-caller-file/index.js.map +0 -1
  110. package/node_modules/get-caller-file/package.json +0 -42
  111. package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  112. package/node_modules/is-fullwidth-code-point/index.js +0 -50
  113. package/node_modules/is-fullwidth-code-point/license +0 -9
  114. package/node_modules/is-fullwidth-code-point/package.json +0 -42
  115. package/node_modules/is-fullwidth-code-point/readme.md +0 -39
  116. package/node_modules/locate-path/index.d.ts +0 -83
  117. package/node_modules/locate-path/index.js +0 -65
  118. package/node_modules/locate-path/license +0 -9
  119. package/node_modules/locate-path/package.json +0 -45
  120. package/node_modules/locate-path/readme.md +0 -122
  121. package/node_modules/p-limit/index.d.ts +0 -38
  122. package/node_modules/p-limit/index.js +0 -57
  123. package/node_modules/p-limit/license +0 -9
  124. package/node_modules/p-limit/package.json +0 -52
  125. package/node_modules/p-limit/readme.md +0 -101
  126. package/node_modules/p-locate/index.d.ts +0 -64
  127. package/node_modules/p-locate/index.js +0 -52
  128. package/node_modules/p-locate/license +0 -9
  129. package/node_modules/p-locate/package.json +0 -53
  130. package/node_modules/p-locate/readme.md +0 -90
  131. package/node_modules/p-try/index.d.ts +0 -39
  132. package/node_modules/p-try/index.js +0 -9
  133. package/node_modules/p-try/license +0 -9
  134. package/node_modules/p-try/package.json +0 -42
  135. package/node_modules/p-try/readme.md +0 -58
  136. package/node_modules/path-exists/index.d.ts +0 -28
  137. package/node_modules/path-exists/index.js +0 -23
  138. package/node_modules/path-exists/license +0 -9
  139. package/node_modules/path-exists/package.json +0 -39
  140. package/node_modules/path-exists/readme.md +0 -52
  141. package/node_modules/pngjs/.eslintignore +0 -2
  142. package/node_modules/pngjs/.eslintrc.json +0 -19
  143. package/node_modules/pngjs/.prettierignore +0 -3
  144. package/node_modules/pngjs/LICENSE +0 -20
  145. package/node_modules/pngjs/README.md +0 -429
  146. package/node_modules/pngjs/browser.js +0 -16096
  147. package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
  148. package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
  149. package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
  150. package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
  151. package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
  152. package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
  153. package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
  154. package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
  155. package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
  156. package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
  157. package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
  158. package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
  159. package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
  160. package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
  161. package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
  162. package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
  163. package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
  164. package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
  165. package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
  166. package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
  167. package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
  168. package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
  169. package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
  170. package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
  171. package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
  172. package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
  173. package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  174. package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
  175. package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
  176. package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
  177. package/node_modules/pngjs/coverage/lcov.info +0 -2177
  178. package/node_modules/pngjs/lib/bitmapper.js +0 -267
  179. package/node_modules/pngjs/lib/bitpacker.js +0 -158
  180. package/node_modules/pngjs/lib/chunkstream.js +0 -189
  181. package/node_modules/pngjs/lib/constants.js +0 -32
  182. package/node_modules/pngjs/lib/crc.js +0 -40
  183. package/node_modules/pngjs/lib/filter-pack.js +0 -171
  184. package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
  185. package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
  186. package/node_modules/pngjs/lib/filter-parse.js +0 -177
  187. package/node_modules/pngjs/lib/format-normaliser.js +0 -93
  188. package/node_modules/pngjs/lib/interlace.js +0 -95
  189. package/node_modules/pngjs/lib/packer-async.js +0 -50
  190. package/node_modules/pngjs/lib/packer-sync.js +0 -56
  191. package/node_modules/pngjs/lib/packer.js +0 -129
  192. package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
  193. package/node_modules/pngjs/lib/parser-async.js +0 -165
  194. package/node_modules/pngjs/lib/parser-sync.js +0 -108
  195. package/node_modules/pngjs/lib/parser.js +0 -290
  196. package/node_modules/pngjs/lib/png-sync.js +0 -12
  197. package/node_modules/pngjs/lib/png.js +0 -194
  198. package/node_modules/pngjs/lib/sync-inflate.js +0 -168
  199. package/node_modules/pngjs/lib/sync-reader.js +0 -45
  200. package/node_modules/pngjs/package.json +0 -73
  201. package/node_modules/qrcode/README.md +0 -770
  202. package/node_modules/qrcode/bin/qrcode +0 -159
  203. package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
  204. package/node_modules/qrcode/helper/to-sjis.js +0 -105
  205. package/node_modules/qrcode/lib/browser.js +0 -76
  206. package/node_modules/qrcode/lib/can-promise.js +0 -7
  207. package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
  208. package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
  209. package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
  210. package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
  211. package/node_modules/qrcode/lib/core/byte-data.js +0 -30
  212. package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
  213. package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
  214. package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
  215. package/node_modules/qrcode/lib/core/format-info.js +0 -29
  216. package/node_modules/qrcode/lib/core/galois-field.js +0 -69
  217. package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
  218. package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
  219. package/node_modules/qrcode/lib/core/mode.js +0 -167
  220. package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
  221. package/node_modules/qrcode/lib/core/polynomial.js +0 -62
  222. package/node_modules/qrcode/lib/core/qrcode.js +0 -495
  223. package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
  224. package/node_modules/qrcode/lib/core/regex.js +0 -31
  225. package/node_modules/qrcode/lib/core/segments.js +0 -330
  226. package/node_modules/qrcode/lib/core/utils.js +0 -63
  227. package/node_modules/qrcode/lib/core/version-check.js +0 -9
  228. package/node_modules/qrcode/lib/core/version.js +0 -163
  229. package/node_modules/qrcode/lib/index.js +0 -12
  230. package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
  231. package/node_modules/qrcode/lib/renderer/png.js +0 -78
  232. package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
  233. package/node_modules/qrcode/lib/renderer/svg.js +0 -19
  234. package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
  235. package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
  236. package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
  237. package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
  238. package/node_modules/qrcode/lib/renderer/utils.js +0 -99
  239. package/node_modules/qrcode/lib/server.js +0 -138
  240. package/node_modules/qrcode/license +0 -10
  241. package/node_modules/qrcode/package.json +0 -77
  242. package/node_modules/require-directory/.jshintrc +0 -67
  243. package/node_modules/require-directory/.npmignore +0 -1
  244. package/node_modules/require-directory/.travis.yml +0 -3
  245. package/node_modules/require-directory/LICENSE +0 -22
  246. package/node_modules/require-directory/README.markdown +0 -184
  247. package/node_modules/require-directory/index.js +0 -86
  248. package/node_modules/require-directory/package.json +0 -40
  249. package/node_modules/require-main-filename/CHANGELOG.md +0 -26
  250. package/node_modules/require-main-filename/LICENSE.txt +0 -14
  251. package/node_modules/require-main-filename/README.md +0 -26
  252. package/node_modules/require-main-filename/index.js +0 -18
  253. package/node_modules/require-main-filename/package.json +0 -35
  254. package/node_modules/set-blocking/CHANGELOG.md +0 -26
  255. package/node_modules/set-blocking/LICENSE.txt +0 -14
  256. package/node_modules/set-blocking/README.md +0 -31
  257. package/node_modules/set-blocking/index.js +0 -7
  258. package/node_modules/set-blocking/package.json +0 -42
  259. package/node_modules/string-width/index.d.ts +0 -29
  260. package/node_modules/string-width/index.js +0 -47
  261. package/node_modules/string-width/license +0 -9
  262. package/node_modules/string-width/package.json +0 -56
  263. package/node_modules/string-width/readme.md +0 -50
  264. package/node_modules/strip-ansi/index.d.ts +0 -17
  265. package/node_modules/strip-ansi/index.js +0 -4
  266. package/node_modules/strip-ansi/license +0 -9
  267. package/node_modules/strip-ansi/package.json +0 -54
  268. package/node_modules/strip-ansi/readme.md +0 -46
  269. package/node_modules/which-module/LICENSE +0 -13
  270. package/node_modules/which-module/README.md +0 -58
  271. package/node_modules/which-module/index.js +0 -9
  272. package/node_modules/which-module/package.json +0 -41
  273. package/node_modules/wrap-ansi/index.js +0 -186
  274. package/node_modules/wrap-ansi/license +0 -9
  275. package/node_modules/wrap-ansi/package.json +0 -61
  276. package/node_modules/wrap-ansi/readme.md +0 -97
  277. package/node_modules/y18n/CHANGELOG.md +0 -35
  278. package/node_modules/y18n/LICENSE +0 -13
  279. package/node_modules/y18n/README.md +0 -109
  280. package/node_modules/y18n/index.js +0 -188
  281. package/node_modules/y18n/package.json +0 -39
  282. package/node_modules/yargs/CHANGELOG.md +0 -420
  283. package/node_modules/yargs/LICENSE +0 -21
  284. package/node_modules/yargs/README.md +0 -140
  285. package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
  286. package/node_modules/yargs/build/lib/apply-extends.js +0 -65
  287. package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
  288. package/node_modules/yargs/build/lib/argsert.js +0 -65
  289. package/node_modules/yargs/build/lib/command.d.ts +0 -64
  290. package/node_modules/yargs/build/lib/command.js +0 -416
  291. package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
  292. package/node_modules/yargs/build/lib/common-types.js +0 -25
  293. package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
  294. package/node_modules/yargs/build/lib/completion-templates.js +0 -50
  295. package/node_modules/yargs/build/lib/completion.d.ts +0 -21
  296. package/node_modules/yargs/build/lib/completion.js +0 -135
  297. package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
  298. package/node_modules/yargs/build/lib/is-promise.js +0 -9
  299. package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
  300. package/node_modules/yargs/build/lib/levenshtein.js +0 -58
  301. package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
  302. package/node_modules/yargs/build/lib/middleware.js +0 -57
  303. package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
  304. package/node_modules/yargs/build/lib/obj-filter.js +0 -14
  305. package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
  306. package/node_modules/yargs/build/lib/parse-command.js +0 -36
  307. package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
  308. package/node_modules/yargs/build/lib/process-argv.js +0 -31
  309. package/node_modules/yargs/build/lib/usage.d.ts +0 -49
  310. package/node_modules/yargs/build/lib/usage.js +0 -540
  311. package/node_modules/yargs/build/lib/validation.d.ts +0 -34
  312. package/node_modules/yargs/build/lib/validation.js +0 -330
  313. package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
  314. package/node_modules/yargs/build/lib/yargs.js +0 -1190
  315. package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
  316. package/node_modules/yargs/build/lib/yerror.js +0 -11
  317. package/node_modules/yargs/index.js +0 -40
  318. package/node_modules/yargs/locales/be.json +0 -46
  319. package/node_modules/yargs/locales/de.json +0 -46
  320. package/node_modules/yargs/locales/en.json +0 -51
  321. package/node_modules/yargs/locales/es.json +0 -46
  322. package/node_modules/yargs/locales/fi.json +0 -49
  323. package/node_modules/yargs/locales/fr.json +0 -53
  324. package/node_modules/yargs/locales/hi.json +0 -49
  325. package/node_modules/yargs/locales/hu.json +0 -46
  326. package/node_modules/yargs/locales/id.json +0 -50
  327. package/node_modules/yargs/locales/it.json +0 -46
  328. package/node_modules/yargs/locales/ja.json +0 -51
  329. package/node_modules/yargs/locales/ko.json +0 -49
  330. package/node_modules/yargs/locales/nb.json +0 -44
  331. package/node_modules/yargs/locales/nl.json +0 -49
  332. package/node_modules/yargs/locales/nn.json +0 -44
  333. package/node_modules/yargs/locales/pirate.json +0 -13
  334. package/node_modules/yargs/locales/pl.json +0 -49
  335. package/node_modules/yargs/locales/pt.json +0 -45
  336. package/node_modules/yargs/locales/pt_BR.json +0 -48
  337. package/node_modules/yargs/locales/ru.json +0 -46
  338. package/node_modules/yargs/locales/th.json +0 -46
  339. package/node_modules/yargs/locales/tr.json +0 -48
  340. package/node_modules/yargs/locales/zh_CN.json +0 -48
  341. package/node_modules/yargs/locales/zh_TW.json +0 -47
  342. package/node_modules/yargs/package.json +0 -92
  343. package/node_modules/yargs/yargs.js +0 -14
  344. package/node_modules/yargs-parser/CHANGELOG.md +0 -601
  345. package/node_modules/yargs-parser/LICENSE.txt +0 -14
  346. package/node_modules/yargs-parser/README.md +0 -449
  347. package/node_modules/yargs-parser/index.js +0 -1032
  348. package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
  349. package/node_modules/yargs-parser/package.json +0 -46
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,145 +0,0 @@
1
- // 用量与额度领域归一化:保持无运行时依赖,便于服务端单测与其它宿主复用。
2
-
3
- /** 额度窗口标签:优先使用 provider 约定名称,未知窗口保持稳定可读。 */
4
- export function usageWindowLabel(seconds) {
5
- const value = Number(seconds);
6
- if (!Number.isFinite(value) || value <= 0) return null;
7
- if (value === 18_000) return '5h';
8
- if (value === 604_800) return 'weekly';
9
- if (value === 2_592_000) return 'monthly';
10
- if (value % 604_800 === 0) return `${value / 604_800}w`;
11
- if (value % 3_600 === 0) return `${value / 3_600}h`;
12
- if (value % 60 === 0) return `${value / 60}m`;
13
- return `${value}s`;
14
- }
15
-
16
- function finiteNumber(value) {
17
- if (value === null || value === undefined || value === '' || typeof value === 'boolean') return undefined;
18
- const number = typeof value === 'number' ? value : Number(value);
19
- return Number.isFinite(number) ? number : undefined;
20
- }
21
-
22
- function clampPercent(value) {
23
- const number = finiteNumber(value);
24
- return number === undefined || number < 0 || number > 100 ? undefined : number;
25
- }
26
-
27
- function isoFromUnixSeconds(value) {
28
- const seconds = finiteNumber(value);
29
- if (seconds === undefined || seconds <= 0) return undefined;
30
- const date = new Date(seconds * 1000);
31
- return Number.isNaN(date.getTime()) ? undefined : date.toISOString();
32
- }
33
-
34
- function isoFromDate(value) {
35
- if (typeof value !== 'string' || value.trim() === '') return undefined;
36
- const date = new Date(value);
37
- return Number.isNaN(date.getTime()) ? undefined : date.toISOString();
38
- }
39
-
40
- /** DeepSeek /user/balance 的顶层投影;优先选择 CNY 余额项。 */
41
- export function normalizeDeepSeekBalance(data) {
42
- const infos = data && typeof data === 'object' && !Array.isArray(data) ? data.balance_infos : undefined;
43
- const validInfos = Array.isArray(infos) ? infos.filter((item) => item && typeof item === 'object' && !Array.isArray(item)) : [];
44
- const first = validInfos.find((item) => item.currency === 'CNY') ?? validInfos[0];
45
- const amount = first ? finiteNumber(first.total_balance) : undefined;
46
- if (!first || amount === undefined) throw new Error('invalid deepseek balance');
47
- return {
48
- amount: String(first.total_balance),
49
- currency: typeof first.currency === 'string' && first.currency !== '' ? first.currency : 'CNY',
50
- available: data.is_available !== false && first.is_available !== false,
51
- };
52
- }
53
-
54
- /**
55
- * dsh-codex-connect 的无密钥投影 → 手机额度领域模型。
56
- * 保留主 bucket 与 additional_rate_limits 的全部有效窗口,仅返回百分比/金额/窗口,不接触 OAuth token。
57
- */
58
- export function normalizeCodexUsage(usage) {
59
- if (!usage || typeof usage !== 'object' || Array.isArray(usage)) throw new Error('invalid codex usage');
60
- if (usage.rateLimits !== undefined && !Array.isArray(usage.rateLimits)) throw new Error('invalid codex rate limits');
61
- const rateLimits = (usage.rateLimits ?? []).filter((bucket) => bucket && typeof bucket === 'object' && !Array.isArray(bucket));
62
- const primaryIndex = rateLimits.findIndex((bucket) => bucket.id === 'codex');
63
- const orderedBuckets = primaryIndex >= 0
64
- ? [rateLimits[primaryIndex], ...rateLimits.filter((_, index) => index !== primaryIndex)]
65
- : rateLimits;
66
- const windows = [];
67
- for (const [bucketIndex, bucket] of orderedBuckets.entries()) {
68
- if (!Array.isArray(bucket.windows)) continue;
69
- const bucketName = typeof bucket.name === 'string' && bucket.name.trim() !== ''
70
- ? bucket.name.trim().slice(0, 80)
71
- : typeof bucket.id === 'string' && bucket.id.trim() !== '' ? bucket.id.trim().slice(0, 80) : undefined;
72
- const seenInBucket = new Set();
73
- for (const item of bucket.windows) {
74
- if (!item || typeof item !== 'object' || Array.isArray(item)) continue;
75
- const baseWindow = usageWindowLabel(item.windowSeconds);
76
- const remainingPercent = clampPercent(item.remainingPercent);
77
- const resetAt = isoFromUnixSeconds(item.resetAt);
78
- if (!baseWindow || seenInBucket.has(baseWindow) || remainingPercent === undefined) continue;
79
- seenInBucket.add(baseWindow);
80
- const window = bucketIndex === 0 || !bucketName ? baseWindow : `${bucketName} · ${baseWindow}`;
81
- windows.push({ window, remainingPercent, ...(resetAt ? { resetAt } : {}) });
82
- }
83
- }
84
- const individual = usage.individualLimit;
85
- let individualLimit;
86
- if (individual && typeof individual === 'object' && !Array.isArray(individual)) {
87
- const limit = finiteNumber(individual.limit);
88
- const used = finiteNumber(individual.used);
89
- const remaining = finiteNumber(individual.remaining);
90
- const remainingPercent = clampPercent(individual.remainingPercent ?? (limit > 0 && remaining !== undefined ? remaining / limit * 100 : undefined));
91
- if (limit !== undefined && used !== undefined && remaining !== undefined && limit > 0 && remainingPercent !== undefined) {
92
- individualLimit = {
93
- limit: String(individual.limit),
94
- used: String(individual.used),
95
- remaining: String(individual.remaining),
96
- remainingPercent,
97
- };
98
- }
99
- }
100
- const credits = usage.credits;
101
- let codexCredits;
102
- if (credits && typeof credits === 'object' && !Array.isArray(credits) && typeof credits.unlimited === 'boolean') {
103
- if (credits.unlimited) {
104
- codexCredits = { unlimited: true };
105
- } else if (typeof credits.balance === 'string' && credits.balance.trim() !== '') {
106
- codexCredits = { unlimited: false, balance: credits.balance };
107
- } else if (finiteNumber(credits.balance) !== undefined) {
108
- codexCredits = { unlimited: false, balance: String(credits.balance) };
109
- } else {
110
- // balance 是可选字段,但 unlimited=false 仍是一个有效、可展示的 Credits 状态。
111
- codexCredits = { unlimited: false };
112
- }
113
- }
114
- if (windows.length === 0 && individualLimit === undefined && codexCredits === undefined) throw new Error('codex usage has no usable allowance');
115
- return {
116
- windows,
117
- ...(individualLimit ? { individualLimit } : {}),
118
- ...(codexCredits ? { credits: codexCredits } : {}),
119
- };
120
- }
121
-
122
- /** OpenCode Go usage payload → 剩余百分比窗口;无效窗口单独跳过,限流窗口保留。 */
123
- export function normalizeOpenCodeUsage(payload) {
124
- const usage = payload && typeof payload === 'object' && !Array.isArray(payload) ? (payload.usage ?? payload) : undefined;
125
- if (!usage || typeof usage !== 'object' || Array.isArray(usage)) throw new Error('invalid opencode usage');
126
- const windows = [];
127
- for (const [key, label] of [['rolling', '5h'], ['weekly', 'weekly'], ['monthly', 'monthly']]) {
128
- const detail = usage[key];
129
- if (!detail || typeof detail !== 'object' || Array.isArray(detail)) continue;
130
- const status = detail.status;
131
- if (status !== undefined && status !== null && status !== 'ok' && status !== 'rate-limited') continue;
132
- const usedPercent = clampPercent(detail.percent);
133
- if (usedPercent === undefined) continue;
134
- // percent=0 时 OpenCode 返回的是 now+window 占位值,不是可展示的 resetAt。
135
- const resetAt = usedPercent === 0 ? undefined : isoFromDate(detail.resetsAt);
136
- windows.push({
137
- window: label,
138
- remainingPercent: 100 - usedPercent,
139
- ...(status === 'rate-limited' ? { limited: true } : {}),
140
- ...(resetAt ? { resetAt } : {}),
141
- });
142
- }
143
- if (windows.length === 0) throw new Error('opencode usage has no usable windows');
144
- return { windows };
145
- }
@@ -1,112 +0,0 @@
1
- // 两端对齐状态(CONTEXT「对齐提示」)。
2
- //
3
- // 判据是**版本号**,且只用于决定**提示文案**——不参与任何能力可用性判定
4
- // (能力看声明,见 ADR 0017 与 ADR 0019 的三条判据分离)。
5
- // 比较只看 core `X.Y.Z`:App 的 `+build` 是它自己的构建号,同一发布周期内每次构建
6
- // 都不同;插件可能是 prerelease(如 `3.2.1-alpha.1`,发布通道用)。两者都不参与配对,
7
- // 因此插件 `3.2.1-alpha.1` 与 App `3.2.1+24` 按 core `3.2.1` 视为对齐。
8
- //
9
- // 自举:已装在用户手机上的旧 App 不会上报版本头,因此「头缺失」本身就是
10
- // 「这是旧 App」的可靠信号——PC 端据此就能提示,不必等 App 先升级。
11
- import { parseVersion } from "./plugin-update.js";
12
-
13
- /** App 上报自身版本所用的请求头。 */
14
- export const APP_VERSION_HEADER = "x-mobile-app-version";
15
-
16
- /** 对齐状态。 */
17
- export const ALIGNMENT_STATE = {
18
- /** 两端语义版本一致。 */
19
- OK: "ok",
20
- /** 手机 App 落后于插件:应更新 App。 */
21
- APP_OUTDATED: "app-outdated",
22
- /** 插件落后于手机 App:应更新插件。 */
23
- PLUGIN_OUTDATED: "plugin-outdated",
24
- /** 无法判定(旧 App 未上报、或版本不可解析)——如实报出,不猜。 */
25
- UNKNOWN: "unknown",
26
- };
27
-
28
- /** 取 core `X.Y.Z`(prerelease 与 build 都剥离);不可解析返回 ""。 */
29
- export function semanticVersion(value) {
30
- const p = parseVersion(value);
31
- return p ? p.version : "";
32
- }
33
-
34
- /** 从请求头读 App 版本;缺失或形状异常一律返回空串。 */
35
- export function readAppVersionHeader(headers) {
36
- if (!headers || typeof headers !== "object") return "";
37
- const raw = headers[APP_VERSION_HEADER];
38
- const value = Array.isArray(raw) ? raw[0] : raw;
39
- return typeof value === "string" ? value.trim() : "";
40
- }
41
-
42
- /**
43
- * 计算两端对齐状态。返回结构可直接放进 bootstrap / diagnostics 响应。
44
- * `hint` 是给人看的说明(PC 端日志与诊断页用);手机端应按 `reason` 自行本地化。
45
- */
46
- export function computeAppAlignment({ appVersionHeader, pluginVersion }) {
47
- const pluginSemver = semanticVersion(pluginVersion);
48
- const appRaw = typeof appVersionHeader === "string" ? appVersionHeader.trim() : "";
49
- const base = {
50
- appVersion: appRaw === "" ? null : appRaw,
51
- pluginVersion: pluginVersion ?? "",
52
- expectedAppVersion: pluginSemver || null,
53
- };
54
- if (pluginSemver === "") {
55
- return { ...base, state: ALIGNMENT_STATE.UNKNOWN, reason: "plugin-version-unparseable", hint: "插件自身版本不可解析,无法判定两端是否对齐" };
56
- }
57
- if (appRaw === "") {
58
- return {
59
- ...base,
60
- state: ALIGNMENT_STATE.UNKNOWN,
61
- reason: "app-version-header-missing",
62
- hint: `手机 App 未上报版本(通常是旧版 App);无法确认两端是否对齐。插件为 ${pluginVersion},建议把 App 更新到同版本。`,
63
- };
64
- }
65
- const appSemver = semanticVersion(appRaw);
66
- if (appSemver === "") {
67
- return { ...base, state: ALIGNMENT_STATE.UNKNOWN, reason: "app-version-unparseable", hint: `手机 App 上报的版本无法解析:${appRaw}` };
68
- }
69
- if (appSemver === pluginSemver) {
70
- return { ...base, state: ALIGNMENT_STATE.OK, reason: "aligned", hint: "" };
71
- }
72
- const older = compareSemver(appSemver, pluginSemver) < 0;
73
- if (older) {
74
- return {
75
- ...base,
76
- state: ALIGNMENT_STATE.APP_OUTDATED,
77
- reason: "app-older-than-plugin",
78
- hint: `手机 App(${appRaw})落后于本机插件(${pluginVersion}):新功能会被明确提示而非静默失效。请在手机上把 App 更新到 ${pluginSemver}。`,
79
- };
80
- }
81
- return {
82
- ...base,
83
- state: ALIGNMENT_STATE.PLUGIN_OUTDATED,
84
- reason: "plugin-older-than-app",
85
- hint: `本机插件(${pluginVersion})落后于手机 App(${appRaw}):请在电脑上把插件更新到 ${appSemver} 并重启 DSH。`,
86
- };
87
- }
88
-
89
- /** 内部:比较两个语义版本(入参已保证可解析)。 */
90
- function compareSemver(a, b) {
91
- const pa = a.split(".").map(Number);
92
- const pb = b.split(".").map(Number);
93
- for (let i = 0; i < 3; i++) {
94
- if (pa[i] !== pb[i]) return pa[i] < pb[i] ? -1 : 1;
95
- }
96
- return 0;
97
- }
98
-
99
- /**
100
- * 只在结论变化时提示一次(bootstrap 会在启动、下拉刷新、重连时反复调用,
101
- * 每次都记日志会把 DSH 日志刷满)。`seen` 是该插件实例作用域内的去重载体。
102
- */
103
- export function noteAppAlignment(logger, alignment, seen) {
104
- if (!alignment || alignment.state === ALIGNMENT_STATE.OK) return false;
105
- const key = `${alignment.state}:${alignment.appVersion ?? "-"}`;
106
- if (seen.key === key) return false;
107
- seen.key = key;
108
- const line = `mobile-remote: ${alignment.hint}`;
109
- if (alignment.state === ALIGNMENT_STATE.UNKNOWN) logger?.info?.(line);
110
- else logger?.warn?.(line);
111
- return true;
112
- }