[{"data":1,"prerenderedAt":1081},["ShallowReactive",2],{"navigation_docs_zh_cn":3,"-zh-cn-pml-2-plugin-triggers":75,"-zh-cn-pml-2-plugin-triggers-surround":1076},[4,26],{"title":5,"path":6,"stem":7,"children":8,"page":25},"PML 2 插件开发指南","\u002Fzh_cn\u002Fpml-2-plugin","zh_cn\u002Fpml-2-plugin",[9,13,17,21],{"title":10,"path":11,"stem":12},"插件开发综述","\u002Fzh_cn\u002Fpml-2-plugin\u002Fintro","zh_cn\u002Fpml-2-plugin\u002F01.intro",{"title":14,"path":15,"stem":16},"插件系统埋点说明","\u002Fzh_cn\u002Fpml-2-plugin\u002Ftriggers","zh_cn\u002Fpml-2-plugin\u002F02.triggers",{"title":18,"path":19,"stem":20},"插件系统运算符说明","\u002Fzh_cn\u002Fpml-2-plugin\u002Foperators","zh_cn\u002Fpml-2-plugin\u002F03.operators",{"title":22,"path":23,"stem":24},"内置函数","\u002Fzh_cn\u002Fpml-2-plugin\u002Ffunctions","zh_cn\u002Fpml-2-plugin\u002F04.functions",false,{"title":27,"path":28,"stem":29,"children":30,"page":25},"PML 2","\u002Fzh_cn\u002Fpml-2","zh_cn\u002Fpml-2",[31,35,39,43,47,51,55,59,63,67,71],{"title":32,"path":33,"stem":34},"介绍 & 下载","\u002Fzh_cn\u002Fpml-2\u002Fintro","zh_cn\u002Fpml-2\u002F01.intro",{"title":36,"path":37,"stem":38},"安装","\u002Fzh_cn\u002Fpml-2\u002Finstall","zh_cn\u002Fpml-2\u002F02.install",{"title":40,"path":41,"stem":42},"用户指南","\u002Fzh_cn\u002Fpml-2\u002Fuser_guide","zh_cn\u002Fpml-2\u002F03.user_guide",{"title":44,"path":45,"stem":46},"故障排查","\u002Fzh_cn\u002Fpml-2\u002Ftroubleshooting","zh_cn\u002Fpml-2\u002F04.troubleshooting",{"title":48,"path":49,"stem":50},"配置文件","\u002Fzh_cn\u002Fpml-2\u002Fconfig","zh_cn\u002Fpml-2\u002F05.config",{"title":52,"path":53,"stem":54},"主题","\u002Fzh_cn\u002Fpml-2\u002Fthemes","zh_cn\u002Fpml-2\u002F06.themes",{"title":56,"path":57,"stem":58},"插件开发指南","\u002Fzh_cn\u002Fpml-2\u002Fplugin","zh_cn\u002Fpml-2\u002F07.plugin",{"title":60,"path":61,"stem":62},"PML 2 隐私政策","\u002Fzh_cn\u002Fpml-2\u002Fpolicy","zh_cn\u002Fpml-2\u002F08.policy",{"title":64,"path":65,"stem":66},"PML 2 用户协议","\u002Fzh_cn\u002Fpml-2\u002Fuser_agreement","zh_cn\u002Fpml-2\u002F09.user_agreement",{"title":68,"path":69,"stem":70},"DNS 提供商","\u002Fzh_cn\u002Fpml-2\u002Fdns_providers","zh_cn\u002Fpml-2\u002F10.dns_providers",{"title":72,"path":73,"stem":74},"遥测","\u002Fzh_cn\u002Fpml-2\u002Ftelemetry","zh_cn\u002Fpml-2\u002F11.telemetry",{"id":76,"title":14,"body":77,"description":1070,"extension":1071,"links":1072,"meta":1073,"navigation":735,"path":15,"seo":1074,"stem":16,"__hash__":1075},"docs_zh_cn\u002Fzh_cn\u002Fpml-2-plugin\u002F02.triggers.md",{"type":78,"value":79,"toc":1060},"minimark",[80,85,98,102,408,411,416,425,474,477,480,510,514,547,555,559,591,594,634,638,644,648,655,889,893,1027,1030,1037,1056],[81,82,84],"h2",{"id":83},"一插件事件触发点-trigger","一、插件事件触发点 (Trigger)",[86,87,88,89,93,94,97],"p",{},"插件通过 YAML 中的 ",[90,91,92],"code",{},"triggers.on"," 订阅以下事件。事件携带的数据可通过模板\n",[90,95,96],{},"{{ctx.data.字段名}}"," 在动作参数中引用。",[99,100,101],"h3",{"id":101},"事件总览",[103,104,105,127],"table",{},[106,107,108],"thead",{},[109,110,111,115,118,121,124],"tr",{},[112,113,114],"th",{},"事件名",[112,116,117],{},"触发时机",[112,119,120],{},"触发位置",[112,122,123],{},"携带数据",[112,125,126],{},"执行方式",[128,129,130,158,181,206,231,252,277,300,322,344,368,388],"tbody",{},[109,131,132,138,141,146,155],{},[133,134,135],"td",{},[90,136,137],{},"app.startup",[133,139,140],{},"主窗口初始化完成、应用启动时",[133,142,143],{},[90,144,145],{},"MainWindow.axaml.cs",[133,147,148,151,152],{},[90,149,150],{},"version",", ",[90,153,154],{},"os",[133,156,157],{},"await",[109,159,160,165,168,173,179],{},[133,161,162],{},[90,163,164],{},"app.exit",[133,166,167],{},"应用退出时 (日志释放前)",[133,169,170],{},[90,171,172],{},"App.axaml.cs",[133,174,175,151,177],{},[90,176,150],{},[90,178,154],{},[133,180,157],{},[109,182,183,188,191,195,203],{},[133,184,185],{},[90,186,187],{},"app.update.available",[133,189,190],{},"检测到有新版本时",[133,192,193],{},[90,194,145],{},[133,196,197,151,200],{},[90,198,199],{},"currentVersion",[90,201,202],{},"latestVersion",[133,204,205],{},"fire-and-forget",[109,207,208,213,216,221,229],{},[133,209,210],{},[90,211,212],{},"user.login",[133,214,215],{},"用户登录成功时",[133,217,218],{},[90,219,220],{},"LoginPage.axaml.cs",[133,222,223,151,226],{},[90,224,225],{},"username",[90,227,228],{},"group",[133,230,205],{},[109,232,233,238,241,246,250],{},[133,234,235],{},[90,236,237],{},"user.logout",[133,239,240],{},"用户确认登出后、应用重启前",[133,242,243],{},[90,244,245],{},"UserCenterPage.axaml.cs",[133,247,248],{},[90,249,225],{},[133,251,157],{},[109,253,254,259,262,267,275],{},[133,255,256],{},[90,257,258],{},"proxy.start",[133,260,261],{},"启动隧道 (创建带 mefrpc 命令的终端标签页) 时",[133,263,264],{},[90,265,266],{},"TerminalPage.axaml.cs",[133,268,269,151,272],{},[90,270,271],{},"proxyName",[90,273,274],{},"command",[133,276,205],{},[109,278,279,284,290,294,298],{},[133,280,281],{},[90,282,283],{},"proxy.stop",[133,285,286,287,289],{},"关闭终端标签页 (与 ",[90,288,258],{}," 配对) 时",[133,291,292],{},[90,293,266],{},[133,295,296],{},[90,297,271],{},[133,299,205],{},[109,301,302,307,310,315,320],{},[133,303,304],{},[90,305,306],{},"page.navigate",[133,308,309],{},"切换主界面页面时",[133,311,312],{},[90,313,314],{},"MainPageFrameViewModel.cs",[133,316,317],{},[90,318,319],{},"page",[133,321,205],{},[109,323,324,329,332,337,342],{},[133,325,326],{},[90,327,328],{},"plugin.install",[133,330,331],{},"插件文件安装成功时",[133,333,334],{},[90,335,336],{},"PluginService.cs",[133,338,339],{},[90,340,341],{},"file",[133,343,205],{},[109,345,346,351,354,358,366],{},[133,347,348],{},[90,349,350],{},"plugin.uninstall",[133,352,353],{},"插件卸载成功时",[133,355,356],{},[90,357,336],{},[133,359,360,151,363],{},[90,361,362],{},"pluginId",[90,364,365],{},"pluginName",[133,367,205],{},[109,369,370,375,378,382,386],{},[133,371,372],{},[90,373,374],{},"plugin.enable",[133,376,377],{},"插件启用时",[133,379,380],{},[90,381,336],{},[133,383,384],{},[90,385,362],{},[133,387,205],{},[109,389,390,395,398,402,406],{},[133,391,392],{},[90,393,394],{},"plugin.disable",[133,396,397],{},"插件禁用时",[133,399,400],{},[90,401,336],{},[133,403,404],{},[90,405,362],{},[133,407,205],{},[99,409,410],{"id":410},"事件详情",[412,413,415],"h4",{"id":414},"appstartup-appexit","app.startup \u002F app.exit",[86,417,418,419,421,422,424],{},"应用生命周期事件。",[90,420,137],{}," 在主窗口加载、隐私政策检查完成后触发；\n",[90,423,164],{}," 在进程退出前触发，会等待插件动作执行完毕才释放日志资源。",[103,426,427,440],{},[106,428,429],{},[109,430,431,434,437],{},[112,432,433],{},"数据字段",[112,435,436],{},"说明",[112,438,439],{},"示例",[128,441,442,456],{},[109,443,444,448,451],{},[133,445,446],{},[90,447,150],{},[133,449,450],{},"应用版本号",[133,452,453],{},[90,454,455],{},"26.2.0",[109,457,458,462,465],{},[133,459,460],{},[90,461,154],{},[133,463,464],{},"操作系统平台",[133,466,467,470,471],{},[90,468,469],{},"Win32NT"," \u002F ",[90,472,473],{},"Unix",[412,475,187],{"id":476},"appupdateavailable",[86,478,479],{},"启动后首次检查到新版本时触发 (每次运行只触发一次) 。",[103,481,482,490],{},[106,483,484],{},[109,485,486,488],{},[112,487,433],{},[112,489,436],{},[128,491,492,501],{},[109,493,494,498],{},[133,495,496],{},[90,497,199],{},[133,499,500],{},"当前版本",[109,502,503,507],{},[133,504,505],{},[90,506,202],{},[133,508,509],{},"检测到的最新版本",[412,511,513],{"id":512},"userlogin-userlogout","user.login \u002F user.logout",[103,515,516,524],{},[106,517,518],{},[109,519,520,522],{},[112,521,433],{},[112,523,436],{},[128,525,526,535],{},[109,527,528,532],{},[133,529,530],{},[90,531,225],{},[133,533,534],{},"登录\u002F登出的用户名",[109,536,537,541],{},[133,538,539],{},[90,540,228],{},[133,542,543,544,546],{},"用户组 (仅 ",[90,545,212],{},")",[548,549,550],"blockquote",{},[86,551,552,554],{},[90,553,237],{}," 之后应用会立即重启，因此采用 await 方式执行，\n保证插件动作 (如通知、上报) 能完整执行。",[412,556,558],{"id":557},"proxystart-proxystop","proxy.start \u002F proxy.stop",[103,560,561,569],{},[106,562,563],{},[109,564,565,567],{},[112,566,433],{},[112,568,436],{},[128,570,571,580],{},[109,572,573,577],{},[133,574,575],{},[90,576,271],{},[133,578,579],{},"隧道\u002F终端标签页名称",[109,581,582,586],{},[133,583,584],{},[90,585,274],{},[133,587,588,589,546],{},"启动命令 (仅 ",[90,590,258],{},[412,592,306],{"id":593},"pagenavigate",[86,595,596,598,599,602,603,602,606,602,609,602,612,615,616,602,619,602,622,602,625,602,628,602,631],{},[90,597,319],{}," 字段取值:\n",[90,600,601],{},"Home","、",[90,604,605],{},"CreateProxy",[90,607,608],{},"ManageProxy",[90,610,611],{},"NodesMonitoring",[90,613,614],{},"UserCenter","、\n",[90,617,618],{},"Settings",[90,620,621],{},"About",[90,623,624],{},"Terminal",[90,626,627],{},"Update",[90,629,630],{},"Theme",[90,632,633],{},"Plugin",[412,635,637],{"id":636},"plugininstall-pluginuninstall-pluginenable-plugindisable","plugin.install \u002F plugin.uninstall \u002F plugin.enable \u002F plugin.disable",[86,639,640,641,643],{},"插件自身管理事件。注意: 插件可以订阅这些事件实现联动，\n但订阅 ",[90,642,350],{}," 的插件在自身被卸载后不会再收到后续事件。",[81,645,647],{"id":646},"二插件-yaml-写法","二、插件 YAML 写法",[86,649,650,651,654],{},"插件文件位于 ",[90,652,653],{},"Config\u002FPlugins\u002F*.yaml","，支持热重载 (文件变更后 1 秒内自动重载) 。",[656,657,662],"pre",{"className":658,"code":659,"language":660,"meta":661,"style":661},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","id: my-plugin\nname: 示例插件\ndescription: 隧道启动时发送通知\nauthor: 作者名\nversion: \"1.0\"\n\ntriggers:\n  - on: proxy.start                          # 订阅的事件名\n    condition: \"ctx.data.proxyName != ''\"    # 可选，条件表达式\n    actions:\n      - name: notify\n        params:\n          msg: \"隧道 {{ctx.data.proxyName}} 已启动\"\n\nfunctions:\n  my_func:                                   # 可复用函数，用 call_function 调用\n    - name: log\n      params:\n        msg: \"hello\"\n","yaml","",[90,663,664,681,692,703,714,730,737,746,765,784,792,806,814,829,834,842,853,866,874],{"__ignoreMap":661},[665,666,669,673,677],"span",{"class":667,"line":668},"line",1,[665,670,672],{"class":671},"swJcz","id",[665,674,676],{"class":675},"sMK4o",":",[665,678,680],{"class":679},"sfazB"," my-plugin\n",[665,682,684,687,689],{"class":667,"line":683},2,[665,685,686],{"class":671},"name",[665,688,676],{"class":675},[665,690,691],{"class":679}," 示例插件\n",[665,693,695,698,700],{"class":667,"line":694},3,[665,696,697],{"class":671},"description",[665,699,676],{"class":675},[665,701,702],{"class":679}," 隧道启动时发送通知\n",[665,704,706,709,711],{"class":667,"line":705},4,[665,707,708],{"class":671},"author",[665,710,676],{"class":675},[665,712,713],{"class":679}," 作者名\n",[665,715,717,719,721,724,727],{"class":667,"line":716},5,[665,718,150],{"class":671},[665,720,676],{"class":675},[665,722,723],{"class":675}," \"",[665,725,726],{"class":679},"1.0",[665,728,729],{"class":675},"\"\n",[665,731,733],{"class":667,"line":732},6,[665,734,736],{"emptyLinePlaceholder":735},true,"\n",[665,738,740,743],{"class":667,"line":739},7,[665,741,742],{"class":671},"triggers",[665,744,745],{"class":675},":\n",[665,747,749,752,756,758,761],{"class":667,"line":748},8,[665,750,751],{"class":675},"  -",[665,753,755],{"class":754},"sfNiH"," on",[665,757,676],{"class":675},[665,759,760],{"class":679}," proxy.start",[665,762,764],{"class":763},"sHwdD","                          # 订阅的事件名\n",[665,766,768,771,773,775,778,781],{"class":667,"line":767},9,[665,769,770],{"class":671},"    condition",[665,772,676],{"class":675},[665,774,723],{"class":675},[665,776,777],{"class":679},"ctx.data.proxyName != ''",[665,779,780],{"class":675},"\"",[665,782,783],{"class":763},"    # 可选，条件表达式\n",[665,785,787,790],{"class":667,"line":786},10,[665,788,789],{"class":671},"    actions",[665,791,745],{"class":675},[665,793,795,798,801,803],{"class":667,"line":794},11,[665,796,797],{"class":675},"      -",[665,799,800],{"class":671}," name",[665,802,676],{"class":675},[665,804,805],{"class":679}," notify\n",[665,807,809,812],{"class":667,"line":808},12,[665,810,811],{"class":671},"        params",[665,813,745],{"class":675},[665,815,817,820,822,824,827],{"class":667,"line":816},13,[665,818,819],{"class":671},"          msg",[665,821,676],{"class":675},[665,823,723],{"class":675},[665,825,826],{"class":679},"隧道 {{ctx.data.proxyName}} 已启动",[665,828,729],{"class":675},[665,830,832],{"class":667,"line":831},14,[665,833,736],{"emptyLinePlaceholder":735},[665,835,837,840],{"class":667,"line":836},15,[665,838,839],{"class":671},"functions",[665,841,745],{"class":675},[665,843,845,848,850],{"class":667,"line":844},16,[665,846,847],{"class":671},"  my_func",[665,849,676],{"class":675},[665,851,852],{"class":763},"                                   # 可复用函数，用 call_function 调用\n",[665,854,856,859,861,863],{"class":667,"line":855},17,[665,857,858],{"class":675},"    -",[665,860,800],{"class":671},[665,862,676],{"class":675},[665,864,865],{"class":679}," log\n",[665,867,869,872],{"class":667,"line":868},18,[665,870,871],{"class":671},"      params",[665,873,745],{"class":675},[665,875,877,880,882,884,887],{"class":667,"line":876},19,[665,878,879],{"class":671},"        msg",[665,881,676],{"class":675},[665,883,723],{"class":675},[665,885,886],{"class":679},"hello",[665,888,729],{"class":675},[99,890,892],{"id":891},"内置指令-actions","内置指令 (actions)",[103,894,895,907],{},[106,896,897],{},[109,898,899,902,905],{},[112,900,901],{},"指令",[112,903,904],{},"参数",[112,906,436],{},[128,908,909,924,941,966,988,1009],{},[109,910,911,916,921],{},[133,912,913],{},[90,914,915],{},"log",[133,917,918],{},[90,919,920],{},"msg",[133,922,923],{},"写日志 (控制台 + 应用日志文件，模块为\"插件\")",[109,925,926,931,935],{},[133,927,928],{},[90,929,930],{},"notify",[133,932,933],{},[90,934,920],{},[133,936,937,938,546],{},"发送系统通知 (标题为 ",[90,939,940],{},"插件ID | PML 2",[109,942,943,948,960],{},[133,944,945],{},[90,946,947],{},"http_request",[133,949,950,151,953,956,957],{},[90,951,952],{},"url",[90,954,955],{},"method","(默认 GET), ",[90,958,959],{},"body",[133,961,962,963],{},"发 HTTP 请求，响应体写入 ",[90,964,965],{},"ctx.variables.http_response",[109,967,968,973,981],{},[133,969,970],{},[90,971,972],{},"python_run",[133,974,975,151,978],{},[90,976,977],{},"script",[90,979,980],{},"input",[133,982,983,984,987],{},"调用 Python 脚本 (需 PATH 中有 ",[90,985,986],{},"python3",") ，返回的 JSON 合并进变量",[109,989,990,995,1003],{},[133,991,992],{},[90,993,994],{},"call_function",[133,996,997,151,1000],{},[90,998,999],{},"func",[90,1001,1002],{},"args",[133,1004,1005,1006,1008],{},"调用 ",[90,1007,839],{}," 中定义的函数",[109,1010,1011,1016,1024],{},[133,1012,1013],{},[90,1014,1015],{},"conditional",[133,1017,1018,151,1021],{},[90,1019,1020],{},"condition",[90,1022,1023],{},"if_true",[133,1025,1026],{},"条件执行一组动作",[99,1028,1029],{"id":1029},"模板变量",[86,1031,1032,1033,1036],{},"参数中的 ",[90,1034,1035],{},"{{...}}"," 会在执行前替换:",[1038,1039,1040,1047],"ul",{},[1041,1042,1043,1046],"li",{},[90,1044,1045],{},"{{ctx.data.xxx}}"," —— 事件携带的数据",[1041,1048,1049,1052,1053,546],{},[90,1050,1051],{},"{{ctx.variables.xxx}}"," —— 执行过程中产生的变量 (如 ",[90,1054,1055],{},"http_response",[1057,1058,1059],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":661,"searchDepth":683,"depth":683,"links":1061},[1062,1066],{"id":83,"depth":683,"text":84,"children":1063},[1064,1065],{"id":101,"depth":694,"text":101},{"id":410,"depth":694,"text":410},{"id":646,"depth":683,"text":647,"children":1067},[1068,1069],{"id":891,"depth":694,"text":892},{"id":1029,"depth":694,"text":1029},"本文档介绍 PML 2 插件系统的全部埋点。","md",null,{},{"title":14,"description":1070},"WbbCYnI76KmzFxsL0Tu7Nx72x3VMnjMsSO0CktAqBn0",[1077,1079],{"title":10,"path":11,"stem":12,"description":1078,"children":-1},"本文将粗略介绍 PML 2 的插件系统。",{"title":18,"path":19,"stem":20,"description":1080,"children":-1},"本文档介绍 PML 2 插件系统的运算符。",1791004264414]