Skip to main content
本文由 AI 撰写,暂未经过人工校对,请谨慎参考。
面板是一个网页。页面发出的请求都落在宿主提供的几族路径上,路径决定请求交给哪一部分处理。除 /bridge/v1 之外,其余路径由面板处理,不受网页面板白名单限制。

路径一览

所有响应统一带 Cache-Control: no-store。失败响应的结构固定:

页面侧调用与路径的对应

包内文件:/pkg/<路径>

/pkg/ 指向插件包根目录,用来把包里的文件交给页面读取,例如词典数据、样式表与图标。路径相对包根,/pkg/dict/json/s.json 对应包内的 dict/json/s.json。
安全限制:路径里出现 .. 段、绝对路径、指向包外的符号链接,以及目录,一律拒绝。响应的内容类型按扩展名判断;扩展名认不出时按 application/octet-stream 返回。
包内文件必须写 /pkg/ 开头的绝对路径。写成相对的 src="model.js" 会落到 mnpanel://panel/model.js,那不是包路由,文件取不到。

图片:/media/<键>

putMedia 把一张图片交给面板之后,页面用 /media/<键> 取得该图片的原始字节。键由写入方指定;写入方把同一个键置空时,对应的数据被删除,路径随之失效。 该路径只进不出,没有让页面把图片交回插件的通道。

主逻辑回调:/addon/<名称>

页面调用 mn.call(名称, 数据) 时,请求以 POST 发到 /addon/<名称>,请求体为参数的 JSON 文本。该路径只在插件写了 main.js 时可用;只有页面的插件没有 main.js,调用会进入失败分支。写法见面板之外。

面板本地 AI:/ai/run-task

mn.ai(noteid, taskId, params) 走这条路径。请求体为 {noteid, taskId, params},身份取面板所属插件,不采信请求体里的身份。该路径只在面板本地,外部调用看不到。 AI 任务不可用、缺少票据、触发限流与用户拒绝等情况一律返回 HTTP 200,返回体中的 ok 为假。这类回执不是传输错误,按返回值判断即可。

尺寸与形态:/ui/*

页面加载完成之后,宿主推一次 chrome 状态,再兜底调用一次 mn.fit()。chrome 状态包括:
面板的 WebView 是透明的,背景必须写在 html 元素上;只给 body 设背景不会显示。

路径与白名单的关系

网页面板白名单只决定 /bridge/v1 的放行范围,写法见数据交互。面板本地路径不受白名单限制:读取包内文件、读取图片与控制面板尺寸,只看面板是否可用。面板能否建立由模板的 plugins 名单与当前是否处于场景界面决定。