@agentunion/fastaun-browser 0.2.19 → 0.3.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 (184) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/_packed_docs/CHANGELOG.md +50 -0
  3. package/_packed_docs/agent.md/SCHEMA.md +173 -0
  4. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +61 -0
  5. package/_packed_docs/agent.md/examples/human-developer.md +60 -0
  6. package/_packed_docs/agent.md/examples/openclaw-lobster.md +52 -0
  7. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +43 -0
  8. package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +205 -0
  9. package/_packed_docs/protocol/00A-/350/256/276/350/256/241/345/216/237/345/210/231-/344/270/272Agent/350/200/214/347/224/237.md +197 -0
  10. package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +549 -0
  11. package/_packed_docs/protocol/02-/350/257/201/344/271/246/344/270/216/344/277/241/344/273/273/344/275/223/347/263/273.md +810 -0
  12. package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +262 -0
  13. package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +180 -0
  14. package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +164 -0
  15. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1135 -0
  16. package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +234 -0
  17. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +900 -0
  18. package/_packed_docs/protocol/08-AUN-E2EE.md +413 -0
  19. package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +316 -0
  20. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +804 -0
  21. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +271 -0
  22. package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +329 -0
  23. package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +141 -0
  24. package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +170 -0
  25. 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
  26. package/_packed_docs/protocol/README.md +71 -0
  27. package/_packed_docs/protocol/agent.md/SCHEMA.md +118 -0
  28. package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +61 -0
  29. package/_packed_docs/protocol/agent.md/examples/human-developer.md +60 -0
  30. package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +52 -0
  31. package/_packed_docs/protocol/aun-docs-guide.md +49 -0
  32. package/_packed_docs/protocol/index.md +124 -0
  33. package/_packed_docs/protocol//350/215/211/346/241/210-agent.md/347/255/276/345/220/215/345/215/217/350/256/256.md +205 -0
  34. package/_packed_docs/protocol//350/215/211/346/241/210-/346/213/222/347/273/235/344/277/241/345/217/267/345/215/217/350/256/256.md +249 -0
  35. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +337 -0
  36. package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +80 -0
  37. package/_packed_docs/protocol//351/231/204/345/275/225C-/347/247/201/351/222/245/347/256/241/347/220/206/344/270/216/350/272/253/344/273/275/346/201/242/345/244/215.md +704 -0
  38. package/_packed_docs/protocol//351/231/204/345/275/225D-Root_CA_/346/262/273/347/220/206/346/234/272/345/210/266.md +620 -0
  39. package/_packed_docs/protocol//351/231/204/345/275/225E-Root_CA_/345/207/206/345/205/245/346/265/201/347/250/213.md +605 -0
  40. package/_packed_docs/protocol//351/231/204/345/275/225F-Issuer_CA_/347/224/263/350/257/267/346/265/201/347/250/213.md +548 -0
  41. package/_packed_docs/protocol//351/231/204/345/275/225G-AID_/345/255/244/345/204/277/351/242/204/351/230/262/344/270/216/346/225/221/346/217/264/346/234/272/345/210/266.md +513 -0
  42. package/_packed_docs/protocol//351/231/204/345/275/225H-Identity/346/234/215/345/212/241/345/256/236/347/216/260/346/214/207/345/215/227.md +619 -0
  43. package/_packed_docs/protocol//351/231/204/345/275/225I-/350/267/250/345/237/237/346/266/210/346/201/257/350/267/257/347/224/261/345/256/236/347/216/260/346/214/207/345/215/227.md +492 -0
  44. package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +402 -0
  45. package/_packed_docs/protocol//351/231/204/345/275/225K-Agent_Web/345/217/221/347/216/260/345/215/217/350/256/256.md +130 -0
  46. package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +267 -0
  47. package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +367 -0
  48. package/_packed_docs/python-sdk-v2-only-changelog.md +189 -0
  49. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +223 -0
  50. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +354 -0
  51. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +172 -0
  52. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +396 -0
  53. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +611 -0
  54. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1203 -0
  55. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +150 -0
  56. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +89 -0
  57. package/_packed_docs/sdk/09-custody-api-manual.md +445 -0
  58. package/_packed_docs/sdk/09-group-rpc-manual.md +1895 -0
  59. package/_packed_docs/sdk/09-message-rpc-manual.md +597 -0
  60. package/_packed_docs/sdk/09-meta-rpc-manual.md +142 -0
  61. package/_packed_docs/sdk/09-payload-reference.md +702 -0
  62. package/_packed_docs/sdk/09-storage-rpc-manual.md +408 -0
  63. package/_packed_docs/sdk/09-stream-rpc-manual.md +275 -0
  64. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +72 -0
  65. package/_packed_docs/sdk/INDEX.md +131 -0
  66. package/_packed_docs/sdk/README.md +307 -0
  67. package/dist/auth.d.ts +2 -1
  68. package/dist/auth.d.ts.map +1 -1
  69. package/dist/auth.js +33 -14
  70. package/dist/auth.js.map +1 -1
  71. package/dist/bundle.js +14300 -0
  72. package/dist/client.d.ts +200 -178
  73. package/dist/client.d.ts.map +1 -1
  74. package/dist/client.js +3096 -4019
  75. package/dist/client.js.map +1 -1
  76. package/dist/config.d.ts +0 -4
  77. package/dist/config.d.ts.map +1 -1
  78. package/dist/config.js +0 -4
  79. package/dist/config.js.map +1 -1
  80. package/dist/crypto.d.ts +8 -1
  81. package/dist/crypto.d.ts.map +1 -1
  82. package/dist/crypto.js +114 -1
  83. package/dist/crypto.js.map +1 -1
  84. package/dist/e2ee.d.ts +5 -210
  85. package/dist/e2ee.d.ts.map +1 -1
  86. package/dist/e2ee.js +4 -1379
  87. package/dist/e2ee.js.map +1 -1
  88. package/dist/index.d.ts +7 -3
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +5 -4
  91. package/dist/index.js.map +1 -1
  92. package/dist/namespaces/auth.d.ts +1 -0
  93. package/dist/namespaces/auth.d.ts.map +1 -1
  94. package/dist/namespaces/auth.js +23 -8
  95. package/dist/namespaces/auth.js.map +1 -1
  96. package/dist/protected-headers.d.ts +14 -0
  97. package/dist/protected-headers.d.ts.map +1 -0
  98. package/dist/protected-headers.js +47 -0
  99. package/dist/protected-headers.js.map +1 -0
  100. package/dist/seq-tracker.d.ts +7 -2
  101. package/dist/seq-tracker.d.ts.map +1 -1
  102. package/dist/seq-tracker.js +31 -10
  103. package/dist/seq-tracker.js.map +1 -1
  104. package/dist/transport.d.ts +9 -1
  105. package/dist/transport.d.ts.map +1 -1
  106. package/dist/transport.js +24 -0
  107. package/dist/transport.js.map +1 -1
  108. package/dist/v2/crypto/aead.d.ts +26 -0
  109. package/dist/v2/crypto/aead.d.ts.map +1 -0
  110. package/dist/v2/crypto/aead.js +63 -0
  111. package/dist/v2/crypto/aead.js.map +1 -0
  112. package/dist/v2/crypto/canonical.d.ts +21 -0
  113. package/dist/v2/crypto/canonical.d.ts.map +1 -0
  114. package/dist/v2/crypto/canonical.js +111 -0
  115. package/dist/v2/crypto/canonical.js.map +1 -0
  116. package/dist/v2/crypto/dh-path.d.ts +21 -0
  117. package/dist/v2/crypto/dh-path.d.ts.map +1 -0
  118. package/dist/v2/crypto/dh-path.js +50 -0
  119. package/dist/v2/crypto/dh-path.js.map +1 -0
  120. package/dist/v2/crypto/ecdh.d.ts +19 -0
  121. package/dist/v2/crypto/ecdh.d.ts.map +1 -0
  122. package/dist/v2/crypto/ecdh.js +101 -0
  123. package/dist/v2/crypto/ecdh.js.map +1 -0
  124. package/dist/v2/crypto/ecdsa.d.ts +16 -0
  125. package/dist/v2/crypto/ecdsa.d.ts.map +1 -0
  126. package/dist/v2/crypto/ecdsa.js +52 -0
  127. package/dist/v2/crypto/ecdsa.js.map +1 -0
  128. package/dist/v2/crypto/hkdf.d.ts +21 -0
  129. package/dist/v2/crypto/hkdf.d.ts.map +1 -0
  130. package/dist/v2/crypto/hkdf.js +32 -0
  131. package/dist/v2/crypto/hkdf.js.map +1 -0
  132. package/dist/v2/crypto/index.d.ts +9 -0
  133. package/dist/v2/crypto/index.d.ts.map +1 -0
  134. package/dist/v2/crypto/index.js +8 -0
  135. package/dist/v2/crypto/index.js.map +1 -0
  136. package/dist/v2/crypto/recipients.d.ts +43 -0
  137. package/dist/v2/crypto/recipients.d.ts.map +1 -0
  138. package/dist/v2/crypto/recipients.js +188 -0
  139. package/dist/v2/crypto/recipients.js.map +1 -0
  140. package/dist/v2/e2ee/decrypt.d.ts +13 -0
  141. package/dist/v2/e2ee/decrypt.d.ts.map +1 -0
  142. package/dist/v2/e2ee/decrypt.js +176 -0
  143. package/dist/v2/e2ee/decrypt.js.map +1 -0
  144. package/dist/v2/e2ee/encrypt-group.d.ts +14 -0
  145. package/dist/v2/e2ee/encrypt-group.d.ts.map +1 -0
  146. package/dist/v2/e2ee/encrypt-group.js +196 -0
  147. package/dist/v2/e2ee/encrypt-group.js.map +1 -0
  148. package/dist/v2/e2ee/encrypt-p2p.d.ts +15 -0
  149. package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -0
  150. package/dist/v2/e2ee/encrypt-p2p.js +240 -0
  151. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -0
  152. package/dist/v2/e2ee/index.d.ts +9 -0
  153. package/dist/v2/e2ee/index.d.ts.map +1 -0
  154. package/dist/v2/e2ee/index.js +9 -0
  155. package/dist/v2/e2ee/index.js.map +1 -0
  156. package/dist/v2/e2ee/metadata-auth.d.ts +9 -0
  157. package/dist/v2/e2ee/metadata-auth.d.ts.map +1 -0
  158. package/dist/v2/e2ee/metadata-auth.js +60 -0
  159. package/dist/v2/e2ee/metadata-auth.js.map +1 -0
  160. package/dist/v2/e2ee/types.d.ts +57 -0
  161. package/dist/v2/e2ee/types.d.ts.map +1 -0
  162. package/dist/v2/e2ee/types.js +7 -0
  163. package/dist/v2/e2ee/types.js.map +1 -0
  164. package/dist/v2/session/index.d.ts +4 -0
  165. package/dist/v2/session/index.d.ts.map +1 -0
  166. package/dist/v2/session/index.js +3 -0
  167. package/dist/v2/session/index.js.map +1 -0
  168. package/dist/v2/session/keystore.d.ts +48 -0
  169. package/dist/v2/session/keystore.d.ts.map +1 -0
  170. package/dist/v2/session/keystore.js +184 -0
  171. package/dist/v2/session/keystore.js.map +1 -0
  172. package/dist/v2/session/session.d.ts +98 -0
  173. package/dist/v2/session/session.d.ts.map +1 -0
  174. package/dist/v2/session/session.js +270 -0
  175. package/dist/v2/session/session.js.map +1 -0
  176. package/dist/v2/state/commitment.d.ts +10 -0
  177. package/dist/v2/state/commitment.d.ts.map +1 -0
  178. package/dist/v2/state/commitment.js +86 -0
  179. package/dist/v2/state/commitment.js.map +1 -0
  180. package/dist/v2/state/index.d.ts +2 -0
  181. package/dist/v2/state/index.d.ts.map +1 -0
  182. package/dist/v2/state/index.js +2 -0
  183. package/dist/v2/state/index.js.map +1 -0
  184. package/package.json +43 -37
