@agentunion/fastaun-browser 0.3.3 → 0.3.4

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 (66) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/_packed_docs/CHANGELOG.md +26 -0
  3. package/_packed_docs/INDEX.md +81 -0
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +55 -0
  5. package/_packed_docs/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +328 -0
  6. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +686 -0
  7. package/_packed_docs/design//350/267/250/350/257/255/350/250/200/345/256/271/345/231/250E2E/346/265/213/350/257/225/346/226/271/346/241/210.md +665 -0
  8. package/_packed_docs/protocol//351/231/204/345/275/225N-/345/210/206/345/270/203/345/274/217Trace/345/215/217/350/256/256.md +257 -0
  9. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +5 -5
  10. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +1 -1
  11. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +2 -2
  12. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +454 -429
  13. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1410 -1398
  14. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +19 -1
  15. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +20 -5
  16. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +8 -8
  17. package/_packed_docs/sdk/E2EE_V2/346/266/210/346/201/257/351/200/232/344/277/241/346/227/266/345/272/217/345/233/276.md +171 -0
  18. package/_packed_docs/sdk/INDEX.md +22 -22
  19. package/_packed_docs/sdk/README.md +3 -3
  20. package/dist/auth.d.ts +10 -11
  21. package/dist/auth.d.ts.map +1 -1
  22. package/dist/auth.js +127 -91
  23. package/dist/auth.js.map +1 -1
  24. package/dist/bundle.js +625 -274
  25. package/dist/client.d.ts +19 -10
  26. package/dist/client.d.ts.map +1 -1
  27. package/dist/client.js +238 -111
  28. package/dist/client.js.map +1 -1
  29. package/dist/errors.d.ts +4 -0
  30. package/dist/errors.d.ts.map +1 -1
  31. package/dist/errors.js +7 -0
  32. package/dist/errors.js.map +1 -1
  33. package/dist/index.d.ts +3 -3
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +3 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/keystore/index.d.ts +5 -0
  38. package/dist/keystore/index.d.ts.map +1 -1
  39. package/dist/keystore/indexeddb.d.ts +12 -0
  40. package/dist/keystore/indexeddb.d.ts.map +1 -1
  41. package/dist/keystore/indexeddb.js +64 -6
  42. package/dist/keystore/indexeddb.js.map +1 -1
  43. package/dist/namespaces/auth.d.ts +3 -3
  44. package/dist/namespaces/auth.d.ts.map +1 -1
  45. package/dist/namespaces/auth.js +39 -20
  46. package/dist/namespaces/auth.js.map +1 -1
  47. package/dist/secret-store/indexeddb-store.js +1 -1
  48. package/dist/secret-store/indexeddb-store.js.map +1 -1
  49. package/dist/transport.d.ts +9 -1
  50. package/dist/transport.d.ts.map +1 -1
  51. package/dist/transport.js +158 -64
  52. package/dist/transport.js.map +1 -1
  53. package/dist/v2/e2ee/decrypt.js +1 -1
  54. package/dist/v2/e2ee/decrypt.js.map +1 -1
  55. package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -1
  56. package/dist/v2/e2ee/encrypt-p2p.js +3 -2
  57. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -1
  58. package/dist/v2/session/session.d.ts +1 -0
  59. package/dist/v2/session/session.d.ts.map +1 -1
  60. package/dist/v2/session/session.js +7 -1
  61. package/dist/v2/session/session.js.map +1 -1
  62. package/package.json +43 -43
  63. package/dist/e2ee-group.d.ts +0 -276
  64. package/dist/e2ee-group.d.ts.map +0 -1
  65. package/dist/e2ee-group.js +0 -1653
  66. package/dist/e2ee-group.js.map +0 -1
