@agentunion/fastaun-browser 0.3.2 → 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 (105) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/_packed_docs/CHANGELOG.md +45 -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 -396
  13. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1410 -1244
  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 +6 -4
  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 +9 -4
  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 +128 -95
  23. package/dist/auth.js.map +1 -1
  24. package/dist/bundle.js +2658 -816
  25. package/dist/client.d.ts +73 -7
  26. package/dist/client.d.ts.map +1 -1
  27. package/dist/client.js +1586 -494
  28. package/dist/client.js.map +1 -1
  29. package/dist/crypto.d.ts.map +1 -1
  30. package/dist/crypto.js +45 -31
  31. package/dist/crypto.js.map +1 -1
  32. package/dist/discovery.d.ts +4 -0
  33. package/dist/discovery.d.ts.map +1 -1
  34. package/dist/discovery.js +16 -11
  35. package/dist/discovery.js.map +1 -1
  36. package/dist/errors.d.ts +4 -0
  37. package/dist/errors.d.ts.map +1 -1
  38. package/dist/errors.js +7 -0
  39. package/dist/errors.js.map +1 -1
  40. package/dist/index.d.ts +3 -3
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +3 -3
  43. package/dist/index.js.map +1 -1
  44. package/dist/keystore/index.d.ts +27 -0
  45. package/dist/keystore/index.d.ts.map +1 -1
  46. package/dist/keystore/indexeddb.d.ts +16 -1
  47. package/dist/keystore/indexeddb.d.ts.map +1 -1
  48. package/dist/keystore/indexeddb.js +168 -7
  49. package/dist/keystore/indexeddb.js.map +1 -1
  50. package/dist/logger.d.ts +5 -1
  51. package/dist/logger.d.ts.map +1 -1
  52. package/dist/logger.js +8 -2
  53. package/dist/logger.js.map +1 -1
  54. package/dist/namespaces/auth.d.ts +4 -3
  55. package/dist/namespaces/auth.d.ts.map +1 -1
  56. package/dist/namespaces/auth.js +77 -20
  57. package/dist/namespaces/auth.js.map +1 -1
  58. package/dist/secret-store/indexeddb-store.js +1 -1
  59. package/dist/secret-store/indexeddb-store.js.map +1 -1
  60. package/dist/seq-tracker.d.ts +5 -3
  61. package/dist/seq-tracker.d.ts.map +1 -1
  62. package/dist/seq-tracker.js +30 -3
  63. package/dist/seq-tracker.js.map +1 -1
  64. package/dist/transport.d.ts +9 -1
  65. package/dist/transport.d.ts.map +1 -1
  66. package/dist/transport.js +176 -64
  67. package/dist/transport.js.map +1 -1
  68. package/dist/v2/crypto/canonical.d.ts +1 -1
  69. package/dist/v2/crypto/canonical.d.ts.map +1 -1
  70. package/dist/v2/crypto/canonical.js +42 -13
  71. package/dist/v2/crypto/canonical.js.map +1 -1
  72. package/dist/v2/crypto/ecdh.d.ts.map +1 -1
  73. package/dist/v2/crypto/ecdh.js +18 -1
  74. package/dist/v2/crypto/ecdh.js.map +1 -1
  75. package/dist/v2/e2ee/decrypt.d.ts.map +1 -1
  76. package/dist/v2/e2ee/decrypt.js +57 -3
  77. package/dist/v2/e2ee/decrypt.js.map +1 -1
  78. package/dist/v2/e2ee/encrypt-group.d.ts.map +1 -1
  79. package/dist/v2/e2ee/encrypt-group.js +16 -6
  80. package/dist/v2/e2ee/encrypt-group.js.map +1 -1
  81. package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -1
  82. package/dist/v2/e2ee/encrypt-p2p.js +40 -11
  83. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -1
  84. package/dist/v2/e2ee/metadata-auth.d.ts +1 -0
  85. package/dist/v2/e2ee/metadata-auth.d.ts.map +1 -1
  86. package/dist/v2/e2ee/metadata-auth.js +51 -0
  87. package/dist/v2/e2ee/metadata-auth.js.map +1 -1
  88. package/dist/v2/e2ee/types.d.ts +2 -2
  89. package/dist/v2/e2ee/types.d.ts.map +1 -1
  90. package/dist/v2/session/keystore.d.ts +12 -4
  91. package/dist/v2/session/keystore.d.ts.map +1 -1
  92. package/dist/v2/session/keystore.js +177 -35
  93. package/dist/v2/session/keystore.js.map +1 -1
  94. package/dist/v2/session/session.d.ts +11 -3
  95. package/dist/v2/session/session.d.ts.map +1 -1
  96. package/dist/v2/session/session.js +97 -17
  97. package/dist/v2/session/session.js.map +1 -1
  98. package/dist/v2/state/commitment.d.ts.map +1 -1
  99. package/dist/v2/state/commitment.js +4 -1
  100. package/dist/v2/state/commitment.js.map +1 -1
  101. package/package.json +43 -43
  102. package/dist/e2ee-group.d.ts +0 -276
  103. package/dist/e2ee-group.d.ts.map +0 -1
  104. package/dist/e2ee-group.js +0 -1653
  105. package/dist/e2ee-group.js.map +0 -1
