@barryfan2045/dsh-matrix 0.1.0

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 (206) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +286 -0
  3. package/THIRD_PARTY_NOTICES.md +53 -0
  4. package/assets/avatars/instance-01.png +0 -0
  5. package/assets/avatars/instance-02.png +0 -0
  6. package/assets/avatars/instance-03.png +0 -0
  7. package/assets/avatars/instance-04.png +0 -0
  8. package/assets/avatars/instance-05.png +0 -0
  9. package/assets/avatars/instance-06.png +0 -0
  10. package/assets/avatars/instance-07.png +0 -0
  11. package/assets/avatars/instance-08.png +0 -0
  12. package/assets/avatars/instance-09.png +0 -0
  13. package/assets/avatars/instance-10.png +0 -0
  14. package/assets/avatars/instance-11.png +0 -0
  15. package/assets/avatars/instance-12.png +0 -0
  16. package/assets/avatars/management.png +0 -0
  17. package/cordis.patch.yml +13 -0
  18. package/dist/auth/admin-commands.d.ts +47 -0
  19. package/dist/auth/admin-commands.d.ts.map +1 -0
  20. package/dist/auth/admin-commands.js +112 -0
  21. package/dist/auth/admin-commands.js.map +1 -0
  22. package/dist/auth/challenge.d.ts +93 -0
  23. package/dist/auth/challenge.d.ts.map +1 -0
  24. package/dist/auth/challenge.js +104 -0
  25. package/dist/auth/challenge.js.map +1 -0
  26. package/dist/auth/store.d.ts +55 -0
  27. package/dist/auth/store.d.ts.map +1 -0
  28. package/dist/auth/store.js +124 -0
  29. package/dist/auth/store.js.map +1 -0
  30. package/dist/bridge/agent-commands.d.ts +39 -0
  31. package/dist/bridge/agent-commands.d.ts.map +1 -0
  32. package/dist/bridge/agent-commands.js +243 -0
  33. package/dist/bridge/agent-commands.js.map +1 -0
  34. package/dist/bridge/attachments-ledger.d.ts +54 -0
  35. package/dist/bridge/attachments-ledger.d.ts.map +1 -0
  36. package/dist/bridge/attachments-ledger.js +68 -0
  37. package/dist/bridge/attachments-ledger.js.map +1 -0
  38. package/dist/bridge/commands.d.ts +28 -0
  39. package/dist/bridge/commands.d.ts.map +1 -0
  40. package/dist/bridge/commands.js +18 -0
  41. package/dist/bridge/commands.js.map +1 -0
  42. package/dist/bridge/crypto-health.d.ts +37 -0
  43. package/dist/bridge/crypto-health.d.ts.map +1 -0
  44. package/dist/bridge/crypto-health.js +38 -0
  45. package/dist/bridge/crypto-health.js.map +1 -0
  46. package/dist/bridge/group-gate.d.ts +38 -0
  47. package/dist/bridge/group-gate.d.ts.map +1 -0
  48. package/dist/bridge/group-gate.js +49 -0
  49. package/dist/bridge/group-gate.js.map +1 -0
  50. package/dist/bridge/instance-lock.d.ts +10 -0
  51. package/dist/bridge/instance-lock.d.ts.map +1 -0
  52. package/dist/bridge/instance-lock.js +82 -0
  53. package/dist/bridge/instance-lock.js.map +1 -0
  54. package/dist/bridge/interactions.d.ts +62 -0
  55. package/dist/bridge/interactions.d.ts.map +1 -0
  56. package/dist/bridge/interactions.js +237 -0
  57. package/dist/bridge/interactions.js.map +1 -0
  58. package/dist/bridge/management-room.d.ts +13 -0
  59. package/dist/bridge/management-room.d.ts.map +1 -0
  60. package/dist/bridge/management-room.js +27 -0
  61. package/dist/bridge/management-room.js.map +1 -0
  62. package/dist/bridge/multi-project.d.ts +34 -0
  63. package/dist/bridge/multi-project.d.ts.map +1 -0
  64. package/dist/bridge/multi-project.js +44 -0
  65. package/dist/bridge/multi-project.js.map +1 -0
  66. package/dist/bridge/pipeline.d.ts +151 -0
  67. package/dist/bridge/pipeline.d.ts.map +1 -0
  68. package/dist/bridge/pipeline.js +502 -0
  69. package/dist/bridge/pipeline.js.map +1 -0
  70. package/dist/bridge/pmctl.d.ts +50 -0
  71. package/dist/bridge/pmctl.d.ts.map +1 -0
  72. package/dist/bridge/pmctl.js +272 -0
  73. package/dist/bridge/pmctl.js.map +1 -0
  74. package/dist/bridge/power-levels.d.ts +57 -0
  75. package/dist/bridge/power-levels.d.ts.map +1 -0
  76. package/dist/bridge/power-levels.js +92 -0
  77. package/dist/bridge/power-levels.js.map +1 -0
  78. package/dist/bridge/power-sync.d.ts +64 -0
  79. package/dist/bridge/power-sync.d.ts.map +1 -0
  80. package/dist/bridge/power-sync.js +121 -0
  81. package/dist/bridge/power-sync.js.map +1 -0
  82. package/dist/bridge/projects.d.ts +97 -0
  83. package/dist/bridge/projects.d.ts.map +1 -0
  84. package/dist/bridge/projects.js +288 -0
  85. package/dist/bridge/projects.js.map +1 -0
  86. package/dist/bridge/quote-cache.d.ts +38 -0
  87. package/dist/bridge/quote-cache.d.ts.map +1 -0
  88. package/dist/bridge/quote-cache.js +56 -0
  89. package/dist/bridge/quote-cache.js.map +1 -0
  90. package/dist/bridge/reply.d.ts +31 -0
  91. package/dist/bridge/reply.d.ts.map +1 -0
  92. package/dist/bridge/reply.js +122 -0
  93. package/dist/bridge/reply.js.map +1 -0
  94. package/dist/bridge/space-identity.d.ts +43 -0
  95. package/dist/bridge/space-identity.d.ts.map +1 -0
  96. package/dist/bridge/space-identity.js +92 -0
  97. package/dist/bridge/space-identity.js.map +1 -0
  98. package/dist/bridge/space-sync.d.ts +94 -0
  99. package/dist/bridge/space-sync.d.ts.map +1 -0
  100. package/dist/bridge/space-sync.js +137 -0
  101. package/dist/bridge/space-sync.js.map +1 -0
  102. package/dist/bridge/turn-commands.d.ts +28 -0
  103. package/dist/bridge/turn-commands.d.ts.map +1 -0
  104. package/dist/bridge/turn-commands.js +97 -0
  105. package/dist/bridge/turn-commands.js.map +1 -0
  106. package/dist/cli/config-store.d.ts +32 -0
  107. package/dist/cli/config-store.d.ts.map +1 -0
  108. package/dist/cli/config-store.js +118 -0
  109. package/dist/cli/config-store.js.map +1 -0
  110. package/dist/cli/crypto-store.d.ts +42 -0
  111. package/dist/cli/crypto-store.d.ts.map +1 -0
  112. package/dist/cli/crypto-store.js +70 -0
  113. package/dist/cli/crypto-store.js.map +1 -0
  114. package/dist/cli/device-prune.d.ts +105 -0
  115. package/dist/cli/device-prune.d.ts.map +1 -0
  116. package/dist/cli/device-prune.js +163 -0
  117. package/dist/cli/device-prune.js.map +1 -0
  118. package/dist/cli/index.d.ts +4 -0
  119. package/dist/cli/index.d.ts.map +1 -0
  120. package/dist/cli/index.js +584 -0
  121. package/dist/cli/index.js.map +1 -0
  122. package/dist/cli/log-filter.d.ts +32 -0
  123. package/dist/cli/log-filter.d.ts.map +1 -0
  124. package/dist/cli/log-filter.js +40 -0
  125. package/dist/cli/log-filter.js.map +1 -0
  126. package/dist/cli/pnpm-builds.d.ts +32 -0
  127. package/dist/cli/pnpm-builds.d.ts.map +1 -0
  128. package/dist/cli/pnpm-builds.js +73 -0
  129. package/dist/cli/pnpm-builds.js.map +1 -0
  130. package/dist/cli/profile-patch.d.ts +26 -0
  131. package/dist/cli/profile-patch.d.ts.map +1 -0
  132. package/dist/cli/profile-patch.js +56 -0
  133. package/dist/cli/profile-patch.js.map +1 -0
  134. package/dist/cli/setup.d.ts +39 -0
  135. package/dist/cli/setup.d.ts.map +1 -0
  136. package/dist/cli/setup.js +234 -0
  137. package/dist/cli/setup.js.map +1 -0
  138. package/dist/cli/systemd-hint.d.ts +11 -0
  139. package/dist/cli/systemd-hint.d.ts.map +1 -0
  140. package/dist/cli/systemd-hint.js +46 -0
  141. package/dist/cli/systemd-hint.js.map +1 -0
  142. package/dist/cli/systemd.d.ts +32 -0
  143. package/dist/cli/systemd.d.ts.map +1 -0
  144. package/dist/cli/systemd.js +58 -0
  145. package/dist/cli/systemd.js.map +1 -0
  146. package/dist/config.d.ts +54 -0
  147. package/dist/config.d.ts.map +1 -0
  148. package/dist/config.js +107 -0
  149. package/dist/config.js.map +1 -0
  150. package/dist/dsh/backend.d.ts +110 -0
  151. package/dist/dsh/backend.d.ts.map +1 -0
  152. package/dist/dsh/backend.js +481 -0
  153. package/dist/dsh/backend.js.map +1 -0
  154. package/dist/dsh/interactions.d.ts +50 -0
  155. package/dist/dsh/interactions.d.ts.map +1 -0
  156. package/dist/dsh/interactions.js +141 -0
  157. package/dist/dsh/interactions.js.map +1 -0
  158. package/dist/dsh/stream.d.ts +32 -0
  159. package/dist/dsh/stream.d.ts.map +1 -0
  160. package/dist/dsh/stream.js +109 -0
  161. package/dist/dsh/stream.js.map +1 -0
  162. package/dist/formatting.d.ts +14 -0
  163. package/dist/formatting.d.ts.map +1 -0
  164. package/dist/formatting.js +63 -0
  165. package/dist/formatting.js.map +1 -0
  166. package/dist/index.d.ts +8 -0
  167. package/dist/index.d.ts.map +1 -0
  168. package/dist/index.js +232 -0
  169. package/dist/index.js.map +1 -0
  170. package/dist/logger.d.ts +9 -0
  171. package/dist/logger.d.ts.map +1 -0
  172. package/dist/logger.js +28 -0
  173. package/dist/logger.js.map +1 -0
  174. package/dist/matrix/matrix-events.d.ts +49 -0
  175. package/dist/matrix/matrix-events.d.ts.map +1 -0
  176. package/dist/matrix/matrix-events.js +89 -0
  177. package/dist/matrix/matrix-events.js.map +1 -0
  178. package/dist/matrix/transport.d.ts +192 -0
  179. package/dist/matrix/transport.d.ts.map +1 -0
  180. package/dist/matrix/transport.js +510 -0
  181. package/dist/matrix/transport.js.map +1 -0
  182. package/dist/ports/attachments.d.ts +51 -0
  183. package/dist/ports/attachments.d.ts.map +1 -0
  184. package/dist/ports/attachments.js +27 -0
  185. package/dist/ports/attachments.js.map +1 -0
  186. package/dist/ports/backend.d.ts +159 -0
  187. package/dist/ports/backend.d.ts.map +1 -0
  188. package/dist/ports/backend.js +25 -0
  189. package/dist/ports/backend.js.map +1 -0
  190. package/dist/ports/interactions.d.ts +65 -0
  191. package/dist/ports/interactions.d.ts.map +1 -0
  192. package/dist/ports/interactions.js +15 -0
  193. package/dist/ports/interactions.js.map +1 -0
  194. package/dist/ports/streaming.d.ts +45 -0
  195. package/dist/ports/streaming.d.ts.map +1 -0
  196. package/dist/ports/streaming.js +23 -0
  197. package/dist/ports/streaming.js.map +1 -0
  198. package/dist/ports/transport.d.ts +68 -0
  199. package/dist/ports/transport.d.ts.map +1 -0
  200. package/dist/ports/transport.js +2 -0
  201. package/dist/ports/transport.js.map +1 -0
  202. package/dist/types.d.ts +53 -0
  203. package/dist/types.d.ts.map +1 -0
  204. package/dist/types.js +2 -0
  205. package/dist/types.js.map +1 -0
  206. package/package.json +80 -0
