@agentunion/fastaun-browser 0.5.18 → 0.5.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/CHANGELOG.md +172 -79
  2. package/_packed_docs/CHANGELOG.md +172 -79
  3. package/_packed_docs/INDEX.md +244 -116
  4. package/_packed_docs/KITE_DOCS_GUIDE.md +98 -69
  5. package/_packed_docs/agent.md/SCHEMA.md +245 -205
  6. 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 +11 -11
  7. package/_packed_docs/aun/345/210/206/345/270/203/345/274/217/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +42 -15
  8. package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +4 -4
  9. 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 +45 -134
  10. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1072 -1072
  11. 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 +5 -20
  12. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +687 -668
  13. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +19 -28
  14. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/211.md +443 -0
  15. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.0.md +161 -0
  16. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +658 -0
  17. package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2113.0.md +233 -0
  18. package/_packed_docs/protocol/agent.md/SCHEMA.md +4 -0
  19. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +1 -1
  20. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +68 -61
  21. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +1 -1
  22. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +279 -285
  23. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +3 -3
  24. package/_packed_docs/sdk/09-group-rpc-manual.md +271 -235
  25. package/_packed_docs/sdk/09-message-rpc-manual.md +47 -6
  26. package/_packed_docs/sdk/09-storage-rpc-manual.md +70 -68
  27. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +63 -34
  28. package/_packed_docs/sdk/INDEX.md +105 -34
  29. package/_packed_docs/sdk/Ownership-SDK/345/256/236/347/216/260/346/214/207/345/215/227.md +169 -0
  30. package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/227.md +349 -0
  31. package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +922 -0
  32. package/_packed_docs/sdk/Ownership-SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +270 -0
  33. package/_packed_docs/sdk/Ownership2.1-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +300 -0
  34. package/_packed_docs/sdk/Ownership2.1-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +382 -0
  35. package/_packed_docs/sdk/Ownership2.1-TDD/345/210/206/351/230/266/346/256/265/345/256/236/346/226/275/350/256/241/345/210/222.md +708 -0
  36. package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +476 -0
  37. package/_packed_docs/sdk/Ownership/347/256/241/347/220/206/344/270/223/351/242/230.md +559 -0
  38. package/_packed_docs/sdk/ProtectedHeaders/347/224/250/346/263/225/344/270/223/351/242/230.md +299 -0
  39. package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +173 -0
  40. package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +211 -0
  41. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/345/256/236/347/216/260/347/247/273/346/244/215/346/214/207/345/215/227.md +331 -0
  42. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273SDK/351/233/206/346/210/220/346/214/207/345/215/227.md +207 -0
  43. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +252 -0
  44. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/345/256/236/346/226/275/350/256/241/345/210/222.md +156 -0
  45. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/346/226/271/346/241/210.md +273 -0
  46. package/_packed_docs//350/267/250/350/256/276/345/244/207/345/267/262/350/257/273/346/234/252/350/257/273/350/257/246/347/273/206/350/256/276/350/256/241.md +211 -0
  47. package/dist/agent-md-schema.d.ts +17 -3
  48. package/dist/agent-md-schema.d.ts.map +1 -1
  49. package/dist/agent-md-schema.js +94 -26
  50. package/dist/agent-md-schema.js.map +1 -1
  51. package/dist/agent-md.d.ts +54 -3
  52. package/dist/agent-md.d.ts.map +1 -1
  53. package/dist/agent-md.js +711 -65
  54. package/dist/agent-md.js.map +1 -1
  55. package/dist/aid-store.d.ts +58 -46
  56. package/dist/aid-store.d.ts.map +1 -1
  57. package/dist/aid-store.js +254 -248
  58. package/dist/aid-store.js.map +1 -1
  59. package/dist/aid.d.ts +4 -1
  60. package/dist/aid.d.ts.map +1 -1
  61. package/dist/aid.js +27 -33
  62. package/dist/aid.js.map +1 -1
  63. package/dist/auth.d.ts +4 -1
  64. package/dist/auth.d.ts.map +1 -1
  65. package/dist/auth.js +426 -39
  66. package/dist/auth.js.map +1 -1
  67. package/dist/bundle.js +38179 -32054
  68. package/dist/cert-utils.d.ts +50 -2
  69. package/dist/cert-utils.d.ts.map +1 -1
  70. package/dist/cert-utils.js +105 -47
  71. package/dist/cert-utils.js.map +1 -1
  72. package/dist/client/delivery.d.ts +22 -1
  73. package/dist/client/delivery.d.ts.map +1 -1
  74. package/dist/client/delivery.js +389 -78
  75. package/dist/client/delivery.js.map +1 -1
  76. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  77. package/dist/client/rpc-pipeline.js +103 -77
  78. package/dist/client/rpc-pipeline.js.map +1 -1
  79. package/dist/client/v2-e2ee.d.ts +1 -0
  80. package/dist/client/v2-e2ee.d.ts.map +1 -1
  81. package/dist/client/v2-e2ee.js +182 -89
  82. package/dist/client/v2-e2ee.js.map +1 -1
  83. package/dist/client.d.ts +100 -1
  84. package/dist/client.d.ts.map +1 -1
  85. package/dist/client.js +1220 -25
  86. package/dist/client.js.map +1 -1
  87. package/dist/crypto.d.ts.map +1 -1
  88. package/dist/crypto.js +8 -6
  89. package/dist/crypto.js.map +1 -1
  90. package/dist/errors.d.ts.map +1 -1
  91. package/dist/errors.js +3 -2
  92. package/dist/errors.js.map +1 -1
  93. package/dist/events.d.ts +9 -2
  94. package/dist/events.d.ts.map +1 -1
  95. package/dist/events.js +72 -13
  96. package/dist/events.js.map +1 -1
  97. package/dist/facades.d.ts +82 -2
  98. package/dist/facades.d.ts.map +1 -1
  99. package/dist/facades.js +100 -6
  100. package/dist/facades.js.map +1 -1
  101. package/dist/index.d.ts +7 -3
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +3 -2
  104. package/dist/index.js.map +1 -1
  105. package/dist/keystore/index.d.ts +17 -0
  106. package/dist/keystore/index.d.ts.map +1 -1
  107. package/dist/keystore/indexeddb-shared.d.ts +10 -1
  108. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  109. package/dist/keystore/indexeddb-shared.js +111 -0
  110. package/dist/keystore/indexeddb-shared.js.map +1 -1
  111. package/dist/keystore/indexeddb-token-store.d.ts +7 -1
  112. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  113. package/dist/keystore/indexeddb-token-store.js +30 -1
  114. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  115. package/dist/org-protocol.d.ts +98 -0
  116. package/dist/org-protocol.d.ts.map +1 -0
  117. package/dist/org-protocol.js +1802 -0
  118. package/dist/org-protocol.js.map +1 -0
  119. package/dist/ownership-proof.d.ts +93 -5
  120. package/dist/ownership-proof.d.ts.map +1 -1
  121. package/dist/ownership-proof.js +239 -53
  122. package/dist/ownership-proof.js.map +1 -1
  123. package/dist/ownership-v21.d.ts +194 -0
  124. package/dist/ownership-v21.d.ts.map +1 -0
  125. package/dist/ownership-v21.js +678 -0
  126. package/dist/ownership-v21.js.map +1 -0
  127. package/dist/ownership-workflow.d.ts +151 -0
  128. package/dist/ownership-workflow.d.ts.map +1 -0
  129. package/dist/ownership-workflow.js +1229 -0
  130. package/dist/ownership-workflow.js.map +1 -0
  131. package/dist/seq-tracker.d.ts +1 -0
  132. package/dist/seq-tracker.d.ts.map +1 -1
  133. package/dist/seq-tracker.js +10 -2
  134. package/dist/seq-tracker.js.map +1 -1
  135. package/dist/tools/cross-sdk-agent.d.ts +83 -0
  136. package/dist/tools/cross-sdk-agent.d.ts.map +1 -1
  137. package/dist/tools/cross-sdk-agent.js +415 -7
  138. package/dist/tools/cross-sdk-agent.js.map +1 -1
  139. package/dist/transport.d.ts +7 -0
  140. package/dist/transport.d.ts.map +1 -1
  141. package/dist/transport.js +90 -2
  142. package/dist/transport.js.map +1 -1
  143. package/dist/v2/e2ee/decrypt.d.ts +1 -0
  144. package/dist/v2/e2ee/decrypt.d.ts.map +1 -1
  145. package/dist/v2/e2ee/decrypt.js +9 -1
  146. package/dist/v2/e2ee/decrypt.js.map +1 -1
  147. package/dist/version.d.ts +1 -1
  148. package/dist/version.js +1 -1
  149. package/package.json +1 -1
