PML 2 插件开发指南

插件系统埋点说明

本文档介绍 PML 2 插件系统的全部埋点。

一、插件事件触发点 (Trigger)

插件通过 YAML 中的 triggers.on 订阅以下事件。事件携带的数据可通过模板 {{ctx.data.字段名}} 在动作参数中引用。

事件总览

事件名触发时机触发位置携带数据执行方式
app.startup主窗口初始化完成、应用启动时MainWindow.axaml.csversion, osawait
app.exit应用退出时 (日志释放前)App.axaml.csversion, osawait
app.update.available检测到有新版本时MainWindow.axaml.cscurrentVersion, latestVersionfire-and-forget
user.login用户登录成功时LoginPage.axaml.csusername, groupfire-and-forget
user.logout用户确认登出后、应用重启前UserCenterPage.axaml.csusernameawait
proxy.start启动隧道 (创建带 mefrpc 命令的终端标签页) 时TerminalPage.axaml.csproxyName, commandfire-and-forget
proxy.stop关闭终端标签页 (与 proxy.start 配对) 时TerminalPage.axaml.csproxyNamefire-and-forget
page.navigate切换主界面页面时MainPageFrameViewModel.cspagefire-and-forget
plugin.install插件文件安装成功时PluginService.csfilefire-and-forget
plugin.uninstall插件卸载成功时PluginService.cspluginId, pluginNamefire-and-forget
plugin.enable插件启用时PluginService.cspluginIdfire-and-forget
plugin.disable插件禁用时PluginService.cspluginIdfire-and-forget

事件详情

app.startup / app.exit

应用生命周期事件。app.startup 在主窗口加载、隐私政策检查完成后触发; app.exit 在进程退出前触发,会等待插件动作执行完毕才释放日志资源。

数据字段说明示例
version应用版本号26.2.0
os操作系统平台Win32NT / Unix

app.update.available

启动后首次检查到新版本时触发 (每次运行只触发一次) 。

数据字段说明
currentVersion当前版本
latestVersion检测到的最新版本

user.login / user.logout

数据字段说明
username登录/登出的用户名
group用户组 (仅 user.login)

user.logout 之后应用会立即重启,因此采用 await 方式执行, 保证插件动作 (如通知、上报) 能完整执行。

proxy.start / proxy.stop

数据字段说明
proxyName隧道/终端标签页名称
command启动命令 (仅 proxy.start)

page 字段取值: HomeCreateProxyManageProxyNodesMonitoringUserCenterSettingsAboutTerminalUpdateThemePlugin

plugin.install / plugin.uninstall / plugin.enable / plugin.disable

插件自身管理事件。注意: 插件可以订阅这些事件实现联动, 但订阅 plugin.uninstall 的插件在自身被卸载后不会再收到后续事件。

二、插件 YAML 写法

插件文件位于 Config/Plugins/*.yaml,支持热重载 (文件变更后 1 秒内自动重载) 。

id: my-plugin
name: 示例插件
description: 隧道启动时发送通知
author: 作者名
version: "1.0"

triggers:
  - on: proxy.start                          # 订阅的事件名
    condition: "ctx.data.proxyName != ''"    # 可选,条件表达式
    actions:
      - name: notify
        params:
          msg: "隧道 {{ctx.data.proxyName}} 已启动"

functions:
  my_func:                                   # 可复用函数,用 call_function 调用
    - name: log
      params:
        msg: "hello"

内置指令 (actions)

指令参数说明
logmsg写日志 (控制台 + 应用日志文件,模块为"插件")
notifymsg发送系统通知 (标题为 插件ID | PML 2)
http_requesturl, method(默认 GET), body发 HTTP 请求,响应体写入 ctx.variables.http_response
python_runscript, input调用 Python 脚本 (需 PATH 中有 python3) ,返回的 JSON 合并进变量
call_functionfunc, args调用 functions 中定义的函数
conditionalcondition, if_true条件执行一组动作

模板变量

参数中的 {{...}} 会在执行前替换:

  • {{ctx.data.xxx}} —— 事件携带的数据
  • {{ctx.variables.xxx}} —— 执行过程中产生的变量 (如 http_response)
Copyright © RYCBStudio 2026, All Rights Reserved.