@@ -0,0 +1,163 @@
1
+ /**
2
+ * T14 后续:清理账号上的**孤儿设备**。
3
+ *
4
+ * 背景(见 docs/tickets/14-e2ee-bridge-regression.md):桥以前每次密码登录都**不带
5
+ * `device_id`**,Synapse 于是每次新建一个设备;累积起来不只是难看 ——
6
+ * 发送方每次加密都要对这一大堆设备做 keys/query、keys/claim 并逐个建 olm 会话,
7
+ * 实测把首次 sendMessage 拖到 6 分 13 秒。T14 已让桥不再造新设备,但**历史遗留**
8
+ * 的那些孤儿设备还在,本模块就是清理它们的显式入口。
9
+ *
10
+ * 设计原则(与 T13 §4 同一条):**显式、可见、不擅自**。
11
+ * - 默认只是**列出**(演练),必须 `--yes`(或交互确认)才真删;
12
+ * - 当前桥设备**永远保留**;
13
+ * - `--keep-days <n>` 可把"最近 n 天活动过"的设备一并保留(安全网,缺省 0 = 只留桥设备);
14
+ * - 删设备是**不可逆**的(私钥没了就是没了),所以这里绝不静默动手。
15
+ */
16
+ const DAY_MS = 24 * 60 * 60 * 1000;
17
+ /**
18
+ * 纯函数:算出"该删谁、留谁"。
19
+ *
20
+ * 判定顺序:当前桥设备 → 最近 keepDays 天活动过 → 其余都删。
21
+ * 没有 `last_seen_ts`(从未登录过)的设备一律算孤儿 —— 它们正是复位/改名留下的残骸。
22
+ */
23
+ export function planDevicePrune(input) {
24
+ const keepDays = input.keepDays ?? 0;
25
+ const keepMs = Math.max(0, keepDays) * DAY_MS;
26
+ const remove = [];
27
+ const retained = [];
28
+ let keepFound = false;
29
+ for (const device of input.devices) {
30
+ if (device.device_id === input.keep) {
31
+ keepFound = true;
32
+ retained.push({ device, why: '当前桥设备(永远保留)' });
33
+ continue;
34
+ }
35
+ const seen = typeof device.last_seen_ts === 'number' ? device.last_seen_ts : undefined;
36
+ if (seen !== undefined && keepMs > 0 && input.now - seen <= keepMs) {
37
+ retained.push({ device, why: `最近 ${keepDays} 天内活动过` });
38
+ continue;
39
+ }
40
+ remove.push(device);
41
+ }
42
+ return { keep: input.keep, keepFound, remove, retained };
43
+ }
44
+ /** 把 HTTP 响应解析成 JSON,失败时给一个可读的错。 */
45
+ async function readJson(res) {
46
+ const text = await res.text();
47
+ try {
48
+ return JSON.parse(text);
49
+ }
50
+ catch {
51
+ throw new Error(`服务端返回的不是 JSON(HTTP ${res.status}): ${text.slice(0, 200)}`);
52
+ }
53
+ }
54
+ function matrixError(status, body) {
55
+ return new Error(body.errcode ? `${status} ${body.errcode}: ${body.error ?? ''}` : `HTTP ${status}`);
56
+ }
57
+ export function createMatrixAdminOps(opts) {
58
+ const base = opts.homeserver.replace(/\/$/, '');
59
+ const doFetch = opts.fetchImpl ?? fetch;
60
+ const authHeaders = { authorization: `Bearer ${opts.accessToken}`, 'content-type': 'application/json' };
61
+ return {
62
+ async whoAmI() {
63
+ const res = await doFetch(`${base}/_matrix/client/v3/account/whoami`, { headers: authHeaders });
64
+ const body = await readJson(res);
65
+ if (!res.ok)
66
+ throw matrixError(res.status, body);
67
+ return body;
68
+ },
69
+ async listDevices() {
70
+ const res = await doFetch(`${base}/_matrix/client/v3/devices`, { headers: authHeaders });
71
+ const body = await readJson(res);
72
+ if (!res.ok)
73
+ throw matrixError(res.status, body);
74
+ const devices = body.devices;
75
+ return Array.isArray(devices) ? devices : [];
76
+ },
77
+ async deleteDevice(deviceId) {
78
+ const url = `${base}/_matrix/client/v3/devices/${encodeURIComponent(deviceId)}`;
79
+ const first = await doFetch(url, { method: 'DELETE', headers: authHeaders, body: '{}' });
80
+ if (first.ok)
81
+ return;
82
+ const body = (await readJson(first));
83
+ if (first.status !== 401)
84
+ throw matrixError(first.status, body);
85
+ // 401 = 要 UI auth(密码重认证),拿 session 走第二步。
86
+ if (!opts.password) {
87
+ throw new Error('删除设备需要重新输入密码,但配置里只有 accessToken —— 请用账密配置,或在 Element 里手动登出设备');
88
+ }
89
+ const session = typeof body.session === 'string' ? body.session : undefined;
90
+ const retry = await doFetch(url, {
91
+ method: 'DELETE',
92
+ headers: authHeaders,
93
+ body: JSON.stringify({
94
+ auth: {
95
+ type: 'm.login.password',
96
+ identifier: { type: 'm.id.user', user: opts.userId.replace(/^@/, '').replace(/:.*$/, '') },
97
+ password: opts.password,
98
+ ...(session ? { session } : {}),
99
+ },
100
+ }),
101
+ });
102
+ if (!retry.ok)
103
+ throw matrixError(retry.status, (await readJson(retry)));
104
+ },
105
+ };
106
+ }
107
+ /** 密码登录换一个 token;带 deviceId 时复用该设备(不新建)。 */
108
+ export async function loginForToken(opts) {
109
+ const base = opts.homeserver.replace(/\/$/, '');
110
+ const doFetch = opts.fetchImpl ?? fetch;
111
+ const res = await doFetch(`${base}/_matrix/client/v3/login`, {
112
+ method: 'POST',
113
+ headers: { 'content-type': 'application/json' },
114
+ body: JSON.stringify({
115
+ type: 'm.login.password',
116
+ identifier: { type: 'm.id.user', user: opts.username },
117
+ password: opts.password,
118
+ ...(opts.deviceId ? { device_id: opts.deviceId } : {}),
119
+ }),
120
+ });
121
+ const body = (await readJson(res));
122
+ if (!res.ok || !body.access_token)
123
+ throw matrixError(res.status, body);
124
+ return {
125
+ accessToken: body.access_token,
126
+ userId: body.user_id ?? '',
127
+ ...(body.device_id ? { deviceId: body.device_id } : {}),
128
+ };
129
+ }
130
+ /** 给人看的"最后活动"列。 */
131
+ export function formatLastSeen(ts, now) {
132
+ if (typeof ts !== 'number')
133
+ return '从未登录';
134
+ const days = Math.floor((now - ts) / DAY_MS);
135
+ const stamp = new Date(ts).toISOString().slice(0, 16).replace('T', ' ');
136
+ return days <= 0 ? `${stamp}(今天)` : `${stamp}(${days} 天前)`;
137
+ }
138
+ /**
139
+ * 选登录身份。
140
+ *
141
+ * **硬不变量:本命令绝不新建设备。** —— 一个"清理孤儿设备"的工具自己再造一个设备,
142
+ * 就正好是它要治的那毛病(实测踩到过:对着没有本地 crypto 存储的账号跑演练,直接多出
143
+ * 一个设备)。所以拿不到**既有**身份时明确拒绝,并告诉用户两条出路,而不是默默登录
144
+ * (密码登录不带 device_id 必然新建)。
145
+ */
146
+ export function chooseLoginIdentity(input) {
147
+ if (input.accessToken)
148
+ return { mode: 'token' };
149
+ if (!input.username || !input.password) {
150
+ return { mode: 'unavailable', message: '配置里既没有 accessToken,也没有 username/password。先跑 dsh-matrix setup' };
151
+ }
152
+ if (!input.storedDeviceId) {
153
+ return {
154
+ mode: 'unavailable',
155
+ message: `没找到桥的设备身份(${input.cryptoDir}/bot-sdk.json 里没有 deviceId)。\n` +
156
+ ' 本命令不会新建设备,因此就此中止、不删任何东西。两条出路:\n' +
157
+ ' 1) 用桥实际所在的 DSH_HOME(或 --data-dir)指到那份 crypto 存储 —— 桥跑过一次就会有;\n' +
158
+ ' 2) 在该 DSH_HOME 的 dsh-matrix.json 里加 accessToken(清理账号级设备不需要本地存储)。',
159
+ };
160
+ }
161
+ return { mode: 'password', deviceId: input.storedDeviceId };
162
+ }
163
+ //# sourceMappingURL=device-prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-prune.js","sourceRoot":"","sources":["../../src/cli/device-prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ /** 找 dsh 启动器绝对路径:先同目录 bin(node <path> 可直接执行),再 PATH。 */
3
+ export declare function resolveDshBin(execPath?: string): string | null;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAsDA,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,QAAQ,GAAE,MAAyB,GAAG,MAAM,GAAG,IAAI,CAahF"}