Manifest 参考

适用版本:StablEdge 桌面端 0.4.4,插件清单协议 v3(schema_version: 3)

每个插件包的根目录都有一个 plugin.json,即插件清单(Manifest)。宿主在安装时按 v3 JSON Schema 校验它,再做跨字段检查(权限组合、文件哈希、图标等)。清单中未定义的字段一律拒绝。

0.4.5 新增 pages/profile_items/editors/windows 及 ui.window* 权限,见出现位置(草稿)。

顶层字段

字段必填类型与约束说明
schema_version是常量 3清单协议版本。
plugin_id是^[a-z][a-z0-9.-]{2,63}$全局唯一且不可变的插件标识,建议用反向域名,如 com.example.my-notes。
name是字符串,1–80插件名称。
display_name否字符串,1–80界面展示名;未提供时使用 name。
description否字符串,1–200一句话简介,显示在插件列表和安装预览中。
plugin_type否workspace | knowledge | skill | integration | utility插件分类:工作区、知识源、技能、集成、工具。
icon见说明{ "resource_id" }指向 contributions.resources 中的一项 PNG 资源。新打包的插件必须提供,见图标。
i18n否对象插件自带的多语言信息,见多语言。
version是语义化版本,如 1.2.0、1.2.0-beta.1插件版本。
minimum_app_version是字符串,5–32要求的最低桌面端版本,低于此版本时拒绝安装。
contributions是对象插件提供的界面、技能和资源,见贡献。
workers是数组,≤16后台 Worker 进程,没有时写 []。
triggers否数组,≤32定时或生命周期触发器。
event_channels否数组,≤16长连接事件通道。
credentials否数组,≤16由宿主保管的凭据。
requested_permissions是数组,≤64申请的权限,见权限。
required_services是数组,≤32依赖的服务,没有时写 []。
ai_runtime否对象宿主托管的 AI 运行时,必须与 runtime.ai 权限同时出现,仅对官方来源开放。
platforms是至少一项:windows-x86_64 | macos-aarch64 | macos-x86_64支持的平台,当前平台不在列表中时拒绝安装。
files是对象:路径 → 64 位小写十六进制包内每个文件的 SHA-256,构成封闭文件集。
publisher是字符串,1–120发布者名称。
publisher_key_id否^[A-Za-z0-9._-]{3,128}$签名公钥标识,与 signature 成对出现。
signature否字符串,40–4096清单签名,与 publisher_key_id 成对出现。由打包工具生成,不要手写。

本地标识

清单内各项的 id(workspace、worker、skill、resource、trigger 等)都遵循同一规则:^[a-z][a-z0-9_-]{1,47}$,即小写字母开头、2–48 位。同类贡献的 id 在清单内不能重复。

图标

  • 在 contributions.resources 中声明一项 media_type 为 image/png 的资源,再用 icon.resource_id 引用它。
  • 图片必须恰好是 200×200 像素的 PNG,文件不超过 500 KiB,并出现在 files 中。
  • 打包时缺图标、不是 PNG、尺寸不对或没有进入 files,会直接拒绝出包(PLUGIN_MANIFEST_INVALID);安装时图标资源不合法报 PLUGIN_ICON_INVALID。
  • 已经发布的旧包没有图标仍然可以安装,但重新打包前必须补上 200×200 的图标。
  • 工作区和顶部栏页面里用到的图片、字体等素材直接放在 payload/ui/ 下,不需要通过 resources 声明。

多语言

i18n 让插件自带名称、简介和界面文案的多语言版本,不需要也不允许向桌面端的语言包写入内容。