@@ -0,0 +1,270 @@
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 * 60 * 60 * 1000; // 7h
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
+ _peerIKCache = new Map();
62
+ _verifiedSPKs = new Set();
63
+ _oldSPKMaxSeq = new Map();
64
+ _nowFn = () => Date.now();
65
+ constructor(store, deviceId, aid, ikPriv, ikPubDer) {
66
+ if (!ikPriv || !ikPubDer) {
67
+ throw new Error('V2Session requires AID priv/pub keys (IK = AID identity)');
68
+ }
69
+ this._store = store;
70
+ this._deviceId = deviceId;
71
+ this._aid = aid;
72
+ this._ikPriv = ikPriv;
73
+ this._ikPubDer = ikPubDer;
74
+ }
75
+ /** 测试用:注入虚拟时钟。 */
76
+ _setNowFn(fn) {
77
+ this._nowFn = fn;
78
+ }
79
+ get deviceId() {
80
+ return this._deviceId;
81
+ }
82
+ get aid() {
83
+ return this._aid;
84
+ }
85
+ get currentSpkId() {
86
+ return this._spkId;
87
+ }
88
+ get currentIkPubDer() {
89
+ return this._ikPubDer;
90
+ }
91
+ /** 暴露 store 以便测试(与 Python 同等私有约定)。 */
92
+ get _storeForTest() {
93
+ return this._store;
94
+ }
95
+ /** 加载或生成当前 SPK;IK 由构造函数注入,无需加载。 */
96
+ async ensureKeys() {
97
+ if (this._spkPriv)
98
+ return;
99
+ const cur = await this._store.loadCurrentSPK(this._deviceId);
100
+ if (cur) {
101
+ this._spkId = cur.spkId;
102
+ this._spkPriv = cur.priv;
103
+ this._spkPubDer = cur.pubDer;
104
+ return;
105
+ }
106
+ await this._generateNewSPK();
107
+ }
108
+ async _generateNewSPK() {
109
+ const [priv, pubDer] = await generateP256Keypair();
110
+ const hex = await sha256Hex(pubDer);
111
+ const spkId = `sha256:${hex.substring(0, 16)}`;
112
+ await this._store.saveSPK(this._deviceId, spkId, priv, pubDer);
113
+ this._spkId = spkId;
114
+ this._spkPriv = priv;
115
+ this._spkPubDer = pubDer;
116
+ }
117
+ /** SPK 由 AID 私钥(IK)签名背书并上报到 message.v2.put_peer_pk。 */
118
+ async _registerSPK(callFn) {
119
+ const spkTimestamp = Math.floor(this._nowFn() / 1000);
120
+ const enc = new TextEncoder();
121
+ const signData = concatBytes(this._spkPubDer, enc.encode(this._spkId), enc.encode(String(spkTimestamp)));
122
+ const signature = await ecdsaSignRaw(this._ikPriv, signData);
123
+ await callFn('message.v2.put_peer_pk', {
124
+ peer_aid: this._aid,
125
+ key_source: 'peer_device_prekey',
126
+ spk_id: this._spkId,
127
+ spk_pk: bytesToBase64(this._spkPubDer),
128
+ spk_signature: bytesToBase64(signature),
129
+ spk_timestamp: spkTimestamp,
130
+ });
131
+ }
132
+ /** 注册本设备 SPK 到服务端。IK = AID 长期密钥,无需注册。幂等。 */
133
+ async ensureRegistered(callFn) {
134
+ if (this._registered)
135
+ return;
136
+ await this.ensureKeys();
137
+ await this._registerSPK(callFn);
138
+ this._registered = true;
139
+ }
140
+ /** 返回加密所需的 sender 结构。 */
141
+ async getSenderIdentity() {
142
+ await this.ensureKeys();
143
+ return {
144
+ aid: this._aid,
145
+ deviceId: this._deviceId,
146
+ ikPriv: this._ikPriv,
147
+ ikPubDer: this._ikPubDer,
148
+ };
149
+ }
150
+ /**
151
+ * 返回解密所需的私钥。
152
+ * - spkId 空:1DH(仅 IK)
153
+ * - spkId == 当前 SPK:当前 spkPriv
154
+ * - 否则:从 store 加载旧 SPK 私钥(可能 undefined = 已销毁)
155
+ */
156
+ async getDecryptKeys(spkId) {
157
+ await this.ensureKeys();
158
+ if (!spkId)
159
+ return { ikPriv: this._ikPriv };
160
+ if (spkId === this._spkId)
161
+ return { ikPriv: this._ikPriv, spkPriv: this._spkPriv };
162
+ const oldSPK = await this._store.loadSPK(this._deviceId, spkId);
163
+ if (!oldSPK)
164
+ return { ikPriv: this._ikPriv };
165
+ return { ikPriv: this._ikPriv, spkPriv: oldSPK };
166
+ }
167
+ /** 判断 spkId 是否命中当前活跃 SPK。 */
168
+ isCurrentSPK(spkId) {
169
+ return Boolean(spkId) && spkId === this._spkId;
170
+ }
171
+ /** 跟踪每个旧 SPK 引用的最大 seq(用于销毁判定)。 */
172
+ trackOldSPKMaxSeq(spkId, seq) {
173
+ if (!spkId || spkId === this._spkId)
174
+ return;
175
+ const cur = this._oldSPKMaxSeq.get(spkId);
176
+ const curSeq = cur ? cur.seq : 0;
177
+ if (seq > curSeq) {
178
+ this._oldSPKMaxSeq.set(spkId, { seq, lastSeenAt: this._nowFn() });
179
+ }
180
+ }
181
+ /**
182
+ * contig_seq 已覆盖、超过 7h 安全窗口、且不在最近 7 代保留窗口内时销毁。
183
+ *
184
+ * 销毁条件(全部满足才销毁):
185
+ * - contig_seq >= 该 SPK 引用的最大 seq
186
+ * - 自最后一次见到该 spk_id 引用 >= 7 小时
187
+ * - 不在最近 7 代 SPK 保留窗口内
188
+ */
189
+ async maybeDestroyOldSPKs(contigSeq) {
190
+ const destroyed = [];
191
+ const now = this._nowFn();
192
+ let recentKeep;
193
+ try {
194
+ recentKeep = new Set(await this._store.listRecentSPKIds(this._deviceId, RECENT_GENERATIONS));
195
+ }
196
+ catch {
197
+ // 列表失败时退化为空集,保持销毁行为可继续推进
198
+ recentKeep = new Set();
199
+ }
200
+ for (const [spkId, info] of Array.from(this._oldSPKMaxSeq.entries())) {
201
+ if (spkId === this._spkId)
202
+ continue;
203
+ if (contigSeq < info.seq)
204
+ continue;
205
+ if (now - info.lastSeenAt < DESTROY_DELAY_MS)
206
+ continue;
207
+ if (recentKeep.has(spkId))
208
+ continue;
209
+ try {
210
+ await this._store.deleteSPK(this._deviceId, spkId);
211
+ }
212
+ catch (err) {
213
+ // 销毁失败时记录到控制台并跳过本轮,下次再重试
214
+ // eslint-disable-next-line no-console
215
+ console.warn('[V2Session] deleteSPK failed', { spkId, err });
216
+ continue;
217
+ }
218
+ this._oldSPKMaxSeq.delete(spkId);
219
+ destroyed.push(spkId);
220
+ }
221
+ // 180 天硬上限:无论是否被引用,超龄 SPK 强制销毁
222
+ try {
223
+ const expired = await this._store.listExpiredSPKIds(this._deviceId, HARD_LIMIT_MS);
224
+ for (const spkId of expired) {
225
+ if (spkId === this._spkId)
226
+ continue;
227
+ try {
228
+ await this._store.deleteSPK(this._deviceId, spkId);
229
+ }
230
+ catch {
231
+ continue;
232
+ }
233
+ this._oldSPKMaxSeq.delete(spkId);
234
+ if (!destroyed.includes(spkId))
235
+ destroyed.push(spkId);
236
+ }
237
+ }
238
+ catch { /* ignore */ }
239
+ return destroyed;
240
+ }
241
+ /** 轮换 SPK:生成新 SPK 并上报到服务端。旧 SPK 保留本地用于解密。 */
242
+ async rotateSPK(callFn) {
243
+ await this._generateNewSPK();
244
+ await this._registerSPK(callFn);
245
+ }
246
+ cachePeerIK(peerAid, deviceId, ikPubDer) {
247
+ this._peerIKCache.set(`${peerAid}#${deviceId}`, {
248
+ pubDer: ikPubDer,
249
+ cachedAt: this._nowFn(),
250
+ });
251
+ }
252
+ getPeerIK(peerAid, deviceId) {
253
+ const key = `${peerAid}#${deviceId}`;
254
+ const entry = this._peerIKCache.get(key);
255
+ if (!entry)
256
+ return null;
257
+ if (this._nowFn() - entry.cachedAt >= PEER_KEY_CACHE_TTL_MS) {
258
+ this._peerIKCache.delete(key);
259
+ return null;
260
+ }
261
+ return entry.pubDer;
262
+ }
263
+ isPeerSPKVerified(peerAid, deviceId, spkId) {
264
+ return this._verifiedSPKs.has(`${peerAid}#${deviceId}#${spkId}`);
265
+ }
266
+ markPeerSPKVerified(peerAid, deviceId, spkId) {
267
+ this._verifiedSPKs.add(`${peerAid}#${deviceId}#${spkId}`);
268
+ }
269
+ }
270
+ //# 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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAmBrE,qCAAqC;AACrC,SAAS,SAAS,CAAI,CAAI;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,OAAqB;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;YACvB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACtB,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;oBAC7B,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;oBAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxC,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACjE,IACE,OAAO,CAAC,SAAS;WACd,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;WACrC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAC9C,CAAC;QACD,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IACD,IACE,OAAO,CAAC,eAAe;WACpB,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ;WAC3C,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,EACrD,CAAC;QACD,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,KAAa,EACb,YAAqB;IAErB,MAAM,MAAM,GAAG,SAAS,CAAC,YAA4B,CAAC,CAAC;IACvD,WAAW,CAAC,MAAM,CAAC,CAAC;IAEpB,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACrC,oBAAoB;IACpB,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;IAChF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC5B,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1B,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1B,GAAG,IAAI,CAAC,CAAC;IACT,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -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,37 +1,43 @@
1
- {
2
- "name": "@agentunion/fastaun-browser",
3
- "version": "0.2.19",
4
- "description": "AUN Protocol Core SDK for Browser",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "browser": "dist/index.js",
9
- "exports": {
10
- ".": {
11
- "import": "./dist/index.js",
12
- "types": "./dist/index.d.ts"
13
- }
14
- },
15
- "license": "Apache-2.0",
16
- "files": [
17
- "dist",
18
- "README.md",
19
- "LICENSE"
20
- ],
21
- "scripts": {
22
- "build": "tsc",
23
- "test": "vitest run --environment jsdom",
24
- "test:unit": "vitest run --environment jsdom tests/unit",
25
- "test:integration": "vitest run --environment jsdom tests/integration",
26
- "test:e2e": "npm run build && playwright test --config=playwright.agentid-local.config.ts tests/e2e-browser/e2ee.spec.ts --reporter=line",
27
- "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
- },
29
- "devDependencies": {
30
- "@playwright/test": "^1.59.1",
31
- "esbuild": "^0.24.0",
32
- "fake-indexeddb": "^6.2.5",
33
- "jsdom": "^25.0.0",
34
- "typescript": "^5.6.0",
35
- "vitest": "^2.0.0"
36
- }
37
- }
1
+ {
2
+ "name": "@agentunion/fastaun-browser",
3
+ "version": "0.3.0",
4
+ "description": "AUN Protocol Core SDK for Browser",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "browser": "dist/index.js",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "license": "Apache-2.0",
16
+ "files": [
17
+ "dist",
18
+ "_packed_docs",
19
+ "README.md",
20
+ "CHANGELOG.md",
21
+ "LICENSE"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc && esbuild src/index.ts --bundle --format=esm --outfile=dist/bundle.js --platform=browser --target=es2020",
25
+ "prepack": "python ../scripts/sync_packed_docs.py js",
26
+ "test": "vitest run --environment jsdom",
27
+ "test:unit": "vitest run --environment jsdom tests/unit",
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
+ },
32
+ "devDependencies": {
33
+ "@playwright/test": "^1.59.1",
34
+ "esbuild": "^0.24.0",
35
+ "fake-indexeddb": "^6.2.5",
36
+ "jsdom": "^25.0.0",
37
+ "typescript": "^5.6.0",
38
+ "vitest": "^2.0.0"
39
+ },
40
+ "dependencies": {
41
+ "@noble/curves": "^2.2.0"
42
+ }
43
+ }