@@ -0,0 +1,257 @@
1
+ # 附录 N — 分布式 Trace 协议
2
+
3
+ ## 设计目标
4
+
5
+ 为 AUN RPC 调用链路(SDK → Gateway → Service → Gateway → SDK)提供轻量级的分布式追踪能力,
6
+ 支持两种使用场景:
7
+
8
+ 1. **日志关联(log 模式)** — 全链路日志通过 `trace_id` 串联,零开销,可在生产环境常开
9
+ 2. **诊断回传(diag 模式)** — 各环节追加 span,response 携带完整链路返回调用者,
10
+ 仅用于疑难问题诊断,需通过开关启用
11
+
12
+ 不依赖 OpenTelemetry / Jaeger 等外部体系,自定义 `_trace` 字段即可,跨语言实现成本极低。
13
+
14
+ ---
15
+
16
+ ## 一、协议层
17
+
18
+ ### 1.1 字段位置
19
+
20
+ `_trace` 字段位于 JSON-RPC `params` 内,沿用 AUN 现有框架字段约定(与 `_caller_id`、`_auth` 同级):
21
+
22
+ ```json
23
+ {
24
+ "jsonrpc": "2.0",
25
+ "id": 1,
26
+ "method": "message.send",
27
+ "params": {
28
+ "to": "bob.aid.com",
29
+ "body": "hello",
30
+ "_trace": {
31
+ "trace_id": "a1b2c3d4e5f6...",
32
+ "mode": "log"
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ ### 1.2 字段定义
39
+
40
+ | 字段 | 类型 | 必填 | 说明 |
41
+ |------|------|------|------|
42
+ | `trace_id` | string | 是 | 32 hex chars(16 bytes 随机),由 SDK 生成,全链路唯一 |
43
+ | `mode` | string | 是 | `"log"` 或 `"diag"`,缺失视为 `"log"` |
44
+ | `spans` | array | 否 | 仅 `diag` 模式存在,各环节追加 |
45
+
46
+ **说明**:`mode: "off"` 不需要显式表示——不带 `_trace` 字段即为 off 状态。
47
+
48
+ ### 1.3 Span 结构
49
+
50
+ ```json
51
+ {
52
+ "node": "gateway",
53
+ "ts": 1716300000156,
54
+ "action": "relay_in",
55
+ "ms": 0,
56
+ "detail": "route→message"
57
+ }
58
+ ```
59
+
60
+ | 字段 | 类型 | 说明 |
61
+ |------|------|------|
62
+ | `node` | string | 环节标识:`sdk-{aid}`、`gateway`、`{service_name}` |
63
+ | `ts` | number | Unix 毫秒时间戳(入站时刻) |
64
+ | `action` | string | 动作:`send` / `relay_in` / `process` / `relay_out` / `deliver` |
65
+ | `ms` | number | 本环节处理耗时(出站时填写,入站初始为 0) |
66
+ | `detail` | string | 可选,关键上下文(路由目标、错误码等),最多 256 字符 |
67
+
68
+ ---
69
+
70
+ ## 二、链路传播流程
71
+
72
+ ```
73
+ SDK-A Gateway Service Gateway SDK-B
74
+ │ │ │ │ │
75
+ │─── params._trace ─▶│ │ │ │
76
+ │ {trace_id, mode, │ │ │ │
77
+ │ spans:[sdk-send]}│ │ │ │
78
+ │ │── 追加 gateway ───▶│ │ │
79
+ │ │ 转发到 service │ │ │
80
+ │ │ │── 追加 svc span ──▶│ │
81
+ │ │ │ 返回 response │ │
82
+ │ │◀── response ───────│ │ │
83
+ │ │ 追加 gateway-out │ │ │
84
+ │◀── response._trace─│ │ │ │
85
+ │ │ │ │ │
86
+ │ │─── event._trace ──────────────────────▶│── deliver ────────▶│
87
+ ```
88
+
89
+ ### 2.1 各环节职责
90
+
91
+ | 环节 | 入站行为 | 出站行为 |
92
+ |------|----------|----------|
93
+ | SDK 发起 | 生成 trace_id;mode≠off 时构造 `_trace` 注入 params | — |
94
+ | Gateway 入站 | 读取 _trace,应用降级;diag 模式追加 `relay_in` span | — |
95
+ | Service 处理 | 读取 _trace 写入日志(log)或追加 span(diag) | response 透传 _trace |
96
+ | Gateway 出站 | diag 模式追加 `relay_out` span | log 模式剥离 _trace;diag 模式注入 response 顶层 |
97
+ | SDK 接收 | 提取 response._trace 回调 trace observer | — |
98
+
99
+ ---
100
+
101
+ ## 三、Response 回传(仅 diag 模式)
102
+
103
+ Gateway 在 `deliver_response_to_client` 中将 `_trace` 注入 response 顶层(与 `_meta` 平级):
104
+
105
+ ```json
106
+ {
107
+ "jsonrpc": "2.0",
108
+ "id": 1,
109
+ "result": {"status": "ok", "message_id": "..."},
110
+ "_meta": {"agent_md_etag": "..."},
111
+ "_trace": {
112
+ "trace_id": "a1b2c3...",
113
+ "mode": "diag",
114
+ "spans": [
115
+ {"node": "sdk-alice.aid.com", "ts": 1716300000100, "action": "send"},
116
+ {"node": "gateway", "ts": 1716300000123, "action": "relay_in", "ms": 2, "detail": "→message"},
117
+ {"node": "message", "ts": 1716300000125, "action": "process", "ms": 15},
118
+ {"node": "gateway", "ts": 1716300000142, "action": "relay_out", "ms": 1}
119
+ ]
120
+ }
121
+ }
122
+ ```
123
+
124
+ **注意**:log 模式下 response 不带 `_trace`(保持 envelope 干净,零开销)。
125
+
126
+ ---
127
+
128
+ ## 四、开关层级
129
+
130
+ ### 4.1 三态定义
131
+
132
+ | 值 | 行为 |
133
+ |---|---|
134
+ | `off` | 不生成 `_trace`,零开销(默认) |
135
+ | `log` | 生成 trace_id + 各环节写本地日志,response 不回传 |
136
+ | `diag` | 同 log + spans 追加 + response 回传完整链路 |
137
+
138
+ ### 4.2 控制点
139
+
140
+ | 层级 | 配置位置 | 默认值 | 作用 |
141
+ |------|----------|--------|------|
142
+ | 服务端上限 | Gateway 环境变量 `AUN_TRACE_MAX_MODE` | `"log"` | 超过此级别自动降级 |
143
+ | SDK 会话级 | `client.set_trace_mode("log")` | `"off"` | 连接内所有请求默认 mode |
144
+ | SDK 调用级 | `client.rpc("method", params, trace="diag")` | 继承会话级 | 单次覆盖,优先级最高 |
145
+
146
+ ### 4.3 优先级规则
147
+
148
+ ```
149
+ 最终 mode = min(SDK 调用级 || SDK 会话级, 服务端上限)
150
+ 其中 off < log < diag
151
+ ```
152
+
153
+ ### 4.4 服务端降级逻辑(Gateway 入站时)
154
+
155
+ ```python
156
+ client_mode = trace.get("mode", "off")
157
+ server_max = config.trace_max_mode # "off" | "log" | "diag"
158
+ effective = min(client_mode, server_max)
159
+ if effective != client_mode:
160
+ trace["mode"] = effective
161
+ if effective != "diag":
162
+ trace.pop("spans", None) # 降级到 log/off 时丢弃已有 spans
163
+ ```
164
+
165
+ **生产环境推荐配置**:`AUN_TRACE_MAX_MODE=log`,diag 需运维手动开启。
166
+
167
+ ---
168
+
169
+ ## 五、各组件改动点
170
+
171
+ ### 5.1 SDK 侧
172
+
173
+ **`transport.py`**:
174
+ - `call()` 方法:会话/调用级 mode 非 off 时,构造 `_trace` 注入 params
175
+ - response 处理:提取 `_trace` 回调 trace observer(与现有 `_meta_observer` 模式一致)
176
+
177
+ **`client.py`**:
178
+ - 新增 `set_trace_mode(mode: str)`:设置会话级默认 mode
179
+ - `rpc()` 方法新增 `trace` 参数:单次覆盖 mode
180
+ - 暴露 `set_trace_observer(callback)`:接收 diag 模式回传的 spans
181
+
182
+ ### 5.2 Gateway 侧
183
+
184
+ **`ws_server.py`**:
185
+ - `_resolve_ws_message_trace()` 改造:读取 mode,应用服务端降级
186
+ - 入站时追加 `relay_in` span(diag 模式)
187
+ - `_strip_internal_route()` 保持现状:log 模式仍剥离 `_trace`,diag 模式由 response 路径专门处理
188
+
189
+ **`relay.py`**:
190
+ - `deliver_response_to_client()`:diag 模式追加 `relay_out` span,将 `_trace` 注入 response 顶层
191
+
192
+ ### 5.3 Service 侧
193
+
194
+ 通用 pattern(适用于 message / group / storage / stream / mail 等所有服务):
195
+ 1. RPC 入口提取 `params._trace`
196
+ 2. 处理过程中通过 trace_id 写入日志
197
+ 3. diag 模式追加自身 span
198
+ 4. response 透传 `_trace` 字段
199
+
200
+ ---
201
+
202
+ ## 六、日志格式(log 模式)
203
+
204
+ 各环节按现有日志规范输出,前缀加 trace_id:
205
+
206
+ ```
207
+ [2026-05-21 10:00:00.123][INFO][gateway] [trace=a1b2c3d4] relay_in method=message.send conn=42
208
+ [2026-05-21 10:00:00.125][INFO][message] [trace=a1b2c3d4] process persist=true target=bob.aid.com
209
+ [2026-05-21 10:00:00.140][INFO][gateway] [trace=a1b2c3d4] relay_out duration_ms=17
210
+ ```
211
+
212
+ 排查时 `grep trace=a1b2c3d4` 即可串联全链路。
213
+
214
+ ---
215
+
216
+ ## 七、安全约束
217
+
218
+ | 约束 | 限制 |
219
+ |------|------|
220
+ | spans 数组最大长度 | 32 条,超出由 Gateway 截断尾部 |
221
+ | 单个 detail 最大长度 | 256 字符 |
222
+ | trace_id 长度 | 严格 32 hex chars,不合规由 Gateway 重新生成 |
223
+ | 敏感信息 | spans 禁止包含消息体、密钥、Token 等,只记录路由/耗时/错误码等元数据 |
224
+ | 生产环境默认 | `AUN_TRACE_MAX_MODE=log`,diag 需运维手动开启 |
225
+ | 跨域传播 | 跨 federation 边界时保留 trace_id,spans 在边界节点视为新链路起点 |
226
+
227
+ ---
228
+
229
+ ## 八、跨语言实现要点
230
+
231
+ 所有 SDK(Python / Go / TypeScript / JavaScript / C++)需保持一致:
232
+
233
+ 1. **trace_id 生成**:16 字节加密随机数,hex 编码
234
+ 2. **时间戳**:Unix 毫秒(不使用秒/纳秒),统一单位
235
+ 3. **字段顺序**:JSON 字段顺序不影响语义,但建议按 `trace_id, mode, spans` 顺序输出便于阅读
236
+ 4. **observer 接口**:各 SDK 提供 `set_trace_observer(callback)` 接口,签名一致
237
+ 5. **会话/调用级 API 命名**:
238
+ - 设置:`set_trace_mode(mode)` / `setTraceMode(mode)`
239
+ - 单次覆盖:`rpc(method, params, trace=mode)` / `rpc(method, params, {trace: mode})`
240
+
241
+ ---
242
+
243
+ ## 九、未实现 / 后续扩展
244
+
245
+ 以下能力本附录暂不覆盖,留作后续扩展:
246
+
247
+ - **采样率控制**:当前 SDK 完全控制 mode,未引入概率采样(如 1% diag)
248
+ - **OpenTelemetry 适配**:未来如需对接 Jaeger / Zipkin,可在 Gateway 端增加导出适配层,
249
+ 将 spans 转为 OTLP 格式
250
+ - **跨域链路连续性**:当前跨 federation 边界视为新链路,未实现端到端 trace_id 透传
251
+ - **span 父子关系**:当前 spans 数组仅按时间排序,未引入 parent_span_id(保持极简)
252
+
253
+ ---
254
+
255
+ ## 文档版本
256
+
257
+ - v1.0 — 2026-05-21 初稿,定义协议字段、链路传播、开关层级、安全约束
@@ -30,17 +30,17 @@ BOB = f"bob{random.randint(1000,9999)}.{DOMAIN}"
30
30
 
31
31
 
32
32
  async def create_client(aid: str) -> tuple[AUNClient, dict]:
33
- """创建客户端 → 加载或创建 AID → 认证 → 返回 (client, auth)"""
33
+ """创建客户端 → 注册 AID → 认证 → 返回 (client, auth)"""
34
34
  client = AUNClient() # 默认 aun_path: ~/.aun
35
35
 
36
36
  # 先检查本地是否已有该 AID 的身份
37
37
  known = any(item["aid"] == aid for item in client.list_identities())
38
38
  if not known:
39
- # 不存在则创建
39
+ # 不存在则注册
40
40
  try:
41
- await client.auth.create_aid({"aid": aid})
41
+ await client.auth.register_aid({"aid": aid})
42
42
  except AuthError as e:
43
- print(f"[错误] 创建 AID 失败 ({aid}): {e}")
43
+ print(f"[错误] 注册 AID 失败 ({aid}): {e}")
44
44
  raise
45
45
  except ConnectionError as e:
46
46
  print(f"[错误] 网络连接失败: {e}")
@@ -213,7 +213,7 @@ await client.connect(auth, {
213
213
  完整的使用流程见上方"最小示例",核心步骤:
214
214
 
215
215
  1. **创建客户端** - `AUNClient(config)`
216
- 2. **加载或创建 AID** - `load_identity_or_none()` → `create_aid()`
216
+ 2. **注册 AID** - `check_aid()` → `register_aid()`
217
217
  3. **认证** - `authenticate()` 获取令牌
218
218
  4. **订阅事件** - `on("message.received", handler)`
219
219
  5. **连接** - `connect(auth, options)`
@@ -210,7 +210,7 @@ async def authenticate(aid: str) -> dict:
210
210
  try:
211
211
  client = AUNClient({"aun_path": f"~/.aun/{aid}"})
212
212
  if not client._auth.load_identity_or_none(aid):
213
- await client.auth.create_aid({"aid": aid})
213
+ await client.auth.register_aid({"aid": aid})
214
214
  auth = await client.auth.authenticate({"aid": aid})
215
215
  return auth
216
216
  except AuthError as e:
@@ -19,8 +19,8 @@ AID 是 Agent 的全局唯一身份,格式为域名形式:`alice.agentid.pub
19
19
  import random
20
20
  MY_AID = f"alice-{random.randint(1000,9999)}.agentid.pub"
21
21
 
22
- # 创建(仅首次)
23
- await client.auth.create_aid({"aid": MY_AID})
22
+ # 注册(仅首次)
23
+ await client.auth.register_aid({"aid": MY_AID})
24
24
 
25
25
  # 认证
26
26
  auth = await client.auth.authenticate({"aid": MY_AID})