virlen-remote 0.4.0 → 0.6.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 (65) hide show
  1. package/CHANGELOG.md +362 -137
  2. package/README.md +389 -201
  3. package/dist/index.d.ts +12 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +12 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/protocol/agents.d.ts +14 -0
  8. package/dist/protocol/agents.d.ts.map +1 -0
  9. package/dist/protocol/agents.js +14 -0
  10. package/dist/protocol/agents.js.map +1 -0
  11. package/dist/protocol/api.d.ts +422 -1
  12. package/dist/protocol/api.d.ts.map +1 -1
  13. package/dist/protocol/api.js.map +1 -1
  14. package/dist/protocol/compress.d.ts +55 -0
  15. package/dist/protocol/compress.d.ts.map +1 -0
  16. package/dist/protocol/compress.js +60 -0
  17. package/dist/protocol/compress.js.map +1 -0
  18. package/dist/protocol/files.d.ts +261 -0
  19. package/dist/protocol/files.d.ts.map +1 -0
  20. package/dist/protocol/files.js +506 -0
  21. package/dist/protocol/files.js.map +1 -0
  22. package/dist/protocol/host.d.ts +41 -1
  23. package/dist/protocol/host.d.ts.map +1 -1
  24. package/dist/protocol/host.js +10 -1
  25. package/dist/protocol/host.js.map +1 -1
  26. package/dist/protocol/message-actions.d.ts +58 -0
  27. package/dist/protocol/message-actions.d.ts.map +1 -0
  28. package/dist/protocol/message-actions.js +38 -0
  29. package/dist/protocol/message-actions.js.map +1 -0
  30. package/dist/protocol/message-files.d.ts +79 -0
  31. package/dist/protocol/message-files.d.ts.map +1 -0
  32. package/dist/protocol/message-files.js +118 -0
  33. package/dist/protocol/message-files.js.map +1 -0
  34. package/dist/protocol/tool-args.d.ts +95 -0
  35. package/dist/protocol/tool-args.d.ts.map +1 -0
  36. package/dist/protocol/tool-args.js +439 -0
  37. package/dist/protocol/tool-args.js.map +1 -0
  38. package/dist/testing/mock-host.d.ts +44 -1
  39. package/dist/testing/mock-host.d.ts.map +1 -1
  40. package/dist/testing/mock-host.js +487 -8
  41. package/dist/testing/mock-host.js.map +1 -1
  42. package/dist/transport/rtc.d.ts +17 -0
  43. package/dist/transport/rtc.d.ts.map +1 -1
  44. package/dist/transport/rtc.js +49 -12
  45. package/dist/transport/rtc.js.map +1 -1
  46. package/dist/transport/signaling.d.ts +12 -1
  47. package/dist/transport/signaling.d.ts.map +1 -1
  48. package/dist/transport/signaling.js +17 -3
  49. package/dist/transport/signaling.js.map +1 -1
  50. package/package.json +69 -69
  51. package/src/index.ts +270 -179
  52. package/src/protocol/agents.ts +13 -0
  53. package/src/protocol/api.ts +960 -553
  54. package/src/protocol/compress.ts +65 -0
  55. package/src/protocol/files.ts +544 -0
  56. package/src/protocol/host.ts +205 -150
  57. package/src/protocol/message-actions.ts +60 -0
  58. package/src/protocol/message-files.ts +161 -0
  59. package/src/protocol/pairing.ts +254 -254
  60. package/src/protocol/tool-args.ts +478 -0
  61. package/src/testing/mock-host.ts +1285 -691
  62. package/src/transport/link-kind.ts +222 -222
  63. package/src/transport/rtc.ts +381 -344
  64. package/src/transport/signaling.ts +331 -317
  65. package/src/transport/transfer-tier.ts +64 -64
