插件系统
ReadAware 插件可以处理阅读数据、添加原生动作和提供方、扩展阅读助手,并向宿主请求受限服务。已安装的软件包会动态加载;应用无需为每个插件 ID 单独添加开关。
一个模型,三类能力
每个可执行的插件能力都属于以下三种形态之一。选择正确的形态,是编写插件时的第一项决策。
| 类别 | 适用场景 | 示例 |
|---|---|---|
| 领域 | ReadAware 已经拥有该状态或行为。 | 书库、阅读、标注、对话、设置 |
| 贡献 | 插件提供新的选择或实现。 | 动作、命令、声音、内容、主题、助手提供方 |
| 服务 | 宿主必须执行受限的外部操作。 | 存储、密钥、定时任务、网络、LLM、剪贴板 |
声明式视图、设置和主题 schema 与这些类别并列。它们描述由宿主渲染的数据,并不会授予另一种授权来源。
设置属于一个领域
外观是设置中的一个分区,而不是单独的插件 API。改变所选主题的插件请求的是诸如 appearance.theme 的精确设置路径。提供新主题的插件使用 themes 贡献。选择和提供是刻意分开的权限。
插件可以添加什么
- 选区动作和顶栏动作、命令面板命令,以及由宿主渲染的视图。
- 声音、虚拟书内容提供方、阅读模式、主题和字体。
- 助手工具、每轮上下文、可搜索的私有来源,以及记忆候选。
- 插件设置、动态选项、周期性工作、存储和加密密钥。
- 在获授权的产品领域中读取数据、执行命令并订阅已提交的事件。
在能力浏览器中查看完整的版本化清单。它也会预览 manifest.json 所请求的权限。
原生 UI,源于构造
插件不会挂载 React、HTML、CSS、iframe 或任意 DOM。它们返回经过校验的视图数据和回调;ReadAware 负责布局、导航、无障碍、主题兼容性、加载状态和清理。新的视觉自由度只能通过受限 schema 或真正的宿主贡献点加入,而不是通过通用 webview 逃生口。
信任边界
每个插件都运行在自己的模块 Worker 中。它没有 DOM、Tauri、SQLite、文件系统或进程句柄,环境网络和浏览器持久化 API 也已禁用。宿主调用跨越消息边界,并根据插件的 actor 作用域能力视图解析。
这会限制意外越权和直接越权,但安装仍然是软件信任决策。在代码运行前,ReadAware 会展示语义权限和精确的设置授权。能力要求会单独检查:权限回答“它可以做这件事吗?”,版本要求回答“它能正确使用这份契约吗?”
激活和更新都是事务性的
activate() 是读取并声明的阶段。在宿主排空调用并完成 Worker 健康检查之前,注册内容都不可见;写入、密钥、网络、LLM、剪贴板、UI 效果和导航都会被阻止。持久数据变化稍后通过仅限存储的 migrate() 执行。只有健康且完成迁移的候选版本才会晋升。
更新会对文件、插件 KV、文档集合和已提交的 schema 元数据做快照。激活或迁移失败时,会恢复之前的文件和数据,并在需要时重新启动之前的运行时。
当前生态
当前发布的插件都是内置的官方插件:Dictionary、Editorial Themes、RSS Reader、Sentence Reader、TTS Voices 和 Theme Schedule。公开的 readaware-plugins 仓库 包含编写模板、公开声明、校验和市场注册表。没有需要保留的旧版第三方 API;当前契约就是基线。