dsh-mobile-plugin 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/config/agent-presets/standard/agent.cordis.yml +7 -5
  2. package/dsh-mobile-credentials/lib/credentials.js +8 -8
  3. package/host.js +108 -39
  4. package/lib/client.js +29 -82
  5. package/lib/desktop-view.cjs +5 -10
  6. package/lib/git/read.js +6 -8
  7. package/lib/host-compat.cjs +120 -0
  8. package/lib/host-guard.cjs +9 -39
  9. package/lib/host-patches.cjs +5 -16
  10. package/lib/http/routing.js +7 -27
  11. package/lib/impl.js +6 -8
  12. package/lib/mirror/pusher.cjs +33 -85
  13. package/lib/mirror-snapshot.cjs +6 -24
  14. package/lib/mobile/agent-presets.js +6 -26
  15. package/lib/mobile/approvals.js +18 -44
  16. package/lib/mobile/archive-clean.js +10 -19
  17. package/lib/mobile/attachments.js +11 -36
  18. package/lib/mobile/channels.js +15 -41
  19. package/lib/mobile/credential-upgrade.js +7 -16
  20. package/lib/mobile/credentials.js +5 -21
  21. package/lib/mobile/directory-browse.js +8 -27
  22. package/lib/mobile/directory-listing.js +10 -23
  23. package/lib/mobile/drive-roots.js +59 -0
  24. package/lib/mobile/envelope.js +4 -15
  25. package/lib/mobile/events.js +35 -65
  26. package/lib/mobile/extensions.js +5 -8
  27. package/lib/mobile/git-repos.js +6 -15
  28. package/lib/mobile/git.js +11 -19
  29. package/lib/mobile/history-derive.js +23 -41
  30. package/lib/mobile/host-bridge/endpoints.js +4 -6
  31. package/lib/mobile/host-bridge/event-synthesis.js +21 -35
  32. package/lib/mobile/host-bridge/shims.js +12 -22
  33. package/lib/mobile/host-bridge.js +8 -20
  34. package/lib/mobile/host-settings.js +9 -19
  35. package/lib/mobile/inbox-clean.js +7 -24
  36. package/lib/mobile/local-images.js +11 -17
  37. package/lib/mobile/monitor.js +8 -17
  38. package/lib/mobile/pairing.js +7 -19
  39. package/lib/mobile/plugin-self.js +5 -22
  40. package/lib/mobile/plugin-update.js +8 -27
  41. package/lib/mobile/plugins.js +6 -24
  42. package/lib/mobile/questions.js +15 -40
  43. package/lib/mobile/references.js +11 -31
  44. package/lib/mobile/relay-control.js +6 -27
  45. package/lib/mobile/rpc.js +5 -13
  46. package/lib/mobile/schedule.js +8 -33
  47. package/lib/mobile/self-check.cjs +9 -36
  48. package/lib/mobile/session-cache.js +13 -19
  49. package/lib/mobile/session-file.js +8 -21
  50. package/lib/mobile/session-flags.js +7 -13
  51. package/lib/mobile/session-mirror.js +8 -15
  52. package/lib/mobile/session-models.js +3 -3
  53. package/lib/mobile/session-schedule-mark.js +8 -14
  54. package/lib/mobile/session-send.js +13 -21
  55. package/lib/mobile/session-snapshot.js +4 -6
  56. package/lib/mobile/sessions.js +7 -23
  57. package/lib/mobile/stats-collect.cjs +10 -24
  58. package/lib/mobile/stats-ledger.cjs +13 -20
  59. package/lib/mobile/stream.js +12 -23
  60. package/lib/mobile/subagents.js +5 -18
  61. package/lib/mobile/uploads.js +8 -17
  62. package/lib/mobile/workspaces.js +20 -8
  63. package/lib/panel/index.html +7 -7
  64. package/lib/read-receipt.cjs +10 -21
  65. package/lib/relay/lan-network.cjs +14 -28
  66. package/lib/relay/lan-proxy.js +14 -21
  67. package/lib/relay/pairing-policy.js +6 -9
  68. package/lib/relay/preview.js +8 -25
  69. package/lib/relay/protocol.js +6 -13
  70. package/lib/relay/status.js +5 -8
  71. package/lib/relay/tunnel.js +9 -14
  72. package/lib/routes/control-plane.js +28 -45
  73. package/lib/routes/mobile-api.js +19 -32
  74. package/lib/session-cleanup.cjs +16 -27
  75. package/lib/shared/credentials-entry.js +4 -11
  76. package/lib/shared/dshtoken.js +4 -4
  77. package/lib/shared/e2ee-request.js +1 -1
  78. package/lib/shared/e2ee.js +8 -14
  79. package/lib/shared/fresh-request.js +6 -22
  80. package/lib/shared/http-util.js +3 -4
  81. package/lib/shared/list-revision.js +5 -14
  82. package/lib/shared/session-signal.js +7 -16
  83. package/lib/shared/sse-write.js +14 -20
  84. package/lib/shared/workspace-guard.js +7 -15
  85. package/lib/shell/device-ota.js +4 -6
  86. package/lib/shell/manager.js +12 -27
  87. package/lib/shell/ota-package.js +7 -12
  88. package/lib/shell/runtime.js +8 -16
  89. package/lib/shell/self-check-after-swap.js +9 -23
  90. package/lib/shell/updater.js +13 -26
  91. package/lib/sidecar-facade-worker.cjs +20 -33
  92. package/lib/sidecar-facade.cjs +7 -7
  93. package/lib/sidecar-lifecycle.cjs +7 -9
  94. package/lib/update-install.cjs +14 -59
  95. package/lib/update-registry.cjs +6 -18
  96. package/package.json +8 -5
