大插件总表
Weftale 的功能面由 16 个大插件承担。大插件的集合在构建期由根插件名单(RPM)写死,第三方不能新增大插件;可替换的是各插件登记的实现位,可介入的是机制插槽与写边。
- 14 个已落地:仓库中有
src/core/<id>/contract.ts与真实实现,参与 RPM 生成与启动核验。 - 2 个规划中:只在设计文稿中登记,尚无目录、契约或实现;框架不为「以后大概会有」预留空服务。
状态分布
状态只取「已完成/测试中/实现中/未实现」。「已完成」指网页与宿主两端的契约测试都通过。
| 状态 | 数量 | 大插件 |
|---|---|---|
| 已完成 | 10 | Kernel、Asset、ScriptPlay、Stage、Audio、Text、Save、Translate、Explore、Extra |
| 实现中 | 4 | Platform、Battle、Author、Growth |
| 未实现 | 2 | Collection、Online |
总表
| 大插件 | 契约 | 状态 | 主要服务/机制插槽/实现位 | 页面 |
|---|---|---|---|---|
| Kernel | kernel@1 | 已完成 | kernel:loader、kernel:unit-files、guard:report、caps:*、kernel:pack-reader@1 | /plugins/kernel |
| Platform | platform@1 | 实现中(导航、独立设置与皮肤已接入;Phase 4 平台适配未实现) | platform:host、platform:resolve-asset-url、host:backend@1、ui:screen@1、ui:navigator、ui:skins、ui:screen-defaults | /plugins/platform |
| Asset | asset@1 | 已完成(Phase 2) | asset:acquire、asset:release、asset:resolve-decoding、asset:variant-producer@1、asset:on-invalidate | /plugins/asset |
| ScriptPlay | scriptplay@1 | 已完成(Phase 2) | script:vm、script:flow、state:flags、script:resolve-presentation、dialog:renderer@1、history:view@1、autoplay:policy@1 | /plugins/scriptplay |
| Stage | stage@1 | 已完成(Phase 2) | stage:bg、stage:cast、stage:camera、stage:compose、stage:compositor@1、stage:cast-renderer@1 | /plugins/stage |
| Audio | audio@1 | 已完成(Phase 2) | audio:channel、audio:mixer、audio:resolve-mix、audio:output@1 | /plugins/audio |
| Text | text@1 | 已完成(Phase 2) | text:view、i18n:runtime、text:shaper@1、text:fonts | /plugins/text |
| Save | save@1 | 已完成(Phase 1 部分;GC 属 Phase 4) | save:slots、save:orphans、progress:stats、save:backend@1 | /plugins/save |
| Translate | translate@1 | 已完成 | translate:detect、translate:archive、translate:run、translate:codec@1、translate:emitter@1 | /plugins/translate |
| Battle | battle@1 | 实现中(S5、AUTO 与会话内序列已验收;伤害管线仍为空缺,奖励及其他玩法出口未闭合) | battle:host、battle:state、battle:disc-policy@1、battle:ai@1、battle:damage-pipeline@1 | /plugins/battle |
| Author | author@1 | 实现中(editor:doc 已实现) | editor:doc、editor:view@1、ops:console、telemetry:sink | /plugins/author |
| Explore | explore@1 | 已完成(地图、会话内道具与剧情导航范围) | map:logic、explore:items、explore:resolve-hotspot、explore:resolve-trigger、explore:pathfinder@1 | /plugins/explore |
| Growth | growth@1 | 实现中(等级与强化范围已验收;觉醒、装备与技能强化未实现) | growth:stats、growth:items、growth:resolve-cost、growth:resolve-cap、growth:formula@1 | /plugins/growth |
| Collection | — | 未实现 | 文稿登记:archive:gallery、quest:registry、vendor:shop | /plugins/planned |
| Extra | extra@1 | 已完成(受控生命周期范围) | extra:modules、extra:resolve-module、gameplay:module@1 | /plugins/extra |
| Online | — | 未实现 | 文稿登记:account:auth、update:hotfix、social:*、liveops:schedule、gacha:*、payment:* | /plugins/planned |
契约字段怎么读
每个大插件的 contract.ts 只登记已有真实实现的名字,构建插件据此生成 RPM。表中各列对应契约里的不同字段:
| 契约字段 | 含义 | 谁能改写 |
|---|---|---|
services | 插件对外提供的只读服务或操作入口 | 按各自 policy;trusted 需提权并审计 |
mechanismSlots | 允许 Mod 以 before/after/replace 介入的机制点 | 按 policy;没有条目时使用内置语义 |
notifySlots | 只广播事实的通知,不参与流程判定 | 订阅者不能改变调用方结果 |
implSlots | 可替换的实现位,按 single 或 multi 登记 | 插件登记实现,卸载时按 onUnload 回落或置空 |
registries | 内容条目(剧本图、章节、皮肤等) | 数据包写入;具体 schema 决定校验方式 |
阅读顺序
- 先读 插槽与实现位,理解
single/multi、默认条目与卸载回落。 - 再读 policy 与写边,区分
closed、public、trusted与三种写边。 - 然后按依赖顺序读插件页:Kernel → Platform → Asset → ScriptPlay → Stage/Audio。
- 装载管线与原因码见 装载管线与 guard 与 装载原因码。
依赖关系
大插件之间不互相 import,只经 Cordis 服务代理交流。下面列出主要的调用方向,箭头表示「调用方 → 被调用方」:
text
Kernel ──→ Platform(读取 host:backend@1,固定本次装载后端)
Asset ──→ Kernel(kernel:unit-files 读取资源包)
Asset ──→ Platform(platform:host.resolveAssetUrl 重定向包内地址)
ScriptPlay ──→ Text(text:view 绘制台词)
ScriptPlay ──→ Audio(audio:channel.playVoice 播放语音)
ScriptPlay ──→ Stage / Audio(script:presentation@1 演出执行者)
Stage / Audio / Text / Explore ──→ Asset(asset:acquire 取资源)
Explore ──→ Platform / ScriptPlay(ui:screen@1、ui:navigator、state:flags 与 script:command-set@1)
Audio ──→ Asset(as: 'stream' 取 PCM)上述方向全部经 Cordis,不存在直接模块引用;某个插件缺席时,调用方按既有降级语义继续,例如没有 Audio 时台词照常推进,只标出「音频暂未提供」。