@@ -1,64 +1,64 @@
1
- /**
2
- * 传输档位 —— 「这条链路上,详细内容发不发」。
3
- *
4
- * ## 为什么要有这一层
5
- *
6
- * 「直连 / 中继」此前只影响**界面上一枚胶囊**(`link-kind.ts`):用户看到「TURN 中继」,知道慢,
7
- * 但慢的代价其实落在手机上 —— 中继意味着**每一个字节都要经 TURN 服务器绕一圈**,而手机那头
8
- * 常常是蜂窝流量。手机上真正的大头也不是聊天正文,而是**工具输出**(`git diff` / 命令回显 /
9
- * 文件片段,单条动辄数 KB,一屏历史里几十条)。
10
- *
11
- * 于是把链路类型**再映射一层**成可执行的档位:
12
- * - `full`(完整):该发什么发什么;
13
- * - `lean`(精简):只发「主要内容」;详细内容(当前 = `role:'tool'` 的输出正文)由电脑端
14
- * 在**投影时**省略(`toMessageDTO`),并带上 `MessageDTO.detail = 'omitted'`,
15
- * 让手机端如实显示「输出已省略」,而不是骗人的「这次调用没有输出」。
16
- *
17
- * ## 口径为什么也必须只有一份
18
- *
19
- * 档位是**两端都会读**的:电脑端据此裁剪(发送侧 —— 唯一能真正省下流量的地方),
20
- * 手机端据此解释「工具输出为什么是空的」并在通讯面板上显示当前档位。两端口径一旦漂移,
21
- * 用户看到的就是自相矛盾(电脑按精简发、手机写着「完整传输」)—— 与 `link-kind.ts`
22
- * 当初收敛到本包是同一条理由:**这里即那份唯一实现。**
23
- *
24
- * ## 判定口径(用户 2026-10-02 拍板)
25
- *
26
- * - `direct`(P2P 直连)→ `full`:字节不经服务器,省它没有意义,信息完整优先;
27
- * - `relay`(TURN 中继)→ `lean`:字节要过服务器(手机流量 + 服务器带宽),砍详细内容;
28
- * - `unknown`(还没结论 / 非 WebRTC 链路)→ **也是 `lean`**:宁可把「其实一直是直连」的链路
29
- * 先按精简发,也不要在开局那一屏白白走完整档 —— 而开局那一屏恰好是全量最大的一笔
30
- * (手机连上就拉最近一窗消息,里面全是历史工具输出)。
31
- *
32
- * ⚠️ **代价如实记在这里**:`unknown` 是常态之一 —— 非 WebRTC 链路(同源 Broadcast 联调 /
33
- * 测试注入的链路)永远读不到候选对,于是永远按精简发;真机上也存在「其实是直连、但首个
34
- * 候选对还没定形」的几秒。这些情形下用户看到的是「工具输出已省略」而不是崩溃或空屏,
35
- * 重开会话(重拉窗口)或链路判定为直连之后新产生的数据都会是完整的。
36
- * **不要**把「联调时工具输出是空的」当成 bug 去修。
37
- */
38
- import type { LinkKind } from './link-kind'
39
-
40
- /** 传输档位:`full` = 完整(含详细内容);`lean` = 精简(只发主要内容)。 */
41
- export type TransferTier = 'full' | 'lean'
42
-
43
- /**
44
- * 两端都要声明/列出的**能力名**(手机端写进 `hello.capabilities`;电脑端写进 ACL 能力集)。
45
- *
46
- * 两端各表一半(能力协商本来就是「我会什么」的交集):
47
- * - 手机端声明它 = 「我能渲染 `MessageDTO.detail` 的省略标记」;
48
- * - 电脑端列出它 = 「我会按档位裁剪正文,并在裁掉时打标记」。
49
- *
50
- * **为什么裁剪必须被它挡住,而不能无条件裁**:已部署的旧手机端不认 `detail` 字段 ——
51
- * 它的工具卡片会把「正文为空」显示成「这次调用没有输出」,而那是**假话**(工具有输出,
52
- * 只是被省略了)。宁可对旧手机端继续全量发送,也不要在它的界面上写一句不成立的结论;
53
- * 反过来,旧电脑端不认识这个能力名,新手机端也只是继续收完整正文,同样不会出问题。
54
- */
55
- export const MESSAGE_DETAIL_CAPABILITY = 'message.detail'
56
-
57
- /**
58
- * 链路类型 → 传输档位(**两端唯一口径**)。
59
- *
60
- * 纯函数:喂一个 `LinkKind` 即可,不碰 DOM、不碰 store,故可完整单测。
61
- */
62
- export function transferTierOf(kind: LinkKind): TransferTier {
63
- return kind === 'direct' ? 'full' : 'lean'
64
- }
1
+ /**
2
+ * 传输档位 —— 「这条链路上,详细内容发不发」。
3
+ *
4
+ * ## 为什么要有这一层
5
+ *
6
+ * 「直连 / 中继」此前只影响**界面上一枚胶囊**(`link-kind.ts`):用户看到「TURN 中继」,知道慢,
7
+ * 但慢的代价其实落在手机上 —— 中继意味着**每一个字节都要经 TURN 服务器绕一圈**,而手机那头
8
+ * 常常是蜂窝流量。手机上真正的大头也不是聊天正文,而是**工具输出**(`git diff` / 命令回显 /
9
+ * 文件片段,单条动辄数 KB,一屏历史里几十条)。
10
+ *
11
+ * 于是把链路类型**再映射一层**成可执行的档位:
12
+ * - `full`(完整):该发什么发什么;
13
+ * - `lean`(精简):只发「主要内容」;详细内容(当前 = `role:'tool'` 的输出正文)由电脑端
14
+ * 在**投影时**省略(`toMessageDTO`),并带上 `MessageDTO.detail = 'omitted'`,
15
+ * 让手机端如实显示「输出已省略」,而不是骗人的「这次调用没有输出」。
16
+ *
17
+ * ## 口径为什么也必须只有一份
18
+ *
19
+ * 档位是**两端都会读**的:电脑端据此裁剪(发送侧 —— 唯一能真正省下流量的地方),
20
+ * 手机端据此解释「工具输出为什么是空的」并在通讯面板上显示当前档位。两端口径一旦漂移,
21
+ * 用户看到的就是自相矛盾(电脑按精简发、手机写着「完整传输」)—— 与 `link-kind.ts`
22
+ * 当初收敛到本包是同一条理由:**这里即那份唯一实现。**
23
+ *
24
+ * ## 判定口径(用户 2026-10-02 拍板)
25
+ *
26
+ * - `direct`(P2P 直连)→ `full`:字节不经服务器,省它没有意义,信息完整优先;
27
+ * - `relay`(TURN 中继)→ `lean`:字节要过服务器(手机流量 + 服务器带宽),砍详细内容;
28
+ * - `unknown`(还没结论 / 非 WebRTC 链路)→ **也是 `lean`**:宁可把「其实一直是直连」的链路
29
+ * 先按精简发,也不要在开局那一屏白白走完整档 —— 而开局那一屏恰好是全量最大的一笔
30
+ * (手机连上就拉最近一窗消息,里面全是历史工具输出)。
31
+ *
32
+ * ⚠️ **代价如实记在这里**:`unknown` 是常态之一 —— 非 WebRTC 链路(同源 Broadcast 联调 /
33
+ * 测试注入的链路)永远读不到候选对,于是永远按精简发;真机上也存在「其实是直连、但首个
34
+ * 候选对还没定形」的几秒。这些情形下用户看到的是「工具输出已省略」而不是崩溃或空屏,
35
+ * 重开会话(重拉窗口)或链路判定为直连之后新产生的数据都会是完整的。
36
+ * **不要**把「联调时工具输出是空的」当成 bug 去修。
37
+ */
38
+ import type { LinkKind } from './link-kind'
39
+
40
+ /** 传输档位:`full` = 完整(含详细内容);`lean` = 精简(只发主要内容)。 */
41
+ export type TransferTier = 'full' | 'lean'
42
+
43
+ /**
44
+ * 两端都要声明/列出的**能力名**(手机端写进 `hello.capabilities`;电脑端写进 ACL 能力集)。
45
+ *
46
+ * 两端各表一半(能力协商本来就是「我会什么」的交集):
47
+ * - 手机端声明它 = 「我能渲染 `MessageDTO.detail` 的省略标记」;
48
+ * - 电脑端列出它 = 「我会按档位裁剪正文,并在裁掉时打标记」。
49
+ *
50
+ * **为什么裁剪必须被它挡住,而不能无条件裁**:已部署的旧手机端不认 `detail` 字段 ——
51
+ * 它的工具卡片会把「正文为空」显示成「这次调用没有输出」,而那是**假话**(工具有输出,
52
+ * 只是被省略了)。宁可对旧手机端继续全量发送,也不要在它的界面上写一句不成立的结论;
53
+ * 反过来,旧电脑端不认识这个能力名,新手机端也只是继续收完整正文,同样不会出问题。
54
+ */
55
+ export const MESSAGE_DETAIL_CAPABILITY = 'message.detail'
56
+
57
+ /**
58
+ * 链路类型 → 传输档位(**两端唯一口径**)。
59
+ *
60
+ * 纯函数:喂一个 `LinkKind` 即可,不碰 DOM、不碰 store,故可完整单测。
61
+ */
62
+ export function transferTierOf(kind: LinkKind): TransferTier {
63
+ return kind === 'direct' ? 'full' : 'lean'
64
+ }