@@ -1,170 +1,152 @@
1
- # Agent.md 规格定义
2
-
3
- 版本: 1.0.0
4
-
5
- ## 限制
6
-
7
- - **文件大小**: 被签名 payload 最大 4KB(尾部签名块不计入)
8
- - **签名块大小**: 尾部签名载体最大 2KB(2048 字节,按 UTF-8 原始字节计算)
9
- - **请求读取上限**: `PUT /agent.md` 最多读取 `payload_max + signature_max` 字节;超出即返回 `413 agent_md_too_large`,不执行证书查询、数据库或缓存写入
10
- - **编码**: UTF-8
11
-
12
- ## 文件格式
13
-
14
- agent.md 文件采用 **YAML frontmatter + Markdown 内容 + 签名块(必需,位于文件尾部)** 的格式:
15
-
16
- ```markdown
17
- ---
18
- # YAML 元数据 (核心字段)
19
- aid: "agent-name.aid.pub"
20
- name: "Agent Name"
21
- type: "agent"
22
- version: "1.0.0"
23
- description: "一句话描述"
24
- tags:
25
- - tag1
26
- - tag2
27
- ---
28
-
29
- # Markdown 正文内容
30
- 详细说明、Skills、使用示例等...
31
-
32
- <!-- AUN-SIGNATURE
33
- cert_fingerprint: sha256:abc123...
34
- public_key_fingerprint: sha256:def456...
35
- timestamp: 1715300000
36
- signature: MEUCIQDx...
37
- -->
38
- ```
39
-
40
- 上传接收契约要求签名块存在且有效;无签名文件只可作为本地草稿或只读示例,不得通过 `PUT /agent.md`。
41
-
42
- ## 签名块规范
43
-
44
- ### 位置
45
-
46
- 文件尾部,位于 Markdown 正文之后。
47
-
48
- ### 格式
49
-
50
- ```
51
- <!-- AUN-SIGNATURE
52
- cert_fingerprint: sha256:<hex>
53
- public_key_fingerprint: sha256:<hex>
54
- timestamp: <unix_seconds>
55
- signature: <base64_der>
56
- -->
57
- ```
58
-
59
- - **cert_fingerprint**(必填): X.509 证书 DER 的 SHA-256 指纹,格式 `sha256:<64位hex>`;不得使用公钥指纹代替
60
- - **public_key_fingerprint**(可选): SubjectPublicKeyInfo DER 的 SHA-256 指纹,格式 `sha256:<64位hex>`
61
- - **timestamp**: 签名时刻的 Unix 时间戳(秒)
62
- - **signature**: ECDSA P-256 / SHA-256 签名的 DER 编码,使用严格 Base64 表示
63
-
64
- ### 签名计算
65
-
66
- 1. **被签内容(payload)**:签名块开始标记 `<!-- AUN-SIGNATURE` 之前的全部 UTF-8 字节,换行和空白均不得规范化
67
- 2. **哈希**:对 payload 计算 SHA-256
68
- 3. **签名**:使用证书对应的 NIST P-256 私钥执行 ECDSA 签名,结果采用 DER 编码
69
-
70
- ### 验签流程
71
-
72
- 1. 检测文件尾部是否存在且只能存在一个 `<!-- AUN-SIGNATURE` 签名块
73
- 2. 提取签名块中的 `cert_fingerprint`、`timestamp`、`signature`
74
- 3. 剥离签名块,取剩余内容为 payload
75
- 4. 对 payload 计算 SHA-256
76
- 5. 通过 `cert_fingerprint` 查找对应证书,获取公钥
77
- 6. 确认证书公钥为 NIST P-256,并使用 ECDSA / SHA-256 验证签名
78
-
79
- ### 约束
80
-
81
- - 签名块必须是文件的最后一个可见块(后面只允许可忽略的空白)
82
- - 签名块必须从新行开始,因此 payload 的最后一个原始字节必须是 `LF` 或 `CR`;SDK 不得自动补换行或改写 payload
83
- - frontmatter 与签名块均接受 `LF`、`CRLF` 或 `CR` 行尾;解析签名块时可识别行尾,但不得据此改写 payload
84
- - 签名块只能包含上述四个字段;除 `public_key_fingerprint` 外均为必填;重复字段和未知字段必须拒绝
85
- - 签名块不计入 4KB 文件大小限制,但自身不得超过 2048 字节;服务端必须在解析和证书查询前拒绝超限载体
86
- - `timestamp` 最多允许比服务端时间快 300 秒,不设置过去时间窗口,并且必须落在证书有效期内
87
- - `aid`、Host、Bearer Token 和签名证书 AID 必须一致
88
- - agent.md 上传签名算法固定为 ECDSA P-256 / SHA-256;其他曲线或密钥类型必须拒绝
89
- - 签名证书必须由当前 Issuer CA 返回,状态为 `active_signing` 且处于有效期内;证书 Subject CN 必须等于 AID
90
- - `PUT /agent.md` 成功验收后,文档不得仅因签名证书随后自然过期而失效;历史验签仍须确认 `timestamp` 落在该证书的有效期内
91
- - 服务端在数据库和缓存写入前完成全部校验;任一校验失败均拒绝接收
92
-
93
- ## YAML Schema (核心字段)
94
-
95
- ```yaml
96
- # ===== 身份标识 (必填) =====
97
- aid:
98
- type: string
99
- required: true
100
- pattern: "^[A-Za-z0-9_][A-Za-z0-9_-]*(?:\\.[A-Za-z0-9_][A-Za-z0-9_-]*)+$"
101
- description: "至少两个标签的 DNS 型 AID;Issuer 后缀不固定,比较时不区分大小写"
102
- example: "lobster.agentid.pub"
103
-
104
- # ===== 基本信息 =====
105
- name:
106
- type: string
107
- required: true
108
- description: "Agent 显示名称"
109
- example: "Code Reviewer"
110
-
1
+ # Agent.md 规格定义
2
+
3
+ 版本: 1.0.0
4
+ Ownership 版本: 2.0.0
5
+
6
+ 本文保留 legacy Ownership 2.0 的文件格式与字段,不是当前 2.1 Schema。Ownership 2.0 的 ownership 声明由整个文件尾部签名保护;本文的第三方存储写删授权、sub 单方撤销及无关系版本示例仅适用于该历史版本。当前 2.1 的完整文件、角色、关系版本、owner 锁与六态结果以 [Ownership 协议定义 2.1](../protocol/Ownership协议定义2.1.md) 为准。
7
+
8
+ 当前 `group/org` 是独立生命周期分支:owner 必填,无 ownership 合法,通用 ownership/proof/release 禁止;实体私钥生成主签,当前 owner 以本人 token 上传,可选 owner 附签且存在必须验证;Group 旧实体单签及实体身份上传持续兼容,Org 不开放。通用多签、实体证书代际和恢复以 [协议 §2.5](../protocol/Ownership协议定义2.1.md#25-grouporg-名片的实体主签与-owner-上传) 为准。下文 legacy 的 owner/ownership 成对及目标本人签名规则不得套用于当前 Group/Org。
9
+
10
+ ## 限制
11
+
12
+ - **文件大小**: 被签名 payload 最大 4KB(尾部签名块不计入)
13
+ - **签名块大小**: 全部尾签区合计最大 2KB(2048 字节,含块间及尾部空白,按 UTF-8 原始字节计算)
14
+ - **请求读取上限**: `PUT /agent.md` 最多读取 `payload_max + signature_max` 字节;超出即返回 `413 agent_md_too_large`
15
+ - **编码**: UTF-8
16
+
17
+ Ownership 字段属于 frontmatter,计入 4KB payload;它们由整个文件的尾部签名覆盖,不另设 ownership 签名块。
18
+
19
+ ## 文件格式
20
+
21
+ `agent.md` 和 `owner.md` 均采用 **YAML frontmatter + Markdown 内容 + 尾部签名块** 的格式:
22
+
23
+ ```markdown
24
+ ---
25
+ aid: "agent-name.agentid.pub"
26
+ name: "Agent Name"
27
+ type: "agent"
28
+ version: "1.0.0"
29
+ ---
30
+
31
+ # Markdown 正文
32
+ 说明内容...
33
+
34
+ <!-- AUN-SIGNATURE-AGENTMD-V2
35
+ cert_fingerprint: sha256:abc123...
36
+ public_key_fingerprint: sha256:def456...
37
+ timestamp: 1715300000
38
+ signature: MEUCIQDx...
39
+ -->
40
+ ```
41
+
42
+ `owner.md` 使用相同的签名块字段格式,但签名块标识为 `<!-- AUN-SIGNATURE-OWNERSHIP-V2`;其 frontmatter 最少包含 `owner_aid`、`sub_aid` 和 `ownership.statement`,不要求使用 `agent.md` 的 `aid`、`name`、`type` 等主体字段。`agent.md` 兼容旧的 `<!-- AUN-SIGNATURE` 标识,也可使用 `<!-- AUN-SIGNATURE-AGENTMD-V2`。
43
+
44
+ ## 尾部文件签名
45
+
46
+ ### 签名块格式
47
+
48
+ ```text
49
+ <!-- AUN-SIGNATURE[-TAG]
50
+ cert_fingerprint: sha256:<64位hex>
51
+ public_key_fingerprint: sha256:<64位hex>
52
+ timestamp: <unix_seconds>
53
+ signature: <base64_der>
54
+ -->
55
+ ```
56
+
57
+ - `cert_fingerprint` 必填,表示签署者 X.509 证书 DER 的 SHA-256 指纹。
58
+ - `public_key_fingerprint` 可选,表示 SubjectPublicKeyInfo DER 的 SHA-256 指纹。
59
+ - `timestamp` 必填,为签名时的 Unix 秒时间戳。
60
+ - `signature` 必填,为 ECDSA P-256 / SHA-256 DER 签名的严格 Base64 表示。
61
+
62
+ 允许连续多尾块。第 i 块签署文件起点至本块 `<` 前的完整原始 UTF-8 prefix;第一块仍只签正文,后续块含前序完整块与分隔空白。append 仅向已有链追加才在末字节非 LF/CR 时补 LF 并纳入新块输入;无旧块按首签要求正文以 CR/LF 结束,否则拒绝。块间及末块后只允许空白,不规范化换行。顺序受后续签名保护;移除末端块可形成有效短链,verify 只返回实际列表且必须全块验签。
63
+
64
+ 签名块标识使用 `<!-- AUN-SIGNATURE` 前缀,可选追加大写 TAG(例如 `<!-- AUN-SIGNATURE-AGENTMD-V2` 或 `<!-- AUN-SIGNATURE-OWNERSHIP-V2`)。`agent.md` 的主签证书必须属于 frontmatter `aid` 对应的 sub_aid;`owner.md` 的主签证书必须属于 frontmatter `owner_aid`。验证方按证书指纹取得公钥,并确认签署者 AID、证书有效期和签名算法均符合要求。
65
+
66
+ 各块仅允许上述四字段及 `signer_aid`;附签必填与该块证书 AID 一致的 `signer_aid`,通用容器可解析主块可选 signer_aid;普通 agent.md/owner.md 主块不输出且业务拒绝该字段,实体主块显式 signer_aid=target。除可选 `public_key_fingerprint` 外其余字段必填,重复及未知字段拒绝。TAG 为 `[A-Z0-9-]+` 字面后缀,空串无后缀,传短 tag,AUN-SIGNATURE 不作特殊选项,不授予角色或权限;证书沿用可信 resolver 按指纹获取。通用 Store document 签验不判断 YAML 业务,资源角色及授权由调用者检查。`timestamp` 最多允许比服务端时间快 300 秒,并且必须落在签署证书有效期内。服务端须在数据库或缓存写入前完成全部校验。
67
+
68
+ ## YAML Schema(`agent.md` 核心字段)
69
+
70
+ ```yaml
71
+ # ===== 身份标识(必填) =====
72
+ aid:
73
+ type: string
74
+ required: true
75
+ pattern: "^[A-Za-z0-9_][A-Za-z0-9_-]*(?:\\.[A-Za-z0-9_][A-Za-z0-9_-]*)+$"
76
+ description: "主体的 DNS 型 AID"
77
+ example: "subject.agentid.pub"
78
+
79
+ # ===== 基本信息 =====
80
+ name:
81
+ type: string
82
+ required: true
83
+ description: "主体显示名称"
84
+ example: "Code Reviewer"
85
+
111
86
  type:
