@agentunion/fastaun-browser 0.2.20 → 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.
- package/CHANGELOG.md +50 -26
- package/_packed_docs/CHANGELOG.md +50 -26
- 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
- package/_packed_docs/protocol/index.md +13 -3
- package/_packed_docs/python-sdk-v2-only-changelog.md +189 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +39 -16
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +90 -39
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +20 -3
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +14300 -0
- package/dist/client.d.ts +179 -187
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3007 -4012
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +0 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -4
- package/dist/config.js.map +1 -1
- package/dist/crypto.d.ts +8 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +114 -1
- package/dist/crypto.js.map +1 -1
- package/dist/e2ee.d.ts +5 -210
- package/dist/e2ee.d.ts.map +1 -1
- package/dist/e2ee.js +4 -1379
- package/dist/e2ee.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/namespaces/auth.d.ts.map +1 -1
- package/dist/namespaces/auth.js +5 -4
- package/dist/namespaces/auth.js.map +1 -1
- package/dist/protected-headers.d.ts +14 -0
- package/dist/protected-headers.d.ts.map +1 -0
- package/dist/protected-headers.js +47 -0
- package/dist/protected-headers.js.map +1 -0
- package/dist/seq-tracker.d.ts +7 -2
- package/dist/seq-tracker.d.ts.map +1 -1
- package/dist/seq-tracker.js +31 -10
- package/dist/seq-tracker.js.map +1 -1
- package/dist/v2/crypto/aead.d.ts +26 -0
- package/dist/v2/crypto/aead.d.ts.map +1 -0
- package/dist/v2/crypto/aead.js +63 -0
- package/dist/v2/crypto/aead.js.map +1 -0
- package/dist/v2/crypto/canonical.d.ts +21 -0
- package/dist/v2/crypto/canonical.d.ts.map +1 -0
- package/dist/v2/crypto/canonical.js +111 -0
- package/dist/v2/crypto/canonical.js.map +1 -0
- package/dist/v2/crypto/dh-path.d.ts +21 -0
- package/dist/v2/crypto/dh-path.d.ts.map +1 -0
- package/dist/v2/crypto/dh-path.js +50 -0
- package/dist/v2/crypto/dh-path.js.map +1 -0
- package/dist/v2/crypto/ecdh.d.ts +19 -0
- package/dist/v2/crypto/ecdh.d.ts.map +1 -0
- package/dist/v2/crypto/ecdh.js +101 -0
- package/dist/v2/crypto/ecdh.js.map +1 -0
- package/dist/v2/crypto/ecdsa.d.ts +16 -0
- package/dist/v2/crypto/ecdsa.d.ts.map +1 -0
- package/dist/v2/crypto/ecdsa.js +52 -0
- package/dist/v2/crypto/ecdsa.js.map +1 -0
- package/dist/v2/crypto/hkdf.d.ts +21 -0
- package/dist/v2/crypto/hkdf.d.ts.map +1 -0
- package/dist/v2/crypto/hkdf.js +32 -0
- package/dist/v2/crypto/hkdf.js.map +1 -0
- package/dist/v2/crypto/index.d.ts +9 -0
- package/dist/v2/crypto/index.d.ts.map +1 -0
- package/dist/v2/crypto/index.js +8 -0
- package/dist/v2/crypto/index.js.map +1 -0
- package/dist/v2/crypto/recipients.d.ts +43 -0
- package/dist/v2/crypto/recipients.d.ts.map +1 -0
- package/dist/v2/crypto/recipients.js +188 -0
- package/dist/v2/crypto/recipients.js.map +1 -0
- package/dist/v2/e2ee/decrypt.d.ts +13 -0
- package/dist/v2/e2ee/decrypt.d.ts.map +1 -0
- package/dist/v2/e2ee/decrypt.js +176 -0
- package/dist/v2/e2ee/decrypt.js.map +1 -0
- package/dist/v2/e2ee/encrypt-group.d.ts +14 -0
- package/dist/v2/e2ee/encrypt-group.d.ts.map +1 -0
- package/dist/v2/e2ee/encrypt-group.js +196 -0
- package/dist/v2/e2ee/encrypt-group.js.map +1 -0
- package/dist/v2/e2ee/encrypt-p2p.d.ts +15 -0
- package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -0
- package/dist/v2/e2ee/encrypt-p2p.js +240 -0
- package/dist/v2/e2ee/encrypt-p2p.js.map +1 -0
- package/dist/v2/e2ee/index.d.ts +9 -0
- package/dist/v2/e2ee/index.d.ts.map +1 -0
- package/dist/v2/e2ee/index.js +9 -0
- package/dist/v2/e2ee/index.js.map +1 -0
- package/dist/v2/e2ee/metadata-auth.d.ts +9 -0
- package/dist/v2/e2ee/metadata-auth.d.ts.map +1 -0
- package/dist/v2/e2ee/metadata-auth.js +60 -0
- package/dist/v2/e2ee/metadata-auth.js.map +1 -0
- package/dist/v2/e2ee/types.d.ts +57 -0
- package/dist/v2/e2ee/types.d.ts.map +1 -0
- package/dist/v2/e2ee/types.js +7 -0
- package/dist/v2/e2ee/types.js.map +1 -0
- package/dist/v2/session/index.d.ts +4 -0
- package/dist/v2/session/index.d.ts.map +1 -0
- package/dist/v2/session/index.js +3 -0
- package/dist/v2/session/index.js.map +1 -0
- package/dist/v2/session/keystore.d.ts +48 -0
- package/dist/v2/session/keystore.d.ts.map +1 -0
- package/dist/v2/session/keystore.js +184 -0
- package/dist/v2/session/keystore.js.map +1 -0
- package/dist/v2/session/session.d.ts +98 -0
- package/dist/v2/session/session.d.ts.map +1 -0
- package/dist/v2/session/session.js +270 -0
- package/dist/v2/session/session.js.map +1 -0
- package/dist/v2/state/commitment.d.ts +10 -0
- package/dist/v2/state/commitment.d.ts.map +1 -0
- package/dist/v2/state/commitment.js +86 -0
- package/dist/v2/state/commitment.js.map +1 -0
- package/dist/v2/state/index.d.ts +2 -0
- package/dist/v2/state/index.d.ts.map +1 -0
- package/dist/v2/state/index.js +2 -0
- package/dist/v2/state/index.js.map +1 -0
- package/package.json +8 -5
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Python SDK V2-Only 改动清单
|
|
2
|
+
|
|
3
|
+
基线:`d8b79f44` (v0.2.20 之后,master_1.0.0 分支)
|
|
4
|
+
日期:2026-05-20
|
|
5
|
+
|
|
6
|
+
## 一、源码改动(`python/src/aun_core/`)
|
|
7
|
+
|
|
8
|
+
### 1. client.py:8588 行 → 4502 行(净删 4086 行)
|
|
9
|
+
|
|
10
|
+
#### 删除的 V1 E2EE 代码(共 ~95 个方法)
|
|
11
|
+
|
|
12
|
+
**V1 P2P 加密:**
|
|
13
|
+
- `_send_encrypted`, `_build_self_sync_copies`, `_build_recipient_device_copies`
|
|
14
|
+
- `_encrypt_copy_payload`, `_ensure_encrypt_result`, `_resolve_self_copy_peer_cert`
|
|
15
|
+
- `_log_e2ee_error`
|
|
16
|
+
|
|
17
|
+
**V1 群组加密:**
|
|
18
|
+
- `_send_group_encrypted`, `_put_group_thought_encrypted`, `_put_message_thought_encrypted`
|
|
19
|
+
- `_call_group_encrypted_rpc`, `_prepare_group_encrypted_rpc_params`
|
|
20
|
+
|
|
21
|
+
**V1 Epoch 管理:**
|
|
22
|
+
- `_recover_group_epoch_key`, `_do_recover_group_epoch_key`, `_try_recover_epoch_key_from_server`
|
|
23
|
+
- `_recover_initial_group_epoch_if_needed`, `_request_group_key_from_candidates`
|
|
24
|
+
- `_request_group_key_from_online`, `_request_group_key_from`
|
|
25
|
+
- `_group_epoch_secret_ready_for_recovery`, `_pending_group_secret_still_current`
|
|
26
|
+
- `_ensure_group_epoch_ready`, `_wait_for_group_membership_epoch_floor`
|
|
27
|
+
- `_committed_group_epoch`, `_committed_group_epoch_state`
|
|
28
|
+
- `_ensure_committed_group_secret_for_send`, `_committed_rotation_membership_gap`
|
|
29
|
+
|
|
30
|
+
**V1 密钥控制面:**
|
|
31
|
+
- `_try_handle_group_key_message`, `_verify_active_group_rotation_distribution`
|
|
32
|
+
- `_verify_group_key_response_epoch`, `_discard_group_distribution_if_stale`
|
|
33
|
+
- `_ack_group_rotation_key`
|
|
34
|
+
|
|
35
|
+
**V1 Epoch 轮换:**
|
|
36
|
+
- `_build_rotation_signature`, `_attach_rotation_id`, `_build_epoch_encrypted_keys`
|
|
37
|
+
- `_distribute_group_epoch_key`, `_heartbeat_group_rotation`, `_abort_group_rotation`
|
|
38
|
+
- `_schedule_group_rotation_retry`, `_sync_epoch_to_server`
|
|
39
|
+
- `_maybe_lead_rotate_group_epoch`, `_ranked_group_rotation_candidates`, `_rotate_group_epoch`
|
|
40
|
+
- `_delayed_rotate_after_join`, `_maybe_backfill_key_to_joined_member`
|
|
41
|
+
- `_distribute_key_to_new_member`, `_start_group_epoch_tasks`
|
|
42
|
+
- `_is_rotation_leader`, `_group_epoch_rotate_loop`, `_group_epoch_cleanup_loop`
|
|
43
|
+
|
|
44
|
+
**V1 解密:**
|
|
45
|
+
- `_decrypt_messages`, `_decrypt_single_message`
|
|
46
|
+
- `_decrypt_group_message`, `_decrypt_group_messages`
|
|
47
|
+
- `_decrypt_group_thoughts`, `_decrypt_message_thoughts`
|
|
48
|
+
|
|
49
|
+
**V1 Pending queue:**
|
|
50
|
+
- `_enqueue_pending_decrypt`, `_schedule_retry_pending_decrypt_msgs`
|
|
51
|
+
- `_retry_pending_decrypt_msgs`, `_schedule_recovery_timeout`, `_cleanup_group_state`
|
|
52
|
+
|
|
53
|
+
**V1 Prekey:**
|
|
54
|
+
- `_upload_prekey`, `_prekey_refresh_loop`, `_start_prekey_refresh_task`
|
|
55
|
+
- `_schedule_prekey_replenish_if_consumed`, `_invalidate_peer_prekey_cache`
|
|
56
|
+
- `_fetch_peer_prekeys`, `_fetch_peer_prekey`, `_normalize_peer_prekeys`
|
|
57
|
+
- `_refresh_peer_prekeys`, `_clear_peer_cert_cache`
|
|
58
|
+
|
|
59
|
+
**V1 错误辅助:**
|
|
60
|
+
- `_is_group_epoch_too_old_error`, `_is_group_epoch_rotation_pending_error`
|
|
61
|
+
- `_is_group_epoch_changed_during_send_error`, `_is_recoverable_group_epoch_error`
|
|
62
|
+
- `_is_expected_group_rotation_skip_error`
|
|
63
|
+
|
|
64
|
+
**V1 成员轮换辅助:**
|
|
65
|
+
- `_membership_rotation_trigger_id`, `_membership_rotation_changed`
|
|
66
|
+
- `_membership_rotation_expected_epoch`, `_extract_group_id_from_result`
|
|
67
|
+
- `_get_group_member_aids`, `_local_group_members_match`, `_extract_group_join_mode`
|
|
68
|
+
- `_group_allows_member_epoch_rotation`, `_group_key_recovery_candidates`
|
|
69
|
+
- `_joined_member_aids_from_payload`
|
|
70
|
+
|
|
71
|
+
**V1 群组推送处理:**
|
|
72
|
+
- `_process_and_publish_group_message`, `_auto_pull_group_messages`, `_fill_group_gap`
|
|
73
|
+
|
|
74
|
+
**V1 公开 API:**
|
|
75
|
+
- `e2ee` property, `group_e2ee` property
|
|
76
|
+
- `send_v2`, `pull_v2`, `ack_v2`, `send_group_v2`, `pull_group_v2`, `ack_group_v2`
|
|
77
|
+
(独立方法合并进 `call()` 路由)
|
|
78
|
+
|
|
79
|
+
#### 删除的 V1 实例变量
|
|
80
|
+
|
|
81
|
+
- `self._e2ee` (E2EEManager)
|
|
82
|
+
- `self._group_e2ee` (GroupE2EEManager)
|
|
83
|
+
- `self._pending_decrypt_msgs`
|
|
84
|
+
- `self._recovery_timeout_scheduled`
|
|
85
|
+
- `self._group_epoch_rotation_inflight`
|
|
86
|
+
- `self._group_epoch_rotation_retry_tasks`
|
|
87
|
+
- `self._group_epoch_recovery_inflight`
|
|
88
|
+
- `self._group_membership_rotation_done`
|
|
89
|
+
- `self._group_member_key_backfill_done`
|
|
90
|
+
|
|
91
|
+
#### 新增/修改的逻辑
|
|
92
|
+
|
|
93
|
+
- `_on_raw_group_message_created`:简化为明文消息透传 + seq 跟踪(不再做 V1 解密)
|
|
94
|
+
- `_process_and_publish_message`:移除 V1 解密调用,明文直接透传
|
|
95
|
+
- `_on_raw_group_changed`:移除 V1 epoch 轮换编排,保留 V2 `_v2_auto_propose_state` + event gap 检测
|
|
96
|
+
- `call()` 中 `message.pull` / `group.pull` 后处理:移除 V1 解密,保留 seq 跟踪 + auto-ack
|
|
97
|
+
- `_stop_background_tasks`:移除 V1 epoch 任务清理
|
|
98
|
+
- `_start_background_tasks`:移除 `_start_group_epoch_tasks()` 调用
|
|
99
|
+
- V2 解密元数据:`e2ee` 字段增加 `encryption_mode` 和 `forward_secrecy`
|
|
100
|
+
- V2 group pull:移除返回值去重(pull 始终返回所有解密成功的消息)
|
|
101
|
+
|
|
102
|
+
### 2. seq_tracker.py:+14 行
|
|
103
|
+
|
|
104
|
+
- `on_pull_result` 新增 `after_seq` 参数
|
|
105
|
+
- gap fill 场景(`after_seq == contiguous_seq`):直接把 pull 到的最大 seq 作为新 `contiguous_seq`,跳过服务端永久空洞
|
|
106
|
+
|
|
107
|
+
### 3. `__init__.py`:无变化(`ProtectedHeaders` 保留)
|
|
108
|
+
|
|
109
|
+
### 4. `e2ee.py`:不动(3544 行保留作为参考)
|
|
110
|
+
|
|
111
|
+
### 5. 保留的 e2ee.py 引用(非 E2EE 加解密)
|
|
112
|
+
|
|
113
|
+
- `from .e2ee import ProtectedHeaders` — 纯数据类,V2 也用
|
|
114
|
+
- `from .e2ee import compute_state_hash` (2处) — 群组 state hash 验证工具函数
|
|
115
|
+
|
|
116
|
+
## 二、测试改动(`python/tests/`)
|
|
117
|
+
|
|
118
|
+
### 删除的测试文件(纯 V1 E2EE)
|
|
119
|
+
|
|
120
|
+
- `e2e_test_epoch_key_server.py` — V1 epoch key 服务端托管
|
|
121
|
+
- `integration_test_e2ee.py` — V1 P2P E2EE 集成
|
|
122
|
+
- `integration_test_multi_device_e2ee.py` — V1 多设备 E2EE
|
|
123
|
+
- `unit/test_client_group_e2ee.py` — V1 群组 E2EE 单元测试(93 个用例)
|
|
124
|
+
|
|
125
|
+
### 删除的测试用例(从现有文件中移除)
|
|
126
|
+
|
|
127
|
+
- `test_client.py`:24 个 V1 测试(prekey、send_encrypted V1、decrypt_group 等)
|
|
128
|
+
- `test_py_issues.py`:`TestPY004PrekeyRefreshLoop`
|
|
129
|
+
- `test_py_issues_batch2.py`:`TestPY001DecryptFailStillAutoAck`、`TestPY002KeyRecoveryRetry`、`TestPY003DissolveCleanup`、`TestPY005RotateLoopLeaderElection`
|
|
130
|
+
- `test_py_issues_batch3.py`:`TestPY002PushedSeqsLimit`、`TestPY005EpochWait`
|
|
131
|
+
|
|
132
|
+
### 修改的测试
|
|
133
|
+
|
|
134
|
+
- `test_client.py`:`test_e2ee_property` 改为断言 `e2ee` 属性不存在
|
|
135
|
+
- `integration_test_storage.py`:自定义 redirect handler 支持 PUT 302 重定向
|
|
136
|
+
|
|
137
|
+
## 三、服务端改动(`extensions/services/`)
|
|
138
|
+
|
|
139
|
+
| 文件 | 改动 |
|
|
140
|
+
|------|------|
|
|
141
|
+
| `gateway/entry.py` | kernel event 订阅补全 V2 事件(fallback);`_handle_event_notification` 路由补全 V2 事件 |
|
|
142
|
+
| `gateway/ws_server.py` | `_dispatch_event_from_service` 白名单补全 `group.state_committed` |
|
|
143
|
+
| `gateway/relay.py` | `_should_forward_event` 补全 `group.state_committed`;`_V2_ONLY_GROUP_METHODS` 补全 `propose_state/confirm_state/get_proposal` |
|
|
144
|
+
| `message/entry.py` | `AUN_DIRECT_EVENT_MESSAGE` 默认改为 True;V2 send 返回 status 对齐 V1 语义(`delivered`/`sent`) |
|
|
145
|
+
| `group/entry.py` | `AUN_DIRECT_EVENT_GROUP` 默认改为 True;`_targets_for_group_event` / `is_client_event` 补全 `group.state_committed`;`_rpc_v2_pull` / `_rpc_v2_ack` 补全成员权限检查 |
|
|
146
|
+
|
|
147
|
+
## 四、Bug 修复(需要其它 SDK 对齐)
|
|
148
|
+
|
|
149
|
+
### BUG-1: gap fill 时 contiguous_seq 卡死
|
|
150
|
+
|
|
151
|
+
**根因:** `on_pull_result` 从 `contiguous_seq` 开始 pull,如果服务端返回的消息跳过了某些 seq(永久空洞:竞态跳跃/未持久化/过期清理),`_try_advance` 逐个检查时会卡在第一个缺失的 seq 上,永远无法推进。新消息被阻塞在 SDK 内部有序队列中,上层收不到。
|
|
152
|
+
|
|
153
|
+
**修复:** `on_pull_result` 新增 `after_seq` 参数。当 `after_seq == contiguous_seq`(gap fill 场景)时,直接把 pull 到的最大 seq 作为新的 `contiguous_seq`。
|
|
154
|
+
|
|
155
|
+
**影响范围:** P2P pull、group pull、event pull 三条路径。
|
|
156
|
+
|
|
157
|
+
### BUG-2: V2 group pull 返回值去重导致手动 pull 拿不到已 push 的消息
|
|
158
|
+
|
|
159
|
+
**根因:** `_pull_group_v2_internal` 中 `_is_published_seq` 去重导致已通过 push 自动 pull 消费的消息在手动 pull 时被跳过,返回空列表。
|
|
160
|
+
|
|
161
|
+
**修复:** pull 返回值不再做 `_is_published_seq` 去重。`_publish_ordered_message` 内部仍做事件投递去重(防止重复触发应用层回调),但 pull 的返回值始终包含所有解密成功的消息。
|
|
162
|
+
|
|
163
|
+
### BUG-3: V2 message.send 返回 status 不对齐 V1 语义
|
|
164
|
+
|
|
165
|
+
**根因:** V2 send 返回 `"status": "accepted"`,但 SDK 和应用层已按 V1 语义(`sent`/`delivered`)实现。
|
|
166
|
+
|
|
167
|
+
**修复:** 服务端 `delivered_count > 0` 时返回 `delivered`,否则返回 `sent`。
|
|
168
|
+
|
|
169
|
+
### BUG-4: V2 解密元数据缺少 encryption_mode
|
|
170
|
+
|
|
171
|
+
**根因:** V2 解密后 `e2ee` 字段只有 `version` + `suite`,缺少 `encryption_mode` 和 `forward_secrecy`,导致依赖这些字段的测试/应用层判断失败。
|
|
172
|
+
|
|
173
|
+
**修复:** 补全 `encryption_mode: "v2_{suite}"` 和 `forward_secrecy: True`。
|
|
174
|
+
|
|
175
|
+
## 五、验证结果
|
|
176
|
+
|
|
177
|
+
| 测试 | 结果 |
|
|
178
|
+
|------|------|
|
|
179
|
+
| 单元测试 | 501 passed |
|
|
180
|
+
| V2 P2P E2EE | 12/12 |
|
|
181
|
+
| V2 Group E2EE | 8/8 |
|
|
182
|
+
| V2 Multi-device | 6/6 |
|
|
183
|
+
| Echo | 5/5 |
|
|
184
|
+
| Message Ack | 4/4 |
|
|
185
|
+
| Storage | 4/4 |
|
|
186
|
+
| 双域明文 | PASS |
|
|
187
|
+
| 双域加密 | PASS |
|
|
188
|
+
| 双域离线 | PASS |
|
|
189
|
+
| 双域群组 | 2/2 |
|
|
@@ -202,26 +202,49 @@ Name Service 同时提供面向 Agent Web 的标准 HTTP 资源:
|
|
|
202
202
|
- `HEAD https://{aid}/agent.md`
|
|
203
203
|
匿名查询是否存在,并获取 `ETag`、`Last-Modified`、`Cache-Control`
|
|
204
204
|
|
|
205
|
-
|
|
205
|
+
### 推荐主 API(自 v0.x 起)
|
|
206
|
+
|
|
207
|
+
SDK 在 `AUNClient` 上提供两个一站式主方法,封装了"读文件/内容 → 签名 → 上传 → 刷新 etag"和"下载 → 自动验签 → 可选写盘"两条主线:
|
|
206
208
|
|
|
207
209
|
```python
|
|
208
|
-
|
|
209
|
-
await client.
|
|
210
|
-
|
|
211
|
-
|
|
210
|
+
# 发布自己的 agent.md(读文件 → 签名 → 上传 → 刷新内部 etag)
|
|
211
|
+
await client.publish_agent_md("/path/to/agent.md")
|
|
212
|
+
|
|
213
|
+
# 下载并自动验签别人的 agent.md(aid 缺省取自身 AID)
|
|
214
|
+
info = await client.fetch_agent_md("bob.agentid.pub", save_path="./bob.md")
|
|
215
|
+
print(info["signature"]["status"], info["in_sync"])
|
|
212
216
|
```
|
|
213
217
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
218
|
+
详细签名见 `06-API手册.md` 中的 `publish_agent_md` / `fetch_agent_md` 章节。
|
|
219
|
+
|
|
220
|
+
| SDK | publish | fetch |
|
|
221
|
+
|------|---------|-------|
|
|
222
|
+
| Python | `client.publish_agent_md(path)` | `client.fetch_agent_md(aid, save_path)` |
|
|
223
|
+
| TypeScript(Node) | `client.publishAgentMd(path)` | `client.fetchAgentMd(aid?, savePath?)` |
|
|
224
|
+
| Go | `client.PublishAgentMD(ctx, path)` | `client.FetchAgentMD(ctx, aid, savePath)` |
|
|
225
|
+
| C++ | `client.PublishAgentMd(path, cb)` | `client.FetchAgentMd(aid, save_path, cb)` |
|
|
226
|
+
| JavaScript(浏览器) | `client.publishAgentMd(content)` | `client.fetchAgentMd(aid?)` |
|
|
227
|
+
|
|
228
|
+
JS 浏览器版本无文件系统,`publish` 接收 markdown 文本(应用层用 `<input type=file>` 等读出),`fetch` 不接受 `savePath`。
|
|
229
|
+
|
|
230
|
+
### Deprecated(保留代码、未来版本将移除)
|
|
231
|
+
|
|
232
|
+
| 旧方法 | 推荐替代 |
|
|
233
|
+
|--------|----------|
|
|
234
|
+
| `client.auth.sign_agent_md` | `client.publish_agent_md` 内部已包含 |
|
|
235
|
+
| `client.auth.verify_agent_md` | `client.fetch_agent_md` 内部已包含 |
|
|
236
|
+
| `client.auth.upload_agent_md` | `client.publish_agent_md` |
|
|
237
|
+
| `client.auth.download_agent_md` | `client.fetch_agent_md` |
|
|
238
|
+
|
|
239
|
+
底层方法仅推荐用于离线签名 / 纯文本验签等特殊场景。
|
|
240
|
+
|
|
241
|
+
> v0.x 起删除了 `set_local_agent_md_path` / `get_local_agent_md_etag` / `get_remote_agent_md_etag` 三个 client 端 API;本地 etag 现在由 `publish_agent_md` / `fetch_agent_md(自身 aid)` 自动计算并缓存。事件 payload 仍会注入 `_agent_md.{local_etag, remote_etag}` 供应用层比对。
|
|
242
|
+
|
|
243
|
+
### 错误返回
|
|
244
|
+
|
|
245
|
+
- `PUT /agent.md` 可能返回 `401`(缺失或无效 token)、`403`(token 的 AID 与 Host 不匹配)、`400`(frontmatter 非法或 frontmatter.aid 与 Host 不匹配)、`413`(文档超过大小上限)
|
|
246
|
+
- `GET/HEAD /agent.md` 在目标尚未发布时返回 `404`
|
|
247
|
+
- 主 API 在上述场景抛对应异常(NotFoundError / AUNError 等)
|
|
225
248
|
|
|
226
249
|
---
|
|
227
250
|
|
|
@@ -15,17 +15,19 @@
|
|
|
15
15
|
- [disconnect()](#await-disconnect---none) - 断开连接(可重连)
|
|
16
16
|
- [list_identities()](#list_identities---listdict) - 列出本地身份
|
|
17
17
|
- [ping()](#await-pingparams-dict--none---any) - 连通性探测
|
|
18
|
-
- [set_local_agent_md_path()](#set_local_agent_md_pathpath-str---str--agentmd-版本一致性) -
|
|
18
|
+
- [set_local_agent_md_path()](#set_local_agent_md_pathpath-str---str--agentmd-版本一致性) - **已删除**,请改用 `publish_agent_md()` / `fetch_agent_md()`
|
|
19
|
+
- [publish_agent_md()](#await-publish_agent_mdpath-str---dict--agentmd-发布主-api) - 读取本地 agent.md → 签名 → 上传,并刷新内部 etag
|
|
20
|
+
- [fetch_agent_md()](#await-fetch_agent_mdaid-str--none-save_path-str--none---dict--agentmd-下载主-api) - 下载 agent.md → 自动验签 → 可选写盘
|
|
19
21
|
- [status()](#await-statusparams-dict--none---any) - 网关状态查询
|
|
20
22
|
- [check_gateway_health()](#await-check_gateway_healthgateway_url-str-timeout-float--50---bool) - 检查网关可用性
|
|
21
23
|
|
|
22
24
|
### [AUNClient.Auth](#authnamespace-clientauth)
|
|
23
25
|
- [create_aid()](#await-create_aidparams-dict---dict) - 注册新 AID
|
|
24
26
|
- [authenticate()](#await-authenticateparams-dict--none---dict) - 认证获取令牌
|
|
25
|
-
- [sign_agent_md()](#await-sign_agent_mdcontent-str-aid-str--none---str) - 为 agent.md 生成尾部签名
|
|
26
|
-
- [verify_agent_md()](#await-verify_agent_mdcontent-str-aid-str--none-cert_pem-str--none---dict) - 验证 agent.md 尾部签名
|
|
27
|
-
- [upload_agent_md()](#await-upload_agent_mdcontent-str---dict) - 上传自己的 agent.md
|
|
28
|
-
- [download_agent_md()](#await-download_agent_mdaid-str---str) - 下载指定 AID 的 agent.md
|
|
27
|
+
- [sign_agent_md()](#await-sign_agent_mdcontent-str-aid-str--none---str) - 为 agent.md 生成尾部签名 **(已 deprecated,建议改用 `client.publish_agent_md`)**
|
|
28
|
+
- [verify_agent_md()](#await-verify_agent_mdcontent-str-aid-str--none-cert_pem-str--none---dict) - 验证 agent.md 尾部签名 **(已 deprecated,建议改用 `client.fetch_agent_md`)**
|
|
29
|
+
- [upload_agent_md()](#await-upload_agent_mdcontent-str---dict) - 上传自己的 agent.md **(已 deprecated,建议改用 `client.publish_agent_md`)**
|
|
30
|
+
- [download_agent_md()](#await-download_agent_mdaid-str---str) - 下载指定 AID 的 agent.md **(已 deprecated,建议改用 `client.fetch_agent_md`)**
|
|
29
31
|
- [renew_cert()](#await-renew_certparams-dict--none---dict) - 续期证书
|
|
30
32
|
- [rekey()](#await-rekeyparams-dict--none---dict) - 密钥轮换
|
|
31
33
|
- [request_cert()](#await-request_certparams-dict---dict) - 通用证书请求
|
|
@@ -394,58 +396,99 @@ for item in identities:
|
|
|
394
396
|
|
|
395
397
|
---
|
|
396
398
|
|
|
397
|
-
### `
|
|
399
|
+
### `await publish_agent_md(path: str) -> dict` — agent.md 发布主 API
|
|
398
400
|
|
|
399
|
-
|
|
401
|
+
读取本地 `agent.md` 文件 → 调用 `auth.sign_agent_md` 在尾部追加 `<!-- AUN-SIGNATURE -->` 块 → 调用 `auth.upload_agent_md` 上传到服务端,并以**上传字节的 sha256**计算 quoted etag 写入内部 `_local_agent_md_etag`,使后续应用事件 payload 中的 `_agent_md.local_etag` 字段反映服务端实际生效的版本。
|
|
400
402
|
|
|
401
|
-
|
|
403
|
+
**API 跨语言对齐:**
|
|
404
|
+
|
|
405
|
+
| SDK | 签名 |
|
|
406
|
+
|------|------|
|
|
407
|
+
| Python | `await client.publish_agent_md(path: str) -> dict` |
|
|
408
|
+
| TypeScript(Node) | `await client.publishAgentMd(path: string)` |
|
|
409
|
+
| Go | `client.PublishAgentMD(ctx, path string) (map[string]any, error)` |
|
|
410
|
+
| C++ | `client.PublishAgentMd(path, callback)` |
|
|
411
|
+
| JavaScript(浏览器) | `await client.publishAgentMd(content: string)` — 浏览器无文件系统,接收 markdown 文本 |
|
|
412
|
+
|
|
413
|
+
**返回值:** 透传 `auth.upload_agent_md` 的返回,含 `aid` / `etag` / `last_modified` / `agent_md_url` / `bytes`。
|
|
414
|
+
|
|
415
|
+
**异常:**
|
|
416
|
+
- `ValidationError`:path / content 为空
|
|
417
|
+
- `FileNotFoundError`(其它语言对应):文件不存在
|
|
418
|
+
- `StateError`:尚未持有本地身份
|
|
419
|
+
- `AUNError`:上传失败
|
|
420
|
+
|
|
421
|
+
**示例:**
|
|
422
|
+
|
|
423
|
+
```python
|
|
424
|
+
result = await client.publish_agent_md("/path/to/agent.md")
|
|
425
|
+
print(result["agent_md_url"])
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
### `await fetch_agent_md(aid: str | None = None, save_path: str | None = None) -> dict` — agent.md 下载主 API
|
|
431
|
+
|
|
432
|
+
下载指定 AID 的 `agent.md`,自动调用 `auth.verify_agent_md` 验签;`aid` 缺省取本地身份;可选 `save_path` 写盘;若目标 aid 是自己则同步刷新内部 `_local_agent_md_etag` 并计算 `in_sync`。
|
|
402
433
|
|
|
403
434
|
**API 跨语言对齐:**
|
|
404
435
|
|
|
405
|
-
| SDK |
|
|
406
|
-
|
|
407
|
-
| Python | `client.
|
|
408
|
-
| TypeScript | `
|
|
409
|
-
| Go | `client.
|
|
410
|
-
| C++ | `client.
|
|
411
|
-
| JavaScript(浏览器) | `client.
|
|
436
|
+
| SDK | 签名 |
|
|
437
|
+
|------|------|
|
|
438
|
+
| Python | `await client.fetch_agent_md(aid=None, save_path=None) -> dict` |
|
|
439
|
+
| TypeScript(Node) | `await client.fetchAgentMd(aid?, savePath?)` |
|
|
440
|
+
| Go | `client.FetchAgentMD(ctx, aid string, savePath string) (*AgentMDInfo, error)` |
|
|
441
|
+
| C++ | `client.FetchAgentMd(aid, save_path, callback)` |
|
|
442
|
+
| JavaScript(浏览器) | `await client.fetchAgentMd(aid?)` — 无 savePath(浏览器无文件系统) |
|
|
443
|
+
|
|
444
|
+
**返回字段:**
|
|
445
|
+
|
|
446
|
+
| 字段 | 类型 | 说明 |
|
|
447
|
+
|------|------|------|
|
|
448
|
+
| `aid` | `str` | 实际下载的 AID(缺省时为自身 AID) |
|
|
449
|
+
| `content` | `str` | agent.md 完整文本 |
|
|
450
|
+
| `signature` | `dict` | `auth.verify_agent_md` 的返回(status / verified / reason / cert_fingerprint / timestamp) |
|
|
451
|
+
| `in_sync` | `bool \| None` | 仅当 aid 是自己时给出:本地 etag == 服务端 etag;否则为 `null` |
|
|
452
|
+
| `saved_to` | `str \| None` | 若传了 save_path 且写盘成功,返回路径;其他情况为 `null`(JS 浏览器版无此字段) |
|
|
453
|
+
| `save_error` | `str \| None` | 写盘失败原因;不影响下载成功(JS 浏览器版无此字段) |
|
|
454
|
+
|
|
455
|
+
**异常:**
|
|
456
|
+
- `ValidationError`:未传 aid 且本地无身份
|
|
457
|
+
- `NotFoundError`:服务端 404
|
|
458
|
+
- `AUNError`:其他 HTTP 错误
|
|
412
459
|
|
|
413
|
-
**
|
|
460
|
+
**etag 缓存:** 内部沿用 `auth.download_agent_md` 的 If-None-Match / 304 缓存机制;命中 304 时返回上次缓存的内容。
|
|
414
461
|
|
|
415
|
-
|
|
462
|
+
**示例:**
|
|
416
463
|
|
|
417
|
-
|
|
464
|
+
```python
|
|
465
|
+
# 拉自己的 agent.md,并判断是否与服务端同步
|
|
466
|
+
info = await client.fetch_agent_md()
|
|
467
|
+
print(info["signature"]["status"], info["in_sync"])
|
|
468
|
+
|
|
469
|
+
# 拉别人的 agent.md,并存到本地路径
|
|
470
|
+
info = await client.fetch_agent_md("bob.agentid.pub", save_path="./bob.md")
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
### `_agent_md` 事件 payload 字段(保留)
|
|
476
|
+
|
|
477
|
+
SDK 在 publish `message.received` / `group.message_created` 等应用事件时仍会自动注入:
|
|
418
478
|
|
|
419
479
|
```python
|
|
420
480
|
{
|
|
421
481
|
"_agent_md": {
|
|
422
|
-
"local_etag": "\"abc...\"", #
|
|
423
|
-
"remote_etag": "\"def...\"", # gateway
|
|
482
|
+
"local_etag": "\"abc...\"", # publish_agent_md / fetch_agent_md(自身)后内部计算
|
|
483
|
+
"remote_etag": "\"def...\"", # gateway 在每次 RPC envelope._meta.agent_md_etag 注入
|
|
424
484
|
},
|
|
425
485
|
# ... 原有业务字段
|
|
426
486
|
}
|
|
427
487
|
```
|
|
428
488
|
|
|
429
|
-
|
|
489
|
+
应用层比对二者是否一致即可知本地是否需要重新 publish。
|
|
430
490
|
|
|
431
|
-
|
|
432
|
-
client = AUNClient()
|
|
433
|
-
client.set_local_agent_md_path("/path/to/agent.md") # 启动时调一次
|
|
434
|
-
|
|
435
|
-
await client.connect(auth)
|
|
436
|
-
|
|
437
|
-
@client.on("message.received")
|
|
438
|
-
async def on_msg(payload):
|
|
439
|
-
meta = payload.get("_agent_md", {})
|
|
440
|
-
if meta["local_etag"] and meta["remote_etag"] and meta["local_etag"] != meta["remote_etag"]:
|
|
441
|
-
# 本地与服务端不一致,提示用户重新上传
|
|
442
|
-
print("agent.md 已变化,请调用 client.auth.upload_agent_md() 同步")
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
**注意事项:**
|
|
446
|
-
- 文件改了之后需要再次调用 `set_local_agent_md_path()` 触发重算(设计上一次性计算,不监听文件 mtime)
|
|
447
|
-
- 服务端 etag 来自 Gateway 缓存(5 分钟 TTL,上传后通过 kernel 事件立即失效)
|
|
448
|
-
- 注入失败被吞,**绝不影响业务路径**
|
|
491
|
+
> **注意:** v0.x 起删除了 `set_local_agent_md_path()` / `get_local_agent_md_etag()` / `get_remote_agent_md_etag()` 三个旧 API。`_local_etag` 现在由 `publish_agent_md` / `fetch_agent_md(自身 aid)` 自动计算并缓存;不再支持外部直接设置或读取。
|
|
449
492
|
|
|
450
493
|
---
|
|
451
494
|
|
|
@@ -537,6 +580,8 @@ auth = await client.auth.authenticate({"aid": MY_AID})
|
|
|
537
580
|
|
|
538
581
|
### `await sign_agent_md(content: str, aid: str | None = None) -> str`
|
|
539
582
|
|
|
583
|
+
> **⚠️ Deprecated。** 主要场景请改用 `client.publish_agent_md(path)`,它内部已包含读文件 + 签名 + 上传一整套流程。`sign_agent_md` 仅作为离线签名(先签名后异步发布、给非 SDK 渠道发送等)的底层工具继续保留,未来版本将移除。
|
|
584
|
+
|
|
540
585
|
为 `agent.md` 生成尾部签名块。
|
|
541
586
|
|
|
542
587
|
**参数**
|
|
@@ -560,6 +605,8 @@ auth = await client.auth.authenticate({"aid": MY_AID})
|
|
|
560
605
|
|
|
561
606
|
### `await verify_agent_md(content: str, aid: str | None = None, cert_pem: str | None = None) -> dict`
|
|
562
607
|
|
|
608
|
+
> **⚠️ Deprecated。** 主要场景请改用 `client.fetch_agent_md(aid)`,它内部已包含下载 + 自动验签 + etag 缓存。`verify_agent_md` 仅作为对纯文本 agent.md(来自非 SDK 渠道)的验签底层工具继续保留,未来版本将移除。
|
|
609
|
+
|
|
563
610
|
验证 `agent.md` 尾部签名。
|
|
564
611
|
|
|
565
612
|
**参数**
|
|
@@ -592,6 +639,8 @@ auth = await client.auth.authenticate({"aid": MY_AID})
|
|
|
592
639
|
|
|
593
640
|
### `await upload_agent_md(content: str) -> dict`
|
|
594
641
|
|
|
642
|
+
> **⚠️ Deprecated。** 请改用 `client.publish_agent_md(path)`,它会自动读文件、签名、上传并刷新内部 etag。`upload_agent_md` 仅作底层 API 继续保留以兼容旧代码,未来版本将移除。
|
|
643
|
+
|
|
595
644
|
上传当前 AID 的公开 `agent.md` 文档。
|
|
596
645
|
|
|
597
646
|
**参数**
|
|
@@ -636,6 +685,8 @@ name: Alice
|
|
|
636
685
|
|
|
637
686
|
### `await download_agent_md(aid: str) -> str`
|
|
638
687
|
|
|
688
|
+
> **⚠️ Deprecated。** 请改用 `client.fetch_agent_md(aid)`,它会自动下载、验签、刷新内部 etag,并支持可选写盘。`download_agent_md` 仅作底层 API 继续保留以兼容旧代码,未来版本将移除。
|
|
689
|
+
|
|
639
690
|
匿名下载指定 AID 的公开 `agent.md` 文档。
|
|
640
691
|
|
|
641
692
|
**参数**
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.js
CHANGED
|
@@ -981,6 +981,16 @@ export class AuthFlow {
|
|
|
981
981
|
async _initializeSession(transport, nonce, token, opts) {
|
|
982
982
|
const connectionKind = opts?.connectionKind ?? 'long';
|
|
983
983
|
const shortTtlMs = opts?.shortTtlMs ?? 0;
|
|
984
|
+
const extraInfo = opts?.extraInfo ?? {};
|
|
985
|
+
// _capabilities 来自 extra_info;可选覆盖默认能力声明,不会透传到服务端
|
|
986
|
+
const overrideCaps = extraInfo._capabilities;
|
|
987
|
+
const capabilities = isJsonObject(overrideCaps) ? overrideCaps : {
|
|
988
|
+
e2ee: true,
|
|
989
|
+
group_e2ee: true,
|
|
990
|
+
// AUN E2EE V2: 默认仅声明 V2 能力(V2-only 客户端)
|
|
991
|
+
supported_p2p_e2ee: ['e2ee_v2'],
|
|
992
|
+
supported_group_e2ee: ['group_e2ee_v2'],
|
|
993
|
+
};
|
|
984
994
|
const request = {
|
|
985
995
|
nonce,
|
|
986
996
|
auth: { method: 'kite_token', token },
|
|
@@ -988,7 +998,7 @@ export class AuthFlow {
|
|
|
988
998
|
device: { id: String(opts?.deviceId ?? this._deviceId ?? ''), type: 'sdk' },
|
|
989
999
|
client: { slot_id: String(opts?.slotId ?? this._slotId ?? '') },
|
|
990
1000
|
delivery_mode: opts?.deliveryMode ?? { mode: 'fanout' },
|
|
991
|
-
capabilities
|
|
1001
|
+
capabilities,
|
|
992
1002
|
};
|
|
993
1003
|
// 长短连接选项:默认 long 时不写入 options(保持 wire 兼容)
|
|
994
1004
|
if (connectionKind === 'short') {
|
|
@@ -999,9 +1009,16 @@ export class AuthFlow {
|
|
|
999
1009
|
request.options = options;
|
|
1000
1010
|
}
|
|
1001
1011
|
// extra_info:应用层自定义信息(PID/HOME/备注等),踢人时透传给被踢方
|
|
1002
|
-
|
|
1012
|
+
// _ 前缀字段是内部覆盖字段,不透传到服务端
|
|
1003
1013
|
if (extraInfo && Object.keys(extraInfo).length > 0) {
|
|
1004
|
-
|
|
1014
|
+
const filtered = {};
|
|
1015
|
+
for (const [k, v] of Object.entries(extraInfo)) {
|
|
1016
|
+
if (!k.startsWith('_'))
|
|
1017
|
+
filtered[k] = v;
|
|
1018
|
+
}
|
|
1019
|
+
if (Object.keys(filtered).length > 0) {
|
|
1020
|
+
request.extra_info = filtered;
|
|
1021
|
+
}
|
|
1005
1022
|
}
|
|
1006
1023
|
this._log.debug(`auth.connect send: device_id=${opts?.deviceId ?? ''} slot_id=${opts?.slotId ?? ''} kind=${connectionKind}`);
|
|
1007
1024
|
const result = await transport.call('auth.connect', request);
|