@agentunion/fastaun-browser 0.2.20 → 0.3.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 (128) hide show
  1. package/CHANGELOG.md +66 -26
  2. package/README.md +0 -1
  3. package/_packed_docs/CHANGELOG.md +66 -26
  4. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +542 -0
  5. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1 -24
  6. package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +419 -0
  7. package/_packed_docs/protocol/index.md +13 -3
  8. package/_packed_docs/python-sdk-v2-only-changelog.md +189 -0
  9. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +39 -16
  10. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +131 -39
  11. package/_packed_docs/sdk/09-message-rpc-manual.md +30 -67
  12. package/dist/auth.d.ts.map +1 -1
  13. package/dist/auth.js +25 -5
  14. package/dist/auth.js.map +1 -1
  15. package/dist/bundle.js +15042 -0
  16. package/dist/client.d.ts +179 -187
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +3148 -3993
  19. package/dist/client.js.map +1 -1
  20. package/dist/config.d.ts +0 -4
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +0 -4
  23. package/dist/config.js.map +1 -1
  24. package/dist/crypto.d.ts +8 -1
  25. package/dist/crypto.d.ts.map +1 -1
  26. package/dist/crypto.js +114 -1
  27. package/dist/crypto.js.map +1 -1
  28. package/dist/e2ee.d.ts +5 -210
  29. package/dist/e2ee.d.ts.map +1 -1
  30. package/dist/e2ee.js +4 -1379
  31. package/dist/e2ee.js.map +1 -1
  32. package/dist/index.d.ts +7 -3
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +5 -4
  35. package/dist/index.js.map +1 -1
  36. package/dist/namespaces/auth.d.ts +9 -0
  37. package/dist/namespaces/auth.d.ts.map +1 -1
  38. package/dist/namespaces/auth.js +248 -4
  39. package/dist/namespaces/auth.js.map +1 -1
  40. package/dist/protected-headers.d.ts +14 -0
  41. package/dist/protected-headers.d.ts.map +1 -0
  42. package/dist/protected-headers.js +47 -0
  43. package/dist/protected-headers.js.map +1 -0
  44. package/dist/seq-tracker.d.ts +7 -2
  45. package/dist/seq-tracker.d.ts.map +1 -1
  46. package/dist/seq-tracker.js +33 -13
  47. package/dist/seq-tracker.js.map +1 -1
  48. package/dist/transport.d.ts +9 -1
  49. package/dist/transport.d.ts.map +1 -1
  50. package/dist/transport.js +262 -10
  51. package/dist/transport.js.map +1 -1
  52. package/dist/v2/crypto/aead.d.ts +26 -0
  53. package/dist/v2/crypto/aead.d.ts.map +1 -0
  54. package/dist/v2/crypto/aead.js +63 -0
  55. package/dist/v2/crypto/aead.js.map +1 -0
  56. package/dist/v2/crypto/canonical.d.ts +21 -0
  57. package/dist/v2/crypto/canonical.d.ts.map +1 -0
  58. package/dist/v2/crypto/canonical.js +111 -0
  59. package/dist/v2/crypto/canonical.js.map +1 -0
  60. package/dist/v2/crypto/dh-path.d.ts +21 -0
  61. package/dist/v2/crypto/dh-path.d.ts.map +1 -0
  62. package/dist/v2/crypto/dh-path.js +50 -0
  63. package/dist/v2/crypto/dh-path.js.map +1 -0
  64. package/dist/v2/crypto/ecdh.d.ts +19 -0
  65. package/dist/v2/crypto/ecdh.d.ts.map +1 -0
  66. package/dist/v2/crypto/ecdh.js +101 -0
  67. package/dist/v2/crypto/ecdh.js.map +1 -0
  68. package/dist/v2/crypto/ecdsa.d.ts +16 -0
  69. package/dist/v2/crypto/ecdsa.d.ts.map +1 -0
  70. package/dist/v2/crypto/ecdsa.js +52 -0
  71. package/dist/v2/crypto/ecdsa.js.map +1 -0
  72. package/dist/v2/crypto/hkdf.d.ts +21 -0
  73. package/dist/v2/crypto/hkdf.d.ts.map +1 -0
  74. package/dist/v2/crypto/hkdf.js +32 -0
  75. package/dist/v2/crypto/hkdf.js.map +1 -0
  76. package/dist/v2/crypto/index.d.ts +9 -0
  77. package/dist/v2/crypto/index.d.ts.map +1 -0
  78. package/dist/v2/crypto/index.js +8 -0
  79. package/dist/v2/crypto/index.js.map +1 -0
  80. package/dist/v2/crypto/recipients.d.ts +43 -0
  81. package/dist/v2/crypto/recipients.d.ts.map +1 -0
  82. package/dist/v2/crypto/recipients.js +188 -0
  83. package/dist/v2/crypto/recipients.js.map +1 -0
  84. package/dist/v2/e2ee/decrypt.d.ts +13 -0
  85. package/dist/v2/e2ee/decrypt.d.ts.map +1 -0
  86. package/dist/v2/e2ee/decrypt.js +176 -0
  87. package/dist/v2/e2ee/decrypt.js.map +1 -0
  88. package/dist/v2/e2ee/encrypt-group.d.ts +14 -0
  89. package/dist/v2/e2ee/encrypt-group.d.ts.map +1 -0
  90. package/dist/v2/e2ee/encrypt-group.js +196 -0
  91. package/dist/v2/e2ee/encrypt-group.js.map +1 -0
  92. package/dist/v2/e2ee/encrypt-p2p.d.ts +15 -0
  93. package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -0
  94. package/dist/v2/e2ee/encrypt-p2p.js +240 -0
  95. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -0
  96. package/dist/v2/e2ee/index.d.ts +9 -0
  97. package/dist/v2/e2ee/index.d.ts.map +1 -0
  98. package/dist/v2/e2ee/index.js +9 -0
  99. package/dist/v2/e2ee/index.js.map +1 -0
  100. package/dist/v2/e2ee/metadata-auth.d.ts +9 -0
  101. package/dist/v2/e2ee/metadata-auth.d.ts.map +1 -0
  102. package/dist/v2/e2ee/metadata-auth.js +60 -0
  103. package/dist/v2/e2ee/metadata-auth.js.map +1 -0
  104. package/dist/v2/e2ee/types.d.ts +57 -0
  105. package/dist/v2/e2ee/types.d.ts.map +1 -0
  106. package/dist/v2/e2ee/types.js +7 -0
  107. package/dist/v2/e2ee/types.js.map +1 -0
  108. package/dist/v2/session/index.d.ts +4 -0
  109. package/dist/v2/session/index.d.ts.map +1 -0
  110. package/dist/v2/session/index.js +3 -0
  111. package/dist/v2/session/index.js.map +1 -0
  112. package/dist/v2/session/keystore.d.ts +57 -0
  113. package/dist/v2/session/keystore.d.ts.map +1 -0
  114. package/dist/v2/session/keystore.js +244 -0
  115. package/dist/v2/session/keystore.js.map +1 -0
  116. package/dist/v2/session/session.d.ts +121 -0
  117. package/dist/v2/session/session.d.ts.map +1 -0
  118. package/dist/v2/session/session.js +344 -0
  119. package/dist/v2/session/session.js.map +1 -0
  120. package/dist/v2/state/commitment.d.ts +10 -0
  121. package/dist/v2/state/commitment.d.ts.map +1 -0
  122. package/dist/v2/state/commitment.js +86 -0
  123. package/dist/v2/state/commitment.js.map +1 -0
  124. package/dist/v2/state/index.d.ts +2 -0
  125. package/dist/v2/state/index.d.ts.map +1 -0
  126. package/dist/v2/state/index.js +2 -0
  127. package/dist/v2/state/index.js.map +1 -0
  128. package/package.json +8 -5
