@blackbelt-technology/dashboard-plugin-runtime 页面存档备份,存于互联网档案馆 互联网档案馆
插件加载器,槽登记器,槽消费者,插件上下文 API,和pi-dashboard的Vite插件.
导入路径
| 路径 | 目录 |
|---|---|
@blackbelt-technology/dashboard-plugin-runtime | 槽消费者、登记类型、桶 |
@blackbelt-technology/dashboard-plugin-runtime/context | 已取消的别名(一个未成年人):进口钩子(usePluginConfig, (中文(简体) ), useAllSessions从根起,只使用 shell names from ./host |
@blackbelt-technology/dashboard-plugin-runtime/server | 装入器, ServerPluginContext配置验证符 |
@blackbelt-technology/dashboard-plugin-runtime/vite-plugin | viteDashboardPluginsPlugin |
安全内容助手
randomUuid() 财务报告和审定财务报表 copyText(text) (桶出口)关于Plain-http 局域网起源的工作,地点 crypto.randomUUID 财务报告和审定财务报表 navigator.clipboard 未定义。 插件 MUST 使用它们而不是赤裸的API(由扫描测试强制). 使用运行时间版本0.9.1(0.9.0后发布);采用它们的插件必须将其运行时间底板提升至该发布. 见变动:审计-插件-捆绑-非安全-文本.
插件只从这些公共路径导入 . 从 packages/client/, (中文(简体) ), packages/server/,或者其他任何内部包被禁用,并且会使林特套件失效.
最低运单
添加一个 pi-dashboard-plugin 字段到您的软件包 package.json数字 :
{
"name": "@blackbelt-technology/my-feature-plugin",
"pi-dashboard-plugin": {
"id": "my-feature",
"displayName": "My Feature",
"priority": 100,
"client": "./dist/client/index.js",
"server": "./dist/server/index.js",
"claims": [
{ "slot": "session-card-badge", "component": "MyFeatureBadge" }
]
}
}
字段 :
id——全球特有克巴布病例编号.priority——多捐款档的排序顺序. 低 = 首发。 默认为1000;先行方=100.client——已建客户端条目的路径(按名称导出反应组件).server——服务器条目的可选路径(导出)default function registerPlugin(ctx: ServerPluginContext)) (中文(简体) ).bridge—— pi-extension/ bridge 条目的可选路径(自动注册输入)~/.pi/agent/settings.json下级dashboard-<id>) (中文(简体) ).configSchema——用于插件配置验证的 JSON Schema 7 文件的可选相对路径.claims——槽数申报.
槽量索赔
每项索赔都针对一个槽:
{ "slot": "session-card-badge", "component": "MyBadge" }
{ "slot": "tool-renderer", "toolName": "MyTool", "component": "MyToolRenderer" }
{ "slot": "command-route", "command": "/myfeature", "component": "MyFeatureView" }
{ "slot": "anchored-popover", "trigger": "my-trigger-button", "component": "MyPopover" }
{ "slot": "settings-section", "component": "MySettings", "tab": "general" }
settings-section 安置情况
每个 settings-section 在自有插件的自有页面上,
/settings/plugins/<id>在宿主拥有的铬下 这页列在下面
页:1 插件 启用插件时的导航条目 .
tab 实值 惰性: 为后向相容性接受(任何字符串,无)
警告),无字可读. 它不选择设置页面 .
settings-section 导航提示
权利要求可能要求主机将插件的页面 ProMOTE 插入到设置导航组中 :
{
"slot": "settings-section",
"component": "BuiltInRolesSettings",
"nav": { "group": "models", "label": "Model roles", "description": "Pick which model answers each @role.", "order": 1000 }
}
| 外地 | 规则 |
|---|---|
group | 需要,修整后不为空。 仅 models ; 未知值被接受并被忽略(向前-相容). |
label | 需要,非空,在 NFKC + 修剪后为 40 个字符。 铁路标签+页名. |
description | -200个字符。 页面线索。 空虚 独自掉下. |
order | 可选限定数,默认为1000。 在组内排序密钥( 独立于显示 priority) (中文(简体) ). |
- 只放置: URL 保留
/settings/plugins/<id>;没有授予任何能力. - 无效的提示( 非对象, 缺失/ 空白字段, 超长, 任意 Unicode Cc/ Cf 字符, 非无限)
order页:1 降下一个警告 命名插件 id, 索赔索引, 字段。 不致命: 插件正常加载 .nav任何其它插槽都默不作声. - 仅因 第一当事方 插件 — npm 软件包
@blackbelt-technology/范围(firstParty打开GET /api/plugins行; 没有priority) (中文(简体) ). - 与任何内置设置页面或组标签相撞的标签(英语 + 每个已运出的地方, NFKC + case- trold) 被忽略; 在所推广的插件之间, 下 ()
order,id)获胜. - 一个被提升的页面得到一个紧凑的主机chrome(label title,描述引导,"由插件提供"+toggle,只当不健康时用药,在披露后使用元数据). 一个被禁用的被推广的插件保留在其组中,标记为"off".
- 字符串可以做成纯文本 永远不要标记.
参见:促销-模型-角色设定.
客户端插件 Context API
插件客户端组件接收槽消费者的道具. 钩子通过最近的 PluginContextProvider数字 :
import {
usePluginConfig,
useAllSessions,
useSessionState,
usePluginLogger,
usePluginSend,
usePluginRouter,
} from "@blackbelt-technology/dashboard-plugin-runtime";
function MyBadge({ session }) {
const config = usePluginConfig<{ enabled: boolean }>();
const logger = usePluginLogger(); // logs as [plugin:my-feature]
const send = usePluginSend();
// ...
}
usePluginConfig<T>() 反应——当 POST /api/config/plugins/<id> 成功和服务器广播 plugin_config_update。 。 。 .
您必须从槽贡献组件中调用这些钩子 (即:a内部) CurrentPluginLayer) (中文(简体) ). 从外部调用它们会引发描述性错误.
槽请求无效存储
一个插件 shouldRender 闸门依赖于解决 ATER 第一次渲染后的信号( 例如, 启动时已安装的检查) 调用 bumpSlotClaimsVersion() 一旦信号到达 每个挂起的门包装器——包括从未播出的闲/无间会卡 session_updated 重播时 shouldRender 同步进行. 只有全球信号;没有每个部分的有效载荷搭载起一个起落. 见变化:添加-黑洞-会话-管线.
import { bumpSlotClaimsVersion } from "@blackbelt-technology/dashboard-plugin-runtime";
服务器侧服务器PluginContext API
您的服务器条目必须导出默认值 registerPlugin 函数 :
// packages/my-feature-plugin/server/index.ts
import type { ServerPluginContext } from "@blackbelt-technology/dashboard-plugin-runtime/server";
export default async function registerPlugin(ctx: ServerPluginContext): Promise<void> {
ctx.fastify.get("/api/my-feature/status", async () => {
return { ok: true };
});
ctx.logger.info("my-feature plugin loaded");
}
备查 ctx数字 :
fastify- 简化REST线路.sessionManager编号 :eventStore——只读仪表板状态.broadcastToSubscribers(msg)——向所有订阅浏览器发送WebSocket消息.registerPiHandler(type, handler)编号 :registerBrowserHandler(type, handler)——钩入WebSocket消息流.getPluginConfig<T>()——读取此插件的配置~/.pi/dashboard/config.json#plugins.<id>.*。 。 。 .updatePluginConfig<T>(partial)- 验证、合并、坚持和广播plugin_config_update。 。 。 .isPiExtensionInstalled?(name)– 布尔- 仅安装到 pi 的软件包注册(Global+local spects,~30s缓存) 。 可选:在旧主机/注入测试上下文上缺席——插件拥有倒置. 扫描失败 REJECS( 从未解决 )false因此,一个false是权威的。 见变化:添加-黑洞-会话-管线.logger- 名称空格记录器([plugin:<id>]) (中文(简体) ).
桥梁自动登记
如果你的申报单 bridge仪表板自动登记 ~/.pi/agent/settings.json 下级 dashboardPluginBridges["dashboard-<id>"] 在服务器启动时。 当插件被禁用时,仪表板会删除条目.
这个 dashboard- 键前缀保留。 用户拥有的扩展条目 packages[] 永远不会被触动.
插件配置持久性
插件设置位于 ~/.pi/dashboard/config.json#plugins.<id>.*。 。 。 .
{
"plugins": {
"my-feature": { "enabled": true, "pollInterval": 30 }
}
}
如果你的申报单 configSchema,装载器:
- 应用计划
default读取值. - 验证器在持续前写( 拒绝使用
ValidationError(关于违反计划).
失败的隔离规则
- 显示验证过程中的插件抛出,服务器侧负载,或客户端侧渲染不会崩溃仪表板.
- 失败反映在
/api/health.plugins[]作为{ loaded: false, error: "..." }。 。 。 . - Slot 消费者错误边界抓取 React 渲染错误 / 要求( 不是每秒), 因此一个插件崩溃不会压制兄弟姐妹.
演示插件
packages/demo-plugin/ 是一个私有的固定套件,可以练习运行时间端到端。 没错 不包括生产建筑 (明显声明) fixture: true) (中文(简体) ). 不要将其作为真实插件的模板 .
Spawn-env 贡献者(实验性)
信任的插件( I)priority <= 100,与 spawnSession可以打电话
ctx.registerSpawnEnvContributor(fn, opts?) 在服务器上下文. fn({ mechanism })
同步返回 env vars 添加到每一次仪表板喷出 pi 会话中
(单位:千美元)headless, (中文(简体) ), tmux, (中文(简体) ), wt, (中文(简体) ), wsl-tmux) (中文(简体) ). 主机从不覆盖一个继承的变量,
拒绝保留名称( e)PATH, (中文(简体) ), HOME, (中文(简体) ), NODE_*, (中文(简体) ), LD_*, (中文(简体) ), DYLD_*, (中文(简体) ), PI_DASHBOARD_*, (中文(简体) ),
ELECTRON_*, (中文(简体) ), CONTEXT_MODE_BRIDGE_*,跳过投稿人,跳过插件时
是残废的. opts.supersede = { marker, names } 让主机删除列表名称( 只有)
在申请捐款之前, 政策,不是沙盒。 见
packages/context-mode-settings-plugin 用于参考用户.