112
87
  type: string
113
88
  required: true
114
- predefined_values: # 预设值,不是封闭枚举
115
- - human # 真人用户
116
- - agent # AI 助手
117
- - group # 群组
118
- - service # 不使用大模型的服务程序
119
- - device # 被控设备
120
- - host # 运行时承载主机
121
- - org # 组织
122
- - custom # 自定义主体类型
89
+ predefined_values:
90
+ - human
91
+ - agent
92
+ - group
93
+ - service
94
+ - device
95
+ - host
96
+ - org
97
+ - custom
123
98
  allow_extensions: true
124
- description: "主体类型,主要决定主体的数据存储结构;允许使用未预设的扩展值"
99
+ description: "主体类型;允许使用扩展值"
125
100
 
126
101
  exttype:
127
102
  type: string
128
103
  required: false
129
- description: "主体的扩展类型,表示 type 对应的更具体形态;取值域由 type 决定"
130
-
131
- version:
132
- type: string
133
- required: true
134
- pattern: "^\\d+\\.\\d+\\.\\d+$"
135
- example: "1.0.0"
136
-
137
- # ===== 描述信息 =====
138
- description:
139
- type: string
140
- required: false
141
- max_length: 100
142
- description: "一句话简介,用于列表展示"
143
-
144
- # ===== 头像 =====
145
- avatar:
146
- type: string
147
- required: false
148
- max_length: 256
149
- description: "头像地址或标识"
150
-
151
- # ===== 标签 =====
152
- tags:
153
- type: array
154
- required: false
155
- items:
156
- type: string
157
- description: "用于分类和检索"
158
- ```
159
-
160
- ## 主体 Type / ExtType 说明
104
+ description: "主体类型的扩展形态"
161
105
 
162
- `type` 和 `exttype` 共同描述主体。`type` 是可扩展字符串,主要决定主体的数据存储结构;`exttype` 在此基础上表示更具体的形态,取值域由 `type` 决定。
106
+ # ===== Ownership 2.0(可选;human 禁止声明) =====
107
+ owner:
108
+ type: string
109
+ required: false
110
+ description: "owner_aid 的完整小写 AID"
111
+ example: "owner.agentid.pub"
163
112
 
164
- 下表定义当前支持的 8 种预设 `type`;解析方必须保留并容忍未知类型,不得因其不在预设列表中拒绝 agent.md。
113
+ ownership:
114
+ type: object
115
+ required: false
116
+ requires: [owner]
117
+ description: "sub_aid 在自己的 agent.md 中发布的 Ownership 2.0 声明"
118
+
119
+ version:
120
+ type: string
121
+ required: true
122
+ pattern: "^\\d+\\.\\d+\\.\\d+$"
123
+ example: "1.0.0"
124
+
125
+ description:
126
+ type: string
127
+ required: false
128
+ max_length: 100
129
+
130
+ avatar:
131
+ type: string
132
+ required: false
133
+ max_length: 256
134
+
135
+ tags:
136
+ type: array
137
+ required: false
138
+ items:
139
+ type: string
140
+ ```
141
+
142
+ `human` 类型不得出现 `owner` 或 `ownership`。其它主体类型可以按应用需要声明 owner_aid。AID 在 Ownership 2.0 字段中使用小写规范形式。
143
+
144
+ ## 主体 Type / ExtType 说明
145
+
146
+ `type` 和 `exttype` 共同描述主体。`type` 是可扩展字符串,主要决定主体的数据存储结构;`exttype` 表示 `type` 对应的更具体形态,取值域由 `type` 决定。解析方应保留并容忍未知类型。
165
147
 
