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