@marktrue/dsh-mobile-remote 3.2.1-alpha.2 → 3.2.1-alpha.3-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 +10 -65
- package/CHANGELOG.md +0 -803
- 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/CONTRIBUTING.md
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# 贡献指南
|
|
2
|
-
|
|
3
|
-
欢迎任何形式的贡献:提 issue、修 bug、加功能、补文档、二次开发。
|
|
4
|
-
|
|
5
|
-
## 参与方式
|
|
6
|
-
|
|
7
|
-
- **报告问题**:GitHub Issues —— 说明环境(dsh 版本 / 平台)、操作步骤、现象;移动端问题附截图更佳
|
|
8
|
-
- **提交代码**:Fork → 分支 → PR;小改动直接 PR,大功能先开 issue 讨论
|
|
9
|
-
- **文档**:README / docs/ 的任何改进都欢迎
|
|
10
|
-
- **二次开发**:见 `docs/08-扩展开发指南.md` —— 欢迎基于本项目做自己的定制并回馈上游
|
|
11
|
-
|
|
12
|
-
## 开发环境
|
|
13
|
-
|
|
14
|
-
- **插件**:Node.js 18+;在 `~/.dsh/profiles/<desktop|web>` 以 `file:` 依赖引入(见 docs/06-install-run.md;桌面版移动端用 LAN 桥)
|
|
15
|
-
- **App**:Flutter 3.47+ + Android SDK;`flutter analyze` 必须零问题
|
|
16
|
-
|
|
17
|
-
## 代码约定
|
|
18
|
-
|
|
19
|
-
- 插件:ESM,遵循现有 `lib/index.js` 的风格;新端点必须在 `docs/03-api.md` 补文档
|
|
20
|
-
- 原型:`prototype/app-prototype.html`(设计参考,零构建,改完直接刷新浏览器看效果)
|
|
21
|
-
- App:`flutter analyze` 零 warning;UI 使用 `theme.dart` 设计令牌,不硬编码颜色
|
|
22
|
-
- 提交信息:中文或英文均可,一句话说明改动(如 `fix: SSE 解析死循环`)
|
|
23
|
-
- 兼容边界:改动涉及内核服务依赖时,对照 `docs/09-compatibility.md` 的降级约定
|
|
24
|
-
|
|
25
|
-
## 测试要求
|
|
26
|
-
|
|
27
|
-
- 插件改动:跑 `tools/e2e-check.mjs`(需 `DSH_MOBILE_TOKEN` 环境变量)
|
|
28
|
-
- App 改动:`flutter analyze` + 真机冒烟(发消息/收通知/新建会话)
|
|
29
|
-
- 新端点:在 `docs/05-test-cases.md` 补用例
|
|
30
|
-
|
|
31
|
-
## 安全底线
|
|
32
|
-
|
|
33
|
-
- 任何新端点默认走统一鉴权;敏感数据(口令/二维码)只允许 loopback 读取
|
|
34
|
-
- 不引入公网暴露;见 `docs/04-security.md`
|
|
35
|
-
|
|
36
|
-
## 发布新版本(维护者清单)
|
|
37
|
-
|
|
38
|
-
**版本号统一原则**:App 版本(pubspec)= 插件版本(package.json)= git tag(如 `v3.0.0` = App 3.0.0+6 + 插件 3.0.0)。**任何一端改动都要三处一起 bump 到同一个新版本号。**
|
|
39
|
-
|
|
40
|
-
**main 分支完整性约定**:main **永远保持完整可发布状态**——每次合并前必须完成:版本号已 bump、CHANGELOG 已更新、`flutter analyze`/`node --check` 通过;不推半成品。这样"拉最新 main"(普通用户让 agent 自动安装的默认路径)拿到的永远是当前正式版,与最新 Release 一致。破坏性/实验性改动走分支或 PR,不进 main。
|
|
41
|
-
|
|
42
|
-
**插件改动(电脑端)**:改 `lib/index.js` → `node --check` → 同步安装目录并重启实测 → `package.json` 版本号(与 App 同步)→ CHANGELOG 条目。
|
|
43
|
-
|
|
44
|
-
**App 改动(手机端)**:改代码 → `flutter analyze` + `flutter test` → `flutter build apk --release` + 真机实测 → `pubspec.yaml` 版本号(形如 `2.5.2+1`)。
|
|
45
|
-
|
|
46
|
-
**共同步骤**:
|
|
47
|
-
1. 文档同步(API/行为变化时更新 docs/03 等)
|
|
48
|
-
2. `git commit`(一句话说明改动)+ `git push origin main`
|
|
49
|
-
3. `git tag -a vX.Y.Z -m "..."` + `git push origin main --tags`
|
|
50
|
-
4. **本地归档**:运行 `dsh-mobile-app\tools\package-release.ps1` → 生成两个带版本号的文件:`dist\DSH-Remote-vX.Y.Z.apk`(App)与 `dist\dsh-mobile-remote-vX.Y.Z.tgz`(插件包)
|
|
51
|
-
5. GitHub 网页创建 **Release**:选新 tag → 标题 `DSH Remote vX.Y.Z` → 说明写清本次改动 → **同时上传上面两个附件**
|
|
52
|
-
6. 大更新在 DSH 社区发帖;CHANGELOG 保持完整历史
|
|
53
|
-
|
|
54
|
-
**版本保留原则**:
|
|
55
|
-
- **旧版 Release 永远保留不删**——它们是版本历史,用户可自行选择下载任一版本回退;每次只**新增**一条 Release(选新 tag),新版本自动成为 Latest
|
|
56
|
-
- 每次改动**必须三处同步 bump 版本号**(pubspec / package.json / CHANGELOG),否则新旧包无法区分
|
|
57
|
-
- 同一签名覆盖安装,用户升级无痛;换 keystore 除外(= 换应用)
|
|
58
|
-
|
|
59
|
-
> 提醒:手机侧载安装无自动更新,重要修复在 Release 说明里写醒目;**不要更换签名 keystore**(同签名覆盖安装保留连接信息)。
|
package/FAQ.md
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
# FAQ(常见问题)
|
|
2
|
-
|
|
3
|
-
## 连接类
|
|
4
|
-
|
|
5
|
-
**Q:手机连不上(连接失败 / 超时)?**
|
|
6
|
-
1. 确认电脑端 DSH 已启动;**桌面版(0.1.1-rc.2)webserver 强制只听 127.0.0.1,手机必须走插件 LAN 桥**(`lanBridge.enabled: true`,默认 `0.0.0.0:3080`,见 docs/06 §4b);**web 版默认即 `0.0.0.0:3080`,开箱即用无需覆盖**(自定义改端口时覆盖 webserver 行必须写全 `host`+`port`,见 docs/06 §4 警示)
|
|
7
|
-
2. 手机和电脑必须在同一网络(同一 WiFi / 虚拟组网)
|
|
8
|
-
3. 口令是否正确(`cordis.patch.yml` 的 `authToken`);改了口令要重启桌面端
|
|
9
|
-
4. **Windows 防火墙(最常见)**:路由器重启/换网后 Windows 会把网络重新识别为「公用」,默认拦截入站 3080。修复:
|
|
10
|
-
- 设置 → 网络和 Internet → 当前网络 → 网络配置文件类型改为「**专用网络**」;
|
|
11
|
-
- 或以管理员身份运行 PowerShell:
|
|
12
|
-
```powershell
|
|
13
|
-
netsh advfirewall firewall add rule name="DSH Mobile 3080" dir=in action=allow protocol=TCP localport=3080 profile=private
|
|
14
|
-
```
|
|
15
|
-
- 判断方法:电脑上 `http://127.0.0.1:3080/m/api/bootstrap` 能通、手机却连不上,基本就是防火墙/网络类别问题
|
|
16
|
-
|
|
17
|
-
**Q:扫码连不上 / 二维码扫了没反应?**
|
|
18
|
-
- App 请用自带的「扫码连接」按钮,不要用系统相机(系统相机会跳浏览器打开网页)
|
|
19
|
-
- 二维码含口令,改了 `authToken` 后需重启桌面端,二维码自动更新
|
|
20
|
-
- 手机与电脑需同一网络
|
|
21
|
-
|
|
22
|
-
**Q:外出(不在家)怎么连?**
|
|
23
|
-
**推荐:蒲公英组网**(已实测 ✅)——电脑和手机装蒲公英客户端,登录同一账号加入同一组网(免费版 3 个成员)。手机 DSH App 首次手动填一次电脑的蒲公英虚拟 IP(`http://172.16.x.x:3080`),之后 App 自动切换:出门走蒲公英、回家走局域网(设置 → 电脑地址显示「共 N 个地址自动切换」)。步骤详见 docs/06 §5.1。
|
|
24
|
-
其他虚拟组网(ZeroTier/路由器 WireGuard)与内网穿透(frp/樱花映射)同理可接,配置要点见 docs/06 §5.2(隧道类需插件 `trustedHosts` 放行 + 强口令)。**禁止公网端口裸奔映射**;Tailscale 因国内控制面不可达不推荐。
|
|
25
|
-
|
|
26
|
-
## 使用类
|
|
27
|
-
|
|
28
|
-
**Q:发消息没反应?**
|
|
29
|
-
- agent 正在处理上一轮时新消息会**排队**(dsh 机制),移动端会提示;等上一轮完成即可
|
|
30
|
-
- 检查状态点:绿色=运行中,橙色=等待你回答(直接回复即可)
|
|
31
|
-
|
|
32
|
-
**Q:通知不推送?**
|
|
33
|
-
- 检查 `pushUrls` 配置是否正确 + 重启桌面端
|
|
34
|
-
- Server酱:SendKey 是否有效;ntfy:手机 App 是否订阅了同一 topic
|
|
35
|
-
- 同会话同类型通知 60 秒内合并(`pushCooldownMs`)
|
|
36
|
-
|
|
37
|
-
**Q:通知列表里看不到任务完成?**
|
|
38
|
-
通知中心按会话聚合(同会话同类型只保留一条);PC 端任务完成/失败/需回答才会产生通知。
|
|
39
|
-
|
|
40
|
-
**Q:新建会话选的工作目录在 PC 端显示"未分组"?**
|
|
41
|
-
该目录不在任何已注册工作区(或不在其子目录下)。在工作区子目录下会自动归属;也可在 PC 端把该目录注册为工作区。
|
|
42
|
-
|
|
43
|
-
**Q:会话列表和 PC 端不一致?**
|
|
44
|
-
不会 —— App/网页端与 PC 端共用同一会话数据源(实时读写),标题/分组/归档全部同源。
|
|
45
|
-
|
|
46
|
-
## 问询/审批弹窗类
|
|
47
|
-
|
|
48
|
-
**Q:agent 问我问题/要权限时,手机为什么不弹卡片?**
|
|
49
|
-
1. 弹窗在**该会话的对话页**里;人在别的页面时只有通知中心的「需要你回答」条目,点进去即见弹窗
|
|
50
|
-
2. 电脑端 dsh 需重启过(answerer 随插件加载);App 设置 → 环境诊断:v3.1.3+ 看 `checks.approvalMode` / `checks.remoteEvents`(0.1.2-rc.1+ 宿主不再输出旧版 `respondBridge`/`frameBridge`/`apiProxy` 键——那是 0.1.1 及更早内核的帧桥探测项,**缺失即正常**;旧版 App + 新插件时字符串行按布尔渲染显示 ❌ 属显示限制,以插件日志/诊断 JSON 为准)
|
|
51
|
-
3. 若 PC 端也没弹:会话审批策略为「从不询问」,或 Harness 配了自动答题/自动审批(不弹是正常行为)
|
|
52
|
-
4. 配置了 `approvalMode: desktop`(审批/问询只走桌面 GUI)时手机不弹卡——符合配置语义,不是故障
|
|
53
|
-
详见 docs/09-compatibility.md。
|
|
54
|
-
|
|
55
|
-
**Q:手机在线时,桌面端不弹审批/问询框?(issue #9)**
|
|
56
|
-
v3.1.2 起审批/问询改走内核 0.1.2 的单条 Cordis 瀑布 + 手机接管机制:手机在线即由手机独占应答,桌面 GUI 不再弹卡。**v3.1.3 起默认 `approvalMode: both`**——桌面 GUI 与手机同时收到待办,任一端先答即生效、另一端自动收卡(恢复 v3.1.1 帧桥体验)。仍可切换其它策略(`cordis.patch.yml` → mobile-remote 行 `config`,重启生效):
|
|
57
|
-
|
|
58
|
-
```yaml
|
|
59
|
-
approvalMode: both # 默认。两端同卡、先答生效(需 DSH 0.1.2-rc.1+ / 桌面 v2.0.5+)
|
|
60
|
-
# approvalMode: mobile # 手机在线独占(v3.1.2 行为),外出远程用
|
|
61
|
-
# approvalMode: desktop # 审批/问询只走桌面 GUI,常驻电脑前用
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
旧宿主(0.1.1-rc.2 及更早,无 $events 通道)`both` 自动按 `mobile` 处理;诊断页 notes 会说明实际生效语义。
|
|
65
|
-
|
|
66
|
-
**Q:手机点了 ✕ / 回答了,电脑端会怎样?**
|
|
67
|
-
两端同一待办:手机 ✕ = 取消(审批 → cancelled、问询 → 跳过),手机回答 = 答案直接传给 agent;任何一端处理后另一端弹窗同步消失。先到先得,后答的一方提示"可能电脑端已先处理"。
|
|
68
|
-
|
|
69
|
-
## 设备/兼容类
|
|
70
|
-
|
|
71
|
-
**Q:哪些手机能用?有苹果版吗?**
|
|
72
|
-
Android 7.0+ 各品牌均可(Flutter 原生,渲染自动回退);实测机型:小米 17 Pro Max。**苹果端尚未开发**——开发者没有苹果设备(Mac/iPhone),无法构建与真机调试;代码本身已平台无关,欢迎有 Mac 的开发者贡献 iOS 版本(见 docs/09-compatibility.md §4)。
|
|
73
|
-
|
|
74
|
-
**Q:换手机 / 重装 App 后要重新连接吗?**
|
|
75
|
-
要:连接信息只存手机本地。重新扫一次电脑端二维码即可(口令未变则电脑端不用动)。
|
|
76
|
-
|
|
77
|
-
**Q:装了 dsh-web 的「移动端远程」后插件冲突 / 网页崩溃?怎么共存?**
|
|
78
|
-
- **原因**:dsh-web 生态的 `@linxin666/dsh-remote-web-ui` 把手机页面与接口整体写死在 `/m` 前缀(不可配置),本插件默认也挂在 `/m`——两者抢同一路由前缀,请求互相覆盖导致异常/崩溃;
|
|
79
|
-
- **解法**:给本插件换一个非 `/m` 的单段前缀即可共存(对方写死,只能我们让路)——在 `cordis.patch.yml` 的 mobile-remote 行 `config` 里加 `path: /mr`(或任意单段,如 `/mobile`),重启 DSH:
|
|
80
|
-
```yaml
|
|
81
|
-
- insert:
|
|
82
|
-
- id: mobile-remote
|
|
83
|
-
name: dsh-mobile-remote
|
|
84
|
-
config:
|
|
85
|
-
path: /mr # 避让 dsh-web 占用的 /m 前缀
|
|
86
|
-
authToken: <口令>
|
|
87
|
-
# lanBridge: { enabled: true, port: 3080, host: 0.0.0.0 } # 桌面版需要
|
|
88
|
-
```
|
|
89
|
-
- **手机 App 无需改动**:路径经二维码 / `bootstrap` 动态获取,自动适配新前缀。
|
|
90
|
-
|
|
91
|
-
**Q:为什么我装的 App 升级时提示签名不一致?**
|
|
92
|
-
构建者更换了签名 keystore(签名变更 = 新应用)。卸载旧版重装,然后重新扫码。开发/自用构建回退 debug 签名,公开分发必须用同一正式 keystore(见 dsh-mobile-app/README.md)。
|
|
93
|
-
|
|
94
|
-
## 深色/显示类
|
|
95
|
-
|
|
96
|
-
**Q:界面是黑的 / 想换浅色?**
|
|
97
|
-
设置 → 深色模式:跟随系统 / 深色 / 浅色 三态切换(App);网页端跟随浏览器系统主题。
|
|
98
|
-
|
|
99
|
-
**Q:看不到工具调用过程?**
|
|
100
|
-
对话页输入框上方有**活动条**:思考中 / 正在调用工具(如 read)实时显示,结束后消失;思考内容可点开查看(v2.6 起)。工具结果细节以 PC 端为准。
|
|
101
|
-
|
|
102
|
-
## 安全类
|
|
103
|
-
|
|
104
|
-
**Q:二维码/口令泄露了怎么办?**
|
|
105
|
-
修改 `cordis.patch.yml` 的 `authToken` → 重启桌面端 → 二维码自动更新,旧码作废。
|
|
106
|
-
|
|
107
|
-
**Q:可以把 3080 映射到公网吗?**
|
|
108
|
-
**禁止**。插件面向可信内网设计(详见 docs/04-security.md);外出请用**蒲公英组网**(推荐,docs/06 §5.1;Tailscale 国内控制面不可达不推荐,其他组网/隧道思路见 §5.2,公网隧道必须配 TLS)。
|
|
109
|
-
|
|
110
|
-
**Q:App 会联网上传我的数据吗?**
|
|
111
|
-
不会。App 只与本机配置的电脑地址通信(HTTP 直连),连接信息仅存手机本地。
|
package/cordis.patch.yml
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# dsh.bundle 激活补丁(DSH 桌面/CLI 安装本包时作为 profile 层应用)。
|
|
2
|
-
#
|
|
3
|
-
# 有了它,用户 `dsh plugin add @marktrue/dsh-mobile-remote` 之后无需手工编辑
|
|
4
|
-
# profile 的 cordis.patch.yml——本文件就是那一段 insert。
|
|
5
|
-
#
|
|
6
|
-
# 口令:**不需要在这里写死**。未配置时插件会自动生成 43 字符强随机口令并存到
|
|
7
|
-
# <DSH_HOME>/mobile-remote/auth-token,连接二维码会携带它;移动接口一律 fail-closed。
|
|
8
|
-
# 桌面版(webserver 只听回环)还需开启 lanBridge 才能让手机连上:
|
|
9
|
-
# config.lanBridge: { enabled: true, port: 3081 }
|
|
10
|
-
- insert:
|
|
11
|
-
- id: mobile-remote
|
|
12
|
-
name: "@marktrue/dsh-mobile-remote"
|
|
13
|
-
config:
|
|
14
|
-
path: /m
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# 00 开发总纲 — DSH Mobile(手机远程操作端)
|
|
2
|
-
> 版本:v2.7.0 · 状态:已开源发布,持续维护 · 本文件是后续全部工作的最高依据
|
|
3
|
-
## 1. 项目一句话
|
|
4
|
-
|
|
5
|
-
**把 dsh(DeepSeek Harness)变成随身控制台**:手机随时查看 agent 状态、发消息派活、审批决策、接收完成/待回答/失败通知、管理会话——电脑端跑着,人不在电脑前也能全程操作。
|
|
6
|
-
## 2. 资产现状(开发起点)
|
|
7
|
-
|
|
8
|
-
| 资产 | 状态 | 位置 |
|
|
9
|
-
|---|---|---|
|
|
10
|
-
| `dsh-mobile-remote` host 插件(/m/api + 桌面客户端模块) | ✅ 已安装启用(desktop profile;web profile 亦可) | `<插件安装目录>` |
|
|
11
|
-
| 桌面端兼容 | ✅ 已验证(DSH Desktop v2.0.2 / 内核 0.1.1-rc.2,LAN 桥接入) | deepseek-harness-desktop(本机验证) |
|
|
12
|
-
| 移动端界面原型 v7(DeepSeek 配色) | ✅ **已定稿** | `prototype\app-prototype.html` |
|
|
13
|
-
| 既有文档 01~09 | ✅ 已更新到 v3.0.0 产品版 | `docs\` |
|
|
14
|
-
| 发布产物 | ✅ 版本线统一:App 版本 = 插件版本 = git tag;Release 每版双附件(APK + 插件 tgz) | GitHub Releases |
|
|
15
|
-
|
|
16
|
-
## 3. 设计定稿(界面冻结,开发必须遵守)
|
|
17
|
-
|
|
18
|
-
- **视觉**:DeepSeek 品牌配色(主色 `#426EFE`,深色 `#0E1116`)、衬线大标题、1.5 线宽线性图标、大圆角、默认跟随系统深浅色
|
|
19
|
-
- **信息架构**:侧边栏三项(首页 / 会话 / 设置);对话、通知为详情页;无底部 tab
|
|
20
|
-
- **首页固定欢迎界面**(不做状态切换):欢迎语 + 最近会话 + 新建会话 + 输入权限
|
|
21
|
-
- **新建会话当场选模式**(标准 PTC/极简/创造,预设 · 设置默认值)
|
|
22
|
-
- **所有展示数据真实对齐 PC 端**:模型(deepseek-v4-flash / deepseek-v4-pro)、推理强度(off/high/max)、权限(read-only / workspace-write / danger-full-access,Full Access 需风险确认)、模式显示名(标准 PTC/极简/创造)
|
|
23
|
-
- **诚实原则**:未实现的功能明确标注「开发中」,不出现无声摆设;深色模式默认跟随系统
|
|
24
|
-
- **移动端不感知插件**:核心层只依赖 dsh 内核语义;动作区(可选)打开时实时拉取清单;插件管理永远在 PC 端
|
|
25
|
-
## 4. 开发阶段(依赖顺序)
|
|
26
|
-
> 现状(v2.7.0):Phase 1-4 全部完成;网页版已移除(见 Phase 3 注);v2.2~v2.5 补充:消息操作/通知删除/问询审批弹窗/无限上翻/多地址切换/连接自愈/版本线统一等(详见 Phase 4 与 CHANGELOG);**v2.6.0 安全加固 + 过程可见性 + 模型提供商互通**:登录限流、推送脱敏、链接白名单、qr.png 收口、口令加固、认证警示、备份隔离、活动条/思考面板、37 个 dormant 提供商手机可见可配、llm-providers 端点;**v2.7.0 会话工具 + 体验打磨**:任务进度实时推送、子代理/目标手机端可见可操作(jobs/subagents/goal 端点)、agent 状态 bootstrap 同步、下拉刷新收集地址、聊天草稿保留、首页改版(官方 logo / 新欢迎语 / 最近会话卡片滚动)。
|
|
27
|
-
### Phase 1:后端 API 补全(完成 ✅)
|
|
28
|
-
|
|
29
|
-
**范围**:插件新增移动端所需的全部 API。
|
|
30
|
-
| 交付版 | 验收标准 |
|
|
31
|
-
|---|---|
|
|
32
|
-
| 模型目录 API(读取) | 返回 PC 端真实模型 + 推理强度选项与当前值 |
|
|
33
|
-
| 会话配置 API(读写) | 切换当前会话模型/推理强度/权限预设;风险确认后允许 danger-full-access |
|
|
34
|
-
| Agent 预设 API(读写) | 读默认预设;新建会话带预设参数 |
|
|
35
|
-
| 新建会话 API | 按 preset 创建会话,返回 id 可续接 |
|
|
36
|
-
| 通知中心 API | 聚合完成/待回答/失败事件;未读 已读状态 |
|
|
37
|
-
| 动作区契约 v0.1 | GET 动作清单 + POST 执行(注册服务 `ctx.mobileActions`) |
|
|
38
|
-
|
|
39
|
-
**Phase 1 完成标志**:API 全链路可用(e2e-check 通过)。
|
|
40
|
-
### Phase 2:推送桥(完成 ✅)
|
|
41
|
-
|
|
42
|
-
**范围**:agent 完成 / 需要回答 / 失败三类事件 → 推送服务(Bark / Serverchan / ntfy,可配置)→ 手机系统通知;App 在后台也能收到。
|
|
43
|
-
| 交付版 | 验收标准 |
|
|
44
|
-
|---|---|
|
|
45
|
-
| 推送桥配置(profile settings) | 配置推送服务 URL + 开关 + 事件类型选择 |
|
|
46
|
-
| 事件 → 推送转发 | 三类事件触发推送,内容含会话摘要;同会话同类型聚合 |
|
|
47
|
-
|
|
48
|
-
**Phase 2 完成标志**:手机锁屏收到任务完成/需要回答通知。
|
|
49
|
-
### Phase 3:Flutter App(完成 ✅)
|
|
50
|
-
|
|
51
|
-
**范围**:按定稿原型实现原生 App,对接 Phase 1 API。
|
|
52
|
-
| 交付版 | 验收标准 |
|
|
53
|
-
|---|---|
|
|
54
|
-
| Flutter 工程(Android 优先) | 全部界面与弹窗按原型实现 |
|
|
55
|
-
| 连接管理 | 扫码/手动连接、重连、断线提示 |
|
|
56
|
-
| 通知接入 | 前台 SSE + 后台依赖 Phase 2 推送桥 |
|
|
57
|
-
| 打包 | Android APK 可安装 |
|
|
58
|
-
|
|
59
|
-
**Phase 3 完成标志**:APK 安装后全功能可用,体验等于原型。
|
|
60
|
-
> **v2.1 决策**:网页版(`/m` 页面)在 App 完成后移除(不再提供浏览器形态),减少运行资源;桌面设置页由客户端模块(`client.js`)提供扫码入口。
|
|
61
|
-
### Phase 4:移动端补齐与可靠性加固(完成 ✅)
|
|
62
|
-
|
|
63
|
-
**范围**:把「人不在电脑前」做实——人类交互补全(问询/审批)、连接不丢、断了快恢复、版本不混乱。
|
|
64
|
-
| 交付版 | 验收标准 |
|
|
65
|
-
|---|---|
|
|
66
|
-
| 问询/审批弹窗(v2.4.0) | agent 提问/工具越权时手机弹卡片,与 PC 同一 pending 通道,任一端回答两端同步消失 |
|
|
67
|
-
| 多地址自动切换(v2.4.1) | 连接成功后自动收集全部地址(局域网 IP + 虚拟组网 IP),断线重试失败自动轮换——出门切虚拟组网、回家切局域网,全程免手动 |
|
|
68
|
-
| 连接自愈(v2.4.2/v2.5.1) | SSE 心跳看门狗(75s 无心跳强制重建);黑洞地址故障切换 72s→约 10s;下拉刷新「探测→自愈→拉数据」 |
|
|
69
|
-
| 手动切换连接地址(v2.5.0) | 设置 → 电脑地址点按弹出候选列表,探测可达后切换并重连 |
|
|
70
|
-
| 版本线统一(v2.5.1) | App 版本 = 插件版本 = git tag;Release 每版双附件(APK + 插件 tgz) |
|
|
71
|
-
| 布局溢出硬化(v2.5.2) | 工作区抽屉/底部弹层/问询卡片/连接配置页在内容多、小屏 + 键盘场景不溢出 |
|
|
72
|
-
|
|
73
|
-
**Phase 4 完成标志**:手机断网/组网失效后约 10 秒自动切到可用地址;抽屉与弹层在极端内容量下不破版。
|
|
74
|
-
|
|
75
|
-
## 5. 阶段依赖与顺序理顺
|
|
76
|
-
1. **API 先行**:App 与脚本测试共用同一套 API,先写 API 再写客户端
|
|
77
|
-
2. **推送桥在 App 前**:App 的后台通知直接复用推送桥,不必在 Flutter 里重做
|
|
78
|
-
3. **App 最后**:纯锦上添花,风险最低的部分最后做
|
|
79
|
-
|
|
80
|
-
## 6. 关键决策记录(ADR 摘要)
|
|
81
|
-
| # | 决策 | 理由 |
|
|
82
|
-
|---|---|---|
|
|
83
|
-
| D1 | 视觉 = DeepSeek 品牌色 + Claude/Notion 排版 | 用户定稿;暖色、蓝色都试过,DeepSeek 蓝最对味 |
|
|
84
|
-
| D2 | 首页固定欢迎界面,无状态切换 | 任务断断续续时切换体验差(用户明确要求) |
|
|
85
|
-
| D3 | 新建会话当场选模式 | 避免每次去设置改默认(用户明确要求) |
|
|
86
|
-
| D4 | 权限三档 + Full Access 风险确认 | 与 PC 端沙箱模式一致 |
|
|
87
|
-
| D5 | 移动端零插件感知 + 可选动作区 | 插件生态差异不进入移动端核心层 |
|
|
88
|
-
| D6 | 诚实原则(开发中标注) | 避免虚假功能误导 |
|
|
89
|
-
| D7 | 桌面端 命令行双形态兼容 | 同 profile 同 CLI,插件天然兼容 |
|
|
90
|
-
| D8 | 版本线统一:App 版本 = 插件版本 = git tag,Release 双附件 | v2.5.1;避免版本错配困惑;已发布接口只加不删(破坏性变更禁止) |
|
|
91
|
-
| D9 | 连接自愈多级兜底:SSE 超时 + 心跳看门狗 + 地址轮换 | 断连形态多样(静默死亡/黑洞/半开),单一机制覆盖不全 |
|
|
92
|
-
| D10 | 地址策略:自动切换为主、手动切换兜底 | 自动覆盖日常(出门/回家);特殊组网场景留给用户手动选 |
|
|
93
|
-
| D11 | 登录失败限流(10 次/60s/来源 IP,成功重置) | 防弱口令爆破;正常用户零感知(v2.6.0) |
|
|
94
|
-
| D12 | 推送内容默认脱敏(minimal:仅事件类型+会话短码) | 第三方推送通道(Server酱/ntfy/Bark)不可信;核心内容默认不出本机(v2.6.0) |
|
|
95
|
-
| D13 | 消息链接 scheme 白名单(仅 http/https 可点击) | 防 file:/intent:/tel: 拉起任意应用(v2.6.0,App) |
|
|
96
|
-
| D14 | qr.png 与 qr-config 同策略(Host 校验 + loopback only) | 消除唯一无认证路由;桌面设置页本就要求 loopback 拉数据(v2.6.0) |
|
|
97
|
-
|
|
98
|
-
## 7. 风险与应对
|
|
99
|
-
| 风险 | 应对 |
|
|
100
|
-
|---|---|
|
|
101
|
-
| 会话配置 API 需要权限边界(改模型 权限影响会话行为) | 写操作要求认证 + 与 PC 端相同的风险确认流程 |
|
|
102
|
-
| 通知聚合的事件语义(待回答如何判定) | 已实现:`turn/end` reason.kind=blocked → needs-answer(v2.4 与问询/审批弹窗联动) |
|
|
103
|
-
| 动作区契约被第三方插件滥用 | 注册表冲突抛错(Cordis 语义) 文档约定命名空间 |
|
|
104
|
-
| 问询/审批桥依赖 apiProxy 私有协议 | 干净降级(不崩、不弹窗),诊断可查,随插件版本跟进——见 09-compatibility |
|
|
105
|
-
| 组网/隧道断连产生黑洞地址(连接不拒绝但无响应) | SSE 超时 + 心跳看门狗 + 地址轮换多级自愈(v2.5.1 实测 72s→约 10s 恢复) |
|
|
106
|
-
| 国产 ROM 杀后台导致外出断连/漏通知 | 文档引导保活设置(docs/06 蒲公英手机端),App 侧地址自愈兜底 |
|
|
107
|
-
| 弱口令被爆破(早期无速率限制) | v2.6 登录限流:10 次/60s → 429 + Retry-After;认证成功重置计数 |
|
|
108
|
-
| 推送内容经第三方通道泄露(会话标题/错误详情) | v2.6 推送默认脱敏:只推事件类型 + 会话短码(pushContent: minimal) |
|
|
109
|
-
|
|
110
|
-
## 8. 文档索引
|
|
111
|
-
|
|
112
|
-
- 本文件:总纲(最高依据)
|
|
113
|
-
- `01-PRD.md`:产品需求(v0.1/v1 历史 + v2.0 移动端产品版)
|
|
114
|
-
- `02-architecture.md`:架构(插件 + App)
|
|
115
|
-
- `03-api.md`:API 设计(全部端点 + SSE 帧)
|
|
116
|
-
- `04-security.md`:安全设计
|
|
117
|
-
- `05-test-cases.md`:测试用例(含 v2.3 问询/审批、通知删除端到端用例;连接逻辑另有单元测试,见 §4 回归建议)
|
|
118
|
-
- `06-install-run.md`:部署与启用(安装/配置;构建/签名与排障见 `10-release.md`)
|
|
119
|
-
- `07-user-manual.md`:用户手册(含 FAQ)
|
|
120
|
-
- `08-扩展开发指南.md`:二次开发(动作区/推送/App 定制/分享你的版本)
|
|
121
|
-
- `09-compatibility.md`:兼容性(内核耦合点/多品牌/已知问题)
|
|
122
|
-
- `10-release.md`:发布操作手册(构建 → 预检 → 演练 → 试发布 → 正式发布 → 验证/回滚;含 Android 构建与排障附录)
|
package/docs/01-PRD.md
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
# 01 产品需求文档(PRD)— dsh-mobile-remote
|
|
2
|
-
|
|
3
|
-
> 版本:v3.0.0 · 状态:全部功能已实现(v0.1/v1 历史部分保留作演进记录) · 适用范围:本插件全部迭代
|
|
4
|
-
|
|
5
|
-
## 1. 产品定位与目标用户
|
|
6
|
-
- **产品定位**:DeepSeek Harness 的手机远程操作插件 + 原生 App。当电脑端 DSH(Desktop 或 web)在线运行时,使用者可以离开电脑,通过手机 App(DSH Remote)向运行中的 agent 发消息、派任务、查看进度、接收完成通知、审批决策、管理历史会话,并跳转 DeepSeek 开放平台充值。
|
|
7
|
-
- **目标用户**:本人(单人使用)。设计上不假设多用户、不做账号体系。
|
|
8
|
-
- **一句话**:把"DSH 桌面会话"延伸到口袋里——电脑是执行者,手机是遥控器。
|
|
9
|
-
## 2. 功能清单
|
|
10
|
-
|
|
11
|
-
### 2.1 功能总表
|
|
12
|
-
|
|
13
|
-
| 编号 | 功能 | 描述 | 优先级 |
|
|
14
|
-
|---|---|---|---|
|
|
15
|
-
| F1 | 发消息/派任务 | 手机输入文本 → 注入运行中的 agent(`agent.followup`)→ agent 立即开始处理 | P0 |
|
|
16
|
-
| F2 | 看进度 | 消息流实时显示 agent 回复、工具调用活动、轮次开始/结束 | P0 |
|
|
17
|
-
| F3 | 完成通知 | agent 空闲/轮次结束时手机浏览器通知(Notification API) | P0 |
|
|
18
|
-
| F4 | 会话历史 | 列出全部会话,切换会话查看历史消息并续接对话 | P1 |
|
|
19
|
-
| F5 | 回答/审批 | 手机上直接回答 agent 提出的问题(选项选择/自定义输入)与权限审批(允许一次/拒绝)——v2.3 起原生弹窗卡片,与 PC 端同一 pending 通道(见 docs/02-architecture §12b) | P0(v2.3 完成) |
|
|
20
|
-
| F6 | 充值入口 | 移动页提供余额充值卡片,跳转 DeepSeek 开放平台充值页 | P1 |
|
|
21
|
-
| F7 | 二维码连接 | 移动页内置二维码:电脑/手机同网络时扫码即得访问地址 | P1 |
|
|
22
|
-
| F8 | 访问口令 | 可选访问口令(默认关闭),启用后移动 API 全部要求认证 | P1 |
|
|
23
|
-
| F9 | 访问地址展示 | 页面列出本机所有可达地址(局域网 IP + 虚拟组网 IP),供外出时手动输入 | P1 |
|
|
24
|
-
| F10 | 用量与额度 | 设置 → 账户查看 DeepSeek 余额、Codex 当前活动账户配额、OpenCode Go 套餐窗口;来源独立显示,凭据不下发手机 | P1 |
|
|
25
|
-
|
|
26
|
-
### 2.2 明确不做(v1 范围外)
|
|
27
|
-
|
|
28
|
-
> **演进说明**:以下为 v1 时代的范围边界。其中「原生 App」「推送通知」「移动端新建会话」已在 v2.0~v2.4 全部实现(见 §10/§11 与 CHANGELOG),此处保留原文并标注演进。
|
|
29
|
-
|
|
30
|
-
- ~~原生 App(iOS/Android 客户端),只做浏览器 PWA~~ → **v2.0 起原生 App 为主体**(Android 已发布;iOS 未开发,见 09-compatibility)
|
|
31
|
-
- ~~推送通知(APNs/FCM):v1 用浏览器通知~~ → **推送桥**(Server酱/ntfy/Bark/generic)实现手机系统级提醒
|
|
32
|
-
- ~~移动端发起全新会话(v1 只向现有会话注入消息)~~ → **v2.0 已支持**(新建会话 API + 工作目录选择)
|
|
33
|
-
- 文件上传/下载、语音输入、消息编辑/撤回(仍未做)
|
|
34
|
-
- 多用户账号体系、审计日志(仍未做)
|
|
35
|
-
## 3. 业务主流程与分支流程
|
|
36
|
-
|
|
37
|
-
### 3.1 主流程:手机发消息
|
|
38
|
-
```
|
|
39
|
-
手机打开 /m(扫码/手动输入地址)→ bootstrap 获取状态(agent 是否在线、是否需口令)→ [分支 A] 口令已启用且未认证 → 登录(输入口令)→ Set-Cookie
|
|
40
|
-
→ 输入消息 → POST /api/send { sessionId?, text }
|
|
41
|
-
→ agent.followup() 注入 → agent 唤醒执行
|
|
42
|
-
→ 移动页 SSE(/api/events)实时收到 session/event(turn/start → assistant/chunk 流式 → tool/result → turn/end)
|
|
43
|
-
→ agent 空闲 → 浏览器通知"任务完成"
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### 3.2 分支流程
|
|
47
|
-
|
|
48
|
-
- **A. 认证**:口令为空(默认)→ 跳过;口令非空 → 未认证请求一律 401,页面显示登录表单。
|
|
49
|
-
- **B. 无运行中 agent**:`/api/send` 返回 503,页面提示当前没有运行中的 agent(电脑端未打开会话)。
|
|
50
|
-
- **C. 多会话**:存在多个 agent 时,页面顶部会话选择器指定目标;未指定默认第一个 root agent。
|
|
51
|
-
- **D. 断线重连**:SSE 断开 → 页面自动重连(指数退避),重连后拉取历史增量补齐。
|
|
52
|
-
- **E. 通知不可用**:浏览器未授权通知 → 页面内横幅提示,消息流仍正常显示。
|
|
53
|
-
## 4. 页面原型(文字线框)
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
┌──────────────────────────────┐
|
|
57
|
-
│ ◀ agent 状态|会话: <当前> ▸ │
|
|
58
|
-
│ → 顶部栏:状态点(running/idle)、会话切换 │
|
|
59
|
-
├──────────────────────────────┤
|
|
60
|
-
│ [Tab1 对话] [Tab2 会话] [Tab3 更多] │
|
|
61
|
-
├──────────────────────────────┤
|
|
62
|
-
│ 对话 Tab(消息流) │
|
|
63
|
-
│ · 消息流(user 右气泡 / │
|
|
64
|
-
│ assistant 左气泡 / 工具行 / │
|
|
65
|
-
│ 轮次分隔线) │
|
|
66
|
-
│ · 底部输入条:文本框 发送 │
|
|
67
|
-
├──────────────────────────────┤
|
|
68
|
-
│ 会话 Tab(会话列表) │
|
|
69
|
-
│ · 会话列表:id、创建时间。 │
|
|
70
|
-
│ 状态(运行/空闲) │
|
|
71
|
-
│ · 点击切换当前会话 │
|
|
72
|
-
├──────────────────────────────┤
|
|
73
|
-
│ 更多 Tab(更多) │
|
|
74
|
-
│ · 访问地址列表 + 二维码 │
|
|
75
|
-
│ · 充值入口卡片 │
|
|
76
|
-
│ · 安全状态(口令开关) │
|
|
77
|
-
│ · 刷新/关于 │
|
|
78
|
-
└──────────────────────────────┘
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
- 适配规则:手机优先(375px 起),桌面浏览器可用(内容居中限宽 480px);跟随系统深浅色(`prefers-color-scheme`)。
|
|
82
|
-
- 触控目标 ≥ 44px;输入条固定底部(键盘弹起时 iOS 安全区适配 `env(safe-area-inset-bottom)`)。
|
|
83
|
-
## 5. 非功能需求
|
|
84
|
-
| 类别 | 指标 |
|
|
85
|
-
|---|---|
|
|
86
|
-
| 响应时间 | API 请求(bootstrap/send/历史)≤ 200ms(本机回环);SSE 事件延迟 ≤ 500ms |
|
|
87
|
-
| 可用性 | 电脑端 DSH 在线即可用;GUI 重启后移动端自动恢复(会话持久化在 DSH 侧) |
|
|
88
|
-
| 并发 | 单用户;SSE 连接数上限 16(超出拒绝并提示) |
|
|
89
|
-
| 兼容性 | 手机:iOS Safari ≥ 15、Android Chrome ≥ 90(现代浏览器,含 Notification/EventSource);桌面:Chrome/Edge/Firefox |
|
|
90
|
-
| 流量 | 时间线摘要默认轻量;tool/result 与 assistant 长内容通过认证详情端点按需读取,列表不静默丢失 Visible event |
|
|
91
|
-
| 安全基线 | 见 04-security.md:威胁模型、口令方案、传输安全要求 |
|
|
92
|
-
| 可维护性 | 零构建(无前端打包步骤);插件为纯 ESM;配置项集中在 Config schema |
|
|
93
|
-
|
|
94
|
-
## 6. 数据与埋点
|
|
95
|
-
- 不采集任何埋点;不新增持久化存储(口令仅存于 dsh profile 配置;会话数据由 dsh 现有 session 服务持有)。
|
|
96
|
-
## 7. 迭代优先级
|
|
97
|
-
| 迭代 | 范围 | 目标 |
|
|
98
|
-
|---|---|---|
|
|
99
|
-
| v0.1(本次) | F1 F2 F3 F8 F9 + 页面骨架 | 打通「手机发消息 → 看进度 → 收通知」主链路 |
|
|
100
|
-
| v0.2 | F4 会话历史、F6 充值入口、F7 二维码 | 会话管理 + 常用入口 |
|
|
101
|
-
| v0.3 | F5 回答/审批独立端点、通知增强 | 移动端全场景操作 |
|
|
102
|
-
|
|
103
|
-
## 8. 验收标准(v0.1)
|
|
104
|
-
1. 手机与电脑同一网络(或虚拟组网)时,App 可见页面与 agent 状态正确。
|
|
105
|
-
2. 发送消息后,电脑端 GUI 会话出现该消息,agent 开始执行,移动页实时看到流式回复。
|
|
106
|
-
3. agent 完成任务空闲时,手机浏览器收到通知(页面后台时)。
|
|
107
|
-
4. 启用访问口令后,未认证访问全部移动 API 返回 401;登录后正常。
|
|
108
|
-
5. 无运行中 agent 时发送消息,页面给出明确提示而非静默失败。
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
# 第二部分:移动端产品版(v2.0,与 00-开发总纲配套)
|
|
112
|
-
## 9. 界面定稿(冻结)
|
|
113
|
-
|
|
114
|
-
视觉与信息架构以 `prototype/app-prototype.html`(v7)为准,要点:
|
|
115
|
-
- **视觉**:DeepSeek 品牌配色(主色 `#426EFE`,深色 `#0E1116`/`#161B22`)、衬线大标题(Georgia/宋体)、1.5 线宽 Lucide 风格线性图标、大圆角(16-24px)、默认跟随系统深浅色
|
|
116
|
-
- **信息架构**:侧边栏三项——首页 / 会话 / 设置;对话、通知为详情页;无底部 tab
|
|
117
|
-
- **首页固定欢迎界面**:衬线欢迎语 + 最近会话 + 新建会话 + 底部输入条(不做状态切换)
|
|
118
|
-
- **新建会话当场选模式**(标准 PTC/极简/创造),预选值来自设置默认
|
|
119
|
-
- **对话页**:输入条两行式(第一行模型/权限胶囊,第二行 + 输入/发送)、动作区(可选,空则隐藏)、活动条(思考中/工具执行中,v2.6)、微信式无限上翻(滑到顶自动加载更早 + 回到底部浮钮)、问询/审批弹窗卡片(与 PC 端同一 pending)
|
|
120
|
-
- **通知中心**:三类通知(完成/需要回答/失败)、未读徽标、全部已读、点击直达会话
|
|
121
|
-
- **设置页**:连接、账户用量与额度(DeepSeek / Codex / OpenCode Go)、DeepSeek 充值与金额预警、默认权限预设、默认 Agent 预设、通知开关、显示开关、关于
|
|
122
|
-
- **诚实原则**:未实现功能明确标注"开发中"
|
|
123
|
-
|
|
124
|
-
## 10. 移动端功能映射(v2.0 范围)
|
|
125
|
-
| 功能 | 实现层 | API |
|
|
126
|
-
|---|---|---|
|
|
127
|
-
| 发消息/派任务 | 核心层 | `POST /api/send`(已有) |
|
|
128
|
-
| 流式回复/进度 | 核心层 | `GET /api/events` SSE(已有) |
|
|
129
|
-
| 历史/上翻 | 核心层 | `GET /api/history`(已有) |
|
|
130
|
-
| 新建会话(选模式) | 核心层 | `POST /api/sessions`(新增) |
|
|
131
|
-
| 模型/推理/权限切换 | 核心层 | `GET/POST /api/session-config`(新增) |
|
|
132
|
-
| 通知中心 | 核心层 | `GET /api/notifications`(新增) |
|
|
133
|
-
| 通知删除 | 核心层 | `POST /api/notifications/delete`(v2.3) |
|
|
134
|
-
| 问询/审批弹窗 | 核心层 | SSE `mobile/frame` + `POST /api/respond`(v2.3) |
|
|
135
|
-
| 插件动作区 | 可选层 | `GET /api/actions` + invoke(新增) |
|
|
136
|
-
| 模型提供商互通 | 核心层 | `GET/POST /api/llm-providers` + `probe`(v2.6,与 PC 端同一 settings/credentials 通道) |
|
|
137
|
-
| 多地址自动切换 | 核心层 | bootstrap `server.urls` 收集(局域网 + 组网 IP,排除 169.254/16)+ 断线轮换(v2.4.1) |
|
|
138
|
-
| 连接自愈 | 核心层 | SSE 超时 + 心跳看门狗 + 地址轮换(v2.4.2/v2.5.1,黑洞约 10s 故障切换) |
|
|
139
|
-
| 手动切换连接地址 | 核心层 | 设置 → 电脑地址候选列表,探测后切换重连(v2.5.0) |
|
|
140
|
-
| 用量与额度 | 核心层 | `GET /api/account-usage`;来源独立成功/隐藏,服务端凭据隔离(v3.2) |
|
|
141
|
-
|
|
142
|
-
## 11. 验收标准(v2.0,Phase 1 完成标志)
|
|
143
|
-
1. 手机完成「新建会话(选模式)→ 发消息 → 流式回复 → 通知 → 审批 → 翻历史记录」全链路。
|
|
144
|
-
2. 模型/推理强度/权限预设选择与 PC 端一致,Full Access 有风险确认。
|
|
145
|
-
3. 通知中心三类事件正确聚合,未读状态跨重启保留。
|
|
146
|
-
4. 既有 v0.1 端点全部保持兼容(回归)。
|
|
147
|
-
5. 问询/审批弹窗与 PC 端同一 pending:任一端回答,两端同步消失(v2.3+,用例见 05-test-cases F-15/F-16)。
|
|
148
|
-
6. 设置 → 账户进入“用量与额度”后,DeepSeek、当前活动 Codex 账户、OpenCode Go 的成功来源按固定顺序展示;配额窗口显示剩余百分比与重置时间,不合并求和,任何来源失败不阻塞其他来源。
|