166
148
  | 预设 Type | 用途 | 示例 |
167
- |------|------|------|
149
+ | --- | --- | --- |
168
150
  | `human` | 真人用户 | 开发者、管理员、终端用户 |
169
151
  | `agent` | 使用大模型的服务程序 | 对话助手、代码 Agent、自动化 Agent |
170
152
  | `group` | 群组身份 | 项目团队、协作群组 |
@@ -174,53 +156,111 @@ tags:
174
156
  | `org` | 组织 | 公司、部门、协作小组 |
175
157
  | `custom` | 自定义主体类型 | 用户声明的主体类型 |
176
158
 
177
- `exttype` 的具体取值示例:`agent` 可使用 `claude-code`、`codex` 等运行时名称;`org` 可使用 `company`、`department`、`team` 等组织层级;`group` 可使用 `normal`、`org-collab`、`task`、`org` 等群类型。
178
-
179
- ## 示例文件
180
-
181
- | 文件 | Type | AID | 说明 |
182
- |------|------|-----|------|
183
- | [human-developer.md](examples/human-developer.md) | `human` | `zhangsan.aid.pub` | 全栈开发者 |
184
- | [openclaw-lobster.md](examples/openclaw-lobster.md) | `agent` | `lobster.aid.pub` | OpenClaw AI 助手(无签名) |
185
- | [signed-openclaw-lobster.md](examples/signed-openclaw-lobster.md) | `agent` | `lobster.aid.pub` | OpenClaw AI 助手(带签名) |
186
- | [codeagent-claudecode.md](examples/codeagent-claudecode.md) | `agent` | `claudecode.aid.pub` | Claude Code 编程助手 |
187
- | [群组-开发团队.md](examples/群组-开发团队.md) | `group` | `dev-team.aid.pub` | 开发团队协作群组 |
188
-
189
- 表中无签名文件仅用于展示 payload 格式,不符合 `PUT /agent.md` 接收契约;静态签名示例也不代表可由线上 CA 验证的有效身份材料。
190
-
191
- ## `PUT /agent.md` 接收顺序
192
-
193
- 1. SDK 在联网前校验 UTF-8、payload 大小、frontmatter Schema;失败时不得签名或发起 HTTP 请求。
194
- 2. SDK 使用当前 AID 的签名私钥追加签名块,再执行一次完整 Schema 校验和本地验签;失败时不得上传。
195
- 3. Name Service 完成 Bearer Token 与 Host 绑定校验、完整 Schema 校验、CA 证书查询和验签。
196
- 4. 只有全部校验成功后,Name Service 才能写入数据库并失效缓存。
197
-
198
- 接收失败使用稳定的机器可读错误:格式或签名无效返回 `400 invalid_agent_md`,payload 超限返回 `413 agent_md_too_large`,CA 不可用返回 `503 certificate_verification_unavailable`,数据库不可用返回 `503 database_unavailable`。
199
-
200
- ## Markdown 部分建议内容
201
-
202
- YAML 只保留核心元数据,详细信息放在 Markdown 部分:
203
-
204
- - **Skills** - 技能/命令列表及说明
205
- - **功能说明** - 详细的功能描述
206
- - **使用示例** - 具体的使用方法
207
- - **配置说明** - 运行时配置(如需要)
208
- - **限制/注意事项** - 使用限制
209
-
210
- ## 解析方式
211
-
212
- 解析时需先检测并跳过尾部签名块:
213
-
214
- ```go
215
- // 1. 检测尾部签名块
216
- if idx := strings.LastIndex(content, "<!-- AUN-SIGNATURE"); idx >= 0 {
217
- content = content[:idx] // 跳过尾部签名块,取 payload
218
- }
219
- // 2. 按原规则解析 frontmatter
220
- parts := strings.SplitN(content, "---", 3)
221
- // parts[0] = "" (空)
222
- // parts[1] = YAML 内容
223
- // parts[2] = Markdown 内容
224
- ```
225
-
226
-
159
+ ## Ownership 2.0 字段
160
+
161
+ ### sub_aid 的 `agent.md`
162
+
163
+ ```yaml
164
+ owner: owner.agentid.pub
165
+ ownership:
166
+ statement:
167
+ version: 2
168
+ declaration_id: 550e8400-e29b-41d4-a716-446655440000
169
+ owner_aid: owner.agentid.pub
170
+ sub_aid: subject.agentid.pub
171
+ declared_at: 1791523200
172
+ ```
173
+
174
+ 字段约束:
175
+
176
+ | 字段 | 要求 |
177
+ | --- | --- |
178
+ | `owner` | 可选;出现时必须等于 `ownership.statement.owner_aid` |
179
+ | `ownership.statement.version` | 固定为整数 `2` |
180
+ | `ownership.statement.declaration_id` | 小写 UUID v4,用于审计标识 |
181
+ | `ownership.statement.owner_aid` | 管理方的完整小写 AID,必须等于 `owner` |
182
+ | `ownership.statement.sub_aid` | 必须等于当前 `agent.md` 的 `aid` |
183
+ | `ownership.statement.declared_at` | 正整数 Unix 秒时间戳 |
184
+
185
+ `owner` 与 `ownership` 可以同时省略;出现其中一个时另一个必须出现。`ownership` 只有 `statement` 及其定义字段,不包含独立签名字段。声明随整个 `agent.md` 文件签名,由 sub_aid 自己生成和上传。
186
+
187
+ ### owner_aid 的 `owner.md`
188
+
189
+ owner_aid 为每个 sub_aid 保存一份声明,路径为:
190
+
191
+ ```text
192
+ owner_aid:/sub_aids/{sub_aid}/owner.md
193
+ ```
194
+
195
+ `owner.md` 的最小 frontmatter 为:
196
+
197
+ ```yaml
198
+ ---
199
+ owner_aid: owner.agentid.pub
200
+ sub_aid: subject.agentid.pub
201
+ ownership:
202
+ statement:
203
+ version: 2
204
+ declaration_id: 660e8400-e29b-41d4-a716-446655440000
205
+ owner_aid: owner.agentid.pub
206
+ sub_aid: subject.agentid.pub
207
+ declared_at: 1791523260
208
+ ---
209
+ ```
210
+
211
+ `owner.md` 的 `owner_aid`、`sub_aid` 必须与 statement 相同。文件尾部使用 `AUN-SIGNATURE-OWNERSHIP-V2` 标识和与 `agent.md` 相同的签名字段,签署者必须是 `owner_aid`。`owner.md` 公开可读、可下载,不开放公共写权限;写入和删除由 owner_aid 或应用层明确授权的存储执行者完成。
212
+
213
+ ## 关系状态、撤销与共识
214
+
215
+ | 当前文档情况 | 状态 |
216
+ | --- | --- |
217
+ | `agent.md` 与对应 `owner.md` 都存在,字段及文件签名有效且 AID 匹配 | `consensus` |
218
+ | 两份声明都不存在 | `unbound` |
219
+ | 只有一方声明存在 | `single_sided` |
220
+ | 字段、路径、角色或文件签名无效 | `invalid` |
221
+
222
+ sub_aid 撤销时,从自己的 `agent.md` 移除 `owner` 和 `ownership` 后重新签名上传。owner_aid 撤销时,删除自己的 `sub_aids/{sub_aid}/owner.md`。撤销不发送 ownership RPC 或 P2P 消息,不产生申请或拒绝事件。
223
+
224
+ 需要 owner 关系的操作必须先读取并验证两份文档。验证成功后,应用层或审计服务应追加保存双方 statement、两份文件签名、文档摘要、调用方和校验时间;之后任一方撤销,不影响已保存的审计快照。
225
+
226
+ ## `PUT /agent.md` 接收顺序
227
+
228
+ 1. SDK 在联网前校验 UTF-8、payload 大小和 frontmatter Schema;失败时不得签名或发起 HTTP 请求。
229
+ 2. SDK 使用 sub_aid 自己的签名私钥追加尾部签名块,再执行完整 Schema 校验和本地文件验签。
230
+ 3. Name Service 校验目标 Host、Bearer Token 与 `aid` 一致,执行 Schema、尾部文件签名及 `ownership` 字段一致性验证;owner_aid 不得代 sub_aid 上传。
231
+ 4. 全部校验成功后,Name Service 才能写入数据库并失效缓存。
232
+
233
+ 接收失败使用稳定的机器可读错误:格式或签名无效返回 `400 invalid_agent_md`,payload 超限返回 `413 agent_md_too_large`,证书服务不可用返回 `503 certificate_verification_unavailable`,数据库不可用返回 `503 database_unavailable`。
234
+
235
+ ## 示例文件
236
+
237
+ | 文件 | Type | AID | 说明 |
238
+ | --- | --- | --- | --- |
239
+ | [human-developer.md](examples/human-developer.md) | `human` | `zhangsan.aid.pub` | 全栈开发者 |
240
+ | [openclaw-lobster.md](examples/openclaw-lobster.md) | `agent` | `lobster.aid.pub` | OpenClaw AI 助手 |
241
+ | [signed-openclaw-lobster.md](examples/signed-openclaw-lobster.md) | `agent` | `lobster.aid.pub` | 带尾部签名的 OpenClaw AI 助手 |
242
+ | [codeagent-claudecode.md](examples/codeagent-claudecode.md) | `agent` | `claudecode.aid.pub` | Claude Code 编程助手 |
243
+ | [群组-开发团队.md](examples/群组-开发团队.md) | `group` | `dev-team.aid.pub` | 开发团队协作群组 |
244
+
245
+ 无签名示例只用于展示 payload;线上 `PUT /agent.md` 仍要求有效的尾部文件签名。
246
+
247
+ ## Markdown 部分建议内容
248
+
249
+ YAML 只保留核心元数据,详细信息放在 Markdown 部分:
250
+
251
+ - **Skills**:技能、命令及说明
252
+ - **功能说明**:主体功能描述
253
+ - **使用示例**:具体使用方法
254
+ - **配置说明**:运行时配置
255
+ - **限制/注意事项**:使用限制
256
+
257
+ ## 解析方式
258
+
259
+ 解析时先检测并剥离尾部签名块,再按 YAML frontmatter 解析:
260
+
261
+ ```text
262
+ 1. 定位连续 `<!-- AUN-SIGNATURE[-TAG]` 尾块并保留原字节边界。
263
+ 2. 取首块前字节为 payload,逐块验各自之前的完整 prefix。
264
+ 3. 解析 payload 的 YAML frontmatter。
265
+ 4. 对 agent.md 按 aid 校验;对 owner.md 按 owner_aid、sub_aid 和路径校验。
266
+ ```
@@ -101,12 +101,12 @@ Gateway RPC response 和 event push 的 `_meta` 字段:
101
101
 
