@agentunion/fastaun-browser 0.2.20 → 0.3.1
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 +66 -26
- package/README.md +0 -1
- package/_packed_docs/CHANGELOG.md +66 -26
- package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +542 -0
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1 -24
- 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 +131 -39
- package/_packed_docs/sdk/09-message-rpc-manual.md +30 -67
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +25 -5
- package/dist/auth.js.map +1 -1
- package/dist/bundle.js +15042 -0
- package/dist/client.d.ts +179 -187
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3148 -3993
- 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 +9 -0
- package/dist/namespaces/auth.d.ts.map +1 -1
- package/dist/namespaces/auth.js +248 -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 +33 -13
- package/dist/seq-tracker.js.map +1 -1
- package/dist/transport.d.ts +9 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +262 -10
- package/dist/transport.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 +57 -0
- package/dist/v2/session/keystore.d.ts.map +1 -0
- package/dist/v2/session/keystore.js +244 -0
- package/dist/v2/session/keystore.js.map +1 -0
- package/dist/v2/session/session.d.ts +121 -0
- package/dist/v2/session/session.d.ts.map +1 -0
- package/dist/v2/session/session.js +344 -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
|
@@ -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,20 @@
|
|
|
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
|
|
26
|
+
- [check_aid()](#await-check_aidparams-dict---dict) - 检查 AID 状态(本地完整性 + 远程注册)
|
|
24
27
|
- [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
|
|
28
|
+
- [sign_agent_md()](#await-sign_agent_mdcontent-str-aid-str--none---str) - 为 agent.md 生成尾部签名 **(已 deprecated,建议改用 `client.publish_agent_md`)**
|
|
29
|
+
- [verify_agent_md()](#await-verify_agent_mdcontent-str-aid-str--none-cert_pem-str--none---dict) - 验证 agent.md 尾部签名 **(已 deprecated,建议改用 `client.fetch_agent_md`)**
|
|
30
|
+
- [upload_agent_md()](#await-upload_agent_mdcontent-str---dict) - 上传自己的 agent.md **(已 deprecated,建议改用 `client.publish_agent_md`)**
|
|
31
|
+
- [download_agent_md()](#await-download_agent_mdaid-str---str) - 下载指定 AID 的 agent.md **(已 deprecated,建议改用 `client.fetch_agent_md`)**
|
|
29
32
|
- [renew_cert()](#await-renew_certparams-dict--none---dict) - 续期证书
|
|
30
33
|
- [rekey()](#await-rekeyparams-dict--none---dict) - 密钥轮换
|
|
31
34
|
- [request_cert()](#await-request_certparams-dict---dict) - 通用证书请求
|
|
@@ -394,58 +397,99 @@ for item in identities:
|
|
|
394
397
|
|
|
395
398
|
---
|
|
396
399
|
|
|
397
|
-
### `
|
|
400
|
+
### `await publish_agent_md(path: str) -> dict` — agent.md 发布主 API
|
|
398
401
|
|
|
399
|
-
|
|
402
|
+
读取本地 `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
403
|
|
|
401
|
-
|
|
404
|
+
**API 跨语言对齐:**
|
|
405
|
+
|
|
406
|
+
| SDK | 签名 |
|
|
407
|
+
|------|------|
|
|
408
|
+
| Python | `await client.publish_agent_md(path: str) -> dict` |
|
|
409
|
+
| TypeScript(Node) | `await client.publishAgentMd(path: string)` |
|
|
410
|
+
| Go | `client.PublishAgentMD(ctx, path string) (map[string]any, error)` |
|
|
411
|
+
| C++ | `client.PublishAgentMd(path, callback)` |
|
|
412
|
+
| JavaScript(浏览器) | `await client.publishAgentMd(content: string)` — 浏览器无文件系统,接收 markdown 文本 |
|
|
413
|
+
|
|
414
|
+
**返回值:** 透传 `auth.upload_agent_md` 的返回,含 `aid` / `etag` / `last_modified` / `agent_md_url` / `bytes`。
|
|
415
|
+
|
|
416
|
+
**异常:**
|
|
417
|
+
- `ValidationError`:path / content 为空
|
|
418
|
+
- `FileNotFoundError`(其它语言对应):文件不存在
|
|
419
|
+
- `StateError`:尚未持有本地身份
|
|
420
|
+
- `AUNError`:上传失败
|
|
421
|
+
|
|
422
|
+
**示例:**
|
|
423
|
+
|
|
424
|
+
```python
|
|
425
|
+
result = await client.publish_agent_md("/path/to/agent.md")
|
|
426
|
+
print(result["agent_md_url"])
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
### `await fetch_agent_md(aid: str | None = None, save_path: str | None = None) -> dict` — agent.md 下载主 API
|
|
432
|
+
|
|
433
|
+
下载指定 AID 的 `agent.md`,自动调用 `auth.verify_agent_md` 验签;`aid` 缺省取本地身份;可选 `save_path` 写盘;若目标 aid 是自己则同步刷新内部 `_local_agent_md_etag` 并计算 `in_sync`。
|
|
402
434
|
|
|
403
435
|
**API 跨语言对齐:**
|
|
404
436
|
|
|
405
|
-
| SDK |
|
|
406
|
-
|
|
407
|
-
| Python | `client.
|
|
408
|
-
| TypeScript | `
|
|
409
|
-
| Go | `client.
|
|
410
|
-
| C++ | `client.
|
|
411
|
-
| JavaScript(浏览器) | `client.
|
|
437
|
+
| SDK | 签名 |
|
|
438
|
+
|------|------|
|
|
439
|
+
| Python | `await client.fetch_agent_md(aid=None, save_path=None) -> dict` |
|
|
440
|
+
| TypeScript(Node) | `await client.fetchAgentMd(aid?, savePath?)` |
|
|
441
|
+
| Go | `client.FetchAgentMD(ctx, aid string, savePath string) (*AgentMDInfo, error)` |
|
|
442
|
+
| C++ | `client.FetchAgentMd(aid, save_path, callback)` |
|
|
443
|
+
| JavaScript(浏览器) | `await client.fetchAgentMd(aid?)` — 无 savePath(浏览器无文件系统) |
|
|
412
444
|
|
|
413
|
-
|
|
445
|
+
**返回字段:**
|
|
414
446
|
|
|
415
|
-
|
|
447
|
+
| 字段 | 类型 | 说明 |
|
|
448
|
+
|------|------|------|
|
|
449
|
+
| `aid` | `str` | 实际下载的 AID(缺省时为自身 AID) |
|
|
450
|
+
| `content` | `str` | agent.md 完整文本 |
|
|
451
|
+
| `signature` | `dict` | `auth.verify_agent_md` 的返回(status / verified / reason / cert_fingerprint / timestamp) |
|
|
452
|
+
| `in_sync` | `bool \| None` | 仅当 aid 是自己时给出:本地 etag == 服务端 etag;否则为 `null` |
|
|
453
|
+
| `saved_to` | `str \| None` | 若传了 save_path 且写盘成功,返回路径;其他情况为 `null`(JS 浏览器版无此字段) |
|
|
454
|
+
| `save_error` | `str \| None` | 写盘失败原因;不影响下载成功(JS 浏览器版无此字段) |
|
|
416
455
|
|
|
417
|
-
|
|
456
|
+
**异常:**
|
|
457
|
+
- `ValidationError`:未传 aid 且本地无身份
|
|
458
|
+
- `NotFoundError`:服务端 404
|
|
459
|
+
- `AUNError`:其他 HTTP 错误
|
|
460
|
+
|
|
461
|
+
**etag 缓存:** 内部沿用 `auth.download_agent_md` 的 If-None-Match / 304 缓存机制;命中 304 时返回上次缓存的内容。
|
|
462
|
+
|
|
463
|
+
**示例:**
|
|
464
|
+
|
|
465
|
+
```python
|
|
466
|
+
# 拉自己的 agent.md,并判断是否与服务端同步
|
|
467
|
+
info = await client.fetch_agent_md()
|
|
468
|
+
print(info["signature"]["status"], info["in_sync"])
|
|
469
|
+
|
|
470
|
+
# 拉别人的 agent.md,并存到本地路径
|
|
471
|
+
info = await client.fetch_agent_md("bob.agentid.pub", save_path="./bob.md")
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
---
|
|
475
|
+
|
|
476
|
+
### `_agent_md` 事件 payload 字段(保留)
|
|
477
|
+
|
|
478
|
+
SDK 在 publish `message.received` / `group.message_created` 等应用事件时仍会自动注入:
|
|
418
479
|
|
|
419
480
|
```python
|
|
420
481
|
{
|
|
421
482
|
"_agent_md": {
|
|
422
|
-
"local_etag": "\"abc...\"", #
|
|
423
|
-
"remote_etag": "\"def...\"", # gateway
|
|
483
|
+
"local_etag": "\"abc...\"", # publish_agent_md / fetch_agent_md(自身)后内部计算
|
|
484
|
+
"remote_etag": "\"def...\"", # gateway 在每次 RPC envelope._meta.agent_md_etag 注入
|
|
424
485
|
},
|
|
425
486
|
# ... 原有业务字段
|
|
426
487
|
}
|
|
427
488
|
```
|
|
428
489
|
|
|
429
|
-
|
|
490
|
+
应用层比对二者是否一致即可知本地是否需要重新 publish。
|
|
430
491
|
|
|
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
|
-
- 注入失败被吞,**绝不影响业务路径**
|
|
492
|
+
> **注意:** 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
493
|
|
|
450
494
|
---
|
|
451
495
|
|
|
@@ -509,6 +553,46 @@ result = await client.auth.create_aid({"aid": MY_AID})
|
|
|
509
553
|
|
|
510
554
|
---
|
|
511
555
|
|
|
556
|
+
### `await check_aid(params: dict) -> dict`
|
|
557
|
+
|
|
558
|
+
检查 AID 的本地密钥/证书完整性和远程注册状态。用于首次启动时判断是创建还是恢复,或连接前确认本地状态。
|
|
559
|
+
|
|
560
|
+
**参数**
|
|
561
|
+
|
|
562
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
563
|
+
|------|------|------|------|
|
|
564
|
+
| `aid` | `str` | 是 | 要检查的 AID |
|
|
565
|
+
|
|
566
|
+
**返回值**
|
|
567
|
+
|
|
568
|
+
| 字段 | 类型 | 说明 |
|
|
569
|
+
|------|------|------|
|
|
570
|
+
| `status` | `str` | `local_ready` / `local_incomplete` / `available` / `registered_remote` / `unknown` |
|
|
571
|
+
| `can_register` | `bool\|null` | 是否可注册(`local_ready` 时为 `false`) |
|
|
572
|
+
| `local` | `dict` | 本地状态详情(`exists` / `complete` / `private_key` / `public_key` / `certificate` / `issues`) |
|
|
573
|
+
| `remote` | `dict` | 远程状态(`status`: `not_checked` / `registered` / `available` / `error`) |
|
|
574
|
+
|
|
575
|
+
```python
|
|
576
|
+
result = await client.auth.check_aid({"aid": "alice.agentid.pub"})
|
|
577
|
+
if result["status"] == "local_ready":
|
|
578
|
+
# 可以直接连接
|
|
579
|
+
pass
|
|
580
|
+
elif result["can_register"]:
|
|
581
|
+
# AID 可用,创建新身份
|
|
582
|
+
await client.auth.create_aid({"aid": "alice.agentid.pub"})
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
**跨语言**
|
|
586
|
+
|
|
587
|
+
| 语言 | 调用方式 |
|
|
588
|
+
|------|----------|
|
|
589
|
+
| Python | `await client.auth.check_aid({"aid": "..."})` |
|
|
590
|
+
| TypeScript | `await client.auth.checkAid({ aid: '...' })` |
|
|
591
|
+
| Go | `client.Auth.CheckAID(ctx, map[string]any{"aid": "..."})` |
|
|
592
|
+
| C++ | `client->Auth()->CheckAID("...", callback)` |
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
512
596
|
### `await authenticate(params: dict | None) -> dict`
|
|
513
597
|
|
|
514
598
|
执行双向 ECDSA 挑战-响应认证,获取访问令牌。
|
|
@@ -537,6 +621,8 @@ auth = await client.auth.authenticate({"aid": MY_AID})
|
|
|
537
621
|
|
|
538
622
|
### `await sign_agent_md(content: str, aid: str | None = None) -> str`
|
|
539
623
|
|
|
624
|
+
> **⚠️ Deprecated。** 主要场景请改用 `client.publish_agent_md(path)`,它内部已包含读文件 + 签名 + 上传一整套流程。`sign_agent_md` 仅作为离线签名(先签名后异步发布、给非 SDK 渠道发送等)的底层工具继续保留,未来版本将移除。
|
|
625
|
+
|
|
540
626
|
为 `agent.md` 生成尾部签名块。
|
|
541
627
|
|
|
542
628
|
**参数**
|
|
@@ -560,6 +646,8 @@ auth = await client.auth.authenticate({"aid": MY_AID})
|
|
|
560
646
|
|
|
561
647
|
### `await verify_agent_md(content: str, aid: str | None = None, cert_pem: str | None = None) -> dict`
|
|
562
648
|
|
|
649
|
+
> **⚠️ Deprecated。** 主要场景请改用 `client.fetch_agent_md(aid)`,它内部已包含下载 + 自动验签 + etag 缓存。`verify_agent_md` 仅作为对纯文本 agent.md(来自非 SDK 渠道)的验签底层工具继续保留,未来版本将移除。
|
|
650
|
+
|
|
563
651
|
验证 `agent.md` 尾部签名。
|
|
564
652
|
|
|
565
653
|
**参数**
|
|
@@ -592,6 +680,8 @@ auth = await client.auth.authenticate({"aid": MY_AID})
|
|
|
592
680
|
|
|
593
681
|
### `await upload_agent_md(content: str) -> dict`
|
|
594
682
|
|
|
683
|
+
> **⚠️ Deprecated。** 请改用 `client.publish_agent_md(path)`,它会自动读文件、签名、上传并刷新内部 etag。`upload_agent_md` 仅作底层 API 继续保留以兼容旧代码,未来版本将移除。
|
|
684
|
+
|
|
595
685
|
上传当前 AID 的公开 `agent.md` 文档。
|
|
596
686
|
|
|
597
687
|
**参数**
|
|
@@ -636,6 +726,8 @@ name: Alice
|
|
|
636
726
|
|
|
637
727
|
### `await download_agent_md(aid: str) -> str`
|
|
638
728
|
|
|
729
|
+
> **⚠️ Deprecated。** 请改用 `client.fetch_agent_md(aid)`,它会自动下载、验签、刷新内部 etag,并支持可选写盘。`download_agent_md` 仅作底层 API 继续保留以兼容旧代码,未来版本将移除。
|
|
730
|
+
|
|
639
731
|
匿名下载指定 AID 的公开 `agent.md` 文档。
|
|
640
732
|
|
|
641
733
|
**参数**
|
|
@@ -20,8 +20,8 @@ P2P `message.*` 的最终投递语义由连接阶段声明的 `delivery_mode`
|
|
|
20
20
|
| 方法 | 说明 |
|
|
21
21
|
|------|------|
|
|
22
22
|
| [message.send](#messagesend) | 发送消息 |
|
|
23
|
-
| [message.thought.put](#messagethoughtput) | 写入某个 P2P 上下文的思考内容 |
|
|
24
|
-
| [message.thought.get](#messagethoughtget) | 读取某个 P2P 上下文的思考内容 |
|
|
23
|
+
| [message.thought.put](#messagethoughtput) | 写入某个 P2P 上下文的思考内容 |
|
|
24
|
+
| [message.thought.get](#messagethoughtget) | 读取某个 P2P 上下文的思考内容 |
|
|
25
25
|
| [message.pull](#messagepull) | 增量拉取消息 |
|
|
26
26
|
| [message.ack](#messageack) | 确认送达 |
|
|
27
27
|
| [message.recall](#messagerecall) | 撤回消息 |
|
|
@@ -43,7 +43,6 @@ P2P `message.*` 的最终投递语义由连接阶段声明的 `delivery_mode`
|
|
|
43
43
|
| 事件 | 说明 |
|
|
44
44
|
|------|------|
|
|
45
45
|
| [event/message.received](#eventmessagereceived) | 收到新消息 |
|
|
46
|
-
| [event/message.ack](#eventmessageack) | 消息被确认 |
|
|
47
46
|
| [event/message.recalled](#eventmessagerecalled) | 消息被撤回 |
|
|
48
47
|
|
|
49
48
|
---
|
|
@@ -76,13 +75,13 @@ P2P `message.*` 的最终投递语义由连接阶段声明的 `delivery_mode`
|
|
|
76
75
|
| `to` | string | 是 | — | 接收方 AID |
|
|
77
76
|
| `payload` | object | 是 | — | 消息内容(任意 JSON 对象) |
|
|
78
77
|
| `type` | string | 否 | — | 信封/封装类型,普通业务消息无需填写;SDK 加密发送时自动使用 `e2ee.encrypted` |
|
|
79
|
-
| `encrypted` | boolean | 否 | `false` | 底层 RPC 的 E2EE 标记。Python SDK 便捷层通常使用 `encrypt` 入参并由 SDK 自动填充此字段 |
|
|
80
|
-
| `message_id` | string | 否 | — | 幂等键(客户端提供或服务端生成 UUID) |
|
|
81
|
-
| `timestamp` | integer | 否 | — | 客户端时间戳(毫秒)。**服务端忽略此字段,始终使用服务端时间** |
|
|
82
|
-
| `protected_headers` / `headers` | object | 否 | — | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers;服务端不解释,接收端验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
|
|
83
|
-
|
|
84
|
-
> 连接级 `delivery_mode` 在 `auth.connect` 阶段声明,结构见 `02-WebSocket协议.md`。Python SDK 的 P2P 消息发送会沿用当前连接的 `delivery_mode`,应用层发送时无需重复指定。
|
|
85
|
-
> `protected_headers` 只在 SDK 加密路径生效;裸 RPC 发送明文或已加密信封时,调用方需自行遵守 [05-E2EE加密通信](05-E2EE加密通信.md#protectedheaders-与可验证上下文) 的格式和校验规则。
|
|
78
|
+
| `encrypted` | boolean | 否 | `false` | 底层 RPC 的 E2EE 标记。Python SDK 便捷层通常使用 `encrypt` 入参并由 SDK 自动填充此字段 |
|
|
79
|
+
| `message_id` | string | 否 | — | 幂等键(客户端提供或服务端生成 UUID) |
|
|
80
|
+
| `timestamp` | integer | 否 | — | 客户端时间戳(毫秒)。**服务端忽略此字段,始终使用服务端时间** |
|
|
81
|
+
| `protected_headers` / `headers` | object | 否 | — | SDK 加密前读取的 E2EE 信封元数据,类似 HTTP headers;服务端不解释,接收端验 `_auth` 后在 `e2ee.protected_headers` 暴露 |
|
|
82
|
+
|
|
83
|
+
> 连接级 `delivery_mode` 在 `auth.connect` 阶段声明,结构见 `02-WebSocket协议.md`。Python SDK 的 P2P 消息发送会沿用当前连接的 `delivery_mode`,应用层发送时无需重复指定。
|
|
84
|
+
> `protected_headers` 只在 SDK 加密路径生效;裸 RPC 发送明文或已加密信封时,调用方需自行遵守 [05-E2EE加密通信](05-E2EE加密通信.md#protectedheaders-与可验证上下文) 的格式和校验规则。
|
|
86
85
|
|
|
87
86
|
### Payload 参考约定
|
|
88
87
|
|
|
@@ -140,24 +139,24 @@ result = await client.call("message.send", {
|
|
|
140
139
|
|
|
141
140
|
## message.thought.put
|
|
142
141
|
|
|
143
|
-
写入当前发送者针对一个上下文的思考内容。它不是普通消息:不广播、不进 `message.pull`、不占用收件箱 `seq`,只通过 `message.thought.get` 主动读取。
|
|
142
|
+
写入当前发送者针对一个上下文的思考内容。它不是普通消息:不广播、不进 `message.pull`、不占用收件箱 `seq`,只通过 `message.thought.get` 主动读取。
|
|
144
143
|
|
|
145
144
|
SDK 调用时必须走 P2P E2EE。应用层传入明文 `payload`,SDK 会加密成 `e2ee.encrypted` 信封、补齐 `thought_id` / `timestamp`,并附加 `client_signature`。裸 WebSocket 客户端若绕过 SDK,则必须自行完成同等加密和签名。
|
|
146
145
|
|
|
147
|
-
存储键为 `sender_aid + peer_aid + context.type + context.id`。其中 `sender_aid` 由认证态派生,`peer_aid` 来自 `to`;`context` 是 thought head 的唯一 selector,推荐使用 `{"type": "run", "id": "run-xxx"}`。同一会话里每个 sender 保留最近 N 个 context 对应的 head,N 由 Message 服务配置 `max_thought_heads_per_sender` 控制,当前默认值为 5;同一个 head 下可追加多条 thought item。
|
|
146
|
+
存储键为 `sender_aid + peer_aid + context.type + context.id`。其中 `sender_aid` 由认证态派生,`peer_aid` 来自 `to`;`context` 是 thought head 的唯一 selector,推荐使用 `{"type": "run", "id": "run-xxx"}`。同一会话里每个 sender 保留最近 N 个 context 对应的 head,N 由 Message 服务配置 `max_thought_heads_per_sender` 控制,当前默认值为 5;同一个 head 下可追加多条 thought item。
|
|
148
147
|
|
|
149
148
|
### 参数
|
|
150
149
|
|
|
151
|
-
| 参数 | 类型 | 必填 | 说明 |
|
|
152
|
-
|------|------|------|------|
|
|
153
|
-
| `to` | string | 是 | P2P 会话另一方 AID,不能是 `group.{issuer}` |
|
|
154
|
-
| `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
|
|
155
|
-
| `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
|
|
156
|
-
| `payload` | object | 是 | SDK 加密前的思考内容;推荐格式见 [09-payload-reference](09-payload-reference.md#thought思考内容) |
|
|
157
|
-
| `encrypt` | boolean | 否 | SDK 侧固定按 `true` 处理;`false` 会被拒绝 |
|
|
158
|
-
| `thought_id` | string | 否 | thought item ID;不传时 SDK 生成 `mt-*` |
|
|
159
|
-
| `timestamp` | integer | 否 | 客户端时间戳;不传时 SDK 生成 |
|
|
160
|
-
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据;`context` 会被 SDK 复制进信封并单独验 `_auth` |
|
|
150
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
151
|
+
|------|------|------|------|
|
|
152
|
+
| `to` | string | 是 | P2P 会话另一方 AID,不能是 `group.{issuer}` |
|
|
153
|
+
| `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
|
|
154
|
+
| `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
|
|
155
|
+
| `payload` | object | 是 | SDK 加密前的思考内容;推荐格式见 [09-payload-reference](09-payload-reference.md#thought思考内容) |
|
|
156
|
+
| `encrypt` | boolean | 否 | SDK 侧固定按 `true` 处理;`false` 会被拒绝 |
|
|
157
|
+
| `thought_id` | string | 否 | thought item ID;不传时 SDK 生成 `mt-*` |
|
|
158
|
+
| `timestamp` | integer | 否 | 客户端时间戳;不传时 SDK 生成 |
|
|
159
|
+
| `protected_headers` / `headers` | object | 否 | SDK 加密前读取的 E2EE 信封元数据;`context` 会被 SDK 复制进信封并单独验 `_auth` |
|
|
161
160
|
|
|
162
161
|
### SDK 调用示例
|
|
163
162
|
|
|
@@ -203,20 +202,20 @@ await client.call("message.thought.put", {
|
|
|
203
202
|
|
|
204
203
|
## message.thought.get
|
|
205
204
|
|
|
206
|
-
读取指定发送者针对指定上下文的当前思考内容。`get` 是查询操作,可重复调用;它不触发 push/pull、ack 或 replay 消费。
|
|
205
|
+
读取指定发送者针对指定上下文的当前思考内容。`get` 是查询操作,可重复调用;它不触发 push/pull、ack 或 replay 消费。
|
|
207
206
|
|
|
208
207
|
### 参数
|
|
209
208
|
|
|
210
|
-
| 参数 | 类型 | 必填 | 说明 |
|
|
211
|
-
|------|------|------|------|
|
|
212
|
-
| `sender_aid` | string | 是 | thought 作者 AID |
|
|
213
|
-
| `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
|
|
214
|
-
| `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
|
|
215
|
-
| `peer_aid` / `to` | string | 条件必填 | P2P 会话另一方。读取自己写的 thought 时必须提供;读取对方写给当前认证 AID 的 thought 时可省略,服务端自动用当前认证 AID 作为 peer |
|
|
209
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
210
|
+
|------|------|------|------|
|
|
211
|
+
| `sender_aid` | string | 是 | thought 作者 AID |
|
|
212
|
+
| `context.type` | string | 是 | 思考的上下文类型,推荐 `run` |
|
|
213
|
+
| `context.id` | string | 是 | 思考的上下文 ID,如 `run_id` |
|
|
214
|
+
| `peer_aid` / `to` | string | 条件必填 | P2P 会话另一方。读取自己写的 thought 时必须提供;读取对方写给当前认证 AID 的 thought 时可省略,服务端自动用当前认证 AID 作为 peer |
|
|
216
215
|
|
|
217
216
|
### SDK 调用示例
|
|
218
217
|
|
|
219
|
-
读取 Bob 针对当前上下文的思考:
|
|
218
|
+
读取 Bob 针对当前上下文的思考:
|
|
220
219
|
|
|
221
220
|
```python
|
|
222
221
|
result = await client.call("message.thought.get", {
|
|
@@ -388,14 +387,10 @@ for msg in result["messages"]:
|
|
|
388
387
|
|------|------|------|
|
|
389
388
|
| `success` | boolean | 操作是否成功 |
|
|
390
389
|
| `ack_seq` | integer | 本次推进到的 ack_seq |
|
|
391
|
-
| `event_published` | boolean | 可选。`false` 表示 DB 已写入但 ack 事件发布失败(部分成功语义) |
|
|
392
|
-
| `event_error` | string | 可选。仅 `event_published=false` 时出现,包含事件发布错误详情 |
|
|
393
|
-
|
|
394
|
-
其中 `event_published` / `event_error` 为可选字段:当 ack 游标已成功写入数据库,但事件发布失败时,当前实现会返回 `{"success": true, "ack_seq": ..., "event_published": false, "event_error": "..."}`,提示调用方不要因重试而重复推进状态。
|
|
395
390
|
|
|
396
391
|
### 副作用
|
|
397
392
|
|
|
398
|
-
|
|
393
|
+
确认成功后仅推进接收方消费游标。服务端不会向发送方或其他客户端推送 `message.ack` 事件,也不会把对端已读状态作为协议通知暴露。
|
|
399
394
|
|
|
400
395
|
### 示例
|
|
401
396
|
|
|
@@ -536,38 +531,6 @@ client.on("message.received", lambda msg: print(msg["payload"]))
|
|
|
536
531
|
|
|
537
532
|
---
|
|
538
533
|
|
|
539
|
-
## event/message.ack
|
|
540
|
-
|
|
541
|
-
消息被接收方确认时推送给**发送方**。
|
|
542
|
-
|
|
543
|
-
### Payload
|
|
544
|
-
|
|
545
|
-
```json
|
|
546
|
-
{
|
|
547
|
-
"to": "bob.agentid.pub",
|
|
548
|
-
"ack_seq": 150,
|
|
549
|
-
"device_id": "device-001",
|
|
550
|
-
"slot_id": "slot-a",
|
|
551
|
-
"timestamp": 1234567890000
|
|
552
|
-
}
|
|
553
|
-
```
|
|
554
|
-
|
|
555
|
-
| 字段 | 类型 | 说明 |
|
|
556
|
-
|------|------|------|
|
|
557
|
-
| `to` | string | **确认方(接收方)AID** — 即执行 ack 操作的一方 |
|
|
558
|
-
| `ack_seq` | integer | 已确认的最大 seq |
|
|
559
|
-
| `device_id` | string | 触发 ack 的设备标识;legacy 客户端为空字符串 |
|
|
560
|
-
| `slot_id` | string | 触发 ack 的消费槽位;空字符串表示设备单实例或 legacy 路径 |
|
|
561
|
-
| `timestamp` | integer | 服务端时间戳(毫秒) |
|
|
562
|
-
|
|
563
|
-
### 订阅
|
|
564
|
-
|
|
565
|
-
```python
|
|
566
|
-
client.on("message.ack", lambda ev: print(f"{ev['to']}[{ev['device_id']}/{ev['slot_id']}] 已确认到 seq {ev['ack_seq']}"))
|
|
567
|
-
```
|
|
568
|
-
|
|
569
|
-
---
|
|
570
|
-
|
|
571
534
|
## event/message.recalled
|
|
572
535
|
|
|
573
536
|
消息被发送方撤回时推送给**接收方**。
|
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
|
@@ -837,16 +837,19 @@ export class AuthFlow {
|
|
|
837
837
|
if (!receivedChallenge) {
|
|
838
838
|
// 首条消息是 challenge,忽略并发送 RPC 请求
|
|
839
839
|
receivedChallenge = true;
|
|
840
|
-
|
|
840
|
+
const requestPayload = JSON.stringify({
|
|
841
841
|
jsonrpc: '2.0',
|
|
842
842
|
id: `pre-${method}`,
|
|
843
843
|
method,
|
|
844
844
|
params,
|
|
845
|
-
})
|
|
845
|
+
});
|
|
846
|
+
this._log.debug(`short RPC request full: ${requestPayload}`);
|
|
847
|
+
ws.send(requestPayload);
|
|
846
848
|
return;
|
|
847
849
|
}
|
|
848
850
|
// 第二条消息是 RPC 响应
|
|
849
851
|
globalThis.clearTimeout(timeout);
|
|
852
|
+
this._log.debug(`short RPC response full: method=${method} ${JSON.stringify(msg)}`);
|
|
850
853
|
try {
|
|
851
854
|
ws.close();
|
|
852
855
|
}
|
|
@@ -981,6 +984,16 @@ export class AuthFlow {
|
|
|
981
984
|
async _initializeSession(transport, nonce, token, opts) {
|
|
982
985
|
const connectionKind = opts?.connectionKind ?? 'long';
|
|
983
986
|
const shortTtlMs = opts?.shortTtlMs ?? 0;
|
|
987
|
+
const extraInfo = opts?.extraInfo ?? {};
|
|
988
|
+
// _capabilities 来自 extra_info;可选覆盖默认能力声明,不会透传到服务端
|
|
989
|
+
const overrideCaps = extraInfo._capabilities;
|
|
990
|
+
const capabilities = isJsonObject(overrideCaps) ? overrideCaps : {
|
|
991
|
+
e2ee: true,
|
|
992
|
+
group_e2ee: true,
|
|
993
|
+
// AUN E2EE V2: 默认仅声明 V2 能力(V2-only 客户端)
|
|
994
|
+
supported_p2p_e2ee: ['e2ee_v2'],
|
|
995
|
+
supported_group_e2ee: ['group_e2ee_v2'],
|
|
996
|
+
};
|
|
984
997
|
const request = {
|
|
985
998
|
nonce,
|
|
986
999
|
auth: { method: 'kite_token', token },
|
|
@@ -988,7 +1001,7 @@ export class AuthFlow {
|
|
|
988
1001
|
device: { id: String(opts?.deviceId ?? this._deviceId ?? ''), type: 'sdk' },
|
|
989
1002
|
client: { slot_id: String(opts?.slotId ?? this._slotId ?? '') },
|
|
990
1003
|
delivery_mode: opts?.deliveryMode ?? { mode: 'fanout' },
|
|
991
|
-
capabilities
|
|
1004
|
+
capabilities,
|
|
992
1005
|
};
|
|
993
1006
|
// 长短连接选项:默认 long 时不写入 options(保持 wire 兼容)
|
|
994
1007
|
if (connectionKind === 'short') {
|
|
@@ -999,9 +1012,16 @@ export class AuthFlow {
|
|
|
999
1012
|
request.options = options;
|
|
1000
1013
|
}
|
|
1001
1014
|
// extra_info:应用层自定义信息(PID/HOME/备注等),踢人时透传给被踢方
|
|
1002
|
-
|
|
1015
|
+
// _ 前缀字段是内部覆盖字段,不透传到服务端
|
|
1003
1016
|
if (extraInfo && Object.keys(extraInfo).length > 0) {
|
|
1004
|
-
|
|
1017
|
+
const filtered = {};
|
|
1018
|
+
for (const [k, v] of Object.entries(extraInfo)) {
|
|
1019
|
+
if (!k.startsWith('_'))
|
|
1020
|
+
filtered[k] = v;
|
|
1021
|
+
}
|
|
1022
|
+
if (Object.keys(filtered).length > 0) {
|
|
1023
|
+
request.extra_info = filtered;
|
|
1024
|
+
}
|
|
1005
1025
|
}
|
|
1006
1026
|
this._log.debug(`auth.connect send: device_id=${opts?.deviceId ?? ''} slot_id=${opts?.slotId ?? ''} kind=${connectionKind}`);
|
|
1007
1027
|
const result = await transport.call('auth.connect', request);
|