Files
NotesAgentic/docs/contracts/Community-v1契约.md
T

61 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Community Catalog v1
状态:独立目录服务与 Web 消费入口已实现;完整升级/回滚事务、桌面 Extension Manager 和各类别应用链路尚未交付。原型入口为 `community-server/community`,前端为 `/community`。没有预置或宣称上线的官方市场。
## 来源与发行
用户添加 HTTPS 来源(本机开发可用 HTTP),查看并固定来源公布的 Ed25519 公钥;来源密钥改变不自动继承信任。客户端每次安装重新获取发行、撤回及公钥状态,缓存只用于离线浏览。来源信任由用户核对维护者公钥建立,不由 ZIP 摘要推导,也不由 Sync 绑定继承。
`Release` v1 字段及限制见 `community-server/community/package.py`、前端 `src/contracts/community.ts`。签名覆盖除 `signature` 和服务端展示字段外的全部发行元数据,以 UTF-8、递归键排序、无空白且不转义 Unicode 的 JSON 编码。签名包括包类型、版本、许可证、权限、兼容版本、依赖、对象摘要与大小。前后端真实签名互验向量为 `frontend/src/services/fixtures/community-python-vector.json`,仅含受控测试包和公钥。
SHA-256 证明内容完整性,Ed25519 证明固定签名者;二者均不能替代运行权限。主题保留 5 MiB ZIP / 10 MiB 展开 / 100 条限制,其他包为 10 MiB / 50 MiB / 2048 条。拒绝路径穿越、Windows 特殊路径、大小写重名、链接、加密 ZIP、非法压缩法和扩展后超限;清单身份、版本及权限须与签名元数据一致。
## 接口
公共只读接口不携带 Vault Token
| 方法 / 路径 | 行为 |
| --- | --- |
| GET `/catalog/v1/sources` | 来源 ID、公钥与撤回状态 |
| GET `/catalog/v1/packages?q=&type=&offset=&limit=` | 搜索、分页及 ETag;包括已撤回记录 |
| GET `/catalog/v1/packages/{namespace}/{id}/releases` | 包版本记录 |
| GET `/catalog/v1/releases/{id}/archive` | 已发布包;撤回或签名键撤销为 410 |
| POST `/catalog/v1/publish/submissions` | 作者独立 Bearer Token、签名 metadata 和 archive_base64 |
| GET、POST `/catalog/v1/moderation/reviews` | 审核员列出待审包、批准或拒绝并留原因 |
| POST `/catalog/v1/releases/{id}/withdraw` | 作者本人或审核员撤回,历史不可覆盖 |
| POST `/catalog/v1/releases/{id}/reports` | 登录身份举报,写入审计 |
| POST `/catalog/v1/keys/{id}/revoke` | 审核员撤销签名键,后续下载拒绝 |
namespace 归属绑定作者;作者无审核角色;审核拒绝自审。版本一旦提交不可原地替换,拒绝后也须使用新版本。账号令牌在独立 SQLite 中只保存摘要;CLI 排他写出首次令牌文件,服务不需要作者私钥。
## 客户端安装与明确限制
前端支持来源启停、搜索、发行详情、固定公钥、取消/错误、离线浏览。Theme / Skill / Plugin 经已有类型安装 API,安装后保持未启用。MCP、人设、模板和模型方案保存为候选,可预览和删除,**尚未应用到各自 Runtime**。存在依赖的包当前要求先人工核对,不自动启用依赖。
该原型尚不具备全量安全安装状态机:统一持久安装库迁移、事务升级/回滚、断点下载、资源托管、维护者转移、账号登录/令牌过期、举报处理 UI 和生产限流均待完成。目录读取目前在 SQLite 中筛选;大规模服务索引和负载测试待完成。客户端分页当前展示前 100 条,需缩小搜索范围。
开发 CORS 只允许部署者指定的来源执行 GET,不共享作者凭据。所有返回文案作为文本渲染,包内代码不在目录服务运行。
## Rust 包验证基础
Host 的 `extension_package` 已实现 Release v1 字段校验、递归排序 canonical JSON 和 Ed25519 严格验签,复用已有 Python 签名向量。校验入口要求提供 Host 固定信任根及已核实的撤回/键撤销状态;该离线函数自身不获取在线状态,也不授权安装。验签采用 [ed25519-dalek verify_strict](https://docs.rs/ed25519-dalek/2.2.0/ed25519_dalek/struct.VerifyingKey.html#method.verify_strict),拒绝无效签名及弱键。
ZIP 在解压前独立校验中央目录计数、重复原始名称、本地头一致性和数据区不重叠,避免解压库的名称映射隐藏重复项。逐条检查 NFC 路径、Windows 保留名、完整大小写折叠冲突、文件/目录前缀冲突、链接/特殊文件、加密与压缩方法;按类别检查压缩/展开/条目限额,并用有界缓冲验证全部条目及 CRC。当前只返回文件摘要清单,不写出包文件;不支持多卷或需 ZIP64 中央目录的包。
类型清单的身份、版本和权限校验已接入 `verify_package`;完整 Runtime 配置 schema、在线来源复核、持久安装库、迁移与事务运行生命周期仍待接入。因此当前不能据此开启 extensions capability 或标记完整 D-01 通过。
清单解析最多 1 MiB、32 层、10000 个节点、一个文档,限制别名及记录的锚点大小;重复键、包含指令、循环别名、非 UTF-8 和未知 schema_version 拒绝。关闭文件包含与环境插值特性。JSON 类别先验证 JSON 语法再进行重复键检查,不接受伪装为 JSON 的 YAML。
Theme 必须声明 theme_idSkill/Plugin 支持 Runtime 现有的 id 或专用 skill_id/plugin_id,两者同时出现须相等。YAML 类型版本及全部类型权限集合须与发行一致,重复权限拒绝。人设、模板、MCP 和模型方案检查各自基本结构及递归秘密字段;声明式包通过检查不代表已具备运行权限。项目自带 markdown-workbench/note-reviewer 清单已在 Rust 和 Community 校验中验证。
## 本地依赖锁预览
Rust 暂存库可为指定根发行生成只读依赖预览。依赖键为同命名空间的包 ID,或同一来源下的 `namespace/package_id`;不跨来源借用同名包。完整裸版本(如 `1.2.3`)表示精确版本,其余采用 Rust SemVer 的 `=`, `^`, `~`, 比较符、通配符和逗号交集语法;不支持的范围明确拒绝,不能当作任意版本。
预览固定根发行,优先选择符合全部约束的较新稳定版本,发生依赖冲突时回溯;验证应用 min/max 版本、平台和架构,按依赖先于使用者输出。缺包、版本冲突和环均不生成部分结果。预算为同来源最多 4096 个候选、64 MiB 元数据、200 个解析包、10000 次搜索展开和 4 MiB 预览编码。
锁定结果包含来源、命名空间、包类型/版本、归档摘要、签名者摘要、完整发行摘要和权限集;整体摘要另绑定应用版本与目标平台/架构。所选包会重新读取归档并复核签名与清单。该本地预览不下载缺包、不启用实例、不授予许可;正式安装仍须在线复核撤回状态并确认权限,随后按锁定结果执行事务。