@@ -0,0 +1,344 @@
1
+ /**
2
+ * AUN E2EE V2 Session Manager(浏览器版,全 async)。
3
+ *
4
+ * 与 Python `aun_core.v2.session.V2Session` 行为对齐:
5
+ * - IK = AID 长期密钥(多设备共享 AID 身份),由构造函数注入,不独立生成
6
+ * - SPK 设备级 P-256 密钥对,IK 签名背书
7
+ * - SPK 销毁三重条件:
8
+ * contig_seq >= 该 SPK 引用的最大 seq
9
+ * && now - last_seen >= 7 小时
10
+ * && 不在最近 7 代保留窗口内
11
+ * - 对端 IK 公钥缓存 TTL 1 小时
12
+ * - SPK 注册:`callFn("message.v2.put_peer_pk", ...)`
13
+ *
14
+ * 浏览器目标:所有 store 调用均 `await`,签名走 noble(确定性 ECDSA)。
15
+ */
16
+ import { generateP256Keypair, ecdsaSignRaw } from '../crypto/index';
17
+ /** 对端 IK 公钥缓存 TTL(毫秒)。 */
18
+ export const PEER_KEY_CACHE_TTL_MS = 60 * 60 * 1000; // 1h
19
+ /** SPK 销毁安全窗口(毫秒)。 */
20
+ export const DESTROY_DELAY_MS = 7 * 24 * 60 * 60 * 1000; // 7 天
21
+ /** SPK 销毁时保留的最近代数。 */
22
+ export const RECENT_GENERATIONS = 7;
23
+ /** SPK 180 天硬上限。 */
24
+ export const HARD_LIMIT_MS = 180 * 24 * 60 * 60 * 1000;
25
+ async function sha256Hex(data) {
26
+ const buf = await crypto.subtle.digest('SHA-256', data.slice().buffer);
27
+ const arr = new Uint8Array(buf);
28
+ let hex = '';
29
+ for (let i = 0; i < arr.length; i++)
30
+ hex += arr[i].toString(16).padStart(2, '0');
31
+ return hex;
32
+ }
33
+ function bytesToBase64(b) {
34
+ let bin = '';
35
+ for (let i = 0; i < b.length; i++)
36
+ bin += String.fromCharCode(b[i]);
37
+ return btoa(bin);
38
+ }
39
+ function concatBytes(...parts) {
40
+ let total = 0;
41
+ for (const p of parts)
42
+ total += p.length;
43
+ const out = new Uint8Array(total);
44
+ let offset = 0;
45
+ for (const p of parts) {
46
+ out.set(p, offset);
47
+ offset += p.length;
48
+ }
49
+ return out;
50
+ }
51
+ export class V2Session {
52
+ _store;
53
+ _deviceId;
54
+ _aid;
55
+ _ikPriv;
56
+ _ikPubDer;
57
+ _spkId = '';
58
+ _spkPriv;
59
+ _spkPubDer;
60
+ _registered = false;
61
+ _lastUploadedSPKId = '';
62
+ _lastUploadedGroupSPKIds = new Map();
63
+ _peerIKCache = new Map();
64
+ _verifiedSPKs = new Set();
65
+ _oldSPKMaxSeq = new Map();
66
+ _nowFn = () => Date.now();
67
+ constructor(store, deviceId, aid, ikPriv, ikPubDer) {
68
+ if (!ikPriv || !ikPubDer) {
69
+ throw new Error('V2Session requires AID priv/pub keys (IK = AID identity)');
70
+ }
71
+ this._store = store;
72
+ this._deviceId = deviceId;
73
+ this._aid = aid;
74
+ this._ikPriv = ikPriv;
75
+ this._ikPubDer = ikPubDer;
76
+ }
77
+ /** 测试用:注入虚拟时钟。 */
78
+ _setNowFn(fn) {
79
+ this._nowFn = fn;
80
+ }
81
+ get deviceId() {
82
+ return this._deviceId;
83
+ }
84
+ get aid() {
85
+ return this._aid;
86
+ }
87
+ get currentSpkId() {
88
+ return this._spkId;
89
+ }
90
+ get currentIkPubDer() {
91
+ return this._ikPubDer;
92
+ }
93
+ /** 暴露 store 以便测试(与 Python 同等私有约定)。 */
94
+ get _storeForTest() {
95
+ return this._store;
96
+ }
97
+ /** 加载或生成当前 SPK;IK 由构造函数注入,无需加载。 */
98
+ async ensureKeys() {
99
+ if (this._spkPriv)
100
+ return;
101
+ const cur = await this._store.loadCurrentSPK(this._deviceId);
102
+ if (cur) {
103
+ this._spkId = cur.spkId;
104
+ this._spkPriv = cur.priv;
105
+ this._spkPubDer = cur.pubDer;
106
+ return;
107
+ }
108
+ await this._generateNewSPK();
109
+ }
110
+ async _generateNewSPK() {
111
+ const [priv, pubDer] = await generateP256Keypair();
112
+ const hex = await sha256Hex(pubDer);
113
+ const spkId = `sha256:${hex.substring(0, 16)}`;
114
+ await this._store.saveSPK(this._deviceId, spkId, priv, pubDer);
115
+ this._spkId = spkId;
116
+ this._spkPriv = priv;
117
+ this._spkPubDer = pubDer;
118
+ }
119
+ /** SPK 由 AID 私钥(IK)签名背书并上报到 message.v2.put_peer_pk。 */
120
+ async _registerSPK(callFn) {
121
+ const spkTimestamp = Math.floor(this._nowFn() / 1000);
122
+ const enc = new TextEncoder();
123
+ const signData = concatBytes(this._spkPubDer, enc.encode(this._spkId), enc.encode(String(spkTimestamp)));
124
+ const signature = await ecdsaSignRaw(this._ikPriv, signData);
125
+ await callFn('message.v2.put_peer_pk', {
126
+ peer_aid: this._aid,
127
+ key_source: 'peer_device_prekey',
128
+ spk_id: this._spkId,
129
+ spk_pk: bytesToBase64(this._spkPubDer),
130
+ spk_signature: bytesToBase64(signature),
131
+ spk_timestamp: spkTimestamp,
132
+ });
133
+ }
134
+ /** 注册本设备 SPK 到服务端。IK = AID 长期密钥,无需注册。幂等。 */
135
+ async ensureRegistered(callFn) {
136
+ if (this._registered)
137
+ return;
138
+ await this.ensureKeys();
139
+ await this._registerSPK(callFn);
140
+ this._registered = true;
141
+ this._lastUploadedSPKId = this._spkId;
142
+ }
143
+ /** 返回加密所需的 sender 结构。 */
144
+ async getSenderIdentity() {
145
+ await this.ensureKeys();
146
+ return {
147
+ aid: this._aid,
148
+ deviceId: this._deviceId,
149
+ ikPriv: this._ikPriv,
150
+ ikPubDer: this._ikPubDer,
151
+ };
152
+ }
153
+ /**
154
+ * 返回解密所需的私钥。
155
+ * - spkId 空:1DH(仅 IK)
156
+ * - spkId == 当前 SPK:当前 spkPriv
157
+ * - 否则:从 store 加载旧 SPK 私钥(可能 undefined = 已销毁)
158
+ */
159
+ async getDecryptKeys(spkId) {
160
+ await this.ensureKeys();
161
+ if (!spkId)
162
+ return { ikPriv: this._ikPriv };
163
+ if (spkId === this._spkId)
164
+ return { ikPriv: this._ikPriv, spkPriv: this._spkPriv };
165
+ const oldSPK = await this._store.loadSPK(this._deviceId, spkId);
166
+ if (!oldSPK)
167
+ return { ikPriv: this._ikPriv };
168
+ return { ikPriv: this._ikPriv, spkPriv: oldSPK };
169
+ }
170
+ /** 判断 spkId 是否命中当前活跃 SPK。 */
171
+ isCurrentSPK(spkId) {
172
+ return Boolean(spkId) && spkId === this._spkId;
173
+ }
174
+ /** 跟踪每个旧 SPK 引用的最大 seq(用于销毁判定)。 */
175
+ trackOldSPKMaxSeq(spkId, seq) {
176
+ if (!spkId || spkId === this._spkId)
177
+ return;
178
+ const cur = this._oldSPKMaxSeq.get(spkId);
179
+ const curSeq = cur ? cur.seq : 0;
180
+ if (seq > curSeq) {
181
+ this._oldSPKMaxSeq.set(spkId, { seq, lastSeenAt: this._nowFn() });
182
+ }
183
+ }
184
+ /**
185
+ * contig_seq 已覆盖、超过 7 天安全窗口、且不在最近 7 代保留窗口内时销毁。
186
+ *
187
+ * 销毁条件(全部满足才销毁):
188
+ * - contig_seq >= 该 SPK 引用的最大 seq
189
+ * - 自最后一次见到该 spk_id 引用 >= 7 天
190
+ * - 不在最近 7 代 SPK 保留窗口内
191
+ */
192
+ async maybeDestroyOldSPKs(contigSeq) {
193
+ const destroyed = [];
194
+ const now = this._nowFn();
195
+ let recentKeep;
196
+ try {
197
+ recentKeep = new Set(await this._store.listRecentSPKIds(this._deviceId, RECENT_GENERATIONS));
198
+ }
199
+ catch {
200
+ // 列表失败时退化为空集,保持销毁行为可继续推进
201
+ recentKeep = new Set();
202
+ }
203
+ for (const [spkId, info] of Array.from(this._oldSPKMaxSeq.entries())) {
204
+ if (spkId === this._spkId)
205
+ continue;
206
+ if (contigSeq < info.seq)
207
+ continue;
208
+ if (now - info.lastSeenAt < DESTROY_DELAY_MS)
209
+ continue;
210
+ if (recentKeep.has(spkId))
211
+ continue;
212
+ try {
213
+ await this._store.deleteSPK(this._deviceId, spkId);
214
+ }
215
+ catch (err) {
216
+ // 销毁失败时记录到控制台并跳过本轮,下次再重试
217
+ // eslint-disable-next-line no-console
218
+ console.warn('[V2Session] deleteSPK failed', { spkId, err });
219
+ continue;
220
+ }
221
+ this._oldSPKMaxSeq.delete(spkId);
222
+ destroyed.push(spkId);
223
+ }
224
+ // 180 天硬上限:无论是否被引用,超龄 SPK 强制销毁
225
+ try {
226
+ const expired = await this._store.listExpiredSPKIds(this._deviceId, HARD_LIMIT_MS);
227
+ for (const spkId of expired) {
228
+ if (spkId === this._spkId)
229
+ continue;
230
+ try {
231
+ await this._store.deleteSPK(this._deviceId, spkId);
232
+ }
233
+ catch {
234
+ continue;
235
+ }
236
+ this._oldSPKMaxSeq.delete(spkId);
237
+ if (!destroyed.includes(spkId))
238
+ destroyed.push(spkId);
239
+ }
240
+ }
241
+ catch { /* ignore */ }
242
+ return destroyed;
243
+ }
244
+ /** 轮换 SPK:生成新 SPK 并上报到服务端。旧 SPK 保留本地用于解密。 */
245
+ async rotateSPK(callFn) {
246
+ await this._generateNewSPK();
247
+ await this._registerSPK(callFn);
248
+ this._lastUploadedSPKId = this._spkId;
249
+ }
250
+ /** 判断 spkId 是否为本进程最后一次成功上传的 P2P SPK。 */
251
+ isLastUploadedSPK(spkId) {
252
+ return Boolean(spkId) && spkId === this._lastUploadedSPKId;
253
+ }
254
+ /** 判断 spkId 是否为本进程在该群最后一次成功上传的 group SPK。 */
255
+ isLastUploadedGroupSPK(groupId, spkId) {
256
+ if (!spkId)
257
+ return false;
258
+ const gk = (groupId || '').trim();
259
+ return this._lastUploadedGroupSPKIds.get(gk) === spkId;
260
+ }
261
+ // ---------- Group SPK ----------
262
+ /** 确保指定群有独立 group SPK,返回 { spkId, priv, pubDer }。 */
263
+ async ensureGroupSPK(groupId) {
264
+ await this.ensureKeys();
265
+ const gk = (groupId || '').trim();
266
+ const existing = await this._store.loadCurrentGroupSPK(this._deviceId, gk);
267
+ if (existing)
268
+ return existing;
269
+ const [priv, pubDer] = await generateP256Keypair();
270
+ const hex = await sha256Hex(pubDer);
271
+ const spkId = `sha256:${hex.substring(0, 16)}`;
272
+ await this._store.saveGroupSPK(this._deviceId, gk, spkId, priv, pubDer);
273
+ return { spkId, priv, pubDer };
274
+ }
275
+ /** 注册指定群的 group SPK。group 服务负责成员鉴权。 */
276
+ async ensureGroupRegistered(groupId, callFn) {
277
+ await this.ensureKeys();
278
+ const gk = (groupId || '').trim();
279
+ const { spkId, pubDer } = await this.ensureGroupSPK(gk);
280
+ await this._publishGroupSPK(gk, spkId, pubDer, callFn);
281
+ }
282
+ /** 轮换指定群的 group SPK,保留旧私钥用于缓存窗口内的历史 wrap 解密。 */
283
+ async rotateGroupSPK(groupId, callFn) {
284
+ await this.ensureKeys();
285
+ const gk = (groupId || '').trim();
286
+ const [priv, pubDer] = await generateP256Keypair();
287
+ const hex = await sha256Hex(pubDer);
288
+ const spkId = `sha256:${hex.substring(0, 16)}`;
289
+ await this._store.saveGroupSPK(this._deviceId, gk, spkId, priv, pubDer);
290
+ await this._publishGroupSPK(gk, spkId, pubDer, callFn);
291
+ return { spkId, priv, pubDer };
292
+ }
293
+ /** 群消息解密优先查 group SPK;找不到时 fallback 旧 P2P SPK 兼容历史消息。 */
294
+ async getGroupDecryptKeys(groupId, spkId) {
295
+ await this.ensureKeys();
296
+ const gk = (groupId || '').trim();
297
+ if (!spkId)
298
+ return { ikPriv: this._ikPriv };
299
+ const groupSpk = await this._store.loadGroupSPK(this._deviceId, gk, spkId);
300
+ if (groupSpk)
301
+ return { ikPriv: this._ikPriv, spkPriv: groupSpk };
302
+ // fallback 到 P2P SPK
303
+ return this.getDecryptKeys(spkId);
304
+ }
305
+ async _publishGroupSPK(groupId, spkId, spkPubDer, callFn) {
306
+ const spkTimestamp = Math.floor(this._nowFn() / 1000);
307
+ const enc = new TextEncoder();
308
+ const signData = concatBytes(spkPubDer, enc.encode(spkId), enc.encode(String(spkTimestamp)));
309
+ const signature = await ecdsaSignRaw(this._ikPriv, signData);
310
+ await callFn('group.v2.put_group_pk', {
311
+ group_id: groupId,
312
+ key_source: 'group_device_prekey',
313
+ spk_id: spkId,
314
+ spk_pk: bytesToBase64(spkPubDer),
315
+ spk_signature: bytesToBase64(signature),
316
+ spk_timestamp: spkTimestamp,
317
+ });
318
+ this._lastUploadedGroupSPKIds.set(groupId, spkId);
319
+ }
320
+ cachePeerIK(peerAid, deviceId, ikPubDer) {
321
+ this._peerIKCache.set(`${peerAid}#${deviceId}`, {
322
+ pubDer: ikPubDer,
323
+ cachedAt: this._nowFn(),
324
+ });
325
+ }
326
+ getPeerIK(peerAid, deviceId) {
327
+ const key = `${peerAid}#${deviceId}`;
328
+ const entry = this._peerIKCache.get(key);
329
+ if (!entry)
330
+ return null;
331
+ if (this._nowFn() - entry.cachedAt >= PEER_KEY_CACHE_TTL_MS) {
332
+ this._peerIKCache.delete(key);
333
+ return null;
334
+ }
335
+ return entry.pubDer;
336
+ }
337
+ isPeerSPKVerified(peerAid, deviceId, spkId) {
338
+ return this._verifiedSPKs.has(`${peerAid}#${deviceId}#${spkId}`);
339
+ }
340
+ markPeerSPKVerified(peerAid, deviceId, spkId) {
341
+ this._verifiedSPKs.add(`${peerAid}#${deviceId}#${spkId}`);
342
+ }
343
+ }
344
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/v2/session/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const STATE_PREFIX: Uint8Array<ArrayBuffer>;
2
+ /**
3
+ * 计算 state_commitment(64 hex)。
4
+ *
5
+ * @param groupId 群 ID
6
+ * @param epoch 当前 epoch(uint32 big-endian 编入)
7
+ * @param statePayload 状态负载(members / audit_aids / admin_set / ...)
8
+ */
9
+ export declare function computeStateCommitment(groupId: string, epoch: number, statePayload: unknown): Promise<string>;
10
+ //# sourceMappingURL=commitment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitment.d.ts","sourceRoot":"","sources":["../../../src/v2/state/commitment.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,YAAY,yBAA2C,CAAC;AA0DrE;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * AUN E2EE V2: State Commitment 计算
3
+ *
4
+ * 规范引用: §6.2
5
+ *
6
+ * state_commitment = SHA256(
7
+ * "AUN-V2-SC-v1" || group_id || uint32(epoch) || canonical_json(sorted_payload)
8
+ * )
9
+ *
10
+ * sorted_payload 规则:
11
+ * - members 按 aid 排序,每个 member 的 devices 按 device_id 排序
12
+ * - audit_aids 排序
13
+ * - admin_set.admin_aids 排序
14
+ * - recovery_quorum.quorum_aids 排序
15
+ *
16
+ * 浏览器实现:使用 WebCrypto subtle.digest('SHA-256'),async。
17
+ */
18
+ import { canonicalJson } from '../crypto/canonical';
19
+ export const STATE_PREFIX = new TextEncoder().encode('AUN-V2-SC-v1');
20
+ /** 深拷贝(state_payload 仅含 JSON 兼容值) */
21
+ function deepClone(x) {
22
+ return JSON.parse(JSON.stringify(x));
23
+ }
24
+ function sortPayload(payload) {
25
+ if (Array.isArray(payload.members)) {
26
+ payload.members.sort((a, b) => {
27
+ const ka = a.aid ?? '';
28
+ const kb = b.aid ?? '';
29
+ return ka < kb ? -1 : ka > kb ? 1 : 0;
30
+ });
31
+ for (const m of payload.members) {
32
+ if (Array.isArray(m.devices)) {
33
+ m.devices.sort((a, b) => {
34
+ const ka = a.device_id ?? '';
35
+ const kb = b.device_id ?? '';
36
+ return ka < kb ? -1 : ka > kb ? 1 : 0;
37
+ });
38
+ }
39
+ }
40
+ }
41
+ if (Array.isArray(payload.audit_aids))
42
+ payload.audit_aids.sort();
43
+ if (payload.admin_set
44
+ && typeof payload.admin_set === 'object'
45
+ && Array.isArray(payload.admin_set.admin_aids)) {
46
+ payload.admin_set.admin_aids.sort();
47
+ }
48
+ if (payload.recovery_quorum
49
+ && typeof payload.recovery_quorum === 'object'
50
+ && Array.isArray(payload.recovery_quorum.quorum_aids)) {
51
+ payload.recovery_quorum.quorum_aids.sort();
52
+ }
53
+ }
54
+ /**
55
+ * 计算 state_commitment(64 hex)。
56
+ *
57
+ * @param groupId 群 ID
58
+ * @param epoch 当前 epoch(uint32 big-endian 编入)
59
+ * @param statePayload 状态负载(members / audit_aids / admin_set / ...)
60
+ */
61
+ export async function computeStateCommitment(groupId, epoch, statePayload) {
62
+ const sorted = deepClone(statePayload);
63
+ sortPayload(sorted);
64
+ const groupBytes = new TextEncoder().encode(groupId);
65
+ const epochBytes = new Uint8Array(4);
66
+ // big-endian uint32
67
+ new DataView(epochBytes.buffer).setUint32(0, epoch >>> 0, false);
68
+ const payloadBytes = canonicalJson(sorted);
69
+ const total = STATE_PREFIX.length + groupBytes.length + 4 + payloadBytes.length;
70
+ const data = new Uint8Array(total);
71
+ let pos = 0;
72
+ data.set(STATE_PREFIX, pos);
73
+ pos += STATE_PREFIX.length;
74
+ data.set(groupBytes, pos);
75
+ pos += groupBytes.length;
76
+ data.set(epochBytes, pos);
77
+ pos += 4;
78
+ data.set(payloadBytes, pos);
79
+ const hashBuf = await crypto.subtle.digest('SHA-256', data.slice().buffer);
80
+ const hash = new Uint8Array(hashBuf);
81
+ let hex = '';
82
+ for (let i = 0; i < hash.length; i++)
83
+ hex += hash[i].toString(16).padStart(2, '0');
84
+ return hex;
85
+ }
86
+ //# sourceMappingURL=commitment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitment.js","sourceRoot":"","sources":["../../../src/v2/state/commitment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { computeStateCommitment, STATE_PREFIX } from './commitment';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/v2/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { computeStateCommitment, STATE_PREFIX } from './commitment';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/v2/state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentunion/fastaun-browser",
3
- "version": "0.2.20",
3
+ "version": "0.3.1",
4
4
  "description": "AUN Protocol Core SDK for Browser",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -21,13 +21,13 @@