@@ -3,26 +3,17 @@
3
3
  /**
4
4
  * 移动端文件分片上传:把手机分享进来的文件落到宿主机固定收件目录。
5
5
  *
6
- * 四步:begin(登记文件名,拿 uploadId 与片大小)→ chunk(按 index 顺序追加)→
7
- * finish(落盘成 `<收件根>/<日期>/<文件名>`,重名自动加后缀)→ abort(放弃)。
6
+ * 四步:begin(登记文件名,拿 uploadId 与片大小)→ chunk(按 index 顺序追加)→ finish
7
+ * (落盘成 `<收件根>/<日期>/<文件名>`,重名自动加后缀)→ abort(放弃)。
8
8
  *
9
- * 为什么分片,而不是一次 POST 传完:
10
- * - 一次传完会把「能传多大的文件」变成一条运维配置 —— 中转的
11
- * `MAX_BODY_BYTES`(dsh-mobile-server/lib/config.js)默认 50MB,插件自己的
12
- * readJsonBody 默认只有 256KB。分片后单请求最大只有 2MB,与这些上限无关。
13
- * - 手机侧网络不稳,分片能只重传坏掉的那一片,而不是整个文件。
9
+ * 分片而不是一次传完:单请求因此与中转的 `MAX_BODY_BYTES`、readJsonBody 的 256KB 上限无关,
10
+ * 手机网络不稳时也能只重传坏掉的那一片。片内容走 base64 而不是原始字节:App 侧没有发二进制
11
+ * body 的先例,图片通道本来就以 base64 走 JSON;代价是 33% 膨胀,仍远低于各层上限。
14
12
  *
15
- * 为什么片内容走 base64 而不是原始字节:隧道协议本身支持原始字节
16
- * (lib/relay/protocol.js 的 httpBody 帧),但 App 侧没有任何「发二进制 body」的
17
- * 先例,RN 的 fetch 对 ArrayBuffer body 的支持也随版本变;图片通道本来就以 base64
18
- * 走 JSON,这里沿用同一条确定能用的路。代价是 33% 膨胀(单片 2MB → 约 2.73MB),
19
- * 仍远低于任何一层上限。
13
+ * 顺序与幂等:chunk 只接受下一片,重复送达同一片按重传处理,跳号直接 409。
20
14
  *
21
- * 顺序与幂等:chunk 只接受「下一片」,重复送达同一片按重传处理(回当前 received,
22
- * 不再追加),跳号直接 409 —— 客户端因此不需要在重试前先问进度。
23
- *
24
- * 落盘根目录固定 `~/.dsh/mobile-inbox`(收件专目录,与工作区解耦,工作区被删也不
25
- * 影响已收到的文件)。`DSH_MOBILE_INBOX` 可覆盖,只给测试用。
15
+ * 收件根固定 `~/.dsh/mobile-inbox`,与工作区解耦(工作区被删不影响已收到的文件);
16
+ * `DSH_MOBILE_INBOX` 可覆盖,只给测试用。
26
17
  */