102
102
  ## SDK 缓存模型
103
103
 
104
- 每个远程 AID 在内存和本地持久化记录中都维护一条 agent.md 状态。Python / TypeScript / Go 的持久化记录是 `{aun_path}/AIDs/{aid}/agentmd.json`;浏览器 JavaScript 是 IndexedDB 中的 `{aid}/agentmd.json` logical key。SDK 启动或内存 miss 时按需加载该记录。
104
+ 每个 AID 在内存和本地持久化记录中维护一条 agent.md 状态,远端已确认缓存与自有身份上传失败稿分开保存。Python / TypeScript / Go 的记录是 `{aun_path}/AIDs/{aid}/agentmd.json`;浏览器 JavaScript 是 IndexedDB 中的 `{aid}/agentmd.json` logical key。SDK 启动或内存 miss 时按需加载。
105
105
 
106
106
  | 字段 | 含义 |
107
107
  | --- | --- |
108
108
  | `aid` | 远程 AID |
109
- | `content` | 本地缓存的完整 `agent.md` 内容,可为空 |
109
+ | `content` | 已确认的远端完整 `agent.md` 缓存,可为空;不用于保存尚未提交的本地失败稿 |
110
110
  | `local_etag` | 当前 `content` 对应的 ETag,由成功 GET 200 内容确认;304 复用本地内容时沿用原值 |