字段必填约束说明
default_locale是^[a-z]{2}(-[A-Z]{2})?$默认语言,如 zh-CN。
languages是数组,1–32每种语言一项。
languages[].locale是同上语言标签。
languages[].label是1–40语言名称,如「简体中文」。
languages[].display_name是1–80该语言下的插件展示名。
languages[].description否1–200该语言下的简介。
languages[].workspaces否对象:workspace id → { "title" }该语言下的工作区标题。
languages[].ui_catalog否payload/i18n/*.json界面文案字典,界面中用 i18n.t() 读取。

至少一项贡献

清单必须在 contributions 中提供 knowledge_providers、workspaces、skills、resources 中的至少一项。由于新插件必须通过 resources 声明图标,只有顶部栏项、没有工作区的插件同样合法。

贡献(contributions)

所有入口、资源和技能文件都必须位于 payload/ 下,并出现在 files 中。

workspaces:工作区界面

数量上限 16 项。每项是一个在沙箱 iframe 中运行的 HTML 页面,API 见 Workspace 与 Bridge API。

字段必填约束说明
id是本地标识工作区标识。
title是1–80工作区标题。
entrypoint是payload/ui/*.html入口页面。
bridge_version是常量 "1.0"Workspace Bridge 版本。
allowed_placements是至少一项:replace_files | replace_editor | replace_both允许的摆放位置:替换文件区、替换编辑区、两者都替换。
default_placement是同上,单个值默认摆放位置。
worker否引用 workers[].id界面通过 worker.invoke 调用的 Worker。
drops否对象接收文件拖放,需要 storage.blob。宿主把文件存进插件 Blob 存储后再通知界面,插件拿不到系统路径。
drops.extensions是*1–16 项,^[a-z0-9]{1,16}$接受的扩展名,不带点。
drops.max_files是*1–16单次最多文件数。
drops.max_bytes是*1–1073741824单次总字节数上限。
capture_providers否≤8 项向 Agent 提供界面截图,需要 agent.capture 和 storage.blob。
capture_providers[].id是*本地标识截图提供者标识。
capture_providers[].description是*1–160告诉 Agent 这张截图展示什么。
capture_providers[].max_long_edge是*256–4096截图长边像素上限。
connect否≤64 个 http(s) origin见网络声明。

标 * 的字段在其父对象出现时必填。

topbar_items:顶部栏项

数量上限 16 项,显示在工作区插件专用的顶部栏。side 为 full 的项独占整行,同一分区的插件不能同时启用。

字段必填约束说明
id是本地标识顶部栏项标识。
side是left | center | right | full所在分区。
label是1–32显示文字。
tooltip否1–160悬停提示。
priority否-100–100,默认 0同分区内的排序优先级。
workspace否引用 workspace id点击后打开的工作区。
worker否引用 worker id提供数据的 Worker,与 method 同时出现。
method否^topbar\. 开头宿主定期调用的 Worker 方法。
entrypoint否payload/ui/*.html嵌入式小页面,与 bridge_version 同时出现。
bridge_version否常量 "1.0"嵌入页面使用的 Bridge 版本。
min_width否48–600,默认 48最小宽度(像素)。
max_width否48–600,默认 280最大宽度(像素)。
refresh_seconds否1–300,默认 15调用 method 的刷新间隔。
connect否≤64 个 http(s) origin见网络声明。

每个顶部栏项必须是以下三种形态之一:

  • 静态:只有 label 等展示字段,不带 worker、method、entrypoint、bridge_version。
  • Worker 驱动:同时提供 worker 和 method,不带 entrypoint。
  • 嵌入页面:同时提供 entrypoint 和 bridge_version,不带 method。

skills:技能

只接受 1 项,超过 1 项时安装报 PLUGIN_MANIFEST_INVALID。该项为 { "id", "entrypoint" },entrypoint 为 payload/agent/*.md。技能文件告诉 Agent 如何读取插件发布的上下文、可以发送哪些动作。技能文件同样参与哈希和签名校验,但不会因此获得额外的工具权限。

每个插件只提供一份技能文件,payload/agent/ 下只放这一个文件。

resources:资源

最多 64 项,三个字段都必填:id(本地标识)、path(payload/resources/ 下的文件)、media_type(type/subtype 形式,3–127 字符)。资源是给宿主读取的文件,目前用于根级 icon 和 ai_runtime。

knowledge_providers:知识源

数量上限 16 项,每项 { "id", "worker" },worker 引用 workers[].id。

该贡献目前只通过清单校验,宿主还没有运行时消费方。不要依赖它实现功能。

网络声明(connect)

工作区和顶部栏项可以用 connect 列出会访问的 origin(只能是 http:// 或 https:// 加主机和可选端口,不带路径),用于在安装页展示。声明 connect 时必须同时申请 worker 为 host 的 net.fetch,否则拒绝安装。地址由用户自行配置时可以省略 connect。

"connect": ["https://api.example.com"]

workers:Worker

数量上限 16 项。Worker 的运行方式和协议见 Worker。

字段必填约束说明
id是本地标识Worker 标识,供权限、工作区、触发器引用。
entrypoint是payload/worker/*入口脚本。
protocol_version是常量 "2.0"Worker 协议版本。
isolation是sandboxed_plugin | dev_unrestricted隔离级别。dev_unrestricted 需要用户授予本电脑模式后才会以不受限方式运行。
activation是on_demand | on_startup按需启动,或随应用启动。on_startup 只拉起进程,不会自动执行业务。
resource_limits.memory_mb是64–2048内存上限(MB)。
resource_limits.cpu_percent是1–100CPU 占用上限(%)。
resource_limits.max_inflight是1–64同时处理的请求数上限。
execution_policy否sandbox | trusted,默认 sandboxtrusted 需要用户在安装时勾选确认,仍在沙箱内运行,不能启动子进程。

资源上限按实际需要设置,不要为规避问题盲目放大。

required_services:依赖的服务

字段必填约束说明
service_id是^[a-z][a-z0-9.-]{2,127}$服务标识,如 com.stabledge.ocr。
version是1–64语义化版本范围,如 ^1.0.0。
worker是本地标识调用该服务的 Worker,该 Worker 必须同时申请 service.invoke。
optional否布尔,默认 false为 true 时服务缺失不阻止安装,插件需自行降级。

后台任务、事件与凭据

插件需要在不打开界面、没有 Agent 消息时运行(定时同步、启动或唤醒后补一次、持续监听推送)时,使用下面三类声明。后台运行一律由宿主调度:到点或来事件时,宿主调用你声明的 Worker operation。不要在 Worker 里自己 setInterval 或自己维持 socket。

triggers:触发器

字段必填约束说明
id是本地标识触发器标识。
kind是interval | startup | resume按间隔、应用启动后、系统唤醒后。
worker是本地标识执行的 Worker。
operation是^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$调用的 operation,必须出现在 Worker 握手返回的 methods 中。
minimum_interval_seconds见说明60–604800kind 为 interval 时必填,其他类型不得填写。
default_enabled否布尔,默认 false为 false 时需要用户在插件详情页「后台任务」中手动启用。
catch_up是skip | once错过多个周期后,不补或最多补一次。
"triggers": [
  {
    "id": "sync",
    "kind": "interval",
    "worker": "main",
    "operation": "sync.incremental",
    "minimum_interval_seconds": 900,
    "default_enabled": false,
    "catch_up": "once"
  }
]

event_channels:事件通道

长连接由宿主维持(建连、心跳、断线重连),每收到一条事件就调用一次声明的 operation。对应 Worker 必须申请 events.connect。

字段必填约束说明
id是本地标识通道标识。
kind是sse | websocket | webhookwebhook 指云端 Webhook 中转:由你的云服务接收第三方 Webhook,再通过 wss:// 推给宿主。
worker是本地标识处理事件的 Worker。
operation是同触发器处理事件的 operation。
url是URI,≤2048sse 要求 https://,另外两种要求 wss://。本地开发时允许 http:// / ws:// 指向 127.0.0.1、localhost 或 [::1]。
credential_refs否≤8 项建连时注入的凭据 id。
protocols否≤8 项WebSocket 子协议。
default_enabled否布尔,默认 false目前没有单独开关事件通道的界面,是否连接由该字段决定。

投递语义为至少一次:operation 成功返回即确认,抛错或超时则在重连后重放。请按事件 id 做幂等处理。

credentials:凭据

凭据由用户在插件详情页填写或完成授权,保存在系统钥匙串中。Worker、Agent 和界面都读不到明文,只能按引用让宿主注入请求。声明凭据的 Worker 必须申请 net.fetch 或 events.connect。

字段必填约束说明
id是本地标识凭据标识。
label是1–80显示给用户的名称。
kind否static | oauth2,默认 static静态密钥或 OAuth2。为 oauth2 时必须提供 oauth2 对象。
worker是本地标识使用该凭据的 Worker。
allowed_origins是1–32 个 https:// origin只有请求目标在列表中时才注入。
injection.location是header | query注入位置。
injection.name是^[A-Za-z][A-Za-z0-9_-]{0,63}$请求头名或查询参数名。
injection.prefix否≤64,默认空值前缀,如 Bearer 。

oauth2 凭据

宿主负责 PKCE、令牌刷新和轮换;遇到 401 会强制刷新并重试一次。

字段必填约束说明
authorization_endpoint是https://,不带查询和片段授权地址。
token_endpoint是同上换取令牌的地址。
revoke_endpoint否同上撤销令牌的地址。
client_id是1–512客户端标识。
scopes否≤64 项申请的授权范围。
callback_mode是custom_scheme | loopback回调方式:自定义协议或本机回环地址。
client_auth否none | client_secret_post | client_secret_basic,默认 none客户端认证方式。
token_request_encoding否form | json,默认 form令牌请求体编码。token_method 为 get 时不能用 json。
token_method否get | post,默认 post令牌请求方法。
response否对象,值为 JSON Pointer非标准响应时,指出 access_token、refresh_token、expires_in、token_type、error、error_description 和 metadata 所在位置。
authorization_params否≤32 个键值授权请求的附加参数。
token_params否≤32 个键值令牌请求的附加参数。
不要把令牌放进 KV、触发器 input、cursor、日志或 Worker 内存的长期缓存中。

ai_runtime

ai_runtime 让宿主拉取源码、建立 Python 环境并托管一个模型运行时,必须与 runtime.ai 权限同时出现。它只对官方来源开放,第三方发布者的包一律拒绝安装。第三方插件需要模型或重型计算时,请使用全局 Worker 服务,或让用户自行运行本机 HTTP 服务。

files:封闭文件集

  • 键是以 / 分隔、以 payload/ 开头的相对路径;值是原始文件字节的 SHA-256(64 位小写十六进制)。
  • 不能漏列文件、多列文件,不能出现绝对路径、..、反斜杠和符号链接。
  • 每次修改 payload/ 后都要重新打包;旧的哈希和签名会立即失效。不要手改 files。

v1 / v2 清单

桌面端仍能安装 v1 和 v2 清单,但只用于兼容旧插件和迁移,新插件一律使用 v3。

版本特点
v1只支持知识源插件;顶层有 entrypoint 和 capabilities;必须签名。
v2加入 workspaces 和 agent_integration,capabilities 扩展了工作区和 Agent 事件能力;signature 必填。
v3以 contributions、workers、requested_permissions 取代 capabilities;支持顶部栏、后台任务、凭据、服务依赖;允许未签名的开发者包。
本页目录