@marktrue/dsh-mobile-remote 3.2.4-alpha.1 → 3.2.4-alpha.2-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.
- package/DSH-Remote-v3.2.4.apk +4 -0
- package/README.md +6 -254
- package/manifest.json +21 -0
- package/package.json +12 -65
- package/CHANGELOG.md +0 -1410
- package/CONTRIBUTING.md +0 -59
- package/FAQ.md +0 -111
- package/cordis.patch.yml +0 -14
- package/docs/00-/345/274/200/345/217/221/346/200/273/347/272/262.md +0 -125
- package/docs/01-PRD.md +0 -148
- package/docs/02-architecture.md +0 -249
- package/docs/03-api.md +0 -1154
- package/docs/04-security.md +0 -100
- package/docs/05-test-cases.md +0 -405
- package/docs/06-install-run.md +0 -372
- package/docs/07-user-manual.md +0 -70
- package/docs/08-/346/211/251/345/261/225/345/274/200/345/217/221/346/214/207/345/215/227.md +0 -86
- package/docs/09-compatibility.md +0 -227
- package/docs/10-release.md +0 -1067
- package/docs/screenshots/01-home.png +0 -0
- package/docs/screenshots/02-notifications.png +0 -0
- package/docs/screenshots/03-sessions.png +0 -0
- package/docs/screenshots/04-chat.png +0 -0
- package/docs/screenshots/05-settings.png +0 -0
- package/docs/screenshots/06-new-session.png +0 -0
- package/docs/screenshots/pgy-appstore.jpg +0 -0
- package/docs/screenshots/pgy-mobile-app.jpg +0 -0
- package/docs/screenshots/pgy-pc-client.jpg +0 -0
- package/lib/account-usage.js +0 -145
- package/lib/app-alignment.js +0 -112
- package/lib/app-carrier-store.js +0 -1972
- package/lib/app-carrier.js +0 -609
- package/lib/client.js +0 -1174
- package/lib/desktop-form.js +0 -738
- package/lib/endpoint-registry.js +0 -167
- package/lib/git-read-bundled-provider.js +0 -450
- package/lib/git-read-service.js +0 -601
- package/lib/index.js +0 -9622
- package/lib/npm-update-source.js +0 -226
- package/lib/plugin-content-digest.js +0 -80
- package/lib/plugin-self-update.js +0 -997
- package/lib/plugin-update-controller.js +0 -274
- package/lib/plugin-update-log.js +0 -164
- package/lib/plugin-update-transaction.js +0 -322
- package/lib/plugin-update.js +0 -309
- package/lib/runtime-dependency-snapshot.js +0 -345
- package/lib/session-title-cache.js +0 -123
- package/lib/session-title-refresh.js +0 -261
- package/lib/tool-process.js +0 -20
- package/lib/update-fetch.js +0 -24
- package/lib/update-lock-arbiter.js +0 -170
- package/lib/update-supervisor.js +0 -346
- package/node_modules/ansi-regex/index.d.ts +0 -37
- package/node_modules/ansi-regex/index.js +0 -10
- package/node_modules/ansi-regex/license +0 -9
- package/node_modules/ansi-regex/package.json +0 -55
- package/node_modules/ansi-regex/readme.md +0 -78
- package/node_modules/ansi-styles/index.d.ts +0 -345
- package/node_modules/ansi-styles/index.js +0 -163
- package/node_modules/ansi-styles/license +0 -9
- package/node_modules/ansi-styles/package.json +0 -56
- package/node_modules/ansi-styles/readme.md +0 -152
- package/node_modules/camelcase/index.d.ts +0 -63
- package/node_modules/camelcase/index.js +0 -76
- package/node_modules/camelcase/license +0 -9
- package/node_modules/camelcase/package.json +0 -43
- package/node_modules/camelcase/readme.md +0 -99
- package/node_modules/cliui/CHANGELOG.md +0 -76
- package/node_modules/cliui/LICENSE.txt +0 -14
- package/node_modules/cliui/README.md +0 -115
- package/node_modules/cliui/index.js +0 -354
- package/node_modules/cliui/package.json +0 -65
- package/node_modules/color-convert/CHANGELOG.md +0 -54
- package/node_modules/color-convert/LICENSE +0 -21
- package/node_modules/color-convert/README.md +0 -68
- package/node_modules/color-convert/conversions.js +0 -839
- package/node_modules/color-convert/index.js +0 -81
- package/node_modules/color-convert/package.json +0 -48
- package/node_modules/color-convert/route.js +0 -97
- package/node_modules/color-name/LICENSE +0 -8
- package/node_modules/color-name/README.md +0 -11
- package/node_modules/color-name/index.js +0 -152
- package/node_modules/color-name/package.json +0 -28
- package/node_modules/decamelize/index.js +0 -13
- package/node_modules/decamelize/license +0 -21
- package/node_modules/decamelize/package.json +0 -38
- package/node_modules/decamelize/readme.md +0 -48
- package/node_modules/dijkstrajs/.travis.yml +0 -4
- package/node_modules/dijkstrajs/CONTRIBUTING.md +0 -8
- package/node_modules/dijkstrajs/LICENSE.md +0 -19
- package/node_modules/dijkstrajs/README.md +0 -18
- package/node_modules/dijkstrajs/dijkstra.js +0 -165
- package/node_modules/dijkstrajs/package.json +0 -60
- package/node_modules/dijkstrajs/test/dijkstra.test.js +0 -96
- package/node_modules/emoji-regex/LICENSE-MIT.txt +0 -20
- package/node_modules/emoji-regex/README.md +0 -73
- package/node_modules/emoji-regex/es2015/index.js +0 -6
- package/node_modules/emoji-regex/es2015/text.js +0 -6
- package/node_modules/emoji-regex/index.d.ts +0 -23
- package/node_modules/emoji-regex/index.js +0 -6
- package/node_modules/emoji-regex/package.json +0 -50
- package/node_modules/emoji-regex/text.js +0 -6
- package/node_modules/find-up/index.d.ts +0 -137
- package/node_modules/find-up/index.js +0 -89
- package/node_modules/find-up/license +0 -9
- package/node_modules/find-up/package.json +0 -53
- package/node_modules/find-up/readme.md +0 -156
- package/node_modules/get-caller-file/LICENSE.md +0 -6
- package/node_modules/get-caller-file/README.md +0 -41
- package/node_modules/get-caller-file/index.d.ts +0 -2
- package/node_modules/get-caller-file/index.js +0 -22
- package/node_modules/get-caller-file/index.js.map +0 -1
- package/node_modules/get-caller-file/package.json +0 -42
- package/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
- package/node_modules/is-fullwidth-code-point/index.js +0 -50
- package/node_modules/is-fullwidth-code-point/license +0 -9
- package/node_modules/is-fullwidth-code-point/package.json +0 -42
- package/node_modules/is-fullwidth-code-point/readme.md +0 -39
- package/node_modules/locate-path/index.d.ts +0 -83
- package/node_modules/locate-path/index.js +0 -65
- package/node_modules/locate-path/license +0 -9
- package/node_modules/locate-path/package.json +0 -45
- package/node_modules/locate-path/readme.md +0 -122
- package/node_modules/p-limit/index.d.ts +0 -38
- package/node_modules/p-limit/index.js +0 -57
- package/node_modules/p-limit/license +0 -9
- package/node_modules/p-limit/package.json +0 -52
- package/node_modules/p-limit/readme.md +0 -101
- package/node_modules/p-locate/index.d.ts +0 -64
- package/node_modules/p-locate/index.js +0 -52
- package/node_modules/p-locate/license +0 -9
- package/node_modules/p-locate/package.json +0 -53
- package/node_modules/p-locate/readme.md +0 -90
- package/node_modules/p-try/index.d.ts +0 -39
- package/node_modules/p-try/index.js +0 -9
- package/node_modules/p-try/license +0 -9
- package/node_modules/p-try/package.json +0 -42
- package/node_modules/p-try/readme.md +0 -58
- package/node_modules/path-exists/index.d.ts +0 -28
- package/node_modules/path-exists/index.js +0 -23
- package/node_modules/path-exists/license +0 -9
- package/node_modules/path-exists/package.json +0 -39
- package/node_modules/path-exists/readme.md +0 -52
- package/node_modules/pngjs/.eslintignore +0 -2
- package/node_modules/pngjs/.eslintrc.json +0 -19
- package/node_modules/pngjs/.prettierignore +0 -3
- package/node_modules/pngjs/LICENSE +0 -20
- package/node_modules/pngjs/README.md +0 -429
- package/node_modules/pngjs/browser.js +0 -16096
- package/node_modules/pngjs/coverage/lcov-report/base.css +0 -354
- package/node_modules/pngjs/coverage/lcov-report/bitmapper.js.html +0 -881
- package/node_modules/pngjs/coverage/lcov-report/bitpacker.js.html +0 -554
- package/node_modules/pngjs/coverage/lcov-report/block-navigation.js +0 -77
- package/node_modules/pngjs/coverage/lcov-report/chunkstream.js.html +0 -647
- package/node_modules/pngjs/coverage/lcov-report/constants.js.html +0 -176
- package/node_modules/pngjs/coverage/lcov-report/crc.js.html +0 -200
- package/node_modules/pngjs/coverage/lcov-report/favicon.png +0 -0
- package/node_modules/pngjs/coverage/lcov-report/filter-pack.js.html +0 -593
- package/node_modules/pngjs/coverage/lcov-report/filter-parse-async.js.html +0 -152
- package/node_modules/pngjs/coverage/lcov-report/filter-parse-sync.js.html +0 -143
- package/node_modules/pngjs/coverage/lcov-report/filter-parse.js.html +0 -611
- package/node_modules/pngjs/coverage/lcov-report/format-normaliser.js.html +0 -359
- package/node_modules/pngjs/coverage/lcov-report/index.html +0 -426
- package/node_modules/pngjs/coverage/lcov-report/interlace.js.html +0 -365
- package/node_modules/pngjs/coverage/lcov-report/packer-async.js.html +0 -230
- package/node_modules/pngjs/coverage/lcov-report/packer-sync.js.html +0 -248
- package/node_modules/pngjs/coverage/lcov-report/packer.js.html +0 -467
- package/node_modules/pngjs/coverage/lcov-report/paeth-predictor.js.html +0 -128
- package/node_modules/pngjs/coverage/lcov-report/parser-async.js.html +0 -575
- package/node_modules/pngjs/coverage/lcov-report/parser-sync.js.html +0 -404
- package/node_modules/pngjs/coverage/lcov-report/parser.js.html +0 -950
- package/node_modules/pngjs/coverage/lcov-report/png-sync.js.html +0 -116
- package/node_modules/pngjs/coverage/lcov-report/png.js.html +0 -662
- package/node_modules/pngjs/coverage/lcov-report/prettify.css +0 -101
- package/node_modules/pngjs/coverage/lcov-report/prettify.js +0 -1007
- package/node_modules/pngjs/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/node_modules/pngjs/coverage/lcov-report/sorter.js +0 -169
- package/node_modules/pngjs/coverage/lcov-report/sync-inflate.js.html +0 -584
- package/node_modules/pngjs/coverage/lcov-report/sync-reader.js.html +0 -215
- package/node_modules/pngjs/coverage/lcov.info +0 -2177
- package/node_modules/pngjs/lib/bitmapper.js +0 -267
- package/node_modules/pngjs/lib/bitpacker.js +0 -158
- package/node_modules/pngjs/lib/chunkstream.js +0 -189
- package/node_modules/pngjs/lib/constants.js +0 -32
- package/node_modules/pngjs/lib/crc.js +0 -40
- package/node_modules/pngjs/lib/filter-pack.js +0 -171
- package/node_modules/pngjs/lib/filter-parse-async.js +0 -24
- package/node_modules/pngjs/lib/filter-parse-sync.js +0 -21
- package/node_modules/pngjs/lib/filter-parse.js +0 -177
- package/node_modules/pngjs/lib/format-normaliser.js +0 -93
- package/node_modules/pngjs/lib/interlace.js +0 -95
- package/node_modules/pngjs/lib/packer-async.js +0 -50
- package/node_modules/pngjs/lib/packer-sync.js +0 -56
- package/node_modules/pngjs/lib/packer.js +0 -129
- package/node_modules/pngjs/lib/paeth-predictor.js +0 -16
- package/node_modules/pngjs/lib/parser-async.js +0 -165
- package/node_modules/pngjs/lib/parser-sync.js +0 -108
- package/node_modules/pngjs/lib/parser.js +0 -290
- package/node_modules/pngjs/lib/png-sync.js +0 -12
- package/node_modules/pngjs/lib/png.js +0 -194
- package/node_modules/pngjs/lib/sync-inflate.js +0 -168
- package/node_modules/pngjs/lib/sync-reader.js +0 -45
- package/node_modules/pngjs/package.json +0 -73
- package/node_modules/qrcode/README.md +0 -770
- package/node_modules/qrcode/bin/qrcode +0 -159
- package/node_modules/qrcode/helper/to-sjis-browser.js +0 -2
- package/node_modules/qrcode/helper/to-sjis.js +0 -105
- package/node_modules/qrcode/lib/browser.js +0 -76
- package/node_modules/qrcode/lib/can-promise.js +0 -7
- package/node_modules/qrcode/lib/core/alignment-pattern.js +0 -83
- package/node_modules/qrcode/lib/core/alphanumeric-data.js +0 -59
- package/node_modules/qrcode/lib/core/bit-buffer.js +0 -37
- package/node_modules/qrcode/lib/core/bit-matrix.js +0 -65
- package/node_modules/qrcode/lib/core/byte-data.js +0 -30
- package/node_modules/qrcode/lib/core/error-correction-code.js +0 -135
- package/node_modules/qrcode/lib/core/error-correction-level.js +0 -50
- package/node_modules/qrcode/lib/core/finder-pattern.js +0 -22
- package/node_modules/qrcode/lib/core/format-info.js +0 -29
- package/node_modules/qrcode/lib/core/galois-field.js +0 -69
- package/node_modules/qrcode/lib/core/kanji-data.js +0 -54
- package/node_modules/qrcode/lib/core/mask-pattern.js +0 -234
- package/node_modules/qrcode/lib/core/mode.js +0 -167
- package/node_modules/qrcode/lib/core/numeric-data.js +0 -43
- package/node_modules/qrcode/lib/core/polynomial.js +0 -62
- package/node_modules/qrcode/lib/core/qrcode.js +0 -495
- package/node_modules/qrcode/lib/core/reed-solomon-encoder.js +0 -56
- package/node_modules/qrcode/lib/core/regex.js +0 -31
- package/node_modules/qrcode/lib/core/segments.js +0 -330
- package/node_modules/qrcode/lib/core/utils.js +0 -63
- package/node_modules/qrcode/lib/core/version-check.js +0 -9
- package/node_modules/qrcode/lib/core/version.js +0 -163
- package/node_modules/qrcode/lib/index.js +0 -12
- package/node_modules/qrcode/lib/renderer/canvas.js +0 -63
- package/node_modules/qrcode/lib/renderer/png.js +0 -78
- package/node_modules/qrcode/lib/renderer/svg-tag.js +0 -81
- package/node_modules/qrcode/lib/renderer/svg.js +0 -19
- package/node_modules/qrcode/lib/renderer/terminal/terminal-small.js +0 -85
- package/node_modules/qrcode/lib/renderer/terminal/terminal.js +0 -49
- package/node_modules/qrcode/lib/renderer/terminal.js +0 -9
- package/node_modules/qrcode/lib/renderer/utf8.js +0 -71
- package/node_modules/qrcode/lib/renderer/utils.js +0 -99
- package/node_modules/qrcode/lib/server.js +0 -138
- package/node_modules/qrcode/license +0 -10
- package/node_modules/qrcode/package.json +0 -77
- package/node_modules/require-directory/.jshintrc +0 -67
- package/node_modules/require-directory/.npmignore +0 -1
- package/node_modules/require-directory/.travis.yml +0 -3
- package/node_modules/require-directory/LICENSE +0 -22
- package/node_modules/require-directory/README.markdown +0 -184
- package/node_modules/require-directory/index.js +0 -86
- package/node_modules/require-directory/package.json +0 -40
- package/node_modules/require-main-filename/CHANGELOG.md +0 -26
- package/node_modules/require-main-filename/LICENSE.txt +0 -14
- package/node_modules/require-main-filename/README.md +0 -26
- package/node_modules/require-main-filename/index.js +0 -18
- package/node_modules/require-main-filename/package.json +0 -35
- package/node_modules/set-blocking/CHANGELOG.md +0 -26
- package/node_modules/set-blocking/LICENSE.txt +0 -14
- package/node_modules/set-blocking/README.md +0 -31
- package/node_modules/set-blocking/index.js +0 -7
- package/node_modules/set-blocking/package.json +0 -42
- package/node_modules/string-width/index.d.ts +0 -29
- package/node_modules/string-width/index.js +0 -47
- package/node_modules/string-width/license +0 -9
- package/node_modules/string-width/package.json +0 -56
- package/node_modules/string-width/readme.md +0 -50
- package/node_modules/strip-ansi/index.d.ts +0 -17
- package/node_modules/strip-ansi/index.js +0 -4
- package/node_modules/strip-ansi/license +0 -9
- package/node_modules/strip-ansi/package.json +0 -54
- package/node_modules/strip-ansi/readme.md +0 -46
- package/node_modules/which-module/LICENSE +0 -13
- package/node_modules/which-module/README.md +0 -58
- package/node_modules/which-module/index.js +0 -9
- package/node_modules/which-module/package.json +0 -41
- package/node_modules/wrap-ansi/index.js +0 -186
- package/node_modules/wrap-ansi/license +0 -9
- package/node_modules/wrap-ansi/package.json +0 -61
- package/node_modules/wrap-ansi/readme.md +0 -97
- package/node_modules/y18n/CHANGELOG.md +0 -35
- package/node_modules/y18n/LICENSE +0 -13
- package/node_modules/y18n/README.md +0 -109
- package/node_modules/y18n/index.js +0 -188
- package/node_modules/y18n/package.json +0 -39
- package/node_modules/yargs/CHANGELOG.md +0 -420
- package/node_modules/yargs/LICENSE +0 -21
- package/node_modules/yargs/README.md +0 -140
- package/node_modules/yargs/build/lib/apply-extends.d.ts +0 -2
- package/node_modules/yargs/build/lib/apply-extends.js +0 -65
- package/node_modules/yargs/build/lib/argsert.d.ts +0 -2
- package/node_modules/yargs/build/lib/argsert.js +0 -65
- package/node_modules/yargs/build/lib/command.d.ts +0 -64
- package/node_modules/yargs/build/lib/command.js +0 -416
- package/node_modules/yargs/build/lib/common-types.d.ts +0 -36
- package/node_modules/yargs/build/lib/common-types.js +0 -25
- package/node_modules/yargs/build/lib/completion-templates.d.ts +0 -2
- package/node_modules/yargs/build/lib/completion-templates.js +0 -50
- package/node_modules/yargs/build/lib/completion.d.ts +0 -21
- package/node_modules/yargs/build/lib/completion.js +0 -135
- package/node_modules/yargs/build/lib/is-promise.d.ts +0 -1
- package/node_modules/yargs/build/lib/is-promise.js +0 -9
- package/node_modules/yargs/build/lib/levenshtein.d.ts +0 -1
- package/node_modules/yargs/build/lib/levenshtein.js +0 -58
- package/node_modules/yargs/build/lib/middleware.d.ts +0 -10
- package/node_modules/yargs/build/lib/middleware.js +0 -57
- package/node_modules/yargs/build/lib/obj-filter.d.ts +0 -1
- package/node_modules/yargs/build/lib/obj-filter.js +0 -14
- package/node_modules/yargs/build/lib/parse-command.d.ts +0 -11
- package/node_modules/yargs/build/lib/parse-command.js +0 -36
- package/node_modules/yargs/build/lib/process-argv.d.ts +0 -2
- package/node_modules/yargs/build/lib/process-argv.js +0 -31
- package/node_modules/yargs/build/lib/usage.d.ts +0 -49
- package/node_modules/yargs/build/lib/usage.js +0 -540
- package/node_modules/yargs/build/lib/validation.d.ts +0 -34
- package/node_modules/yargs/build/lib/validation.js +0 -330
- package/node_modules/yargs/build/lib/yargs.d.ts +0 -274
- package/node_modules/yargs/build/lib/yargs.js +0 -1190
- package/node_modules/yargs/build/lib/yerror.d.ts +0 -4
- package/node_modules/yargs/build/lib/yerror.js +0 -11
- package/node_modules/yargs/index.js +0 -40
- package/node_modules/yargs/locales/be.json +0 -46
- package/node_modules/yargs/locales/de.json +0 -46
- package/node_modules/yargs/locales/en.json +0 -51
- package/node_modules/yargs/locales/es.json +0 -46
- package/node_modules/yargs/locales/fi.json +0 -49
- package/node_modules/yargs/locales/fr.json +0 -53
- package/node_modules/yargs/locales/hi.json +0 -49
- package/node_modules/yargs/locales/hu.json +0 -46
- package/node_modules/yargs/locales/id.json +0 -50
- package/node_modules/yargs/locales/it.json +0 -46
- package/node_modules/yargs/locales/ja.json +0 -51
- package/node_modules/yargs/locales/ko.json +0 -49
- package/node_modules/yargs/locales/nb.json +0 -44
- package/node_modules/yargs/locales/nl.json +0 -49
- package/node_modules/yargs/locales/nn.json +0 -44
- package/node_modules/yargs/locales/pirate.json +0 -13
- package/node_modules/yargs/locales/pl.json +0 -49
- package/node_modules/yargs/locales/pt.json +0 -45
- package/node_modules/yargs/locales/pt_BR.json +0 -48
- package/node_modules/yargs/locales/ru.json +0 -46
- package/node_modules/yargs/locales/th.json +0 -46
- package/node_modules/yargs/locales/tr.json +0 -48
- package/node_modules/yargs/locales/zh_CN.json +0 -48
- package/node_modules/yargs/locales/zh_TW.json +0 -47
- package/node_modules/yargs/package.json +0 -92
- package/node_modules/yargs/yargs.js +0 -14
- package/node_modules/yargs-parser/CHANGELOG.md +0 -601
- package/node_modules/yargs-parser/LICENSE.txt +0 -14
- package/node_modules/yargs-parser/README.md +0 -449
- package/node_modules/yargs-parser/index.js +0 -1032
- package/node_modules/yargs-parser/lib/tokenize-arg-string.js +0 -40
- 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
|
|
Binary file
|
package/lib/account-usage.js
DELETED
|
@@ -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
|
-
}
|
package/lib/app-alignment.js
DELETED
|
@@ -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
|
-
}
|