@@ -0,0 +1,686 @@
1
+ # AUN CLI 设计文档
2
+
3
+ ## 1. 定位
4
+
5
+ AUN CLI 是面向开发者和运维的命令行工具,提供与 AUN 网络交互的完整能力:身份管理、消息收发、群组操作、加密状态检查、故障诊断。
6
+
7
+ 核心价值:不写代码即可完成 AUN 协议的全部操作,同时作为 SDK 功能的验证工具和调试入口。
8
+
9
+ ## 2. 架构
10
+
11
+ ```
12
+ ┌─────────────────────────────────────────────┐
13
+ │ aun CLI │
14
+ │ ┌─────────┐ ┌─────────┐ ┌──────────────┐ │
15
+ │ │ typer │ │ config │ │ output fmt │ │
16
+ │ │ routing │ │ manager │ │ (table/json) │ │
17
+ │ └────┬────┘ └────┬────┘ └──────┬───────┘ │
18
+ │ │ │ │ │
19
+ │ ┌────▼────────────▼─────────────▼────────┐ │
20
+ │ │ SDK Adapter Layer │ │
21
+ │ │ (async → sync bridge, session mgmt) │ │
22
+ │ └────────────────┬───────────────────────┘ │
23
+ └───────────────────┼─────────────────────────┘
24
+
25
+ ┌───────────────────▼───────────────────────┐
26
+ │ aun_core (SDK) │
27
+ │ AUNClient / AuthFlow / E2EE / Groups │
28
+ └───────────────────────────────────────────┘
29
+ ```
30
+
31
+ ### 2.1 关键设计决策
32
+
33
+ | 决策 | 选择 | 理由 |
34
+ |------|------|------|
35
+ | 命令框架 | typer | 类型注解驱动,自动生成 help,比 click 更简洁 |
36
+ | 异步桥接 | asyncio.run() 包装 | SDK 全异步,CLI 需要同步入口 |
37
+ | 配置格式 | TOML | Python 生态标准,人类可读 |
38
+ | 输出格式 | 默认 human-readable,`--json` 切换 | 兼顾交互和脚本管道 |
39
+ | 状态持久化 | 复用 SDK 的 aun_path 目录 | 零额外存储概念 |
40
+ | 分发方式 | pip + PyInstaller 独立二进制 | 覆盖开发者和终端用户 |
41
+
42
+ ### 2.2 目录结构
43
+
44
+ ```
45
+ aun-sdk-core/python/
46
+ ├── src/
47
+ │ ├── aun_core/ # 现有 SDK(不动)
48
+ │ └── aun_cli/ # CLI 工具
49
+ │ ├── __init__.py
50
+ │ ├── __main__.py # python -m aun_cli 入口
51
+ │ ├── main.py # typer app 定义 + 全局选项
52
+ │ ├── adapter.py # SDK 异步桥接 + 会话管理
53
+ │ ├── config.py # profile/配置 CRUD
54
+ │ ├── output.py # 输出格式化(table/json/plain)
55
+ │ └── commands/
56
+ │ ├── __init__.py
57
+ │ ├── identity.py # register / login / whoami / list
58
+ │ ├── message.py # send / pull / listen / ack
59
+ │ ├── group.py # create / send / invite / kick / ...
60
+ │ ├── storage.py # upload / download / delete
61
+ │ ├── keys.py # list / rotate / export / import
62
+ │ └── diag.py # doctor / status / ping / trace / logs
63
+ └── pyproject.toml # 新增 [project.scripts] aun = "aun_cli.main:app"
64
+ ```
65
+
66
+ ## 3. 全局选项
67
+
68
+ ```
69
+ aun [全局选项] <command> [子选项] [参数]
70
+
71
+ 全局选项:
72
+ --profile, -p TEXT 使用指定 profile(默认 "default")
73
+ --gateway, -g URL 覆盖网关地址
74
+ --json JSON 格式输出
75
+ --debug 启用 debug 日志
76
+ --no-color 禁用彩色输出
77
+ --timeout, -t INT 操作超时秒数(默认 30)
78
+ --version, -V 显示版本
79
+ --help, -h 显示帮助
80
+ ```
81
+
82
+ ## 4. 命令详细设计
83
+
84
+ ### 4.1 身份管理 (identity)
85
+
86
+ #### `aun register`
87
+
88
+ 注册新 AID 并保存到本地 profile。
89
+
90
+ ```
91
+ aun register <aid> --gateway <url> [--password <seed-password>]
92
+
93
+ 示例:
94
+ aun register alice@aid.com --gateway wss://gw.aid.com/ws
95
+ aun register bob@example.com -g wss://gw.example.com/ws -p work
96
+ ```
97
+
98
+ 流程:
99
+ 1. 生成 P-256 密钥对
100
+ 2. 连接网关,调用 `auth.create_aid()`
101
+ 3. 保存身份材料到 `~/.aun/profiles/{profile}/AIDs/{aid}/`
102
+ 4. 输出注册结果(AID、证书指纹、有效期)
103
+
104
+ #### `aun login`
105
+
106
+ 登录已有 AID(验证本地密钥可用,刷新 token)。
107
+
108
+ ```
109
+ aun login [aid]
110
+
111
+ 示例:
112
+ aun login # 登录当前 profile 的默认 AID
113
+ aun login alice@aid.com # 指定 AID
114
+ ```
115
+
116
+ #### `aun whoami`
117
+
118
+ 显示当前身份信息。
119
+
120
+ ```
121
+ aun whoami
122
+
123
+ 输出:
124
+ AID: alice@aid.com
125
+ Profile: default
126
+ Gateway: wss://gw.aid.com/ws
127
+ Cert: SHA256:a1b2c3... (expires 2027-01-15)
128
+ State: authenticated
129
+ Device ID: d8f2...
130
+ ```
131
+
132
+ #### `aun identity list`
133
+
134
+ 列出本地所有身份。
135
+
136
+ ```
137
+ aun identity list
138
+
139
+ 输出:
140
+ PROFILE AID GATEWAY STATUS
141
+ default alice@aid.com wss://gw.aid.com active
142
+ work bot@corp.com wss://gw.corp.com expired
143
+ ```
144
+
145
+ ### 4.2 消息 (message)
146
+
147
+ #### `aun send`
148
+
149
+ 发送 P2P 消息。
150
+
151
+ ```
152
+ aun send <target-aid> <message> [--no-encrypt] [--persist]
153
+
154
+ 示例:
155
+ aun send bob@aid.com "hello"
156
+ aun send bob@aid.com --no-encrypt "plaintext msg"
157
+ echo "piped content" | aun send bob@aid.com -
158
+ ```
159
+
160
+ - 默认 E2EE 加密
161
+ - 支持 stdin 管道输入(`-` 表示从 stdin 读取)
162
+ - `--persist` 标志控制消息持久化
163
+
164
+ #### `aun pull`
165
+
166
+ 拉取离线消息。
167
+
168
+ ```
169
+ aun pull [--from <aid>] [--limit N] [--after-seq N]
170
+
171
+ 示例:
172
+ aun pull # 拉取所有未读
173
+ aun pull --from bob@aid.com # 只拉某人的
174
+ aun pull --limit 10 # 最多 10 条
175
+ ```
176
+
177
+ #### `aun listen`
178
+
179
+ 实时监听消息(长连接,类似 tail -f)。
180
+
181
+ ```
182
+ aun listen [--from <aid>] [--include-group]
183
+
184
+ 示例:
185
+ aun listen # 监听所有 P2P 消息
186
+ aun listen --include-group # 同时监听群消息
187
+ aun listen --from bob@aid.com # 只监听某人
188
+
189
+ 输出(逐行):
190
+ [2026-05-21 14:32:01] bob@aid.com → you: hello
191
+ [2026-05-21 14:32:05] group:abc123 carol@aid.com: meeting at 3pm
192
+ ```
193
+
194
+ Ctrl+C 退出。
195
+
196
+ #### `aun ack`
197
+
198
+ 确认消息。
199
+
200
+ ```
201
+ aun ack <sender-aid> --seq <N>
202
+ aun ack --all
203
+ ```
204
+
205
+ ### 4.3 群组 (group)
206
+
207
+ #### `aun group create`
208
+
209
+ ```
210
+ aun group create <name> [--members <aid1,aid2,...>]
211
+
212
+ 示例:
213
+ aun group create "Project Alpha"
214
+ aun group create "Team" --members bob@aid.com,carol@aid.com
215
+ ```
216
+
217
+ #### `aun group list`
218
+
219
+ ```
220
+ aun group list
221
+
222
+ 输出:
223
+ GROUP ID NAME MEMBERS ROLE EPOCH
224
+ g:abc123 Project Alpha 5 owner 3
225
+ g:def456 Team Chat 3 member 1
226
+ ```
227
+
228
+ #### `aun group send`
229
+
230
+ ```
231
+ aun group send <group-id> <message> [--no-encrypt]
232
+
233
+ 示例:
234
+ aun group send g:abc123 "hello team"
235
+ ```
236
+
237
+ #### `aun group invite`
238
+
239
+ ```
240
+ aun group invite <group-id> <aid> [<aid2> ...]
241
+
242
+ 示例:
243
+ aun group invite g:abc123 dave@aid.com eve@aid.com
244
+ ```
245
+
246
+ #### `aun group kick`
247
+
248
+ ```
249
+ aun group kick <group-id> <aid>
250
+ ```
251
+
252
+ #### `aun group leave`
253
+
254
+ ```
255
+ aun group leave <group-id>
256
+ ```
257
+
258
+ #### `aun group dissolve`
259
+
260
+ ```
261
+ aun group dissolve <group-id>
262
+ ```
263
+
264
+ #### `aun group members`
265
+
266
+ ```
267
+ aun group members <group-id>
268
+
269
+ 输出:
270
+ AID ROLE JOINED
271
+ alice@aid.com owner 2026-05-01
272
+ bob@aid.com admin 2026-05-02
273
+ carol@aid.com member 2026-05-10
274
+ ```
275
+
276
+ #### `aun group info`
277
+
278
+ ```
279
+ aun group info <group-id>
280
+
281
+ 输出:
282
+ Name: Project Alpha
283
+ ID: g:abc123
284
+ Owner: alice@aid.com
285
+ Members: 5
286
+ Epoch: 3
287
+ E2EE: enabled (V2)
288
+ Created: 2026-05-01
289
+ ```
290
+
291
+ #### `aun group listen`
292
+
293
+ ```
294
+ aun group listen <group-id>
295
+
296
+ 输出(逐行):
297
+ [14:32:01] bob@aid.com: let's sync
298
+ [14:32:05] carol@aid.com: sounds good
299
+ ```
300
+
301
+ ### 4.4 存储 (storage)
302
+
303
+ #### `aun storage upload`
304
+
305
+ ```
306
+ aun storage upload <local-path> [--name <remote-name>]
307
+
308
+ 示例:
309
+ aun storage upload ./report.pdf
310
+ aun storage upload ./img.png --name avatar.png
311
+ ```
312
+
313
+ #### `aun storage download`
314
+
315
+ ```
316
+ aun storage download <object-id> [--output <path>]
317
+ ```
318
+
319
+ #### `aun storage delete`
320
+
321
+ ```
322
+ aun storage delete <object-id>
323
+ ```
324
+
325
+ ### 4.5 密钥管理 (keys)
326
+
327
+ #### `aun keys list`
328
+
329
+ ```
330
+ aun keys list
331
+
332
+ 输出:
333
+ TYPE ID/FINGERPRINT CREATED EXPIRES STATUS
334
+ IK SHA256:a1b2c3... 2026-05-01 2027-05-01 active
335
+ SPK SHA256:d4e5f6... 2026-05-20 2026-06-20 active
336
+ SPK SHA256:789abc... 2026-04-20 2026-05-20 expired
337
+ ```
338
+
339
+ #### `aun keys rotate`
340
+
341
+ ```
342
+ aun keys rotate [--type spk|ik]
343
+
344
+ 示例:
345
+ aun keys rotate # 轮换 SPK
346
+ aun keys rotate --type ik # 轮换 IK(需确认)
347
+ ```
348
+
349
+ #### `aun keys export`
350
+
351
+ 导出身份(加密打包)。
352
+
353
+ ```
354
+ aun keys export [aid] --output <path> --password <password>
355
+
356
+ 示例:
357
+ aun keys export alice@aid.com --output ./alice-backup.aun
358
+ ```
359
+
360
+ #### `aun keys import`
361
+
362
+ 导入身份。
363
+
364
+ ```
365
+ aun keys import <path> --password <password> [--profile <name>]
366
+ ```
367
+
368
+ ### 4.6 诊断 (diag)
369
+
370
+ #### `aun doctor`
371
+
372
+ 一键健康检查。
373
+
374
+ ```
375
+ aun doctor
376
+
377
+ 输出:
378
+ ✓ Profile "default" exists
379
+ ✓ Identity alice@aid.com found
380
+ ✓ Private key intact (P-256)
381
+ ✓ Certificate valid (expires 2027-01-15)
382
+ ✓ Gateway wss://gw.aid.com reachable (latency: 45ms)
383
+ ✓ Authentication successful
384
+ ✓ SPK valid (expires 2026-06-20)
385
+ ✗ Trust root CA not configured (optional)
386
+
387
+ 7/8 checks passed
388
+ ```
389
+
390
+ #### `aun status`
391
+
392
+ 连接状态概览。
393
+
394
+ ```
395
+ aun status
396
+
397
+ 输出:
398
+ Gateway: wss://gw.aid.com/ws
399
+ Protocol: AUN/1.0
400
+ Connection: connected
401
+ Latency: 42ms
402
+ Session: active (expires in 23h)
403
+ ```
404
+
405
+ #### `aun ping`
406
+
407
+ 验证目标 AID 可达性。
408
+
409
+ ```
410
+ aun ping <target-aid> [--count N]
411
+
412
+ 示例:
413
+ aun ping bob@aid.com
414
+ aun ping bob@aid.com --count 5
415
+
416
+ 输出:
417
+ bob@aid.com is reachable (latency: 67ms)
418
+ ```
419
+
420
+ #### `aun logs`
421
+
422
+ 查看本地 SDK 日志。
423
+
424
+ ```
425
+ aun logs [--tail N] [--follow]
426
+
427
+ 示例:
428
+ aun logs --tail 50
429
+ aun logs --follow # 实时跟踪
430
+ ```
431
+
432
+ ## 5. 配置系统
433
+
434
+ ### 5.1 配置文件
435
+
436
+ ```toml
437
+ # ~/.aun/cli.toml
438
+
439
+ [default]
440
+ profile = "default" # 默认 profile
441
+ output = "table" # 默认输出格式: table | json | plain
442
+ color = true # 彩色输出
443
+ timeout = 30 # 默认超时(秒)
444
+
445
+ [profiles.default]
446
+ aid = "alice@aid.com"
447
+ gateway = "wss://gw.aid.com/ws"
448
+ aun_path = "~/.aun/profiles/default"
449
+
450
+ [profiles.work]
451
+ aid = "bot@corp.com"
452
+ gateway = "wss://gw.corp.com/ws"
453
+ aun_path = "~/.aun/profiles/work"
454
+ ```
455
+
456
+ ### 5.2 Profile 管理命令
457
+
458
+ ```
459
+ aun config init # 初始化配置
460
+ aun config set <key> <value> # 设置配置项
461
+ aun config get <key> # 读取配置项
462
+ aun config profile create <name> # 创建 profile
463
+ aun config profile delete <name> # 删除 profile
464
+ aun config profile switch <name> # 切换默认 profile
465
+ ```
466
+
467
+ ### 5.3 配置优先级
468
+
469
+ ```
470
+ 命令行参数 > 环境变量 > cli.toml > 内置默认值
471
+ ```
472
+
473
+ 环境变量映射:
474
+ - `AUN_PROFILE` → `--profile`
475
+ - `AUN_GATEWAY` → `--gateway`
476
+ - `AUN_DEBUG` → `--debug`
477
+ - `AUN_DATA_ROOT` → 覆盖 aun_path
478
+
479
+ ## 6. 会话管理
480
+
481
+ ### 6.1 短命令模式(默认)
482
+
483
+ 每次命令执行:连接 → 认证 → 操作 → 断开。
484
+
485
+ 为避免每次都做完整握手,引入 session cache:
486
+
487
+ ```
488
+ ~/.aun/profiles/{profile}/.session.json
489
+ {
490
+ "gateway": "wss://gw.aid.com/ws",
491
+ "token": "...",
492
+ "expires_at": "2026-05-22T14:00:00Z",
493
+ "device_id": "d8f2..."
494
+ }
495
+ ```
496
+
497
+ - token 未过期:跳过认证,直接用 token 连接
498
+ - token 过期:重新挑战-响应认证,更新 cache
499
+
500
+ ### 6.2 长连接模式(listen)
501
+
502
+ `aun listen` 和 `aun group listen` 保持 WebSocket 长连接:
503
+ - 前台运行,Ctrl+C 优雅退出
504
+ - 自动重连(SDK 内置机制)
505
+ - 断线时输出提示,重连后继续
506
+
507
+ ## 7. 输出格式
508
+
509
+ ### 7.1 Human-readable(默认)
510
+
511
+ ```
512
+ aun group list
513
+
514
+ GROUP ID NAME MEMBERS ROLE
515
+ g:abc123 Project Alpha 5 owner
516
+ g:def456 Team Chat 3 member
517
+ ```
518
+
519
+ ### 7.2 JSON(`--json`)
520
+
521
+ ```json
522
+ [
523
+ {"group_id": "g:abc123", "name": "Project Alpha", "members": 5, "role": "owner"},
524
+ {"group_id": "g:def456", "name": "Team Chat", "members": 3, "role": "member"}
525
+ ]
526
+ ```
527
+
528
+ JSON 模式适合脚本管道:`aun group list --json | jq '.[0].group_id'`
529
+
530
+ ## 8. 错误处理
531
+
532
+ ### 8.1 退出码
533
+
534
+ | 退出码 | 含义 |
535
+ |--------|------|
536
+ | 0 | 成功 |
537
+ | 1 | 通用错误 |
538
+ | 2 | 参数错误 |
539
+ | 3 | 认证失败 |
540
+ | 4 | 连接失败(网关不可达) |
541
+ | 5 | 超时 |
542
+ | 6 | 权限不足 |
543
+ | 7 | 目标不存在(AID/群组) |
544
+
545
+ ### 8.2 错误输出
546
+
547
+ ```
548
+ # 默认模式
549
+ Error: Gateway wss://gw.aid.com unreachable (connection refused)
550
+ Hint: Check network connectivity or verify gateway URL with `aun config get profiles.default.gateway`
551
+
552
+ # JSON 模式
553
+ {"error": "connection_failed", "message": "Gateway unreachable", "code": 4}
554
+ ```
555
+
556
+ ## 9. SDK Adapter Layer
557
+
558
+ CLI 与 SDK 之间的桥接层,解决以下问题:
559
+
560
+ ### 9.1 异步桥接
561
+
562
+ ```python
563
+ # adapter.py 核心模式
564
+ import asyncio
565
+ from aun_core import AUNClient
566
+
567
+ def run_async(coro):
568
+ """CLI 同步入口调用 SDK 异步方法"""
569
+ return asyncio.run(coro)
570
+
571
+ class CLISession:
572
+ """管理 SDK client 生命周期"""
573
+
574
+ def __init__(self, profile: str, gateway: str = None, timeout: int = 30):
575
+ self.profile = profile
576
+ self.gateway = gateway
577
+ self.timeout = timeout
578
+
579
+ async def __aenter__(self):
580
+ # 加载配置 → 创建 client → 连接/认证
581
+ ...
582
+ return self.client
583
+
584
+ async def __aexit__(self, *exc):
585
+ await self.client.close()
586
+ ```
587
+
588
+ ### 9.2 命令实现模式
589
+
590
+ ```python
591
+ # commands/message.py 示例模式
592
+ @app.command()
593
+ def send(target: str, message: str, no_encrypt: bool = False):
594
+ async def _send():
595
+ async with CLISession(profile) as client:
596
+ result = await client.call("message.send", {
597
+ "to": target,
598
+ "content": {"text": message},
599
+ "encrypt": not no_encrypt,
600
+ })
601
+ return result
602
+ result = run_async(_send())
603
+ output(result)
604
+ ```
605
+
606
+ ## 10. 分发策略
607
+
608
+ ### 10.1 开发阶段
609
+
610
+ ```bash
611
+ # 直接运行
612
+ python -m aun_cli send bob@aid.com "hello"
613
+
614
+ # 或 editable install
615
+ pip install -e ".[cli]"
616
+ aun send bob@aid.com "hello"
617
+ ```
618
+
619
+ ### 10.2 正式发布
620
+
621
+ **pip 包**(面向 Python 开发者):
622
+ ```bash
623
+ pip install fastaun[cli]
624
+ ```
625
+
626
+ **独立二进制**(面向终端用户):
627
+ ```bash
628
+ # 构建
629
+ pyinstaller --onefile src/aun_cli/main.py -n aun --hidden-import aun_core
630
+
631
+ # 产出
632
+ dist/aun (Linux/Mac)
633
+ dist/aun.exe (Windows)
634
+ ```
635
+
636
+ ### 10.3 pyproject.toml 变更
637
+
638
+ ```toml
639
+ [project.optional-dependencies]
640
+ cli = ["typer>=0.9", "rich>=13.0"]
641
+
642
+ [project.scripts]
643
+ aun = "aun_cli.main:app"
644
+ ```
645
+
646
+ ## 11. 实现优先级
647
+
648
+ ### Phase 1:核心可用(MVP)
649
+
650
+ - [ ] 项目骨架(typer app + 全局选项 + 配置加载)
651
+ - [ ] `aun register` / `aun login` / `aun whoami`
652
+ - [ ] `aun send` / `aun pull`
653
+ - [ ] `aun status` / `aun ping`
654
+ - [ ] 基本输出格式化(table + json)
655
+
656
+ ### Phase 2:完整通信
657
+
658
+ - [ ] `aun listen`(长连接)
659
+ - [ ] `aun group create/send/list/members/invite/kick/leave`
660
+ - [ ] `aun group listen`
661
+ - [ ] `aun ack`
662
+
663
+ ### Phase 3:管理与诊断
664
+
665
+ - [ ] `aun keys list/rotate/export/import`
666
+ - [ ] `aun doctor`
667
+ - [ ] `aun logs`
668
+ - [ ] `aun storage upload/download/delete`
669
+ - [ ] `aun config` 子命令
670
+
671
+ ### Phase 4:体验优化
672
+
673
+ - [ ] Shell 自动补全(typer 内置支持)
674
+ - [ ] PyInstaller 打包流程
675
+ - [ ] 交互式模式(`aun interactive` — REPL 风格)
676
+ - [ ] `aun trace <message-id>` 消息追踪
677
+
678
+ ## 12. 与现有工具的关系
679
+
680
+ | 工具 | 定位 | 用户 |
681
+ |------|------|------|
682
+ | **certool** | 服务端 CA 证书管理 | 运维 |
683
+ | **aun CLI** | 客户端身份 + 通信 | 开发者/Agent |
684
+ | **SDK** | 编程接口 | 应用开发者 |
685
+
686
+ 三者互补:certool 管服务端证书链,CLI 管客户端身份和消息,SDK 供应用集成。