111
111
  | `remote_etag` | 从消息信封、RPC response `_meta` 或 event push `_meta` 观察到的远端云端 ETag |
112
112
  | `last_modified` | GET 响应的 `Last-Modified` |
@@ -114,15 +114,15 @@ Gateway RPC response 和 event push 的 `_meta` 字段:
114
114
  | `checked_at` | 最近一次 HEAD / GET 确认远端状态的本机时间 |
115
115
  | `observed_at` | 最近一次观察到远端 ETag 的本机时间 |
116
116
  | `remote_status` | `found` / `missing` / `error` |
117
- | `verify_status` | 最近一次 agent.md 验签结果:`ok` / `unsigned` / `invalid` 等 |
117
+ | `verify_status` | 最近一次远端 agent.md 验签结果:`ok` / `unsigned` / `invalid` 等;不表示本地草稿已被远端验收 |
118
118
  | `verify_error` | 最近一次验签失败原因 |
119
119
  | `last_error` | 最近一次网络或 HTTP 错误 |
120
-
120
+ | `local_draft_content` | 私有元数据:本地 schema/外层签名验证通过的上传候选,在首次远端 preflight 前独立保存;服务端确认对应候选提交成功后才清除 |
121
121
  状态规则:
122
122
 
123
123
  - 收到远端 ETag 时,只更新 `remote_etag` 和 `observed_at`。
