@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.
- package/DSH-Remote-v3.2.1.apk +4 -0
- package/README.md +6 -253
- package/manifest.json +21 -0
- package/package.json +12 -65
- package/CHANGELOG.md +0 -810
- 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 -122
- package/docs/01-PRD.md +0 -148
- package/docs/02-architecture.md +0 -249
- package/docs/03-api.md +0 -816
- package/docs/04-security.md +0 -96
- package/docs/05-test-cases.md +0 -326
- package/docs/06-install-run.md +0 -308
- package/docs/07-user-manual.md +0 -65
- 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 -195
- package/docs/10-release.md +0 -927
- 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 -602
- package/lib/client.js +0 -706
- package/lib/desktop-form.js +0 -738
- package/lib/endpoint-registry.js +0 -162
- package/lib/git-read-bundled-provider.js +0 -255
- package/lib/git-read-service.js +0 -322
- package/lib/index.js +0 -9292
- package/lib/plugin-content-digest.js +0 -80
- package/lib/plugin-self-update.js +0 -758
- package/lib/plugin-update-controller.js +0 -95
- 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/update-fetch.js +0 -24
- package/lib/update-lock-arbiter.js +0 -158
- package/lib/update-supervisor.js +0 -312
- 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
package/docs/02-architecture.md
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
# 02 系统架构设计说明书 — dsh-mobile-remote
|
|
2
|
-
|
|
3
|
-
> 版本:v3.2.0 · 状态:已实现(v2.3 问询/审批弹窗桥、v2.4~v2.5 连接自愈、v2.6 安全加固+模型提供商互通、v2.9/v3.0 LAN 桥 + 图像链路、v3.2 用量与额度) · 配套:01-PRD.md、03-api.md、04-security.md、09-compatibility.md
|
|
4
|
-
|
|
5
|
-
## 1. 背景与范围
|
|
6
|
-
DSH 由 Cordis 组合出宿主(desktop 版 `dsh-plugin-desktop` 或 web 版 `dsh --profile web`),webserver 默认只绑定 `127.0.0.1`(**桌面版 0.1.1-rc.2 起强制回环**,DesktopsWebServer 对非回环 host 直接 throw)。本插件在宿主侧挂载 Cordis 插件:在 webServer 上注册 `/m` 前缀路由,并在 **LAN 桥**(`lanBridge`,默认 `0.0.0.0:3080`)自建监听把移动端请求流式转发到回环 webserver——移动端形态为**原生 Flutter App**(`dsh-mobile-app`),经 `/m/api` 与插件通信。插件不修改桌面 GUI 的任何现有 UI。
|
|
7
|
-
## 2. 技术选型结论与理由
|
|
8
|
-
### 2.1 移动端形态:独立轻量页(`/m`) vs 桌面 GUI 窄屏适配
|
|
9
|
-
|
|
10
|
-
| 方案 | 优点 | 缺点 | 结论 |
|
|
11
|
-
|---|---|---|---|
|
|
12
|
-
| 桌面 GUI 窄屏适配(client 插件 + slot) | 复用现有 React 组件、自动获得全部功能 | 三栏 AppFrame 适配工作量大;HMR 依赖 `pnpm run dev:web` watcher;触控体验难做通 | 放弃 |
|
|
13
|
-
| **独立轻量页 `/m`(本方案)** | ~500 行原生 HTML/CSS/JS 覆盖全部需求;无构建;与桌面 UI 零耦合;可独立控制安全边界 | 功能需自己实现(消息流、通知、历史) | **采用** |
|
|
14
|
-
|
|
15
|
-
### 2.2 外出通路:蒲公英(虚拟组网) vs 隧道/反代 vs 裸公网
|
|
16
|
-
| 方案 | 认证/TLS | 成本 | 结论 |
|
|
17
|
-
|---|---|---|---|
|
|
18
|
-
| **蒲公英/虚拟组网(WireGuard 组网)** | 设备身份认证 + 端到端加密,零应用层代码 | 免费版 3 成员 | **采用**(实测通过;账号可用性属个体情况,其他组网如 ZeroTier/EasyTier 同理可接) |
|
|
19
|
-
| 隧道/中继类(frp/SakuraFrp,`trustedHosts`) | 需自建认证 + **必须 TLS**(自有域名须 ICP 备案) | 免费/收费 | 备选(有合规门槛) |
|
|
20
|
-
| cloudflared 隧道 | TLS 自动,但公网可达需自建认证 | 免费,需额外 token 机制 | 备选 |
|
|
21
|
-
| 裸公网暴露 0.0.0.0 | 无 TLS | 高危(agent 可执行 bash/pwsh ≥ RCE) | 明确禁止 |
|
|
22
|
-
|
|
23
|
-
### 2.3 前端技术:原生 JS vs 框架
|
|
24
|
-
|
|
25
|
-
单页无构建、无路由、无状态管理需求 → 原生 HTML/CSS/JS(ES2022),`EventSource` 接 SSE、`fetch` 接 JSON API、`Notification` 做提醒。避免引入 Node 侧构建链。
|
|
26
|
-
### 2.4 二维码生成:npm `qrcode` 包(Node 侧)
|
|
27
|
-
|
|
28
|
-
Node 侧直接生成 PNG data 输出到 `<img>`,前端零依赖;避免在前端内联 QR 编码算法(Reed-Solomon 实现量大)。
|
|
29
|
-
### 2.5 其余依赖
|
|
30
|
-
|
|
31
|
-
- `@deepseek-ai/schemastery`(Config schema,与 dsh 同款)
|
|
32
|
-
- `@deepseek-ai/dsh-llm`(`createUserMessage` 构造消息)
|
|
33
|
-
- 宿主机服务:`webServer`(路由)、`agents`(AgentRegistry,惰态 `ctx.get`)、`sessions`(SessionStore,惰态 `ctx.get`)
|
|
34
|
-
## 3. 架构分层
|
|
35
|
-
|
|
36
|
-
```mermaid
|
|
37
|
-
graph TB
|
|
38
|
-
subgraph 手机端 M[DSH Remote App(Flutter)]
|
|
39
|
-
end
|
|
40
|
-
subgraph 电脑端 DSH 宿主进程
|
|
41
|
-
subgraph Cordis 组合树 WS[webserver 服务(强制回环)<br/>node:http]
|
|
42
|
-
PH[插件 /m 路由 + SSE]
|
|
43
|
-
BR[插件 LAN 桥 0.0.0.0:3080<br/>流式转发 /m/api*]
|
|
44
|
-
AG[agents 服务<br/>AgentRegistry]
|
|
45
|
-
SS[sessions 服务<br/>SessionStore]
|
|
46
|
-
AL[agent loop<br/>运行中的 agent]
|
|
47
|
-
end
|
|
48
|
-
PH -->|register 前缀路由 /m| WS
|
|
49
|
-
BR -->|上游请求 Host 重写为回环| WS
|
|
50
|
-
PH -->|ctx.get 惰性| AG
|
|
51
|
-
PH -->|ctx.get 惰性| SS
|
|
52
|
-
PH -->|ctx.on session/event| AL
|
|
53
|
-
AG -->|followup/inbox/status| AL
|
|
54
|
-
end
|
|
55
|
-
M -->|HTTP/SSE(局域网/组网直连桥)| BR
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
- **插件层**(本插件):路由注册、LAN 桥转发、JSON API、SSE 事件桥、认证、二维码、推送桥。
|
|
59
|
-
- **服务层**(dsh 现有):`agents`(注入消息、查状态)、`sessions`(列会话、读事件历史)、`webServer`(传输)。
|
|
60
|
-
- **执行层**:agent loop 消费 inbox 消息,产出 `session/event` 事实流。
|
|
61
|
-
## 4. 模块划分
|
|
62
|
-
|
|
63
|
-
### 4.1 服务端(`lib/index.js`)
|
|
64
|
-
| 模块 | 职责 |
|
|
65
|
-
|---|---|
|
|
66
|
-
| 路由注册 | `webServer.register`:前缀 `/m/api/*`、`/m/qr.png`;dispose 时全部注销 |
|
|
67
|
-
| JSON API | bootstrap / send / sessions / history / catalog / notifications / defaults …(见 03-api.md) |
|
|
68
|
-
| SSE 事件桥 | `ctx.on('session/event', ...)` → 摘要化 → 广播到移动端连接;心跳注释帧;连接数上限 |
|
|
69
|
-
| 认证 | 口令比对(常量时间,`X-Mobile-Token` 头)→ 401 语义 |
|
|
70
|
-
| 二维码 | `qrcode` 生成 PNG(桌面设置页扫码用) |
|
|
71
|
-
| 地址发现 | `os.networkInterfaces()` 枚举 IPv4(含虚拟组网段,过滤 VMware 等虚拟网卡),port 取自 `lanBridge.port`(桥监听成功时)否则 `ctx.webServer.port` |
|
|
72
|
-
|
|
73
|
-
### 4.2 客户端(`dsh-mobile-app` Flutter + `lib/client.js` 桌面模块)
|
|
74
|
-
| 模块 | 职责 |
|
|
75
|
-
|---|---|
|
|
76
|
-
| App 状态层(`store.dart`) | bootstrap 缓存、当前会话、SSE 重连(指数退避)、事件去重(messageId/seq) |
|
|
77
|
-
| App 消息流(`chat_screen.dart`) | user/assistant 气泡、流式合并(节流)、Markdown 渲染、活动条(思考/工具过程,v2.6)、轮次分隔 |
|
|
78
|
-
| App 通知页 | turn/end 分类通知(完成/失败/需回答)、已读持久化、未读角标 |
|
|
79
|
-
| App 会话/新建 | 会话列表、新建会话(模式 + 目录跨盘浏览) |
|
|
80
|
-
| App 设置 | 用量与额度(DeepSeek / Codex / OpenCode Go)、充值/DeepSeek 金额预警、默认预设、深色模式、诊断、重新配置 |
|
|
81
|
-
| 桌面客户端模块(`client.js`) | dsh 设置页「连接移动端设备」:拉取 `/m/api/qr-config` 展示二维码 |
|
|
82
|
-
|
|
83
|
-
## 5. 核心时序
|
|
84
|
-
|
|
85
|
-
### 5.1 发消息全链路
|
|
86
|
-
|
|
87
|
-
```mermaid
|
|
88
|
-
sequenceDiagram
|
|
89
|
-
participant M as 手机 /m
|
|
90
|
-
participant P as mobile-remote 插件
|
|
91
|
-
participant A as agents 服务
|
|
92
|
-
participant L as agent loop
|
|
93
|
-
participant E as session/event 事件流
|
|
94
|
-
M->>P: POST /api/send {text}
|
|
95
|
-
P->>P: 认证校验(口令启用时)
|
|
96
|
-
P->>A: agents.get(sessionId) / roots()[0]
|
|
97
|
-
alt 无运行中 agent
|
|
98
|
-
P-->>M: 503 {error:'no-live-agent'}
|
|
99
|
-
else
|
|
100
|
-
P->>P: createUserMessage({content:[text], source:{kind:'user'}})
|
|
101
|
-
P->>A: agent.followup(message)
|
|
102
|
-
A->>L: 唤醒驱动器(如空闲)
|
|
103
|
-
L-->>E: turn/start, assistant/chunk..., turn/end
|
|
104
|
-
E-->>P: ctx.on('session/event')
|
|
105
|
-
P-->>M: SSE 帧(摘要)
|
|
106
|
-
M->>M: 渲染消息流 + 通知判断
|
|
107
|
-
end
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### 5.2 事件摘要规则(服务端,防止移动端流量膨胀)
|
|
111
|
-
| 事件类型 | 下发给移动端的载荷 |
|
|
112
|
-
|---|---|
|
|
113
|
-
| `user/message` | 全部 text blocks(≤2000 字符),图片/文件仅下发引用元数据 |
|
|
114
|
-
| `assistant/message` | 全部 text blocks(≤20000 字符),reasoning 折叠计数,图片/文件仅下发引用元数据 |
|
|
115
|
-
| `assistant/chunk` | 仅 text delta(≤4000 字符缓冲合并) |
|
|
116
|
-
| `tool/result` | 工具名 + 成功/失败 + 截断内容(≤2000 字符)+ 文件/图片引用元数据 |
|
|
117
|
-
| `turn/start` / `turn/end` | 类型 + 轮次数 / 结束原因 |
|
|
118
|
-
| 其他 | 保留 type/seq;无损详情按需读取(`ignorable` 不改变可见性,敏感/内部事件除外) |
|
|
119
|
-
| 协议元数据(`session/title`、`model/selection`、`feedback/*` 等) | 仍下发并保留 seq/详情指针,但普通模式折叠、调试模式可展开 |
|
|
120
|
-
| 内部/重建/快照(`request/*`、`step/*`、`system/message`、`assistant/attempt`、`compaction/*`) | 历史、实时与详情端点均不返回 |
|
|
121
|
-
|
|
122
|
-
## 6. 状态机
|
|
123
|
-
```mermaid
|
|
124
|
-
stateDiagram-v2
|
|
125
|
-
[*] --> idle: 会话就绪
|
|
126
|
-
idle --> running: followup 唤醒
|
|
127
|
-
running --> running: 连续轮次/子代理
|
|
128
|
-
running --> idle: turn/end (kind≠aborted)
|
|
129
|
-
running --> idle: turn/end (aborted)
|
|
130
|
-
idle --> [*]: agent dispose
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
- 移动页顶部状态点直接来自最近的 `turn/start`/`turn/end` 事件推断;`bootstrap`/`agents` 接口提供权威值。
|
|
134
|
-
- "完成通知"触发条件:`running → idle` 且页面文档处于 hidden 状态。
|
|
135
|
-
## 7. 关键设计决策(ADR 简表)
|
|
136
|
-
|
|
137
|
-
| # | 决策 | 理由 |
|
|
138
|
-
|---|---|---|
|
|
139
|
-
| D1 | **桌面版:LAN 桥转发(回环 webserver 不动);web 版:profile patch 绑定 0.0.0.0** | 桌面版 0.1.1-rc.2 强制 webserver 回环(patch 覆盖 host 会 throw),只能在插件内自建监听转发;web 版无此限制,patch 覆盖须写全必填字段(见 06 §4) |
|
|
140
|
-
| D2 | 口令认证默认关闭 | 信任网络层(自家 WiFi + 虚拟组网);口令是可选加固而非默认摩擦 |
|
|
141
|
-
| D3 | SSE 而非轮询 | 现有 `/plugins/events` 同款模式;事件延迟 <500ms 需求 |
|
|
142
|
-
| D4 | 移动页不发起新会话 | 会话创建/模型配置语义复杂(preset、模型选择),v1 只续接 |
|
|
143
|
-
| D5 | 摘要作为默认展示,完整 Visible event 通过详情按需读取 | 保持移动端列表流量与渲染成本可控,同时允许调试模式审阅主会话工具链;未知事件保留类型/顺序,不静默丢弃(取代旧的“摘要而非全量”表述) |
|
|
144
|
-
|
|
145
|
-
## 8. 非功能架构
|
|
146
|
-
- **连接管理**:SSE 连接 Set,上限 16;dispose 时 `res.destroy()` 全部连接。
|
|
147
|
-
- **心跳**:每 25s 发送 `: ping` 注释帧,防中间代理断连。
|
|
148
|
-
- **事件广播失败隔离**:单个连接写入抛错 → 只断开该连接,不影响其他订阅者。
|
|
149
|
-
- **无状态**:插件无自有持久化;重启 dsh 后插件随组合树重新挂载,SSE 连接由客户端重连恢复。
|
|
150
|
-
## 9. 风险与应对
|
|
151
|
-
| 风险 | 影响 | 应对 |
|
|
152
|
-
|---|---|---|
|
|
153
|
-
| 0.0.0.0 暴露给陌生网络 | 他人可驱动 agent | 04-security.md:口令加固 + 使用场景约束(仅可信 WiFi/虚拟组网) |
|
|
154
|
-
| 浏览器通知被系统拦截 | 收不到完成提醒 | 页面内横幅降级 + 用户手册说明系统设置 |
|
|
155
|
-
| dsh 服务名变动(agents/sessions 接口演进) | 插件失效 | 惰态 `ctx.get` + 明确错误文案;依赖固定 rc.6 版本 |
|
|
156
|
-
| SSE 在移动网络下断连 | 消息流中断 | 指数退避重连 + 重连后历史增量补齐 |
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
# 第二部分:移动端产品版架构(v2.1,配套 00-开发总纲)
|
|
161
|
-
## 10. 总体形态
|
|
162
|
-
```mermaid
|
|
163
|
-
graph LR
|
|
164
|
-
subgraph 手机
|
|
165
|
-
A1[DSH Remote App<br/>Flutter 原生]
|
|
166
|
-
end
|
|
167
|
-
subgraph 电脑 dsh 进程
|
|
168
|
-
P[dsh-mobile-remote 插件]
|
|
169
|
-
D[dsh 内核:agents/sessions/llm/settings]
|
|
170
|
-
G[dsh 设置页客户端模块<br/>连接移动端设备]
|
|
171
|
-
end
|
|
172
|
-
A1 -->|HTTP/SSE| P
|
|
173
|
-
G -->|loopback| P
|
|
174
|
-
P -->|ctx 服务| D
|
|
175
|
-
P -.Phase 2 推送桥.-> N[推送服务 Bark/Server酱] -.-> A1
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
- **单一 API 面**:App 共用 `/m/api/*`;API 先行,两端后写(总纲 §5)
|
|
179
|
-
- **App = 原生实现**:Flutter 全部界面(Phase 3 完成,v2.1 起唯一移动端形态)
|
|
180
|
-
- **网页版已移除**:v2.1 起不再提供 `/m` 页面(`page.html` 删除),减少运行资源;桌面设置页由客户端模块提供
|
|
181
|
-
|
|
182
|
-
## 11. 新增服务与模块(插件侧)
|
|
183
|
-
|
|
184
|
-
| 模块 | 职责 | 依赖 |
|
|
185
|
-
|---|---|---|
|
|
186
|
-
| `catalog` | 模型/推理/权限/预设枚举聚合(读 PC 端真实目录) | `ctx.llm`、permission-presets、agent-presets manifest |
|
|
187
|
-
| `session-config` | 当前会话模型/推理/权限读写(写走 PC 端同一事件路径) | `agents`、permission 服务 |
|
|
188
|
-
| `session-create` | 按 preset 新建会话并覆写配置 | `agents.create`、presets |
|
|
189
|
-
| `notifications` | 事件流聚合(completed/needs-answer/failed) 已读状态(文件持久化 `~/.dsh/mobile-remote/read-notifs.json`) | `ctx.on session/event` |
|
|
190
|
-
| `mobile-actions` | 动作注册表服务 `ctx.mobileActions` + 清单/执行端点 | 注册表(Cordis 语义) |
|
|
191
|
-
| `respond` | 问询/审批应答(v2.3):经 `apiProxy.respond` 回写,与 PC 端 GUI 同一 pending 通道 | `apiProxy`(`ctx.inject`) |
|
|
192
|
-
|
|
193
|
-
## 12. 关键实现要点
|
|
194
|
-
|
|
195
|
-
- **通知聚合**:`turn/end` 的 reason.kind 分类(completed/failed/blocked=needs-answer);聚合为内存记录 + 已读集合文件持久化(不再用 settings 域——无 fiber 的 HTTP 回调里调 settings 会崩进程)
|
|
196
|
-
- **权限写入**:`POST /api/session-config` 的权限项复用 PC 端 `/permission <preset>` 的写入路径(permission/preset 事件 + sandbox/approval 旋钮),确保桌面 GUI 与移动端看到同一事实
|
|
197
|
-
- **模型切换**:经 `ctx.agents` 的 per-session LLM target 设置(`installAgentLlmTarget` 语义),与 GUI 模型选择器一致
|
|
198
|
-
- **动作执行**:handler 在电脑端运行,长任务结果经会话事件回流(不阻塞 HTTP 响应)
|
|
199
|
-
|
|
200
|
-
## 12b. 问询/审批弹窗桥(v2.3,与 PC 端同一 pending)
|
|
201
|
-
|
|
202
|
-
```mermaid
|
|
203
|
-
sequenceDiagram
|
|
204
|
-
participant K as dsh 内核(apiProxy)
|
|
205
|
-
participant P as 插件(ctx.inject apiProxy)
|
|
206
|
-
participant M as 手机 App
|
|
207
|
-
participant U as 用户
|
|
208
|
-
|
|
209
|
-
K-->>P: mux 帧 question/requested / approval/requested(含 rpcId)
|
|
210
|
-
P->>P: pendingFrames 缓存(App 重连时补发)
|
|
211
|
-
P-->>M: SSE `mobile/frame`
|
|
212
|
-
M->>M: 聊天页弹出卡片(问询/审批)
|
|
213
|
-
U->>M: 选选项/输入/允许一次/拒绝/✕
|
|
214
|
-
M->>P: POST /m/api/respond {kind, rpcId, ...}
|
|
215
|
-
P->>K: apiProxy.respond(内核校验 matchesQuestions 等)
|
|
216
|
-
K-->>P: question/resolved / approval/resolved
|
|
217
|
-
P-->>M: SSE `mobile/frame`(收起卡片,两端同步消失)
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
- **获取服务必须用 `ctx.inject(["apiProxy"])`**:各插件上下文隔离,`ctx.get` 看不到兄弟插件注册的服务(dsh-client-connection 同款用法)。
|
|
221
|
-
- 只转发 question/approval/session-queue 瞬态帧;`session/event` 仍走 `ctx.on` 桥避免重复。
|
|
222
|
-
- **私有协议风险**:`events.mux` / `respond` 消息格式无稳定版本承诺;缺失时干净降级(`/m/api/respond` 返回 503、诊断 `respondBridge=false`),详见 docs/09-compatibility.md。
|
|
223
|
-
- 断线补发:App 重连 SSE 时插件回放 `pendingFrames`;从「需要你回答」通知进入会话即见挂起弹窗。
|
|
224
|
-
- 另一端先答:内核 pending 表先到先得,后答方收到 `not-pending`,App 收起卡片并提示"可能电脑端已先回答"。
|
|
225
|
-
## 13. 推送桥(Phase 2 架构)
|
|
226
|
-
```mermaid
|
|
227
|
-
sequenceDiagram
|
|
228
|
-
participant P as 插件
|
|
229
|
-
participant D as dsh 内核
|
|
230
|
-
participant N as 推送服务
|
|
231
|
-
participant M as 手机
|
|
232
|
-
|
|
233
|
-
D-->>P: session/event(turn/end / 提问 / 失败)
|
|
234
|
-
P->>P: 匹配推送配置(类型/会话/静默期)
|
|
235
|
-
P->>N: HTTPS POST(标题+摘要+深链)
|
|
236
|
-
N-->>M: 系统通知
|
|
237
|
-
M->>M: 点击 → 深链打开 App/网页对应会话
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
- 配置:`settings` 域(推送服务 URL、密钥、事件类型开关、静默时段)
|
|
241
|
-
- 深链:点击系统通知 → 打开 App 通知中心/对应会话(当前实现:通知中心条目跳转;App 自定义 scheme 深链未做)
|
|
242
|
-
- 去重/节流:同会话同类型 60s 内合并
|
|
243
|
-
## 14. App 架构(Phase 3 要点)
|
|
244
|
-
- Flutter 单工程;状态管理 ChangeNotifier(`store.dart` 的 `AppStore`);SSE 用 `http` 包流式解析
|
|
245
|
-
- 页面:首页(欢迎 + 最近会话) 会话 / 对话 / 通知 / 设置(对照原型 v7)
|
|
246
|
-
- 本地存储:连接配置(地址/口令)、UI 偏好(工具显示、主题、工作区选择)
|
|
247
|
-
- 连接自愈(v2.4.1~v2.5.1):bootstrap `server.urls` 收集全部地址(局域网 + 蒲公英/虚拟组网,排除 169.254/16 链路本地与 VMware 虚拟网卡);SSE 心跳看门狗(45s 无心跳强制重建)+ 超时即轮换(黑洞地址约 10s 故障切换);下拉刷新「探测 → 自愈 → 拉数据」;SSE 周期断连经实测系手机息屏 Doze(屏亮自动重连+唤醒重同步,非缺陷)
|
|
248
|
-
- 通知:App 内通知中心实时角标(SSE 推送);后台系统级提醒依赖 Phase 2 推送桥(App 不保活长连接)
|
|
249
|
-
- 用量与额度:设置页进入时调用 `/m/api/account-usage`;服务端并发查询 DeepSeek、dsh-codex-connect 当前活动 Codex 账户、OpenCode Go,并只返回本轮成功来源。额度查询为只读投影,凭据停留在电脑端;App 端仅运行期缓存/复用初始快照,配额窗口不聚合。
|