@agentunion/fastaun-browser 0.5.0 → 0.5.2
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 +550 -464
- package/_packed_docs/CHANGELOG-validators.md +147 -0
- package/_packed_docs/CHANGELOG.md +550 -464
- package/_packed_docs/INDEX.md +201 -177
- package/_packed_docs/KITE_DOCS_GUIDE.md +38 -32
- 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 +169 -116
- package/_packed_docs/aun-perf-audit-critical-bugs.md +315 -0
- package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +263 -260
- package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +331 -0
- package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +2 -2
- 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 +1 -1
- 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 +39 -16
- package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +8 -5
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +18 -19
- 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 +1 -1
- package/_packed_docs/protocol/08-AUN-E2EE-Group.md +139 -746
- package/_packed_docs/protocol/08-AUN-E2EE.md +12 -10
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +117 -171
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +6 -0
- 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 +1 -1
- package/_packed_docs/protocol/16-/347/263/273/347/273/237/347/233/256/345/275/225/344/277/235/346/212/244/346/226/271/346/241/210.md +177 -0
- package/_packed_docs/protocol/README.md +5 -4
- package/_packed_docs/protocol/aun-docs-guide.md +2 -2
- package/_packed_docs/protocol/index.md +12 -7
- 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 +1 -1
- package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +13 -13
- package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +9 -9
- package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +15 -13
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +26 -18
- package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +35 -284
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +473 -442
- package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +11 -7
- package/_packed_docs/sdk/09-collab-rpc-manual.md +581 -550
- package/_packed_docs/sdk/09-group-rpc-manual.md +367 -433
- package/_packed_docs/sdk/09-message-rpc-manual.md +50 -28
- package/_packed_docs/sdk/09-payload-reference.md +3 -3
- package/_packed_docs/sdk/09-storage-rpc-manual.md +57 -20
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +18 -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 +3 -2
- package/_packed_docs/sdk/INDEX.md +25 -24
- package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +6 -2
- package/dist/agent-md.d.ts.map +1 -1
- package/dist/agent-md.js +18 -9
- package/dist/agent-md.js.map +1 -1
- package/dist/bundle.js +1661 -1180
- package/dist/client/delivery.d.ts +13 -2
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js +251 -46
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.d.ts.map +1 -1
- package/dist/client/group-state.js +36 -14
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/lifecycle.js +2 -2
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/rpc-pipeline.d.ts +1 -0
- package/dist/client/rpc-pipeline.d.ts.map +1 -1
- package/dist/client/rpc-pipeline.js +166 -50
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +14 -1
- package/dist/client/v2-e2ee.d.ts.map +1 -1
- package/dist/client/v2-e2ee.js +376 -126
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +5 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +187 -46
- package/dist/client.js.map +1 -1
- package/dist/collab/client.d.ts +8 -0
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +12 -0
- package/dist/collab/client.js.map +1 -1
- package/dist/errors.d.ts +0 -20
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +8 -51
- package/dist/errors.js.map +1 -1
- package/dist/facades.d.ts +9 -4
- package/dist/facades.d.ts.map +1 -1
- package/dist/facades.js +192 -31
- package/dist/facades.js.map +1 -1
- package/dist/group-fs.d.ts +17 -0
- package/dist/group-fs.d.ts.map +1 -1
- package/dist/group-fs.js +54 -11
- package/dist/group-fs.js.map +1 -1
- package/dist/group-id.d.ts +9 -12
- package/dist/group-id.d.ts.map +1 -1
- package/dist/group-id.js +41 -63
- package/dist/group-id.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/keystore/index.d.ts +2 -54
- package/dist/keystore/index.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.d.ts +3 -0
- package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-identity-store.js +65 -0
- package/dist/keystore/indexeddb-identity-store.js.map +1 -1
- package/dist/keystore/indexeddb-shared.d.ts +3 -17
- package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
- package/dist/keystore/indexeddb-shared.js +4 -47
- package/dist/keystore/indexeddb-shared.js.map +1 -1
- package/dist/keystore/indexeddb-token-store.d.ts +1 -64
- package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
- package/dist/keystore/indexeddb-token-store.js +45 -774
- package/dist/keystore/indexeddb-token-store.js.map +1 -1
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +4 -0
- package/dist/logger.js.map +1 -1
- package/dist/storage/lowlevel.d.ts +9 -1
- package/dist/storage/lowlevel.d.ts.map +1 -1
- package/dist/storage/lowlevel.js +12 -1
- package/dist/storage/lowlevel.js.map +1 -1
- package/dist/storage/vfs.d.ts +22 -0
- package/dist/storage/vfs.d.ts.map +1 -1
- package/dist/storage/vfs.js +54 -0
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.js +336 -49
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +2 -0
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +96 -3
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +39 -56
- package/dist/types.d.ts.map +1 -1
- package/dist/v2/session/session.d.ts +2 -0
- package/dist/v2/session/session.d.ts.map +1 -1
- package/dist/v2/session/session.js +58 -22
- package/dist/v2/session/session.js.map +1 -1
- package/dist/v2/state/commitment.d.ts +1 -1
- package/dist/v2/state/commitment.d.ts.map +1 -1
- package/dist/v2/state/commitment.js +5 -3
- package/dist/v2/state/commitment.js.map +1 -1
- package/dist/validators.d.ts +35 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +127 -0
- package/dist/validators.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/_packed_docs/collab-gateway-boundary-test-report.md +0 -164
|
@@ -1,457 +1,488 @@
|
|
|
1
|
-
# AUN SDK - API 手册
|
|
2
|
-
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
## 目录
|
|
6
|
-
|
|
7
|
-
- [AIDStore](#aidstore)
|
|
8
|
-
- [AID](#aid)
|
|
9
|
-
- [AUNClient](#aunclient)
|
|
10
|
-
- [事件](#事件)
|
|
11
|
-
- [ServiceProxyClient](#serviceproxyclient)
|
|
12
|
-
- [E2EE 高级 API](#e2ee-高级-api)
|
|
13
|
-
- [RPC 方法参考](#rpc-方法参考)
|
|
14
|
-
- [Stream 使用指南](#stream-使用指南)
|
|
15
|
-
|
|
16
|
-
> **多语言命名约定**:Python 使用 `snake_case`(如 `aun_path`、`download_agent_md`),TS/JS 使用 `camelCase`(如 `aunPath`、`downloadAgentMd`),Go 使用 `PascalCase` 公开方法(如 `Load`、`Register`)。本手册表格中各列对应各语言的实际命名。
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## AIDStore
|
|
21
|
-
|
|
22
|
-
Python:
|
|
23
|
-
|
|
24
|
-
```python
|
|
25
|
-
store = AIDStore(
|
|
26
|
-
aun_path: str,
|
|
27
|
-
encryption_seed: str,
|
|
28
|
-
*,
|
|
29
|
-
device_id=None,
|
|
30
|
-
slot_id="default",
|
|
31
|
-
verify_ssl=None, # None=自动(由 AUN_ENV/KITE_ENV 决定),True/False=强制
|
|
32
|
-
root_ca_path=None, # 私有部署时指定自定义根证书路径
|
|
33
|
-
debug=False,
|
|
34
|
-
)
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
TypeScript / JavaScript:
|
|
38
|
-
|
|
39
|
-
```ts
|
|
40
|
-
const store = new AIDStore({
|
|
41
|
-
aunPath, encryptionSeed,
|
|
42
|
-
deviceId, slotId,
|
|
43
|
-
verifySsl, // 同 Python verify_ssl
|
|
44
|
-
rootCaPath, // 同 Python root_ca_path
|
|
45
|
-
debug,
|
|
46
|
-
});
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Go:
|
|
50
|
-
|
|
51
|
-
```go
|
|
52
|
-
store := aun.NewAIDStore(aunPath, encryptionSeed)
|
|
53
|
-
// 可选配置通过 AIDStoreOptions 传入
|
|
54
|
-
store := aun.NewAIDStore(aunPath, encryptionSeed, aun.AIDStoreOptions{
|
|
55
|
-
VerifySSL: &[]bool{true}[0],
|
|
56
|
-
RootCaPath: "/path/to/ca.crt",
|
|
57
|
-
Debug: true,
|
|
58
|
-
})
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### 方法
|
|
62
|
-
|
|
63
|
-
| Python | TS/JS | Go | 说明 |
|
|
64
|
-
|--------|-------|----|------|
|
|
65
|
-
| `load(aid)` | `load(aid)` | `Load(aid)` | 从本地加载 AID |
|
|
66
|
-
| `register(aid)` | `register(aid)` | `Register(ctx, aid)` | 注册并落盘证书和私钥 |
|
|
67
|
-
| `list()` | `list()` | `List()` | 列出本地 AID |
|
|
68
|
-
| `exists(aid)` | `exists(aid)` | `Exists(ctx, aid)` | 远端存在性检查 |
|
|
69
|
-
| `resolve(aid, opts=None)` | `resolve(aid, opts?)` | `Resolve(ctx, aid, opts...)` | 拉证书并缓存;默认下载 agent.md,可用 `skip_agent_md` / `skipAgentMd` 跳过 |
|
|
70
|
-
| `upload_agent_md(aid, content=None)` | `uploadAgentMd(aid, content?)` | `UploadAgentMD(ctx, aid, content...)` | 发布本地 AID 的 agent.md;签名后使用该 AID 的 access_token 上传 |
|
|
71
|
-
| `download_agent_md(aid, timeout_s=None)` | `downloadAgentMd(aid, timeoutMs=30000)` | `DownloadAgentMD(ctx, aid)` | 下载 agent.md,返回 `DownloadAgentMdResult` / `AgentMDInfo` |
|
|
72
|
-
| `check_agent_md(aid, ttl_days=1)` | `checkAgentMd(aid, ttlDays=1)` | `CheckAgentMD(ctx, aid, maxUnsyncedDays...)` | 通过 HEAD 和本地记录检查一致性 |
|
|
73
|
-
| `diagnose(aid)` | `diagnose(aid)` | `Diagnose(ctx, aid)` | 本地 + 远端诊断 |
|
|
74
|
-
| `renew_cert(aid)` / `rekey(aid)` | `renewCert(aid)` / `rekey(aid)` | `RenewCert(ctx, aid)` / `Rekey(ctx, aid)` | 证书运维 |
|
|
75
|
-
| `change_seed(old, new)` | `changeSeed(old, new)` | `ChangeSeed(old, new)` | 本地密钥保护种子迁移 |
|
|
76
|
-
|
|
77
|
-
Python、TS/Node 与 Go 的 `AIDStore` 本地方法返回 Result 包装;浏览器 JS 因 IndexedDB / WebCrypto 约束返回 `Promise<Result>`。联网方法在 TS/JS 中均返回 `Promise<Result>`;Go 形态为 `Result[T]`,字段为 `Ok` / `Data` / `Error`。
|
|
78
|
-
|
|
79
|
-
### Result 类型
|
|
80
|
-
|
|
81
|
-
```python
|
|
82
|
-
# ok=True 时
|
|
83
|
-
{"ok": True, "data": {...}}
|
|
84
|
-
|
|
85
|
-
# ok=False 时
|
|
86
|
-
{"ok": False, "error": {"code": "ERROR_CODE", "message": "..."}}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### DownloadAgentMdResult
|
|
90
|
-
|
|
91
|
-
| 字段 | 类型 | 说明 |
|
|
92
|
-
|------|------|------|
|
|
93
|
-
| `aid` | str | AID 字符串 |
|
|
94
|
-
| `content` | str | agent.md 原始内容 |
|
|
95
|
-
| `verification` | `{status, reason?}` | 验签结果;`status` 为 `"ok"` / `"no_cert"` / `"invalid"` 等 |
|
|
96
|
-
| `signature` | dict | 低层签名解析和验签结果 |
|
|
97
|
-
| `cert_pem` | str | 签名所用证书 PEM |
|
|
98
|
-
| `etag` | str | HTTP ETag |
|
|
99
|
-
| `last_modified` | str | HTTP Last-Modified |
|
|
100
|
-
| `status` | int | HTTP 状态码;异常 304 且本地有内容时可返回 304 |
|
|
101
|
-
| `in_sync` | bool\|null | 目标是当前 AID 时表示本地内容 ETag 是否等于远端 ETag;对端 AID 通常为 null |
|
|
102
|
-
| `saved_to` | str | SDK 管理的本地 agent.md 位置或浏览器 logical key |
|
|
103
|
-
|
|
104
|
-
### CheckAgentMdResult
|
|
105
|
-
|
|
106
|
-
| 字段 | 类型 | 说明 |
|
|
107
|
-
|------|------|------|
|
|
108
|
-
| `aid` | str | AID 字符串 |
|
|
109
|
-
| `local_found` | bool | 本地是否有 agent.md 内容或本地 ETag |
|
|
110
|
-
| `remote_found` | bool | 远端 HEAD 是否发现 agent.md |
|
|
111
|
-
| `local_etag` | str | 本地内容 SHA-256 ETag |
|
|
112
|
-
| `remote_etag` | str | 远端 HTTP ETag |
|
|
113
|
-
| `in_sync` / `needs_update` | bool | 是否同步 / 是否需要下载 |
|
|
114
|
-
| `last_modified` | str | 远端 Last-Modified |
|
|
115
|
-
| `status` | int | HEAD 状态码 |
|
|
116
|
-
| `cached` | bool | 是否命中 TTL 窗口内的本地检查记录 |
|
|
117
|
-
| `verify_status` / `verify_error` | str | 最近一次下载验签状态 |
|
|
118
|
-
|
|
1
|
+
# AUN SDK - API 手册
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
- [AIDStore](#aidstore)
|
|
8
|
+
- [AID](#aid)
|
|
9
|
+
- [AUNClient](#aunclient)
|
|
10
|
+
- [事件](#事件)
|
|
11
|
+
- [ServiceProxyClient](#serviceproxyclient)
|
|
12
|
+
- [E2EE 高级 API](#e2ee-高级-api)
|
|
13
|
+
- [RPC 方法参考](#rpc-方法参考)
|
|
14
|
+
- [Stream 使用指南](#stream-使用指南)
|
|
15
|
+
|
|
16
|
+
> **多语言命名约定**:Python 使用 `snake_case`(如 `aun_path`、`download_agent_md`),TS/JS 使用 `camelCase`(如 `aunPath`、`downloadAgentMd`),Go 使用 `PascalCase` 公开方法(如 `Load`、`Register`)。本手册表格中各列对应各语言的实际命名。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## AIDStore
|
|
21
|
+
|
|
22
|
+
Python:
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
store = AIDStore(
|
|
26
|
+
aun_path: str,
|
|
27
|
+
encryption_seed: str,
|
|
28
|
+
*,
|
|
29
|
+
device_id=None,
|
|
30
|
+
slot_id="default",
|
|
31
|
+
verify_ssl=None, # None=自动(由 AUN_ENV/KITE_ENV 决定),True/False=强制
|
|
32
|
+
root_ca_path=None, # 私有部署时指定自定义根证书路径
|
|
33
|
+
debug=False,
|
|
34
|
+
)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
TypeScript / JavaScript:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
const store = new AIDStore({
|
|
41
|
+
aunPath, encryptionSeed,
|
|
42
|
+
deviceId, slotId,
|
|
43
|
+
verifySsl, // 同 Python verify_ssl
|
|
44
|
+
rootCaPath, // 同 Python root_ca_path
|
|
45
|
+
debug,
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Go:
|
|
50
|
+
|
|
51
|
+
```go
|
|
52
|
+
store := aun.NewAIDStore(aunPath, encryptionSeed)
|
|
53
|
+
// 可选配置通过 AIDStoreOptions 传入
|
|
54
|
+
store := aun.NewAIDStore(aunPath, encryptionSeed, aun.AIDStoreOptions{
|
|
55
|
+
VerifySSL: &[]bool{true}[0],
|
|
56
|
+
RootCaPath: "/path/to/ca.crt",
|
|
57
|
+
Debug: true,
|
|
58
|
+
})
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 方法
|
|
62
|
+
|
|
63
|
+
| Python | TS/JS | Go | 说明 |
|
|
64
|
+
|--------|-------|----|------|
|
|
65
|
+
| `load(aid)` | `load(aid)` | `Load(aid)` | 从本地加载 AID |
|
|
66
|
+
| `register(aid)` | `register(aid)` | `Register(ctx, aid)` | 注册并落盘证书和私钥 |
|
|
67
|
+
| `list()` | `list()` | `List()` | 列出本地 AID |
|
|
68
|
+
| `exists(aid)` | `exists(aid)` | `Exists(ctx, aid)` | 远端存在性检查 |
|
|
69
|
+
| `resolve(aid, opts=None)` | `resolve(aid, opts?)` | `Resolve(ctx, aid, opts...)` | 拉证书并缓存;默认下载 agent.md,可用 `skip_agent_md` / `skipAgentMd` 跳过 |
|
|
70
|
+
| `upload_agent_md(aid, content=None)` | `uploadAgentMd(aid, content?)` | `UploadAgentMD(ctx, aid, content...)` | 发布本地 AID 的 agent.md;签名后使用该 AID 的 access_token 上传 |
|
|
71
|
+
| `download_agent_md(aid, timeout_s=None)` | `downloadAgentMd(aid, timeoutMs=30000)` | `DownloadAgentMD(ctx, aid)` | 下载 agent.md,返回 `DownloadAgentMdResult` / `AgentMDInfo` |
|
|
72
|
+
| `check_agent_md(aid, ttl_days=1)` | `checkAgentMd(aid, ttlDays=1)` | `CheckAgentMD(ctx, aid, maxUnsyncedDays...)` | 通过 HEAD 和本地记录检查一致性 |
|
|
73
|
+
| `diagnose(aid)` | `diagnose(aid)` | `Diagnose(ctx, aid)` | 本地 + 远端诊断 |
|
|
74
|
+
| `renew_cert(aid)` / `rekey(aid)` | `renewCert(aid)` / `rekey(aid)` | `RenewCert(ctx, aid)` / `Rekey(ctx, aid)` | 证书运维 |
|
|
75
|
+
| `change_seed(old, new)` | `changeSeed(old, new)` | `ChangeSeed(old, new)` | 本地密钥保护种子迁移 |
|
|
76
|
+
|
|
77
|
+
Python、TS/Node 与 Go 的 `AIDStore` 本地方法返回 Result 包装;浏览器 JS 因 IndexedDB / WebCrypto 约束返回 `Promise<Result>`。联网方法在 TS/JS 中均返回 `Promise<Result>`;Go 形态为 `Result[T]`,字段为 `Ok` / `Data` / `Error`。
|
|
78
|
+
|
|
79
|
+
### Result 类型
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
# ok=True 时
|
|
83
|
+
{"ok": True, "data": {...}}
|
|
84
|
+
|
|
85
|
+
# ok=False 时
|
|
86
|
+
{"ok": False, "error": {"code": "ERROR_CODE", "message": "..."}}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### DownloadAgentMdResult
|
|
90
|
+
|
|
91
|
+
| 字段 | 类型 | 说明 |
|
|
92
|
+
|------|------|------|
|
|
93
|
+
| `aid` | str | AID 字符串 |
|
|
94
|
+
| `content` | str | agent.md 原始内容 |
|
|
95
|
+
| `verification` | `{status, reason?}` | 验签结果;`status` 为 `"ok"` / `"no_cert"` / `"invalid"` 等 |
|
|
96
|
+
| `signature` | dict | 低层签名解析和验签结果 |
|
|
97
|
+
| `cert_pem` | str | 签名所用证书 PEM |
|
|
98
|
+
| `etag` | str | HTTP ETag |
|
|
99
|
+
| `last_modified` | str | HTTP Last-Modified |
|
|
100
|
+
| `status` | int | HTTP 状态码;异常 304 且本地有内容时可返回 304 |
|
|
101
|
+
| `in_sync` | bool\|null | 目标是当前 AID 时表示本地内容 ETag 是否等于远端 ETag;对端 AID 通常为 null |
|
|
102
|
+
| `saved_to` | str | SDK 管理的本地 agent.md 位置或浏览器 logical key |
|
|
103
|
+
|
|
104
|
+
### CheckAgentMdResult
|
|
105
|
+
|
|
106
|
+
| 字段 | 类型 | 说明 |
|
|
107
|
+
|------|------|------|
|
|
108
|
+
| `aid` | str | AID 字符串 |
|
|
109
|
+
| `local_found` | bool | 本地是否有 agent.md 内容或本地 ETag |
|
|
110
|
+
| `remote_found` | bool | 远端 HEAD 是否发现 agent.md |
|
|
111
|
+
| `local_etag` | str | 本地内容 SHA-256 ETag |
|
|
112
|
+
| `remote_etag` | str | 远端 HTTP ETag |
|
|
113
|
+
| `in_sync` / `needs_update` | bool | 是否同步 / 是否需要下载 |
|
|
114
|
+
| `last_modified` | str | 远端 Last-Modified |
|
|
115
|
+
| `status` | int | HEAD 状态码 |
|
|
116
|
+
| `cached` | bool | 是否命中 TTL 窗口内的本地检查记录 |
|
|
117
|
+
| `verify_status` / `verify_error` | str | 最近一次下载验签状态 |
|
|
118
|
+
|
|
119
119
|
agent.md 本地记录不写入 SQLite。Python / TypeScript / Go 使用 `{aun_path}/AIDs/{aid}/agent.md` 与 `agentmd.json`;浏览器 JavaScript 使用 IndexedDB 等价 key,存储不可用时退化为内存缓存。
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## AID
|
|
126
|
-
|
|
127
|
-
AID 由 `AIDStore.load()` 返回,应用层不直接构造。
|
|
128
|
-
|
|
129
|
-
### 只读属性
|
|
130
|
-
|
|
131
|
-
| Python | TS/JS | Go | 说明 |
|
|
132
|
-
|--------|-------|----|------|
|
|
133
|
-
| `aid` | `aid` | `AID()` | AID 字符串 |
|
|
134
|
-
| `cert_pem` | `certPem` | `CertPEM()` | 证书 PEM |
|
|
135
|
-
| `public_key` | `publicKey` | `PublicKey()` | 公钥 |
|
|
136
|
-
| `cert_fingerprint` | `certFingerprint` | `CertFingerprint()` | 证书指纹 |
|
|
137
|
-
| `aun_path` | `aunPath` | `AUNPath()` | 所属数据目录 |
|
|
138
|
-
| `device_id` | `deviceId` | `DeviceID` | 设备 ID |
|
|
139
|
-
| `slot_id` | `slotId` | `SlotID` | 实例槽位 ID;允许 `/`、`:`、空格作为共享隔离键分隔符 |
|
|
140
|
-
| `verify_ssl` | `verifySsl` | `VerifySSL` | 是否校验 TLS 证书 |
|
|
141
|
-
| `root_ca_path` | `rootCaPath` | `RootCaPath` | 自定义根证书路径 |
|
|
142
|
-
| `debug` | `debug` | `Debug` | 是否开启调试日志 |
|
|
143
|
-
| `private_key_pem` | `privateKeyPem` | `PrivateKeyPem` | 明文私钥 PEM(由 `AIDStore.load()` 注入,空字符串表示无私钥)|
|
|
144
|
-
|
|
145
|
-
### 方法
|
|
146
|
-
|
|
147
|
-
| Python | TS/JS | Go | 说明 |
|
|
148
|
-
|--------|-------|----|------|
|
|
149
|
-
| `is_cert_valid()` | `isCertValid()` | `IsCertValid()` | 证书是否有效 |
|
|
150
|
-
| `is_private_key_valid()` | `isPrivateKeyValid()` | `IsPrivateKeyValid()` | 私钥是否可用 |
|
|
151
|
-
| `sign(data)` | `sign(data)` | `Sign(data)` | 签名 bytes |
|
|
152
|
-
| `verify(data, signature)` | `verify(data, signature)` | `Verify(data, signature)` | 验签 |
|
|
153
|
-
| `sign_agent_md(content)` | `signAgentMd(content)` | `SignAgentMd(content)` | agent.md 签名 |
|
|
154
|
-
| `verify_agent_md(content)` | `verifyAgentMd(content)` | `VerifyAgentMd(content)` | agent.md 验签 |
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## AUNClient
|
|
159
|
-
|
|
160
|
-
### 构造
|
|
161
|
-
|
|
162
|
-
Python:
|
|
163
|
-
|
|
164
|
-
```python
|
|
165
|
-
client = AUNClient()
|
|
166
|
-
client = AUNClient(aid)
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
TS/JS:
|
|
170
|
-
|
|
171
|
-
```ts
|
|
172
|
-
const client = new AUNClient();
|
|
173
|
-
const client = new AUNClient(aid);
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
Go:
|
|
177
|
-
|
|
178
|
-
```go
|
|
179
|
-
client := aun.NewAUNClientEmpty()
|
|
180
|
-
client := aun.NewAUNClient(aid)
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
构造约束:
|
|
184
|
-
|
|
185
|
-
- `aid` 必须是 AID 对象(由 `AIDStore.load()` 返回)。
|
|
186
|
-
- 不接受字符串 AID。
|
|
187
|
-
- 不接受把 aid 放进 options。
|
|
188
|
-
- 不接受旧的 `(config, debug)` 或 `(config, true)` 形态。
|
|
189
|
-
|
|
190
|
-
### 身份与状态
|
|
191
|
-
|
|
192
|
-
| Python | TS/JS | Go | 说明 |
|
|
193
|
-
|--------|-------|----|------|
|
|
194
|
-
| `load_identity(aid)` | `loadIdentity(aid)` | `LoadIdentity(aid)` | 在 `no_identity` / `closed` 状态加载身份 |
|
|
195
|
-
| `state` | `state` | `ConnectionState()` | 九态公开状态 |
|
|
196
|
-
| `gateway_url` | `gatewayUrl` | `GetGatewayURL()` | 当前连接的 Gateway URL(只读,自动发现,连接前为空) |
|
|
197
|
-
| `current_aid` | `currentAid` | `CurrentAID()` | 当前 AID 对象 |
|
|
198
|
-
| `aid` | `aid` | `AID()` | 当前 AID 字符串 |
|
|
199
|
-
| `has_identity` | `hasIdentity` | `HasIdentity()` | 是否已加载身份 |
|
|
200
|
-
| `can_sign` | `canSign` | `CanSign()` | 是否可签名 |
|
|
201
|
-
| `can_connect` | `canConnect` | `CanConnect()` | 是否可连接 |
|
|
202
|
-
| `can_send` / `is_ready` | `canSend` / `isReady` | `CanSend()` / `IsReady()` | 是否可发送 |
|
|
203
|
-
| `is_online` | `isOnline` | `IsOnline()` | 是否处于在线或重连相关状态 |
|
|
204
|
-
| `is_closed` | `isClosed` | `IsClosed()` | 是否已关闭 |
|
|
205
|
-
|
|
206
|
-
状态值:
|
|
207
|
-
|
|
208
|
-
```text
|
|
209
|
-
no_identity / standby / authenticated / connecting / ready /
|
|
210
|
-
retry_backoff / reconnecting / connection_failed / closed
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
### 生命周期
|
|
214
|
-
|
|
215
|
-
Python:
|
|
216
|
-
|
|
217
|
-
```python
|
|
218
|
-
auth = await client.authenticate()
|
|
219
|
-
await client.connect({"slot_id": "main", "auto_reconnect": True})
|
|
220
|
-
await client.disconnect()
|
|
221
|
-
await client.close()
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
说明:
|
|
225
|
-
|
|
226
|
-
- `authenticate()` 只取 token,不建立业务会话。
|
|
227
|
-
- `connect()` 可从 `standby` 自动认证并进入 `ready`。
|
|
228
|
-
- `disconnect()` 断开当前传输连接,对象仍可重新连接。
|
|
229
|
-
- `close()` 关闭连接和后台任务;之后只能重新加载身份再复用。
|
|
230
|
-
|
|
231
|
-
四个 SDK 的公开构造入口均已对齐为“无参或 AID 对象”。调试、TLS、根证书、device_id、slot_id 等配置由 `AIDStore` 传递到 AID,再由 `AUNClient` 继承;连接级选项只传给 `connect()`。
|
|
232
|
-
|
|
233
|
-
### RPC
|
|
234
|
-
|
|
235
|
-
```python
|
|
236
|
-
result = await client.call("message.send", {
|
|
237
|
-
"to": "bob.agentid.pub",
|
|
238
|
-
"payload": {"type": "text", "text": "hello"},
|
|
239
|
-
})
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
常用 meta RPC 直接透传:
|
|
243
|
-
|
|
244
|
-
```python
|
|
245
|
-
await client.call("meta.ping", {})
|
|
246
|
-
await client.call("meta.status", {})
|
|
247
|
-
await client.call("meta.trust_roots", {})
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
### Notify
|
|
251
|
-
|
|
252
|
-
`notify()` 发送轻量在线通知,底层是 JSON-RPC Notification,无 `id`,不进入离线存储、seq、pull 或 ack。
|
|
253
|
-
|
|
254
|
-
| Python | TS/JS | Go | 说明 |
|
|
255
|
-
|--------|-------|----|------|
|
|
256
|
-
| `notify(method, params=None, *, to=None, group_id=None, device_id=None, slot_id=None, ttl_ms=None)` | `notify(method, params?, options?)` | `Notify(ctx, method, params, NotifyOptions{...})` | 发送在线轻量通知 |
|
|
257
|
-
|
|
258
|
-
常见用法:
|
|
259
|
-
|
|
260
|
-
```python
|
|
261
|
-
await client.notify("notification/client.activity", {"state": "idle"})
|
|
262
|
-
await client.notify("event/app.typing", {"thread_id": "t1"}, to="bob.agentid.pub", ttl_ms=5000)
|
|
263
|
-
await client.notify("event/app.presence", {"state": "active"}, group_id="group.agentid.pub/123")
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
路由选项:
|
|
267
|
-
|
|
268
|
-
| 选项 | 说明 |
|
|
269
|
-
|------|------|
|
|
270
|
-
| `to` / `To` | 目标 AID;可同域或跨域 |
|
|
271
|
-
| `group_id` / `groupId` / `GroupID` | 目标群;与 `to` 互斥 |
|
|
272
|
-
| `device_id` / `deviceId` / `DeviceID` | 限定目标 AID 的在线设备;必须配合 `to` |
|
|
273
|
-
| `slot_id` / `slotId` / `SlotID` | 限定目标设备的在线 slot;必须配合 `device_id` |
|
|
274
|
-
| `ttl_ms` / `ttlMs` / `TTLMS` | `0..60000`,只控制在线投递过期,不表示离线缓存 |
|
|
275
|
-
|
|
276
|
-
约束:
|
|
277
|
-
|
|
278
|
-
- 未指定 `to` / `group_id` 时,`method` 必须以 `notification/` 开头,表示直发 Gateway 的协议级通知。
|
|
279
|
-
- 指定 `to` 或 `group_id` 时,`method` 必须是 `event/app.*`,接收端通过 `client.on("app.xxx", handler)` 订阅。
|
|
280
|
-
- 跨域 AID notify 已支持 federation 在线转发,但仍是 best-effort;目标离线或 federation 不可用时丢弃。
|
|
281
|
-
- 可靠、敏感或需要审计的业务事件应继续使用 `message.send` / `group.send`。
|
|
282
|
-
|
|
283
|
-
详细语义见 [Notify通知方案.md](Notify通知方案.md)。
|
|
284
|
-
|
|
285
|
-
### protected_headers
|
|
286
|
-
|
|
287
|
-
```python
|
|
288
|
-
client = AUNClient(aid)
|
|
289
|
-
client.set_protected_headers({"sdk": "python", "trace": "abc"})
|
|
290
|
-
headers = client.get_protected_headers()
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
只合并到以下 RPC:
|
|
294
|
-
|
|
295
|
-
- `message.send`
|
|
296
|
-
- `group.send`
|
|
297
|
-
- `message.thought.put`
|
|
298
|
-
- `group.thought.put`
|
|
299
|
-
|
|
300
|
-
### agent.md
|
|
301
|
-
|
|
302
|
-
| Python | TS/JS | Go | 说明 |
|
|
303
|
-
|--------|-------|----|------|
|
|
304
|
-
| `AIDStore.upload_agent_md(aid, content=None)` | `store.uploadAgentMd(aid, content?)` | `store.UploadAgentMD(ctx, aid, content...)` | 发布指定本地 AID 的 agent.md |
|
|
305
|
-
| `AIDStore.download_agent_md(aid)` | `store.downloadAgentMd(aid)` | `store.DownloadAgentMD(ctx, aid)` | 下载并验签 |
|
|
306
|
-
| `AIDStore.check_agent_md(aid)` | `store.checkAgentMd(aid)` | `store.CheckAgentMD(ctx, aid, maxUnsyncedDays...)` | 检查一致性 |
|
|
307
|
-
|
|
308
|
-
说明:
|
|
121
|
+
`remote_etag` / `last_modified` 除了来自 `check_agent_md()` 的 HEAD,也会由连接后的内部观察器更新:SDK 会读取 RPC response / event push `_meta.agent_md_etags` 的 `requester`、`peer`、`group` 及兼容别名,并读取 V2 envelope 的 `agent_md.sender` / `agent_md.group`。`group` 记录使用群自身 `group_aid` / `group_id` 作为 AID key。
|
|
309
122
|
|
|
123
|
+
> **v0.4.2 变更**:`discoveryPort` 配置项已移除,Gateway 地址完全由 SDK 根据 AID issuer 自动发现,无需手动指定端口。
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## AID
|
|
128
|
+
|
|
129
|
+
AID 由 `AIDStore.load()` 返回,应用层不直接构造。
|
|
130
|
+
|
|
131
|
+
### 只读属性
|
|
132
|
+
|
|
133
|
+
| Python | TS/JS | Go | 说明 |
|
|
134
|
+
|--------|-------|----|------|
|
|
135
|
+
| `aid` | `aid` | `AID()` | AID 字符串 |
|
|
136
|
+
| `cert_pem` | `certPem` | `CertPEM()` | 证书 PEM |
|
|
137
|
+
| `public_key` | `publicKey` | `PublicKey()` | 公钥 |
|
|
138
|
+
| `cert_fingerprint` | `certFingerprint` | `CertFingerprint()` | 证书指纹 |
|
|
139
|
+
| `aun_path` | `aunPath` | `AUNPath()` | 所属数据目录 |
|
|
140
|
+
| `device_id` | `deviceId` | `DeviceID` | 设备 ID |
|
|
141
|
+
| `slot_id` | `slotId` | `SlotID` | 实例槽位 ID;允许 `/`、`:`、空格作为共享隔离键分隔符 |
|
|
142
|
+
| `verify_ssl` | `verifySsl` | `VerifySSL` | 是否校验 TLS 证书 |
|
|
143
|
+
| `root_ca_path` | `rootCaPath` | `RootCaPath` | 自定义根证书路径 |
|
|
144
|
+
| `debug` | `debug` | `Debug` | 是否开启调试日志 |
|
|
145
|
+
| `private_key_pem` | `privateKeyPem` | `PrivateKeyPem` | 明文私钥 PEM(由 `AIDStore.load()` 注入,空字符串表示无私钥)|
|
|
146
|
+
|
|
147
|
+
### 方法
|
|
148
|
+
|
|
149
|
+
| Python | TS/JS | Go | 说明 |
|
|
150
|
+
|--------|-------|----|------|
|
|
151
|
+
| `is_cert_valid()` | `isCertValid()` | `IsCertValid()` | 证书是否有效 |
|
|
152
|
+
| `is_private_key_valid()` | `isPrivateKeyValid()` | `IsPrivateKeyValid()` | 私钥是否可用 |
|
|
153
|
+
| `sign(data)` | `sign(data)` | `Sign(data)` | 签名 bytes |
|
|
154
|
+
| `verify(data, signature)` | `verify(data, signature)` | `Verify(data, signature)` | 验签 |
|
|
155
|
+
| `sign_agent_md(content)` | `signAgentMd(content)` | `SignAgentMd(content)` | agent.md 签名 |
|
|
156
|
+
| `verify_agent_md(content)` | `verifyAgentMd(content)` | `VerifyAgentMd(content)` | agent.md 验签 |
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## AUNClient
|
|
161
|
+
|
|
162
|
+
### 构造
|
|
163
|
+
|
|
164
|
+
Python:
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
client = AUNClient()
|
|
168
|
+
client = AUNClient(aid)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
TS/JS:
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
const client = new AUNClient();
|
|
175
|
+
const client = new AUNClient(aid);
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Go:
|
|
179
|
+
|
|
180
|
+
```go
|
|
181
|
+
client := aun.NewAUNClientEmpty()
|
|
182
|
+
client := aun.NewAUNClient(aid)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
构造约束:
|
|
186
|
+
|
|
187
|
+
- `aid` 必须是 AID 对象(由 `AIDStore.load()` 返回)。
|
|
188
|
+
- 不接受字符串 AID。
|
|
189
|
+
- 不接受把 aid 放进 options。
|
|
190
|
+
- 不接受旧的 `(config, debug)` 或 `(config, true)` 形态。
|
|
191
|
+
|
|
192
|
+
### 身份与状态
|
|
193
|
+
|
|
194
|
+
| Python | TS/JS | Go | 说明 |
|
|
195
|
+
|--------|-------|----|------|
|
|
196
|
+
| `load_identity(aid)` | `loadIdentity(aid)` | `LoadIdentity(aid)` | 在 `no_identity` / `closed` 状态加载身份 |
|
|
197
|
+
| `state` | `state` | `ConnectionState()` | 九态公开状态 |
|
|
198
|
+
| `gateway_url` | `gatewayUrl` | `GetGatewayURL()` | 当前连接的 Gateway URL(只读,自动发现,连接前为空) |
|
|
199
|
+
| `current_aid` | `currentAid` | `CurrentAID()` | 当前 AID 对象 |
|
|
200
|
+
| `aid` | `aid` | `AID()` | 当前 AID 字符串 |
|
|
201
|
+
| `has_identity` | `hasIdentity` | `HasIdentity()` | 是否已加载身份 |
|
|
202
|
+
| `can_sign` | `canSign` | `CanSign()` | 是否可签名 |
|
|
203
|
+
| `can_connect` | `canConnect` | `CanConnect()` | 是否可连接 |
|
|
204
|
+
| `can_send` / `is_ready` | `canSend` / `isReady` | `CanSend()` / `IsReady()` | 是否可发送 |
|
|
205
|
+
| `is_online` | `isOnline` | `IsOnline()` | 是否处于在线或重连相关状态 |
|
|
206
|
+
| `is_closed` | `isClosed` | `IsClosed()` | 是否已关闭 |
|
|
207
|
+
|
|
208
|
+
状态值:
|
|
209
|
+
|
|
210
|
+
```text
|
|
211
|
+
no_identity / standby / authenticated / connecting / ready /
|
|
212
|
+
retry_backoff / reconnecting / connection_failed / closed
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### 生命周期
|
|
216
|
+
|
|
217
|
+
Python:
|
|
218
|
+
|
|
219
|
+
```python
|
|
220
|
+
auth = await client.authenticate()
|
|
221
|
+
await client.connect({"slot_id": "main", "auto_reconnect": True})
|
|
222
|
+
await client.disconnect()
|
|
223
|
+
await client.close()
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
说明:
|
|
227
|
+
|
|
228
|
+
- `authenticate()` 只取 token,不建立业务会话。
|
|
229
|
+
- `connect()` 可从 `standby` 自动认证并进入 `ready`。
|
|
230
|
+
- `disconnect()` 断开当前传输连接,对象仍可重新连接。
|
|
231
|
+
- `close()` 关闭连接和后台任务;之后只能重新加载身份再复用。
|
|
232
|
+
|
|
233
|
+
四个 SDK 的公开构造入口均已对齐为“无参或 AID 对象”。调试、TLS、根证书、device_id、slot_id 等配置由 `AIDStore` 传递到 AID,再由 `AUNClient` 继承;连接级选项只传给 `connect()`。
|
|
234
|
+
|
|
235
|
+
### RPC
|
|
236
|
+
|
|
237
|
+
```python
|
|
238
|
+
result = await client.call("message.send", {
|
|
239
|
+
"to": "bob.agentid.pub",
|
|
240
|
+
"payload": {"type": "text", "text": "hello"},
|
|
241
|
+
})
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
常用 meta RPC 直接透传:
|
|
245
|
+
|
|
246
|
+
```python
|
|
247
|
+
await client.call("meta.ping", {})
|
|
248
|
+
await client.call("meta.status", {})
|
|
249
|
+
await client.call("meta.trust_roots", {})
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Notify
|
|
253
|
+
|
|
254
|
+
`notify()` 发送轻量在线通知,底层是 JSON-RPC Notification,无 `id`,不进入离线存储、seq、pull 或 ack。
|
|
255
|
+
|
|
256
|
+
| Python | TS/JS | Go | 说明 |
|
|
257
|
+
|--------|-------|----|------|
|
|
258
|
+
| `notify(method, params=None, *, to=None, group_id=None, device_id=None, slot_id=None, ttl_ms=None)` | `notify(method, params?, options?)` | `Notify(ctx, method, params, NotifyOptions{...})` | 发送在线轻量通知 |
|
|
259
|
+
|
|
260
|
+
常见用法:
|
|
261
|
+
|
|
262
|
+
```python
|
|
263
|
+
await client.notify("notification/client.activity", {"state": "idle"})
|
|
264
|
+
await client.notify("event/app.typing", {"thread_id": "t1"}, to="bob.agentid.pub", ttl_ms=5000)
|
|
265
|
+
await client.notify("event/app.presence", {"state": "active"}, group_id="g-abc123.agentid.pub")
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
路由选项:
|
|
269
|
+
|
|
270
|
+
| 选项 | 说明 |
|
|
271
|
+
|------|------|
|
|
272
|
+
| `to` / `To` | 目标 AID;可同域或跨域 |
|
|
273
|
+
| `group_id` / `groupId` / `GroupID` | 目标群;兼容参数名,值使用目标态 `group_aid`,与 `to` 互斥 |
|
|
274
|
+
| `device_id` / `deviceId` / `DeviceID` | 限定目标 AID 的在线设备;必须配合 `to` |
|
|
275
|
+
| `slot_id` / `slotId` / `SlotID` | 限定目标设备的在线 slot;必须配合 `device_id` |
|
|
276
|
+
| `ttl_ms` / `ttlMs` / `TTLMS` | `0..60000`,只控制在线投递过期,不表示离线缓存 |
|
|
277
|
+
|
|
278
|
+
约束:
|
|
279
|
+
|
|
280
|
+
- 未指定 `to` / `group_id` 时,`method` 必须以 `notification/` 开头,表示直发 Gateway 的协议级通知。
|
|
281
|
+
- 指定 `to` 或 `group_id` 时,`method` 必须是 `event/app.*`,接收端通过 `client.on("app.xxx", handler)` 订阅。
|
|
282
|
+
- 跨域 AID notify 已支持 federation 在线转发,但仍是 best-effort;目标离线或 federation 不可用时丢弃。
|
|
283
|
+
- 可靠、敏感或需要审计的业务事件应继续使用 `message.send` / `group.send`。
|
|
284
|
+
|
|
285
|
+
详细语义见 [Notify通知方案.md](Notify通知方案.md)。
|
|
286
|
+
|
|
287
|
+
### protected_headers
|
|
288
|
+
|
|
289
|
+
```python
|
|
290
|
+
client = AUNClient(aid)
|
|
291
|
+
client.set_protected_headers({"sdk": "python", "trace": "abc"})
|
|
292
|
+
headers = client.get_protected_headers()
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
只合并到以下 RPC:
|
|
296
|
+
|
|
297
|
+
- `message.send`
|
|
298
|
+
- `group.send`
|
|
299
|
+
- `message.thought.put`
|
|
300
|
+
- `group.thought.put`
|
|
301
|
+
|
|
302
|
+
### agent.md
|
|
303
|
+
|
|
304
|
+
| Python | TS/JS | Go | 说明 |
|
|
305
|
+
|--------|-------|----|------|
|
|
306
|
+
| `AIDStore.upload_agent_md(aid, content=None)` | `store.uploadAgentMd(aid, content?)` | `store.UploadAgentMD(ctx, aid, content...)` | 发布指定本地 AID 的 agent.md |
|
|
307
|
+
| `AIDStore.download_agent_md(aid)` | `store.downloadAgentMd(aid)` | `store.DownloadAgentMD(ctx, aid)` | 下载并验签 |
|
|
308
|
+
| `AIDStore.check_agent_md(aid)` | `store.checkAgentMd(aid)` | `store.CheckAgentMD(ctx, aid, maxUnsyncedDays...)` | 检查一致性 |
|
|
309
|
+
|
|
310
|
+
说明:
|
|
311
|
+
|
|
310
312
|
- agent.md 上传、下载和检查入口都在 `AIDStore`;`AUNClient` 不再暴露上传入口。
|
|
311
313
|
- 上传要求目标 AID 已在本地加载且私钥有效;SDK 会对正文签名,并通过 `AuthFlow` 获取或复用该 AID 的 access_token。
|
|
312
314
|
- SDK 发起 GET 时只发送 `Accept: text/markdown`,不主动发送 `If-None-Match` / `If-Modified-Since`。如果服务端异常返回 304,本地有内容则复用;无内容时再发一次无条件 GET。
|
|
315
|
+
- SDK 会自动从 Gateway `_meta.agent_md_etags` 和信封 `agent_md` 观察远端版本;`requester`、`peer`、`group` 是标准角色键,`receiver`、`target`、`to`、`sender`、`from` 是兼容别名。
|
|
313
316
|
- `Accept: text/markdown` 与 agent.md 的 YAML frontmatter + Markdown 格式兼容;agent.md 仍是 Markdown 媒体类型上的结构化约定。
|
|
314
|
-
|
|
315
|
-
---
|
|
316
|
-
|
|
317
|
-
## 业务门面
|
|
318
|
-
|
|
319
|
-
除 `client.call(method, params)` 外,四语言 SDK
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
|
324
|
-
|
|
325
|
-
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
|
391
|
-
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## 业务门面
|
|
321
|
+
|
|
322
|
+
除 `client.call(method, params)` 外,四语言 SDK 提供高层门面(Facade),封装常用操作并简化参数。普通应用优先用门面,只有需要精确控制底层参数时再直调 RPC。
|
|
323
|
+
|
|
324
|
+
### 文件与存储门面
|
|
325
|
+
|
|
326
|
+
| 能力 | Python | TS/JS | Go | 说明 |
|
|
327
|
+
|------|--------|-------|----|------|
|
|
328
|
+
| Storage VFS | `client.storage` | `client.storage` | `client.Storage()` | 类 POSIX 文件操作;上传自动选择 inline / session / 秒传,下载自动选择 inline / ticket;支持 `touch`、`find`、`du`、`df`、ACL/token/软链/挂载门面 |
|
|
329
|
+
| Collab | `client.collab` | `client.collab` | `client.Collab()` | 版本化文档、标签、`gc` / `reflog` / `revert` |
|
|
330
|
+
| Group FS | `client.group.fs` | `client.group.fs` | `client.Group().FS()` | POSIX 风格群文件系统;`ls/find/stat/lstat/mkdir/rm/cp/mv/df/mount/umount`,以及 `set_acl/remove_acl/get_acl/list_acl` 角色 ACL 门面,上传下载数据面由 SDK 编排 |
|
|
331
|
+
|
|
332
|
+
群文件系统路径统一使用 `group_aid:/...`,成员数据区使用 `group_aid:/memberdata/{member_ref}/...`。SDK 不拼接真实 storage 路径,`memberdata` 到成员 `group_data/{group_aid}` 的映射只在服务端完成。群自有区写入允许当前 `group_aid` 证书签名、默认 `role:owner`、以及 owner 通过 `group.fs.set_acl` 显式授权后的 `role:admin`;撤销使用 `group.fs.remove_acl`,查询使用 `group.fs.get_acl/list_acl`,这些角色 ACL 操作都要求当前 group owner 调用且对外权限位显示为 `rwx`。JS 浏览器版上传中 `string` 默认表示文本内容,Node 本地路径需显式 `sourceType: "path"`、`localPath: true` 或 `local:` 前缀;Python/TS/Go 默认把 `string` 当本地路径。
|
|
333
|
+
|
|
334
|
+
### 消息与群组门面
|
|
335
|
+
|
|
336
|
+
| 能力 | Python | TS/JS | Go | 说明 |
|
|
337
|
+
|------|--------|-------|----|------|
|
|
338
|
+
| Message | `client.message` | `client.message` | `client.Message()` | 消息便利方法:`send()`、`pull()`、`ack()`、`recall()`、`queryOnline()` |
|
|
339
|
+
| Message Thought | `client.message.thought` | `client.message.thought` | `client.Message().Thought()` | P2P 思考内容:`put()`、`get()`(不持久化、不分配 seq、强制 E2EE) |
|
|
340
|
+
| Group | `client.group` | `client.group` | `client.Group()` | 群组便利方法:`create()`、`send()`、`pull()`、`ack()`、群管理方法、群查询方法、群设置便利方法 |
|
|
341
|
+
| Group Thought | `client.group.thought` | `client.group.thought` | `client.Group().Thought()` | 群思考内容:`put()`、`get()`(不持久化、不分配 seq、强制 E2EE) |
|
|
342
|
+
| Stream | `client.stream` | `client.stream` | — | 流式数据:`createStream()`、`sendChunk()`、`endStream()`、`subscribeStream()` |
|
|
343
|
+
|
|
344
|
+
**群查询方法**:`GroupFacade` 提供三个查询方法,适用不同场景:
|
|
345
|
+
|
|
346
|
+
- `getBasic()` — 查询群组基础信息(嵌套格式 `{found, group_id, group: {...}}`),**SDK 内部逻辑使用**
|
|
347
|
+
- `getInfo()` — 查询群组信息(扁平化格式,提升常用字段到顶层),**推荐外部使用**
|
|
348
|
+
- `info()` — 查询群组详细信息(带权限控制,非成员只能看公开群,成员能看 seq/epoch 等运行时状态)
|
|
349
|
+
|
|
350
|
+
**群设置便利方法**:`GroupFacade` 提供向后兼容的便利方法,基于 `group.set_settings` / `group.get_settings` 实现:
|
|
351
|
+
|
|
352
|
+
- `getAnnouncement()` / `updateAnnouncement()` — 群公告
|
|
353
|
+
- `getRules()` / `updateRules()` — 群规则
|
|
354
|
+
- `getJoinRequirements()` / `updateJoinRequirements()` — 入群要求
|
|
355
|
+
|
|
356
|
+
便利方法返回旧格式(嵌套对象 `{announcement: {content, attachments}}`),屏蔽 `settings` 数组的繁琐。新代码建议直接使用 `group.set_settings` / `group.get_settings` 以获得更灵活的批量操作能力(一次调用可设置多个键)。
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## ServiceProxyClient
|
|
361
|
+
|
|
362
|
+
Service Proxy 用于 provider 通过 AUN 身份暴露本地 HTTP / WebSocket 服务。当前公开封装在 Python SDK 的 `ServiceProxyClient` 中;其它语言可以按 [09-proxy-rpc-manual.md](09-proxy-rpc-manual.md) 直接实现同等控制面和隧道消息。
|
|
363
|
+
|
|
364
|
+
```python
|
|
365
|
+
from aun_core.service_proxy import ServiceProxyClient
|
|
366
|
+
|
|
367
|
+
proxy_client = ServiceProxyClient(
|
|
368
|
+
provider_aid="alice.agentid.pub",
|
|
369
|
+
aun_client=client,
|
|
370
|
+
)
|
|
371
|
+
proxy_client.register_service(
|
|
372
|
+
"fileshare",
|
|
373
|
+
"http://127.0.0.1:8080",
|
|
374
|
+
visibility="public",
|
|
375
|
+
)
|
|
376
|
+
await proxy_client.serve_forever()
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
proxy-server 连接地址不能由应用外部传入或配置。`ServiceProxyClient` 会先读取 provider AID 本地 SQLite metadata 中 1 小时 TTL 的 `service_proxy_discovery` 缓存;缓存缺失或过期时,按协议查询 `https://{provider_aid}/.well-known/aun-proxy`,失败后回退 `https://proxy.{issuer}/.well-known/aun-proxy`,并使用返回的 `ws_url` 建立隧道。
|
|
380
|
+
|
|
381
|
+
关键 API:
|
|
382
|
+
|
|
383
|
+
| Python | 说明 |
|
|
384
|
+
|--------|------|
|
|
385
|
+
| `register_service(service_name, endpoint, service_type="http", visibility="private", metadata=None)` | 注册本地 embedded endpoint |
|
|
386
|
+
| `unregister_service(service_name)` | 注销本地服务 |
|
|
387
|
+
| `list_service_summaries()` | 获取可上报到 Gateway 和 proxy-server 的服务摘要 |
|
|
388
|
+
| `register_services_with_gateway()` | 显式调用 Gateway `proxy.register_services` |
|
|
389
|
+
| `unregister_services_from_gateway(service_names=None)` | 显式调用 Gateway `proxy.unregister_services` |
|
|
390
|
+
| `list_gateway_services()` | 显式调用 Gateway `proxy.list_services` |
|
|
391
|
+
| `register_services_with_proxy_server(ws)` | 通过已认证 proxy-server 隧道发送 `register_services` |
|
|
392
|
+
| `discover_proxy_server(force_refresh=False)` | 通过缓存 / well-known 发现 proxy-server |
|
|
393
|
+
| `connect_once()` | 建立一次 proxy-server 隧道并完成认证、数据面注册和可选心跳 |
|
|
394
|
+
| `serve_once()` | 处理有限数量的 proxy-server 转发请求 |
|
|
395
|
+
| `serve_forever(connection_mode="persistent")` | 持续提供 Service Proxy 服务;支持 persistent / on_demand |
|
|
396
|
+
|
|
397
|
+
自动注册顺序:
|
|
398
|
+
|
|
399
|
+
- `connect_once()`、`serve_once()`、`serve_forever()` 在存在 `aun_client.call()` 时,会先向 Gateway 调用 `proxy.register_services`。
|
|
400
|
+
- 建立 proxy-server 隧道前,SDK 必须通过缓存 / `/.well-known/aun-proxy` 发现得到 `ws_url`;不得由应用传入或配置 proxy-server 地址。
|
|
401
|
+
- proxy-server 隧道使用 `Authorization: Bearer <access_token>` 鉴权;SDK 优先复用 cached token,缺失或过期时通过 `aun_client.authenticate()` 向 Gateway 完成登录刷新。
|
|
402
|
+
- 每次 proxy-server 隧道认证成功后,都会立即向 proxy-server 发送 `register_services` 隧道消息。
|
|
403
|
+
- 服务列表与连接绑定;断开 Gateway 长连接或 proxy-server 隧道后,相应注册立即失效。
|
|
404
|
+
|
|
405
|
+
详细控制面 RPC、隧道消息和路由语义见 [09-proxy-rpc-manual.md](09-proxy-rpc-manual.md)。
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## 事件
|
|
410
|
+
|
|
411
|
+
```python
|
|
412
|
+
sub = client.on("message.received", handler)
|
|
413
|
+
client.off("message.received", handler)
|
|
414
|
+
sub.unsubscribe()
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
常用内置事件:
|
|
418
|
+
|
|
419
|
+
| 事件 | 说明 |
|
|
420
|
+
|------|------|
|
|
392
421
|
| `state_change` | 状态变化,`state` 为九态公开值 |
|
|
393
422
|
| `connection.error` | 连接或重连错误 |
|
|
394
423
|
| `token.refreshed` | token 刷新完成 |
|
|
424
|
+
| `token.refresh_exhausted` | refresh_token 缺失、过期或刷新链耗尽,SDK 已清理本地 token 并等待重新登录 |
|
|
395
425
|
| `message.received` | 收到 P2P 消息 |
|
|
396
426
|
| `message.ack` | 消息 ack |
|
|
397
427
|
| `message.undecryptable` | P2P E2EE 解密失败 |
|
|
398
428
|
| `group.changed` | 群组事件 |
|
|
399
429
|
| `group.message_undecryptable` | 群 E2EE 解密失败 |
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
| `client.e2ee.
|
|
413
|
-
| `client.e2ee.
|
|
414
|
-
| `client.e2ee.
|
|
415
|
-
| `client.
|
|
416
|
-
| `client.group_e2ee.
|
|
417
|
-
| `client.group_e2ee.
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
|
427
|
-
|
|
|
428
|
-
|
|
|
429
|
-
|
|
|
430
|
-
|
|
|
431
|
-
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
"
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
430
|
+
| `storage.object_changed` | Storage 对象变更事件透传 |
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## E2EE 高级 API
|
|
435
|
+
|
|
436
|
+
普通业务无需直接操作 E2EE manager;`message.send` / `group.send` 默认加密并自动解密收到的消息。
|
|
437
|
+
|
|
438
|
+
高级场景可使用:
|
|
439
|
+
|
|
440
|
+
| API | 说明 |
|
|
441
|
+
|-----|------|
|
|
442
|
+
| `client.e2ee.encrypt_message(...)` | 裸 WebSocket 或特殊集成中的 P2P 加密 |
|
|
443
|
+
| `client.e2ee.decrypt_message(...)` | 裸消息解密 |
|
|
444
|
+
| `client.e2ee.generate_prekey()` | 生成 prekey |
|
|
445
|
+
| `client.e2ee.invalidate_prekey_cache(peer_aid)` | 清理对端 prekey 缓存 |
|
|
446
|
+
| `client.group_e2ee.encrypt(...)` | 群消息加密 |
|
|
447
|
+
| `client.group_e2ee.decrypt(...)` | 群消息解密 |
|
|
448
|
+
| `client.group_e2ee.current_epoch(group_id)` | 查询当前群 epoch |
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## RPC 方法参考
|
|
453
|
+
|
|
454
|
+
| 领域 | 手册 | 关键方法 |
|
|
455
|
+
|------|------|----------|
|
|
456
|
+
| 消息 | [09-message-rpc-manual.md](09-message-rpc-manual.md) | `message.send` / `message.pull` / `message.ack` / `message.thought.*` |
|
|
457
|
+
| 群组 | [09-group-rpc-manual.md](09-group-rpc-manual.md) | `group.create` / `group.send` / `group.v2.*` / `group.fs.*` |
|
|
458
|
+
| 存储 | [09-storage-rpc-manual.md](09-storage-rpc-manual.md) | `storage.put_object` / `storage.fs.*` / `storage.volume.*` / ACL / token / share link |
|
|
459
|
+
| 协作 | [09-collab-rpc-manual.md](09-collab-rpc-manual.md) | `collab.ls-files` / `collab.show` / `collab.commit` / `collab.merge` / `collab.log` / `collab.diff` / `collab.clone` / `collab.prune` / `collab.gc` / `collab.reflog` / `collab.revert` / `collab.tag.*` / `collab.ls-remote` / `collab.unregister` |
|
|
460
|
+
| 元信息 | [09-meta-rpc-manual.md](09-meta-rpc-manual.md) | `meta.ping` / `meta.status` / `meta.trust_roots` |
|
|
461
|
+
| Stream | [09-stream-rpc-manual.md](09-stream-rpc-manual.md) | `stream.create` / `stream.close` / `stream.list_active` |
|
|
462
|
+
| Service Proxy | [09-proxy-rpc-manual.md](09-proxy-rpc-manual.md) | `proxy.register_services` / `proxy.unregister_services` / `proxy.list_services` |
|
|
463
|
+
|
|
464
|
+
---
|
|
465
|
+
|
|
466
|
+
## Stream 使用指南
|
|
467
|
+
|
|
468
|
+
创建流:
|
|
469
|
+
|
|
470
|
+
```python
|
|
471
|
+
stream = await client.call("stream.create", {
|
|
472
|
+
"kind": "audio",
|
|
473
|
+
"metadata": {"sample_rate": 16000},
|
|
474
|
+
})
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
查询流:
|
|
478
|
+
|
|
479
|
+
```python
|
|
480
|
+
info = await client.call("stream.get_info", {"stream_id": stream["stream_id"]})
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
关闭流:
|
|
484
|
+
|
|
485
|
+
```python
|
|
486
|
+
await client.call("stream.close", {"stream_id": stream["stream_id"]})
|
|
487
|
+
```
|
|
488
|
+
|