21
21
  "LICENSE"
22
22
  ],
23
23
  "scripts": {
24
- "build": "tsc",
24
+ "build": "tsc && esbuild src/index.ts --bundle --format=esm --outfile=dist/bundle.js --platform=browser --target=es2020",
25
25
  "prepack": "python ../scripts/sync_packed_docs.py js",
26
26
  "test": "vitest run --environment jsdom",
27
27
  "test:unit": "vitest run --environment jsdom tests/unit",
28
- "test:integration": "vitest run --environment jsdom tests/integration",
29
- "test:e2e": "npm run build && playwright test --config=playwright.agentid-local.config.ts tests/e2e-browser/e2ee.spec.ts --reporter=line",
30
- "test:e2e:smoke": "npm run build && playwright test --config=playwright.agentid-local.config.ts tests/e2e-browser/e2ee.spec.ts --grep \"SDK 创建 AID\" --reporter=line"
28
+ "test:integration": "vitest run --environment jsdom --no-file-parallelism --maxWorkers=1 tests/integration",
29
+ "test:e2e": "npm run build && playwright test --config=playwright.agentid-local.config.ts tests/e2e-browser/v2-p2p.spec.ts tests/e2e-browser/v2-group.spec.ts tests/e2e-browser/v2-thought.spec.ts --reporter=line",
30
+ "test:e2e:smoke": "npm run build && playwright test --config=playwright.agentid-local.config.ts tests/e2e-browser/v2-p2p.spec.ts --grep \"V2 session 自动初始化\" --reporter=line"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@playwright/test": "^1.59.1",
@@ -36,5 +36,8 @@
36
36
  "jsdom": "^25.0.0",
37
37
  "typescript": "^5.6.0",
38
38
  "vitest": "^2.0.0"
39
+ },
40
+ "dependencies": {
41
+ "@noble/curves": "^2.2.0"
39
42
  }
40
43
  }