27
18
 
28
19
  const fsp = require('node:fs/promises');
@@ -3,15 +3,12 @@
3
3
  /**
4
4
  * dsh-mobile 工作区/目录浏览:透传宿主 apiProxy 的目录浏览与工作区采纳 RPC。
5
5
  *
6
- * 移动端是**远程遥控器**——它不能像桌面端那样弹被控端的原生目录对话框。
6
+ * 移动端是远程遥控器,不能像桌面端那样弹被控端的原生目录对话框。
7
7
  *
8
- * 这里曾经写着一个**错的**前提:以为 directory-picker-auto 会在「宿主绑定局域网(非
9
- * 127.0.0.1)」时自动启用 `browse` 能力,于是 `apiProxy.host.listDirectory` /
10
- * `host.createDirectory` 在任何被控端都可用。实际不是:auto 只在「web 服务绑到非回环」
11
- * 或「平台不是 darwin/win32」时挂 browse,而**桌面 profile 宿主**(手机经 sidecar/中转
12
- * 连上的那种)两者都不满足,于是恒解析成 native —— 手机端一个条目都列不出来,只能登记
13
- * 一个恰好已存在的目录。现在这两个动词在宿主不服务 browse 时由插件自带实现兜底,见
14
- * lib/mobile/directory-browse.js。本模块仍只做与 sessions.js 相同的透传包装。
8
+ * directory-picker-auto 只在「web 服务绑到非回环」或「平台不是 darwin/win32」时挂 browse,
9
+ * 桌面 profile 宿主两者都不满足、恒解析成 native。所以宿主不服务 browse 时,两个目录动词由
10
+ * 插件自带实现兜底(见 lib/mobile/directory-browse.js);本模块只做与 sessions.js 相同的
11
+ * 透传包装。
15
12
  */
16
13
 
17
14
  const { sendJson, readJsonBody } = require('../shared/http-util');
@@ -27,6 +24,7 @@ const { withIdempotency, requestIdOf } = require('./idempotency.js');
27
24
  const { canonicalDeviceKey } = require('./session-cache.js');
28
25
  const { unwrap } = require('./envelope.js');
29
26
  const { describeProjectGit } = require('./git-repos.js');
27
+ const { listRoots } = require('./drive-roots.js');
30
28
 
31
29
  /** 调宿主 apiProxy.host.*(directory-picker 的 browse 能力)。 */
32
30
  function callHost(ctx, method, payload) {
@@ -167,6 +165,19 @@ async function handleListDirectory(ctx, req, res) {
167
165
  sendJson(res, 200, { ok: true, listing: value });
168
166
  }
169
167
 
168
+ /**
169
+ * GET /api/mobile/v1/directory/roots(token)
170
+ * 「添加工作区」的盘符层:宿主 browse 后端只列某一层目录的内容、从不枚举盘符,而手机端的
171
+ * 目录浏览器一打开就落在被控端主目录 —— Windows 上它永远在 C 盘,别的盘没有任何入口。
172
+ * Windows 回真实存在的盘符,其余平台回文件系统根;只有一项时 App 不显示这一层。
173
+ *
174
+ * 不走宿主:host.listDirectory 只认路径、给不出一份根清单,而枚举本身与目录选择器的部署
175
+ * 形态无关(browse / native 两种宿主下答案一样)。
176
+ */
177
+ async function handleDirectoryRoots(_ctx, _req, res) {
178
+ sendJson(res, 200, { ok: true, roots: await listRoots() });
179
+ }
180
+
170
181
  /**
171
182
  * POST /api/mobile/v1/directory/create(token){ path, name }
172
183
  * 透传宿主 host.createDirectory:在被控端 `path` 下新建名为 `name` 的文件夹。
@@ -339,6 +350,7 @@ module.exports = {
339
350
  handleMoveWorkspace,
340
351
  handleWorkspaces,
341
352
  handleListDirectory,
353
+ handleDirectoryRoots,
342
354
  handleCreateDirectory,
343
355
  handleCreateWorkspace,
344
356
  handleRenameWorkspace,