124
- - 只有下载到内容并完成验签后,才能更新 `content`、`local_etag`、`last_modified`、`fetched_at`。
125
- - `remote_etag == local_etag` 时视为同步。
124
+ - 只有下载到内容并完成验签后,才能更新 `content`、`local_etag`、`last_modified`、`fetched_at`;远端下载、同步和 ETag 观察不清除 `local_draft_content`。
125
+ - `remote_etag == local_etag` 时仅表示远端缓存同步;返回本地草稿时必须标记 unverified、in_sync=false、source.agent_md_fetched=false。
126
126
  - `remote_etag != local_etag` 或 `content` 为空时视为需要更新;该状态可由字段推导,不要求单独存储 `stale` 字段。
127
127
  - `verify_status=invalid` 时内容可以缓存但应用层应能看到无效状态;是否拒绝展示由上层策略决定。
128
128
 
@@ -308,12 +308,12 @@ observe_remote_agent_md_etag(aid, etag, source)
308
308
 
309
309
  ### 按需下载
310
310
 
311
- 当应用调用 `downloadAgentMd(aid)` 或 SDK 需要展示远程 agent 信息时:
311
+ 应用显式调用 `downloadAgentMd(aid)` 或 forceRefresh/本语言等效选项时读取远端权威内容并保留草稿;默认 resolve 对持有本地私钥的自有身份优先返回 `local_draft_content`,其余远程信息继续按以下缓存下载规则处理:
312
312
 
313
313
  - 可先查内存,miss 时查 agentmd.json / IndexedDB,用于展示本地已有状态。
314
314
  - `downloadAgentMd(aid)` 的远端下载请求一律发起无条件 GET,不用本地 ETag 决定请求头。
315
315
  - GET 请求不得发送 `If-None-Match` / `If-Modified-Since`。
316
- - 200:验签,更新内容和 `local_etag`。
316
+ - 200:验签,更新远端 `content` 和 `local_etag`,保留独立的 `local_draft_content`。
317
317
  - 304:本地已有 content 时复用该 content;本地没有 content 时再发起一次无条件 GET。第二次仍非 2xx 时按错误返回。
318
318
  - 404:标记远端未发布 `agent.md`,不要删除已有内容,除非产品要求严格同步。
319
319
  - 网络错误:保留旧内容,记录 `fetch_error` 或更新失败时间。
@@ -334,15 +334,15 @@ agent.md 不写入 SQLite。当前 SDK 使用以下持久化位置:
334
334
  | 字段 | 说明 |
335
335
  | --- | --- |
336
336
  | `aid` | AID |
337
- | `content` | 正文副本;文件系统 SDK 也会单独写 `agent.md` |
337
+ | `content` | 已确认的远端正文副本;文件系统 SDK 也会单独写 `agent.md`,不与本地失败稿混用 |
338
338
  | `local_etag` / `remote_etag` | 本地内容版本 / 远端观察版本 |
339
339
  | `last_modified` | 远端 Last-Modified |
340
340
  | `fetched_at` / `checked_at` / `observed_at` / `updated_at` | 本机时间戳 |
341
341
  | `remote_status` | `found` / `missing` / `error` |
342
342
  | `verify_status` / `verify_error` | 最近一次验签状态 |
343
343
  | `last_error` | 最近一次错误 |
344
-
345
- 四个已实现 SDK 应保持字段语义一致。旧 `agent_md_cache` / `remote_agent_md_cache` SQLite 表不再作为 agent.md 缓存来源;迁移逻辑可清理旧表,但不得把新 agent.md 写回 SQLite。
344
+ | `local_draft_content` | 私有上传候选,独立于远端缓存、ETag 和普通 pending 条件;不得作为已同步内容返回 |
345
+ 四个 SDK 保持上述语义一致:普通及 Group/Org 名片失败稿仅本地保留,重连即使发现普通名片 pending 也不隐式上传;由应用显式重试,服务端确认对应候选后才清稿。Ownership 2.1 任务、消息及 outbox 仍按原机制恢复。旧 `agent_md_cache` / `remote_agent_md_cache` SQLite 表不再作为缓存来源,不得把新 agent.md 写回 SQLite。
346
346
 
347
347
  ## 异常与竞态处理
348
348