pm2-orbit 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/server.js +1 -1
  2. package/package.json +1 -1
package/dist/server.js CHANGED
@@ -881,7 +881,7 @@ Bus `);for(let a=1;a<o.length;a++){let c=oMe(o[a]);i.push(c)}}e&&e(i),t(i)}),ZNe
881
881
  To: <invalid@invalid>\r
882
882
  Subject: Invalid\r
883
883
  \r
884
- Invalid`)}},FromEmailAddress:"invalid@invalid",Destination:{ToAddresses:["invalid@invalid"]}};return this.getRegion(()=>{let s=new this.ses.SendEmailCommand(n);this.ses.sesClient.send(s).then(()=>r(null)).catch(a=>r(a))}),i}};PX.exports=JP});var NX=S((U6e,fv)=>{"use strict";var Vqe=KK(),LX=Hi(),Wqe=mX(),Gqe=bX(),Kqe=_X(),Xqe=EX(),Yqe=CX(),Jqe=AX(),Qqe=pr(),Zqe=ah(),kX=fn(),e$e=(process.env.ETHEREAL_API||"https://api.nodemailer.com").replace(/\/+$/,""),t$e=(process.env.ETHEREAL_WEB||"https://ethereal.email").replace(/\/+$/,""),IX=(process.env.ETHEREAL_API_KEY||"").replace(/\s*/g,"")||null,i$e=["true","yes","y","1"].includes((process.env.ETHEREAL_CACHE||"yes").toString().trim().toLowerCase()),mh=!1;fv.exports.createTransport=function(e,t){let i;if(typeof e=="object"&&typeof e.send!="function"||typeof e=="string"&&/^(smtps?|direct):/i.test(e)){let r=typeof e=="string"?e:e.url;if(r?i=LX.parseConnectionUrl(r):i=e,i.pool)e=new Wqe(i);else if(i.sendmail)e=new Kqe(i);else if(i.streamTransport)e=new Xqe(i);else if(i.jsonTransport)e=new Yqe(i);else if(i.SES){if(i.SES.ses&&i.SES.aws){let n=new Error("Using legacy SES configuration, expecting @aws-sdk/client-sesv2, see https://nodemailer.com/transports/ses/");throw n.code=Qqe.ECONFIG,n}e=new Jqe(i)}else e=new Gqe(i)}return new Vqe(e,i,t)};fv.exports.createTestAccount=function(e,t){let i;if(!t&&typeof e=="function"&&(t=e,e=!1),t||(i=new Promise((l,u)=>{t=LX.callbackPromise(l,u)})),i$e&&mh)return setImmediate(()=>t(null,mh)),i;e=e||e$e;let r=[],n=0,s={},o={requestor:kX.name,version:kX.version};IX&&(s.Authorization="Bearer "+IX);let a={contentType:"application/json",method:"POST",headers:s,body:Buffer.from(JSON.stringify(o))};/^https:/i.test(e)&&(a.tls={rejectUnauthorized:!0});let c=Zqe(e+"/user",a);return c.on("readable",()=>{let l;for(;(l=c.read())!==null;)r.push(l),n+=l.length}),c.once("error",l=>t(l)),c.once("end",()=>{let l=Buffer.concat(r,n),u;try{u=JSON.parse(l.toString())}catch(p){return t(p)}if(u.status!=="success"||u.error)return t(new Error(u.error||"Request failed"));delete u.status,mh=u,t(null,mh)}),i};fv.exports.getTestMessageUrl=function(e){if(!e||!e.response)return!1;let t=new Map,i=e.response.toString();if(i.length>2&&i.charAt(i.length-1)==="]"){let r=i.indexOf("[",i.lastIndexOf("]",i.length-2)+1);r>=0&&r<i.length-2&&i.substring(r+1,i.length-1).replace(/\b([A-Z0-9]+)=([^\s]+)/g,(s,o,a)=>{t.set(o,a)})}return t.has("STATUS")&&t.has("MSGID")?(mh.web||t$e)+"/message/"+t.get("MSGID"):!1}});var MX={};qs(MX,{isEmailConfigured:()=>s$e,sendEmail:()=>n$e});function r$e(){if(hv)return hv;if(!mv)return null;let e=process.env.SMTP_HOST,t=parseInt(process.env.SMTP_PORT||"587",10),i=process.env.SMTP_USER,r=process.env.SMTP_PASS,n=process.env.SMTP_FROM;return!e||!n?null:(hv=mv.createTransport({host:e,port:t,secure:t===465,auth:i&&r?{user:i,pass:r}:void 0}),hv)}async function n$e(e,t){let i=r$e(),r=process.env.SMTP_TO;if(!i||!r)return!1;try{return await i.sendMail({from:process.env.SMTP_FROM,to:r,subject:`[PM2 Orbit] ${e}`,text:t,html:`<p>${t}</p>`}),!0}catch{return!1}}function s$e(){return!!mv&&!!process.env.SMTP_HOST&&!!process.env.SMTP_FROM&&!!process.env.SMTP_TO}var mv,hv,DX=fr(()=>{"use strict";mv=null;try{mv=NX()}catch{}hv=null});var UX=S((aWe,gh)=>{"use strict";var{FifoMap:a$e}=km(),c$e=/^[!#$%&'*+\-.^\w`|~]+$/u;function l$e(e){if(c$e.test(e)===!1)throw new TypeError("Fieldname contains invalid characters.")}function zX(e){e=e.trim().toLowerCase();let t=[];if(e.length!==0)if(e.indexOf(",")===-1)t.push(e);else{let i=e.length,r=0,n=0,s;for(r;r<i;++r)s=e[r],s===" "?n=r+1:s===","&&(n!==r&&t.push(e.slice(n,r)),n=r+1);n!==r&&t.push(e.slice(n,r))}return t}function ZP(e){let t=new a$e(1e3);return l$e(e),function(i){let r=i.getHeader("Vary");if(!r){i.header("Vary",e);return}if(r==="*")return;if(e==="*"){i.header("Vary","*");return}if(Array.isArray(r)&&(r=r.join(", ")),t.get(r)===void 0){let s=zX(r);s.indexOf("*")!==-1?t.set(r,"*"):s.indexOf(e.toLowerCase())===-1?t.set(r,r+", "+e):t.set(r,null)}let n=t.get(r);n!==null&&i.header("Vary",n)}}gh.exports.createAddFieldnameToVary=ZP;gh.exports.addOriginToVaryHeader=ZP("Origin");gh.exports.addAccessControlRequestHeadersToVaryHeader=ZP("Access-Control-Request-Headers");gh.exports.parse=zX});var KX=S((cWe,yv)=>{"use strict";var u$e=Sd(),{addAccessControlRequestHeadersToVaryHeader:p$e,addOriginToVaryHeader:d$e}=UX(),tA={origin:"*",methods:"GET,HEAD,POST",hook:"onRequest",preflightContinue:!1,optionsSuccessStatus:204,credentials:!1,exposedHeaders:null,allowedHeaders:null,maxAge:null,preflight:!0,strictPreflight:!0},f$e=["onRequest","preParsing","preValidation","preHandler","preSerialization","onSend"],eA=["preSerialization","preParsing","onSend"];function WX(e,t){f$e.indexOf(e)===-1&&t(new TypeError("@fastify/cors: Invalid hook option provided."))}function h$e(e,t,i){e.decorateRequest("corsPreflightEnabled",!1);let r=!0,n;if(typeof t=="function")HX(t,e,{hook:tA.hook},i);else if(t.delegator){let{delegator:s,...o}=t;HX(s,e,o,i)}else{let s=gv(t);WX(s.hook,i),eA.indexOf(s.hook)!==-1?e.addHook(s.hook,function(a,c,l,u){yh(e,s,a,c,u)}):e.addHook(s.hook,function(a,c,l){yh(e,s,a,c,l)})}t.logLevel!==void 0&&(n=t.logLevel),t.hideOptionsRoute!==void 0&&(r=t.hideOptionsRoute),e.options("*",{schema:{hide:r},logLevel:n},(s,o)=>{if(!s.corsPreflightEnabled){o.callNotFound();return}o.send()}),i()}function HX(e,t,i,r){let n=i?.hook||tA.hook;WX(n,r),e.length===2?eA.indexOf(n)!==-1?t.addHook(n,function(o,a,c,l){VX(e,t,o,a,l)}):t.addHook(n,function(o,a,c){VX(e,t,o,a,c)}):eA.indexOf(n)!==-1?t.addHook(n,function(o,a,c,l){let u=e(o);if(u&&typeof u.then=="function"){u.then(p=>yh(t,gv(p,!0),o,a,l)).catch(l);return}l(new Error("Invalid CORS origin option"))}):t.addHook(n,function(o,a,c){let l=e(o);if(l&&typeof l.then=="function"){l.then(u=>yh(t,gv(u,!0),o,a,c)).catch(c);return}c(new Error("Invalid CORS origin option"))})}function VX(e,t,i,r,n){e(i,(s,o)=>{s?n(s):yh(t,gv(o,!0),i,r,n)})}function gv(e,t){let i={...tA,...e};return Array.isArray(e.origin)&&e.origin.indexOf("*")!==-1&&(i.origin="*"),Number.isInteger(i.cacheControl)?i.cacheControl=`max-age=${i.cacheControl}`:typeof i.cacheControl!="string"&&(i.cacheControl=null),i.dynamic=t||!1,i}function yh(e,t,i,r,n){let s={...t,...i.routeOptions.config?.cors};(typeof s.origin!="string"&&s.origin!==!1||s.dynamic)&&d$e(r),(typeof s.origin=="function"?y$e(e,s.origin):(a,c)=>c(null,s.origin))(i,(a,c)=>{if(a!==null)return n(a);if(c===!1||i.routeOptions.config?.cors===!1)return n();if(!c)return n(new Error("Invalid CORS origin option"));if(m$e(i,r,c,s),i.raw.method==="OPTIONS"&&s.preflight===!0){if(s.strictPreflight===!0&&(!i.headers.origin||!i.headers["access-control-request-method"])){r.status(400).type("text/plain").send("Invalid Preflight Request");return}if(i.corsPreflightEnabled=!0,g$e(i,r,s),!s.preflightContinue){r.code(s.optionsSuccessStatus).header("Content-Length","0").send();return}}return n()})}function m$e(e,t,i,r){let n=x$e(e.headers.origin,i);n&&t.header("Access-Control-Allow-Origin",n),r.credentials&&t.header("Access-Control-Allow-Credentials","true"),r.exposedHeaders!==null&&t.header("Access-Control-Expose-Headers",Array.isArray(r.exposedHeaders)?r.exposedHeaders.join(", "):r.exposedHeaders)}function g$e(e,t,i){if(t.header("Access-Control-Allow-Methods",Array.isArray(i.methods)?i.methods.join(", "):i.methods),i.allowedHeaders===null){p$e(t);let r=e.headers["access-control-request-headers"];r!==void 0&&t.header("Access-Control-Allow-Headers",r)}else t.header("Access-Control-Allow-Headers",Array.isArray(i.allowedHeaders)?i.allowedHeaders.join(", "):i.allowedHeaders);i.maxAge!==null&&t.header("Access-Control-Max-Age",String(i.maxAge)),i.cacheControl&&t.header("Cache-Control",i.cacheControl)}function y$e(e,t){return function(i,r){let n=t.call(e,i.headers.origin,r);n&&typeof n.then=="function"&&n.then(s=>r(null,s),r)}}function x$e(e,t){return typeof t=="string"?t:GX(e,t)?e:!1}function GX(e,t){if(Array.isArray(t)){for(let i=0;i<t.length;++i)if(GX(e,t[i]))return!0;return!1}else return typeof t=="string"?e===t:t instanceof RegExp?(t.lastIndex=0,t.test(e)):!!t}var iA=u$e(h$e,{fastify:"5.x",name:"@fastify/cors"});yv.exports=iA;yv.exports.fastifyCors=iA;yv.exports.default=iA});function ZX(){try{if(mn.default.existsSync(rA))return Buffer.from(mn.default.readFileSync(rA,"utf-8"),"hex")}catch{}let e=(0,hc.randomBytes)(32);try{mn.default.existsSync(Fu)||mn.default.mkdirSync(Fu,{recursive:!0}),mn.default.writeFileSync(rA,e.toString("hex"),{mode:384})}catch{}return e}function v$e(e){if(!e)return"";try{let t=ZX(),i=(0,hc.randomBytes)(16),r=(0,hc.createCipheriv)("aes-256-cbc",t,i),n=Buffer.concat([r.update(e,"utf8"),r.final()]);return i.toString("hex")+":"+n.toString("hex")}catch{return e}}function b$e(e){if(!e||!e.includes(":"))return e;try{let t=ZX(),[i,r]=e.split(":"),n=Buffer.from(i,"hex"),s=Buffer.from(r,"hex"),o=(0,hc.createDecipheriv)("aes-256-cbc",t,n);return Buffer.concat([o.update(s),o.final()]).toString("utf8")}catch{return e}}function sA(){if($u)return $u;try{if(mn.default.existsSync(nA)){let e=mn.default.readFileSync(nA,"utf-8"),t=JSON.parse(e),i={...JX,...t};for(let r of QX)i[r]&&(i[r]=b$e(i[r]));return $u=i,i}}catch{}return $u={...JX},$u}function w$e(){$u=null}function _$e(e){try{mn.default.existsSync(Fu)||mn.default.mkdirSync(Fu,{recursive:!0});let t={...e};for(let i of QX)t[i]&&(t[i]=v$e(t[i]));mn.default.writeFileSync(nA,JSON.stringify(t,null,2),{mode:384}),w$e()}catch{}}function vv(){return sA()}function eY(){let e=sA();return{...e,authToken:e.authToken?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":"",smtpPass:e.smtpPass?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":""}}function tY(e){let i={...sA()};for(let[r,n]of Object.entries(e))(r==="authToken"||r==="smtpPass")&&(n==="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"||n==="")||(i[r]=n);return _$e(i),i}function bv(e){e.authToken&&(process.env.PM2_ORBIT_TOKEN=e.authToken),e.slackWebhookUrl&&(process.env.SLACK_WEBHOOK_URL=e.slackWebhookUrl),e.discordWebhookUrl&&(process.env.DISCORD_WEBHOOK_URL=e.discordWebhookUrl),e.webhookUrl&&(process.env.WEBHOOK_URL=e.webhookUrl),e.smtpHost&&(process.env.SMTP_HOST=e.smtpHost),e.smtpPort&&(process.env.SMTP_PORT=String(e.smtpPort)),e.smtpUser&&(process.env.SMTP_USER=e.smtpUser),e.smtpPass&&(process.env.SMTP_PASS=e.smtpPass),e.smtpFrom&&(process.env.SMTP_FROM=e.smtpFrom),e.smtpTo&&(process.env.SMTP_TO=e.smtpTo),e.theme&&(process.env.PM2_ORBIT_THEME=e.theme),e.historyRetentionHours&&(process.env.PM2_ORBIT_RETENTION_HOURS=String(e.historyRetentionHours)),e.logBufferSize&&(process.env.PM2_ORBIT_LOG_BUFFER=String(e.logBufferSize));for(let t of Object.keys(e.enabledChannels))process.env[`NOTIFY_${t.toUpperCase()}_ENABLED`]=e.enabledChannels[t]?"1":"0"}var mn,xv,hc,Fu,nA,rA,JX,QX,$u,oA=fr(()=>{"use strict";mn=dt(require("fs")),xv=dt(require("path")),hc=require("crypto"),Fu=xv.default.join(process.env.HOME||process.env.USERPROFILE||"",".pm2-orbit"),nA=xv.default.join(Fu,"settings.json"),rA=xv.default.join(Fu,".key"),JX={theme:"dark",port:9823,authToken:"",slackWebhookUrl:"",discordWebhookUrl:"",webhookUrl:"",smtpHost:"",smtpPort:587,smtpUser:"",smtpPass:"",smtpFrom:"",smtpTo:"",enabledChannels:{browser:!0,slack:!0,discord:!0,webhook:!0,email:!0},historyRetentionHours:24,logBufferSize:2e3},QX=["authToken","smtpPass","slackWebhookUrl","discordWebhookUrl","webhookUrl"];$u=null});var iY=S((pWe,S$e)=>{S$e.exports={name:"pm2",preferGlobal:!0,version:"7.0.3",engines:{node:">=18.0.0"},directories:{bin:"./bin",lib:"./lib",example:"./examples"},author:{name:"Strzelewicz Alexandre",email:"alex@edgecraft.io <Pour ce Nouveau Monde>",url:"https://pm2.io"},maintainers:[{name:"Alexandre Strzelewicz",email:"alexandre@pm2.io"}],contributors:["Mathilde Tuffier","Antoine Bluchet","Alex Kocharin","Antoine Bluchet","Subhash Burramsetty","Valentin Marchaud","Valentin Touffet","Florian Hermouet-Joscht","Vincent Vallet","Joni Shkurti","Jun Tjatse","Xu Jingxin","Ben Postlethwaite","Devo.ps","Bret Copeland","John Hurliman","TruongSinh Tran-Nguyen","Michael Hueuberger","Chris Wiggins"],homepage:"http://pm2.keymetrics.io/",description:"Production process manager for Node.JS applications with a built-in load balancer.",main:"index.js",types:"types/index.d.ts",scripts:{"test:unit":"bash test/unit.sh","test:e2e":"bash test/e2e.sh",test:"bash test/unit.sh && bash test/e2e.sh","test:parallel":"bash test/docker-parallel.sh","test:bpm":"mocha 'modules/pm2-io-bpm/test/**/*.spec.js' --exit --timeout 10000","test:axon-rpc":"mocha 'modules/pm2-axon-rpc/test/' --reporter spec --exit","test:axon":"bash modules/pm2-axon/test/run modules/pm2-axon/test/test.*.js","test:io-agent":"mocha 'modules/pm2-io-agent/test/units/*.mocha.js' --reporter spec --exit","test:windows":"bash test/windows.sh"},keywords:["cli","fault tolerant","sysadmin","tools","pm2","logs","log","json","express","hapi","kraken","reload","load balancer","lb","load-balancer","kubernetes","k8s","pm2-docker","runtime","source maps","graceful","microservice","programmatic","harmony","node-pm2","production","keymetrics","node.js monitoring","strong-pm","deploy","deployment","daemon","supervisor","supervisord","nodemon","pm2.io","ghost","ghost production","monitoring","keymetrics","process manager","forever","profiling","probes","apm","container","forever-monitor","keep process alive","process configuration","clustering","cluster cli","cluster","docker","cron","devops","dev ops"],bin:{pm2:"bin/pm2","pm2-dev":"bin/pm2-dev","pm2-docker":"bin/pm2-docker","pm2-runtime":"bin/pm2-runtime"},dependencies:{"@pm2/blessed":"0.1.81","@pm2/js-api":"0.8.1","@pm2/pm2-version-check":"1.0.4",amp:"0.3.1","amp-message":"0.1.2",ansis:"4.0.0-node10",async:"3.2.6",chokidar:"3.6.0","cli-tableau":"2.0.1",commander:"2.15.1",croner:"4.1.97",dayjs:"1.11.15",debug:"4.4.3",eventemitter2:"6.4.9","fast-json-patch":"3.1.1","js-yaml":"4.3.0",pidusage:"4.0.1","pm2-deploy":"1.0.2","proxy-agent":"6.5.0",semver:"7.7.2",tx2:"1.0.5",ws:"8.21.0"},overrides:{debug:"4.4.3"},devDependencies:{express:"^4.21.0",mocha:"^11.7.0",should:"^13.2.3"},bugs:{url:"https://github.com/Unitech/pm2/issues"},repository:{type:"git",url:"git://github.com/Unitech/pm2.git"},license:"AGPL-3.0"}});var aA=S((dWe,E$e)=>{E$e.exports={name:"pm2-orbit",version:"1.4.0",files:["dist/","dist-ui/","bin/"],description:"High-performance PM2 monitoring dashboard \u2014 event-driven, 1000+ processes, < 150KB",main:"dist/server.js",bin:{"pm2-orbit":"bin/pm2-orbit.js"},scripts:{"dev:ui":"cd ui && vite","dev:server":"tsx watch src/server.ts",dev:'concurrently -k -n ui,server -c blue,green "npm:dev:ui" "npm:dev:server"',build:"node build.js",start:"node dist/server.js",lint:"tsc --noEmit",typecheck:"tsc --noEmit && cd ui && tsc --noEmit",test:"vitest run","test:watch":"vitest","test:e2e":"vitest --config vitest.e2e.config.ts",prepare:"husky",prepublishOnly:"npm run build",postinstall:`node -e "try{require.resolve('pm2')}catch{console.log('\\n \u2139 Install pm2 for process monitoring: npm install -g pm2\\n')}"`},engines:{node:">=18"},dependencies:{"@fastify/compress":"^9","@fastify/cors":"^11","@fastify/helmet":"^13","@fastify/rate-limit":"^11","@fastify/static":"^9.1.3",fastify:"^5",mri:"^1.2",open:"^10",systeminformation:"^5.31.11",ws:"^8"},optionalDependencies:{nodemailer:"^9.0.1"},peerDependencies:{pm2:"^7"},peerDependenciesMeta:{pm2:{optional:!0}},devDependencies:{"@tailwindcss/postcss":"^4","@testing-library/react":"^14","@types/node":"^26.0.1","@types/nodemailer":"^8.0.1","@types/ws":"^8.18.1","@vitejs/plugin-react":"^4",autoprefixer:"^10",concurrently:"^8",esbuild:"^0.25",husky:"^9","lint-staged":"^15",postcss:"^8",tailwindcss:"^4",tsx:"^4",typescript:"^5",vite:"^6",vitest:"^3"},keywords:["pm2","monitoring","dashboard","devops","nodejs","react"],license:"MIT"}});var rY={};qs(rY,{registerHealthRoutes:()=>C$e});function T$e(e,t){switch(e){case"browser":return!0;case"slack":return!!t.slackWebhookUrl;case"discord":return!!t.discordWebhookUrl;case"webhook":return!!t.webhookUrl;case"email":return!!t.smtpHost&&!!t.smtpFrom&&!!t.smtpTo}}async function C$e(e,t){e.get("/api/health",async()=>{let i="unknown";try{i=iY().version}catch{try{i=require("pm2/package.json").version}catch{}}return{status:"ok",uptime:process.uptime(),version:aA().version,processes:(await t.bridge.list()).length,nodeVersion:process.version,pm2Version:i}}),e.get("/api/ping",async()=>"pong"),e.get("/api/system",async()=>{let{readSystem:i}=await Promise.resolve().then(()=>(Jf(),RR));return i()}),e.get("/api/settings",async()=>eY()),e.post("/api/settings/test-webhook",async(i,r)=>{let{url:n,type:s}=i.body;if(!n)return r.code(400).send({error:"URL is required"});try{let a=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s==="slack"?{text:"PM2 Orbit test notification"}:s==="discord"?{content:"PM2 Orbit test notification"}:{message:"PM2 Orbit test notification",type:"test"})});return{success:a.ok,status:a.status}}catch(o){return{success:!1,error:o.message}}}),e.get("/api/channels",async()=>{let i=vv(),r=["browser","slack","discord","webhook","email"],n={};for(let s of r){let o=T$e(s,i),a=i.enabledChannels[s]!==!1;n[s]={configured:o,enabled:a}}return n}),e.put("/api/settings",async(i,r)=>{let n=i.body;if(!n||typeof n!="object")return r.code(400).send({error:"Invalid request body"});let s=["theme","authToken","slackWebhookUrl","discordWebhookUrl","webhookUrl","smtpHost","smtpPort","smtpUser","smtpPass","smtpFrom","smtpTo","enabledChannels","historyRetentionHours","logBufferSize"],o={};for(let c of s)c in n&&(o[c]=n[c]);let a=tY(o);return bv(a),{success:!0,settings:a}})}var nY=fr(()=>{"use strict";oA()});function sY(e){return e.replace(/\.\.(\/|\\)/g,"").replace(/[/\\]/g,"_").replace(/\0/g,"").replace(/\s+/g,"_").replace(/^_+|_+$/g,"").substring(0,128)}function Qo(e){if(!e||typeof e!="string")return null;let t=parseInt(e,10);return isNaN(t)||t<0||!Number.isSafeInteger(t)?null:t}function oY(e){if(!e||typeof e!="object")return null;let t=e;if(typeof t.id!="string"||!t.id||typeof t.metric!="string"||!O$e.includes(t.metric)||typeof t.operator!="string"||!P$e.includes(t.operator)||typeof t.threshold!="number"||isNaN(t.threshold))return null;let i=[];if(Array.isArray(t.channels))for(let r of t.channels)typeof r=="string"&&A$e.includes(r)&&i.push(r);return{id:t.id,scope:R$e.includes(t.scope)?t.scope:"process",metric:t.metric,operator:t.operator,threshold:t.threshold,severity:["info","warning","critical"].includes(t.severity)?t.severity:"warning",...typeof t.processId=="number"?{processId:t.processId}:{},...typeof t.processName=="string"?{processName:t.processName}:{},enabled:t.enabled!==!1,channels:i,...typeof t.webhookUrl=="string"?{webhookUrl:t.webhookUrl}:{},...typeof t.slackWebhook=="string"?{slackWebhook:t.slackWebhook}:{},...typeof t.discordWebhook=="string"?{discordWebhook:t.discordWebhook}:{},...typeof t.emailTo=="string"?{emailTo:t.emailTo}:{}}}var O$e,R$e,P$e,A$e,Bu=fr(()=>{"use strict";O$e=["cpu","memory","restarts","status","systemCpu","systemMemory","systemLoad"],R$e=["process","system"],P$e=[">","<","==",">=","<="],A$e=["browser","webhook","slack","discord","email"]});var cY={};qs(cY,{registerProcessRoutes:()=>k$e});async function k$e(e,t){e.get("/api/processes",async()=>t.bridge.list()),e.get("/api/processes/:id/env",async i=>{let{id:r}=i.params,n=Qo(r);if(n===null)return{};try{return Br?new Promise(s=>{Br.list((o,a)=>{if(o)return s({});let c=a.find(f=>f.pm_id===n);if(!c)return s({});let l=c.pm2_env||{},u={},p=new Set(["PATH","PATHEXT","SYSTEMROOT","SYSTEMDRIVE","WINDIR","TEMP","TMP","USERPROFILE","USERNAME","USERDOMAIN","USERDOMAIN_ROAMINGPROFILE","PROCESSOR_ARCHITECTURE","PROCESSOR_IDENTIFIER","PROCESSOR_LEVEL","PROCESSOR_REVISION","PROGRAMDATA","PROGRAMFILES","PROGRAMW6432","COMMONPROGRAMFILES","COMMONPROGRAMW6432","COMPUTERNAME","COMSPEC","DRIVERDATA","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","LOGONSERVER","NUMBER_OF_PROCESSORS","ONEDRIVE","OS","PSMODULEPATH","PUBLIC","SESSIONNAME","ALLUSERSPROFILE","APPDATA","COLORTERM","LANG","TERM","TERM_PROGRAM","TERM_PROGRAM_VERSION","ZES_ENABLE_SYSMAN","ZED_TERM","ZED_ENVIRONMENT","PM2_USAGE","PM2_JSON_PROCESSING"]);for(let[f,d]of Object.entries(l))typeof d=="string"&&!p.has(f)&&!f.startsWith("MIMOCODE_")&&!f.startsWith("FPS_BROWSER_")&&!f.startsWith("EFC_")&&(u[f]=d);s(u)})}):{}}catch{return{}}}),e.post("/api/processes/:id/action",async(i,r)=>{let{id:n}=i.params,s=Qo(n);if(s===null)return r.code(400).send({error:"Invalid process ID"});let o=i.body,a=typeof o?.action=="string"?o.action:"",c=typeof o?.instances=="number"?o.instances:void 0;if(!a||!aY.includes(a))return r.code(400).send({error:`Invalid action. Must be one of: ${aY.join(", ")}`});try{if(!Br)return r.code(500).send({error:"PM2 not available"});if(a==="scale"){let u=await new Promise((p,f)=>{Br.list((d,h)=>{if(d)return f(d);let m=h.find(g=>g.pm_id===s);if(!m)return f(new Error("Process not found"));p(m.name)})});return await new Promise((p,f)=>{Br.scale(u,c!==void 0?String(c):"+1",d=>{d?f(d):p()})}),{success:!0}}let l={restart:u=>Br.restart(s,u),stop:u=>Br.stop(s,u),start:u=>Br.restart(s,u),reload:u=>Br.reload(s,u),delete:u=>Br.delete(s,u),flush:u=>Br.flush(s,u)}[a];return l?(await new Promise((u,p)=>{l(f=>{f?p(f):u()})}),{success:!0}):r.code(400).send({error:`Unknown action: ${a}`})}catch(l){return r.code(500).send({error:l.message})}})}var Br,aY,lY=fr(()=>{"use strict";Bu();Br=null;try{Br=require("pm2")}catch{}aY=["restart","stop","start","reload","delete","scale","flush"]});var uY={};qs(uY,{registerHistoryRoutes:()=>I$e});async function I$e(e,t){e.get("/api/history/:id",async(i,r)=>{let{id:n}=i.params,{hours:s}=i.query,o=Qo(n);if(o===null)return r.code(400).send({error:"Invalid process ID"});if(!t.persistence)return r.code(503).send({error:"Persistence not available"});let a=s?parseInt(s,10):24;return isNaN(a)||a<1||a>168?r.code(400).send({error:"Invalid hours parameter (1-168)"}):t.persistence.getProcessHistory(o,a)}),e.get("/api/history/system",async(i,r)=>{let{hours:n}=i.query;if(!t.persistence)return r.code(503).send({error:"Persistence not available"});let s=n?parseInt(n,10):24;return isNaN(s)||s<1||s>168?r.code(400).send({error:"Invalid hours parameter (1-168)"}):t.persistence.getSystemHistory(s)})}var pY=fr(()=>{"use strict";Bu()});var dY={};qs(dY,{registerAlertRoutes:()=>L$e});async function L$e(e,t){e.get("/api/alerts",async()=>t.alerts.getRules()),e.post("/api/alerts",async(i,r)=>{let n=oY(i.body);return n?(t.alerts.addRule(n),{success:!0}):r.code(400).send({error:"Invalid alert rule. Required: id (string), metric (cpu|memory|restarts|status), operator (>|<|==|>=|<=), threshold (number)"})}),e.delete("/api/alerts/:id",async(i,r)=>{let{id:n}=i.params;return!n||typeof n!="string"||n.length===0?r.code(400).send({error:"Invalid rule ID"}):(t.alerts.removeRule(n),{success:!0})}),e.put("/api/alerts/:id",async(i,r)=>{let{id:n}=i.params;if(!n||typeof n!="string"||n.length===0)return r.code(400).send({error:"Invalid rule ID"});let s=i.body;if(!s||typeof s!="object")return r.code(400).send({error:"Invalid request body"});let o=["scope","metric","operator","threshold","severity","processId","processName","enabled","channels","cooldownMs"],a=["cpu","memory","restarts","status","systemCpu","systemMemory","systemLoad"],c=[">","<","==",">=","<="],l=["info","warning","critical"],u={};for(let p of o)if(p in s){let f=s[p];if(p==="metric"&&!a.includes(f)||p==="operator"&&!c.includes(f)||p==="severity"&&!l.includes(f)||p==="threshold"&&typeof f!="number"||p==="processId"&&typeof f!="number"||p==="enabled"&&typeof f!="boolean")continue;u[p]=f}return Object.keys(u).length===0?r.code(400).send({error:"No valid fields to update"}):(t.alerts.updateRule(n,u),{success:!0})}),e.get("/api/alerts/history",async()=>t.alerts.getHistory()),e.delete("/api/alerts/history",async()=>(t.alerts.clearHistory(),{success:!0}))}var fY=fr(()=>{"use strict";Bu()});function gY(e,t,i){let r=[],n=!1,s="",o="",a={},c=null;function l(y){if(i){if(y==="out"&&i.out)return i.out;if(y==="err"&&i.err)return i.err}let b=process.env.HOME||process.env.USERPROFILE||"",v=mY.default.join(b,".pm2","logs",sY(t)),x=`${v}-${y}-${e}.log`;if(Ms.default.existsSync(x))return x;if(y==="err"){let C=`${v}-error-${e}.log`;if(Ms.default.existsSync(C))return C}let _=[`${v}-${y}.log`];y==="err"&&_.push(`${v}-error.log`);for(let C=0;C<16;C++)_.push(`${v}-${y}-${C}.log`),y==="err"&&_.push(`${v}-error-${C}.log`);for(let C of _)if(Ms.default.existsSync(C))return C;return _[0]}function u(y,b){try{if(!Ms.default.existsSync(y))return;let v=Ms.default.statSync(y),x=a[y]||0;if(v.size<x&&(a[y]=0,c=null),v.size<=(a[y]||0))return;let _=Ms.default.openSync(y,"r"),C=Buffer.alloc(v.size-(a[y]||0));Ms.default.readSync(_,C,0,C.length,a[y]||0),Ms.default.closeSync(_),a[y]=v.size;let E=C.toString("utf-8");if(c!==null&&(E=c+E,c=null),!E.endsWith(`
884
+ Invalid`)}},FromEmailAddress:"invalid@invalid",Destination:{ToAddresses:["invalid@invalid"]}};return this.getRegion(()=>{let s=new this.ses.SendEmailCommand(n);this.ses.sesClient.send(s).then(()=>r(null)).catch(a=>r(a))}),i}};PX.exports=JP});var NX=S((U6e,fv)=>{"use strict";var Vqe=KK(),LX=Hi(),Wqe=mX(),Gqe=bX(),Kqe=_X(),Xqe=EX(),Yqe=CX(),Jqe=AX(),Qqe=pr(),Zqe=ah(),kX=fn(),e$e=(process.env.ETHEREAL_API||"https://api.nodemailer.com").replace(/\/+$/,""),t$e=(process.env.ETHEREAL_WEB||"https://ethereal.email").replace(/\/+$/,""),IX=(process.env.ETHEREAL_API_KEY||"").replace(/\s*/g,"")||null,i$e=["true","yes","y","1"].includes((process.env.ETHEREAL_CACHE||"yes").toString().trim().toLowerCase()),mh=!1;fv.exports.createTransport=function(e,t){let i;if(typeof e=="object"&&typeof e.send!="function"||typeof e=="string"&&/^(smtps?|direct):/i.test(e)){let r=typeof e=="string"?e:e.url;if(r?i=LX.parseConnectionUrl(r):i=e,i.pool)e=new Wqe(i);else if(i.sendmail)e=new Kqe(i);else if(i.streamTransport)e=new Xqe(i);else if(i.jsonTransport)e=new Yqe(i);else if(i.SES){if(i.SES.ses&&i.SES.aws){let n=new Error("Using legacy SES configuration, expecting @aws-sdk/client-sesv2, see https://nodemailer.com/transports/ses/");throw n.code=Qqe.ECONFIG,n}e=new Jqe(i)}else e=new Gqe(i)}return new Vqe(e,i,t)};fv.exports.createTestAccount=function(e,t){let i;if(!t&&typeof e=="function"&&(t=e,e=!1),t||(i=new Promise((l,u)=>{t=LX.callbackPromise(l,u)})),i$e&&mh)return setImmediate(()=>t(null,mh)),i;e=e||e$e;let r=[],n=0,s={},o={requestor:kX.name,version:kX.version};IX&&(s.Authorization="Bearer "+IX);let a={contentType:"application/json",method:"POST",headers:s,body:Buffer.from(JSON.stringify(o))};/^https:/i.test(e)&&(a.tls={rejectUnauthorized:!0});let c=Zqe(e+"/user",a);return c.on("readable",()=>{let l;for(;(l=c.read())!==null;)r.push(l),n+=l.length}),c.once("error",l=>t(l)),c.once("end",()=>{let l=Buffer.concat(r,n),u;try{u=JSON.parse(l.toString())}catch(p){return t(p)}if(u.status!=="success"||u.error)return t(new Error(u.error||"Request failed"));delete u.status,mh=u,t(null,mh)}),i};fv.exports.getTestMessageUrl=function(e){if(!e||!e.response)return!1;let t=new Map,i=e.response.toString();if(i.length>2&&i.charAt(i.length-1)==="]"){let r=i.indexOf("[",i.lastIndexOf("]",i.length-2)+1);r>=0&&r<i.length-2&&i.substring(r+1,i.length-1).replace(/\b([A-Z0-9]+)=([^\s]+)/g,(s,o,a)=>{t.set(o,a)})}return t.has("STATUS")&&t.has("MSGID")?(mh.web||t$e)+"/message/"+t.get("MSGID"):!1}});var MX={};qs(MX,{isEmailConfigured:()=>s$e,sendEmail:()=>n$e});function r$e(){if(hv)return hv;if(!mv)return null;let e=process.env.SMTP_HOST,t=parseInt(process.env.SMTP_PORT||"587",10),i=process.env.SMTP_USER,r=process.env.SMTP_PASS,n=process.env.SMTP_FROM;return!e||!n?null:(hv=mv.createTransport({host:e,port:t,secure:t===465,auth:i&&r?{user:i,pass:r}:void 0}),hv)}async function n$e(e,t){let i=r$e(),r=process.env.SMTP_TO;if(!i||!r)return!1;try{return await i.sendMail({from:process.env.SMTP_FROM,to:r,subject:`[PM2 Orbit] ${e}`,text:t,html:`<p>${t}</p>`}),!0}catch{return!1}}function s$e(){return!!mv&&!!process.env.SMTP_HOST&&!!process.env.SMTP_FROM&&!!process.env.SMTP_TO}var mv,hv,DX=fr(()=>{"use strict";mv=null;try{mv=NX()}catch{}hv=null});var UX=S((aWe,gh)=>{"use strict";var{FifoMap:a$e}=km(),c$e=/^[!#$%&'*+\-.^\w`|~]+$/u;function l$e(e){if(c$e.test(e)===!1)throw new TypeError("Fieldname contains invalid characters.")}function zX(e){e=e.trim().toLowerCase();let t=[];if(e.length!==0)if(e.indexOf(",")===-1)t.push(e);else{let i=e.length,r=0,n=0,s;for(r;r<i;++r)s=e[r],s===" "?n=r+1:s===","&&(n!==r&&t.push(e.slice(n,r)),n=r+1);n!==r&&t.push(e.slice(n,r))}return t}function ZP(e){let t=new a$e(1e3);return l$e(e),function(i){let r=i.getHeader("Vary");if(!r){i.header("Vary",e);return}if(r==="*")return;if(e==="*"){i.header("Vary","*");return}if(Array.isArray(r)&&(r=r.join(", ")),t.get(r)===void 0){let s=zX(r);s.indexOf("*")!==-1?t.set(r,"*"):s.indexOf(e.toLowerCase())===-1?t.set(r,r+", "+e):t.set(r,null)}let n=t.get(r);n!==null&&i.header("Vary",n)}}gh.exports.createAddFieldnameToVary=ZP;gh.exports.addOriginToVaryHeader=ZP("Origin");gh.exports.addAccessControlRequestHeadersToVaryHeader=ZP("Access-Control-Request-Headers");gh.exports.parse=zX});var KX=S((cWe,yv)=>{"use strict";var u$e=Sd(),{addAccessControlRequestHeadersToVaryHeader:p$e,addOriginToVaryHeader:d$e}=UX(),tA={origin:"*",methods:"GET,HEAD,POST",hook:"onRequest",preflightContinue:!1,optionsSuccessStatus:204,credentials:!1,exposedHeaders:null,allowedHeaders:null,maxAge:null,preflight:!0,strictPreflight:!0},f$e=["onRequest","preParsing","preValidation","preHandler","preSerialization","onSend"],eA=["preSerialization","preParsing","onSend"];function WX(e,t){f$e.indexOf(e)===-1&&t(new TypeError("@fastify/cors: Invalid hook option provided."))}function h$e(e,t,i){e.decorateRequest("corsPreflightEnabled",!1);let r=!0,n;if(typeof t=="function")HX(t,e,{hook:tA.hook},i);else if(t.delegator){let{delegator:s,...o}=t;HX(s,e,o,i)}else{let s=gv(t);WX(s.hook,i),eA.indexOf(s.hook)!==-1?e.addHook(s.hook,function(a,c,l,u){yh(e,s,a,c,u)}):e.addHook(s.hook,function(a,c,l){yh(e,s,a,c,l)})}t.logLevel!==void 0&&(n=t.logLevel),t.hideOptionsRoute!==void 0&&(r=t.hideOptionsRoute),e.options("*",{schema:{hide:r},logLevel:n},(s,o)=>{if(!s.corsPreflightEnabled){o.callNotFound();return}o.send()}),i()}function HX(e,t,i,r){let n=i?.hook||tA.hook;WX(n,r),e.length===2?eA.indexOf(n)!==-1?t.addHook(n,function(o,a,c,l){VX(e,t,o,a,l)}):t.addHook(n,function(o,a,c){VX(e,t,o,a,c)}):eA.indexOf(n)!==-1?t.addHook(n,function(o,a,c,l){let u=e(o);if(u&&typeof u.then=="function"){u.then(p=>yh(t,gv(p,!0),o,a,l)).catch(l);return}l(new Error("Invalid CORS origin option"))}):t.addHook(n,function(o,a,c){let l=e(o);if(l&&typeof l.then=="function"){l.then(u=>yh(t,gv(u,!0),o,a,c)).catch(c);return}c(new Error("Invalid CORS origin option"))})}function VX(e,t,i,r,n){e(i,(s,o)=>{s?n(s):yh(t,gv(o,!0),i,r,n)})}function gv(e,t){let i={...tA,...e};return Array.isArray(e.origin)&&e.origin.indexOf("*")!==-1&&(i.origin="*"),Number.isInteger(i.cacheControl)?i.cacheControl=`max-age=${i.cacheControl}`:typeof i.cacheControl!="string"&&(i.cacheControl=null),i.dynamic=t||!1,i}function yh(e,t,i,r,n){let s={...t,...i.routeOptions.config?.cors};(typeof s.origin!="string"&&s.origin!==!1||s.dynamic)&&d$e(r),(typeof s.origin=="function"?y$e(e,s.origin):(a,c)=>c(null,s.origin))(i,(a,c)=>{if(a!==null)return n(a);if(c===!1||i.routeOptions.config?.cors===!1)return n();if(!c)return n(new Error("Invalid CORS origin option"));if(m$e(i,r,c,s),i.raw.method==="OPTIONS"&&s.preflight===!0){if(s.strictPreflight===!0&&(!i.headers.origin||!i.headers["access-control-request-method"])){r.status(400).type("text/plain").send("Invalid Preflight Request");return}if(i.corsPreflightEnabled=!0,g$e(i,r,s),!s.preflightContinue){r.code(s.optionsSuccessStatus).header("Content-Length","0").send();return}}return n()})}function m$e(e,t,i,r){let n=x$e(e.headers.origin,i);n&&t.header("Access-Control-Allow-Origin",n),r.credentials&&t.header("Access-Control-Allow-Credentials","true"),r.exposedHeaders!==null&&t.header("Access-Control-Expose-Headers",Array.isArray(r.exposedHeaders)?r.exposedHeaders.join(", "):r.exposedHeaders)}function g$e(e,t,i){if(t.header("Access-Control-Allow-Methods",Array.isArray(i.methods)?i.methods.join(", "):i.methods),i.allowedHeaders===null){p$e(t);let r=e.headers["access-control-request-headers"];r!==void 0&&t.header("Access-Control-Allow-Headers",r)}else t.header("Access-Control-Allow-Headers",Array.isArray(i.allowedHeaders)?i.allowedHeaders.join(", "):i.allowedHeaders);i.maxAge!==null&&t.header("Access-Control-Max-Age",String(i.maxAge)),i.cacheControl&&t.header("Cache-Control",i.cacheControl)}function y$e(e,t){return function(i,r){let n=t.call(e,i.headers.origin,r);n&&typeof n.then=="function"&&n.then(s=>r(null,s),r)}}function x$e(e,t){return typeof t=="string"?t:GX(e,t)?e:!1}function GX(e,t){if(Array.isArray(t)){for(let i=0;i<t.length;++i)if(GX(e,t[i]))return!0;return!1}else return typeof t=="string"?e===t:t instanceof RegExp?(t.lastIndex=0,t.test(e)):!!t}var iA=u$e(h$e,{fastify:"5.x",name:"@fastify/cors"});yv.exports=iA;yv.exports.fastifyCors=iA;yv.exports.default=iA});function ZX(){try{if(mn.default.existsSync(rA))return Buffer.from(mn.default.readFileSync(rA,"utf-8"),"hex")}catch{}let e=(0,hc.randomBytes)(32);try{mn.default.existsSync(Fu)||mn.default.mkdirSync(Fu,{recursive:!0}),mn.default.writeFileSync(rA,e.toString("hex"),{mode:384})}catch{}return e}function v$e(e){if(!e)return"";try{let t=ZX(),i=(0,hc.randomBytes)(16),r=(0,hc.createCipheriv)("aes-256-cbc",t,i),n=Buffer.concat([r.update(e,"utf8"),r.final()]);return i.toString("hex")+":"+n.toString("hex")}catch{return e}}function b$e(e){if(!e||!e.includes(":"))return e;try{let t=ZX(),[i,r]=e.split(":"),n=Buffer.from(i,"hex"),s=Buffer.from(r,"hex"),o=(0,hc.createDecipheriv)("aes-256-cbc",t,n);return Buffer.concat([o.update(s),o.final()]).toString("utf8")}catch{return e}}function sA(){if($u)return $u;try{if(mn.default.existsSync(nA)){let e=mn.default.readFileSync(nA,"utf-8"),t=JSON.parse(e),i={...JX,...t};for(let r of QX)i[r]&&(i[r]=b$e(i[r]));return $u=i,i}}catch{}return $u={...JX},$u}function w$e(){$u=null}function _$e(e){try{mn.default.existsSync(Fu)||mn.default.mkdirSync(Fu,{recursive:!0});let t={...e};for(let i of QX)t[i]&&(t[i]=v$e(t[i]));mn.default.writeFileSync(nA,JSON.stringify(t,null,2),{mode:384}),w$e()}catch{}}function vv(){return sA()}function eY(){let e=sA();return{...e,authToken:e.authToken?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":"",smtpPass:e.smtpPass?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":""}}function tY(e){let i={...sA()};for(let[r,n]of Object.entries(e))(r==="authToken"||r==="smtpPass")&&(n==="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"||n==="")||(i[r]=n);return _$e(i),i}function bv(e){e.authToken&&(process.env.PM2_ORBIT_TOKEN=e.authToken),e.slackWebhookUrl&&(process.env.SLACK_WEBHOOK_URL=e.slackWebhookUrl),e.discordWebhookUrl&&(process.env.DISCORD_WEBHOOK_URL=e.discordWebhookUrl),e.webhookUrl&&(process.env.WEBHOOK_URL=e.webhookUrl),e.smtpHost&&(process.env.SMTP_HOST=e.smtpHost),e.smtpPort&&(process.env.SMTP_PORT=String(e.smtpPort)),e.smtpUser&&(process.env.SMTP_USER=e.smtpUser),e.smtpPass&&(process.env.SMTP_PASS=e.smtpPass),e.smtpFrom&&(process.env.SMTP_FROM=e.smtpFrom),e.smtpTo&&(process.env.SMTP_TO=e.smtpTo),e.theme&&(process.env.PM2_ORBIT_THEME=e.theme),e.historyRetentionHours&&(process.env.PM2_ORBIT_RETENTION_HOURS=String(e.historyRetentionHours)),e.logBufferSize&&(process.env.PM2_ORBIT_LOG_BUFFER=String(e.logBufferSize));for(let t of Object.keys(e.enabledChannels))process.env[`NOTIFY_${t.toUpperCase()}_ENABLED`]=e.enabledChannels[t]?"1":"0"}var mn,xv,hc,Fu,nA,rA,JX,QX,$u,oA=fr(()=>{"use strict";mn=dt(require("fs")),xv=dt(require("path")),hc=require("crypto"),Fu=xv.default.join(process.env.HOME||process.env.USERPROFILE||"",".pm2-orbit"),nA=xv.default.join(Fu,"settings.json"),rA=xv.default.join(Fu,".key"),JX={theme:"dark",port:9823,authToken:"",slackWebhookUrl:"",discordWebhookUrl:"",webhookUrl:"",smtpHost:"",smtpPort:587,smtpUser:"",smtpPass:"",smtpFrom:"",smtpTo:"",enabledChannels:{browser:!0,slack:!0,discord:!0,webhook:!0,email:!0},historyRetentionHours:24,logBufferSize:2e3},QX=["authToken","smtpPass","slackWebhookUrl","discordWebhookUrl","webhookUrl"];$u=null});var iY=S((pWe,S$e)=>{S$e.exports={name:"pm2",preferGlobal:!0,version:"7.0.3",engines:{node:">=18.0.0"},directories:{bin:"./bin",lib:"./lib",example:"./examples"},author:{name:"Strzelewicz Alexandre",email:"alex@edgecraft.io <Pour ce Nouveau Monde>",url:"https://pm2.io"},maintainers:[{name:"Alexandre Strzelewicz",email:"alexandre@pm2.io"}],contributors:["Mathilde Tuffier","Antoine Bluchet","Alex Kocharin","Antoine Bluchet","Subhash Burramsetty","Valentin Marchaud","Valentin Touffet","Florian Hermouet-Joscht","Vincent Vallet","Joni Shkurti","Jun Tjatse","Xu Jingxin","Ben Postlethwaite","Devo.ps","Bret Copeland","John Hurliman","TruongSinh Tran-Nguyen","Michael Hueuberger","Chris Wiggins"],homepage:"http://pm2.keymetrics.io/",description:"Production process manager for Node.JS applications with a built-in load balancer.",main:"index.js",types:"types/index.d.ts",scripts:{"test:unit":"bash test/unit.sh","test:e2e":"bash test/e2e.sh",test:"bash test/unit.sh && bash test/e2e.sh","test:parallel":"bash test/docker-parallel.sh","test:bpm":"mocha 'modules/pm2-io-bpm/test/**/*.spec.js' --exit --timeout 10000","test:axon-rpc":"mocha 'modules/pm2-axon-rpc/test/' --reporter spec --exit","test:axon":"bash modules/pm2-axon/test/run modules/pm2-axon/test/test.*.js","test:io-agent":"mocha 'modules/pm2-io-agent/test/units/*.mocha.js' --reporter spec --exit","test:windows":"bash test/windows.sh"},keywords:["cli","fault tolerant","sysadmin","tools","pm2","logs","log","json","express","hapi","kraken","reload","load balancer","lb","load-balancer","kubernetes","k8s","pm2-docker","runtime","source maps","graceful","microservice","programmatic","harmony","node-pm2","production","keymetrics","node.js monitoring","strong-pm","deploy","deployment","daemon","supervisor","supervisord","nodemon","pm2.io","ghost","ghost production","monitoring","keymetrics","process manager","forever","profiling","probes","apm","container","forever-monitor","keep process alive","process configuration","clustering","cluster cli","cluster","docker","cron","devops","dev ops"],bin:{pm2:"bin/pm2","pm2-dev":"bin/pm2-dev","pm2-docker":"bin/pm2-docker","pm2-runtime":"bin/pm2-runtime"},dependencies:{"@pm2/blessed":"0.1.81","@pm2/js-api":"0.8.1","@pm2/pm2-version-check":"1.0.4",amp:"0.3.1","amp-message":"0.1.2",ansis:"4.0.0-node10",async:"3.2.6",chokidar:"3.6.0","cli-tableau":"2.0.1",commander:"2.15.1",croner:"4.1.97",dayjs:"1.11.15",debug:"4.4.3",eventemitter2:"6.4.9","fast-json-patch":"3.1.1","js-yaml":"4.3.0",pidusage:"4.0.1","pm2-deploy":"1.0.2","proxy-agent":"6.5.0",semver:"7.7.2",tx2:"1.0.5",ws:"8.21.0"},overrides:{debug:"4.4.3"},devDependencies:{express:"^4.21.0",mocha:"^11.7.0",should:"^13.2.3"},bugs:{url:"https://github.com/Unitech/pm2/issues"},repository:{type:"git",url:"git://github.com/Unitech/pm2.git"},license:"AGPL-3.0"}});var aA=S((dWe,E$e)=>{E$e.exports={name:"pm2-orbit",version:"1.4.1",files:["dist/","dist-ui/","bin/"],description:"High-performance PM2 monitoring dashboard \u2014 event-driven, 1000+ processes, < 150KB",main:"dist/server.js",bin:{"pm2-orbit":"bin/pm2-orbit.js"},scripts:{"dev:ui":"cd ui && vite","dev:server":"tsx watch src/server.ts",dev:'concurrently -k -n ui,server -c blue,green "npm:dev:ui" "npm:dev:server"',build:"node build.js",start:"node dist/server.js",lint:"tsc --noEmit",typecheck:"tsc --noEmit && cd ui && tsc --noEmit",test:"vitest run","test:watch":"vitest","test:e2e":"vitest --config vitest.e2e.config.ts",prepare:"husky",prepublishOnly:"npm run build",postinstall:`node -e "try{require.resolve('pm2')}catch{console.log('\\n \u2139 Install pm2 for process monitoring: npm install -g pm2\\n')}"`},engines:{node:">=18"},dependencies:{"@fastify/compress":"^9","@fastify/cors":"^11","@fastify/helmet":"^13","@fastify/rate-limit":"^11","@fastify/static":"^9.1.3",fastify:"^5",mri:"^1.2",open:"^10",systeminformation:"^5.31.11",ws:"^8"},optionalDependencies:{nodemailer:"^9.0.1"},peerDependencies:{pm2:"^7"},peerDependenciesMeta:{pm2:{optional:!0}},devDependencies:{"@tailwindcss/postcss":"^4","@testing-library/react":"^14","@types/node":"^26.0.1","@types/nodemailer":"^8.0.1","@types/ws":"^8.18.1","@vitejs/plugin-react":"^4",autoprefixer:"^10",concurrently:"^8",esbuild:"^0.25",husky:"^9","lint-staged":"^15",postcss:"^8",tailwindcss:"^4",tsx:"^4",typescript:"^5",vite:"^6",vitest:"^3"},keywords:["pm2","monitoring","dashboard","devops","nodejs","react"],license:"MIT"}});var rY={};qs(rY,{registerHealthRoutes:()=>C$e});function T$e(e,t){switch(e){case"browser":return!0;case"slack":return!!t.slackWebhookUrl;case"discord":return!!t.discordWebhookUrl;case"webhook":return!!t.webhookUrl;case"email":return!!t.smtpHost&&!!t.smtpFrom&&!!t.smtpTo}}async function C$e(e,t){e.get("/api/health",async()=>{let i="unknown";try{i=iY().version}catch{try{i=require("pm2/package.json").version}catch{}}return{status:"ok",uptime:process.uptime(),version:aA().version,processes:(await t.bridge.list()).length,nodeVersion:process.version,pm2Version:i}}),e.get("/api/ping",async()=>"pong"),e.get("/api/system",async()=>{let{readSystem:i}=await Promise.resolve().then(()=>(Jf(),RR));return i()}),e.get("/api/settings",async()=>eY()),e.post("/api/settings/test-webhook",async(i,r)=>{let{url:n,type:s}=i.body;if(!n)return r.code(400).send({error:"URL is required"});try{let a=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s==="slack"?{text:"PM2 Orbit test notification"}:s==="discord"?{content:"PM2 Orbit test notification"}:{message:"PM2 Orbit test notification",type:"test"})});return{success:a.ok,status:a.status}}catch(o){return{success:!1,error:o.message}}}),e.get("/api/channels",async()=>{let i=vv(),r=["browser","slack","discord","webhook","email"],n={};for(let s of r){let o=T$e(s,i),a=i.enabledChannels[s]!==!1;n[s]={configured:o,enabled:a}}return n}),e.put("/api/settings",async(i,r)=>{let n=i.body;if(!n||typeof n!="object")return r.code(400).send({error:"Invalid request body"});let s=["theme","authToken","slackWebhookUrl","discordWebhookUrl","webhookUrl","smtpHost","smtpPort","smtpUser","smtpPass","smtpFrom","smtpTo","enabledChannels","historyRetentionHours","logBufferSize"],o={};for(let c of s)c in n&&(o[c]=n[c]);let a=tY(o);return bv(a),{success:!0,settings:a}})}var nY=fr(()=>{"use strict";oA()});function sY(e){return e.replace(/\.\.(\/|\\)/g,"").replace(/[/\\]/g,"_").replace(/\0/g,"").replace(/\s+/g,"_").replace(/^_+|_+$/g,"").substring(0,128)}function Qo(e){if(!e||typeof e!="string")return null;let t=parseInt(e,10);return isNaN(t)||t<0||!Number.isSafeInteger(t)?null:t}function oY(e){if(!e||typeof e!="object")return null;let t=e;if(typeof t.id!="string"||!t.id||typeof t.metric!="string"||!O$e.includes(t.metric)||typeof t.operator!="string"||!P$e.includes(t.operator)||typeof t.threshold!="number"||isNaN(t.threshold))return null;let i=[];if(Array.isArray(t.channels))for(let r of t.channels)typeof r=="string"&&A$e.includes(r)&&i.push(r);return{id:t.id,scope:R$e.includes(t.scope)?t.scope:"process",metric:t.metric,operator:t.operator,threshold:t.threshold,severity:["info","warning","critical"].includes(t.severity)?t.severity:"warning",...typeof t.processId=="number"?{processId:t.processId}:{},...typeof t.processName=="string"?{processName:t.processName}:{},enabled:t.enabled!==!1,channels:i,...typeof t.webhookUrl=="string"?{webhookUrl:t.webhookUrl}:{},...typeof t.slackWebhook=="string"?{slackWebhook:t.slackWebhook}:{},...typeof t.discordWebhook=="string"?{discordWebhook:t.discordWebhook}:{},...typeof t.emailTo=="string"?{emailTo:t.emailTo}:{}}}var O$e,R$e,P$e,A$e,Bu=fr(()=>{"use strict";O$e=["cpu","memory","restarts","status","systemCpu","systemMemory","systemLoad"],R$e=["process","system"],P$e=[">","<","==",">=","<="],A$e=["browser","webhook","slack","discord","email"]});var cY={};qs(cY,{registerProcessRoutes:()=>k$e});async function k$e(e,t){e.get("/api/processes",async()=>t.bridge.list()),e.get("/api/processes/:id/env",async i=>{let{id:r}=i.params,n=Qo(r);if(n===null)return{};try{return Br?new Promise(s=>{Br.list((o,a)=>{if(o)return s({});let c=a.find(f=>f.pm_id===n);if(!c)return s({});let l=c.pm2_env||{},u={},p=new Set(["PATH","PATHEXT","SYSTEMROOT","SYSTEMDRIVE","WINDIR","TEMP","TMP","USERPROFILE","USERNAME","USERDOMAIN","USERDOMAIN_ROAMINGPROFILE","PROCESSOR_ARCHITECTURE","PROCESSOR_IDENTIFIER","PROCESSOR_LEVEL","PROCESSOR_REVISION","PROGRAMDATA","PROGRAMFILES","PROGRAMW6432","COMMONPROGRAMFILES","COMMONPROGRAMW6432","COMPUTERNAME","COMSPEC","DRIVERDATA","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","LOGONSERVER","NUMBER_OF_PROCESSORS","ONEDRIVE","OS","PSMODULEPATH","PUBLIC","SESSIONNAME","ALLUSERSPROFILE","APPDATA","COLORTERM","LANG","TERM","TERM_PROGRAM","TERM_PROGRAM_VERSION","ZES_ENABLE_SYSMAN","ZED_TERM","ZED_ENVIRONMENT","PM2_USAGE","PM2_JSON_PROCESSING"]);for(let[f,d]of Object.entries(l))typeof d=="string"&&!p.has(f)&&!f.startsWith("MIMOCODE_")&&!f.startsWith("FPS_BROWSER_")&&!f.startsWith("EFC_")&&(u[f]=d);s(u)})}):{}}catch{return{}}}),e.post("/api/processes/:id/action",async(i,r)=>{let{id:n}=i.params,s=Qo(n);if(s===null)return r.code(400).send({error:"Invalid process ID"});let o=i.body,a=typeof o?.action=="string"?o.action:"",c=typeof o?.instances=="number"?o.instances:void 0;if(!a||!aY.includes(a))return r.code(400).send({error:`Invalid action. Must be one of: ${aY.join(", ")}`});try{if(!Br)return r.code(500).send({error:"PM2 not available"});if(a==="scale"){let u=await new Promise((p,f)=>{Br.list((d,h)=>{if(d)return f(d);let m=h.find(g=>g.pm_id===s);if(!m)return f(new Error("Process not found"));p(m.name)})});return await new Promise((p,f)=>{Br.scale(u,c!==void 0?String(c):"+1",d=>{d?f(d):p()})}),{success:!0}}let l={restart:u=>Br.restart(s,u),stop:u=>Br.stop(s,u),start:u=>Br.restart(s,u),reload:u=>Br.reload(s,u),delete:u=>Br.delete(s,u),flush:u=>Br.flush(s,u)}[a];return l?(await new Promise((u,p)=>{l(f=>{f?p(f):u()})}),{success:!0}):r.code(400).send({error:`Unknown action: ${a}`})}catch(l){return r.code(500).send({error:l.message})}})}var Br,aY,lY=fr(()=>{"use strict";Bu();Br=null;try{Br=require("pm2")}catch{}aY=["restart","stop","start","reload","delete","scale","flush"]});var uY={};qs(uY,{registerHistoryRoutes:()=>I$e});async function I$e(e,t){e.get("/api/history/:id",async(i,r)=>{let{id:n}=i.params,{hours:s}=i.query,o=Qo(n);if(o===null)return r.code(400).send({error:"Invalid process ID"});if(!t.persistence)return r.code(503).send({error:"Persistence not available"});let a=s?parseInt(s,10):24;return isNaN(a)||a<1||a>168?r.code(400).send({error:"Invalid hours parameter (1-168)"}):t.persistence.getProcessHistory(o,a)}),e.get("/api/history/system",async(i,r)=>{let{hours:n}=i.query;if(!t.persistence)return r.code(503).send({error:"Persistence not available"});let s=n?parseInt(n,10):24;return isNaN(s)||s<1||s>168?r.code(400).send({error:"Invalid hours parameter (1-168)"}):t.persistence.getSystemHistory(s)})}var pY=fr(()=>{"use strict";Bu()});var dY={};qs(dY,{registerAlertRoutes:()=>L$e});async function L$e(e,t){e.get("/api/alerts",async()=>t.alerts.getRules()),e.post("/api/alerts",async(i,r)=>{let n=oY(i.body);return n?(t.alerts.addRule(n),{success:!0}):r.code(400).send({error:"Invalid alert rule. Required: id (string), metric (cpu|memory|restarts|status), operator (>|<|==|>=|<=), threshold (number)"})}),e.delete("/api/alerts/:id",async(i,r)=>{let{id:n}=i.params;return!n||typeof n!="string"||n.length===0?r.code(400).send({error:"Invalid rule ID"}):(t.alerts.removeRule(n),{success:!0})}),e.put("/api/alerts/:id",async(i,r)=>{let{id:n}=i.params;if(!n||typeof n!="string"||n.length===0)return r.code(400).send({error:"Invalid rule ID"});let s=i.body;if(!s||typeof s!="object")return r.code(400).send({error:"Invalid request body"});let o=["scope","metric","operator","threshold","severity","processId","processName","enabled","channels","cooldownMs"],a=["cpu","memory","restarts","status","systemCpu","systemMemory","systemLoad"],c=[">","<","==",">=","<="],l=["info","warning","critical"],u={};for(let p of o)if(p in s){let f=s[p];if(p==="metric"&&!a.includes(f)||p==="operator"&&!c.includes(f)||p==="severity"&&!l.includes(f)||p==="threshold"&&typeof f!="number"||p==="processId"&&typeof f!="number"||p==="enabled"&&typeof f!="boolean")continue;u[p]=f}return Object.keys(u).length===0?r.code(400).send({error:"No valid fields to update"}):(t.alerts.updateRule(n,u),{success:!0})}),e.get("/api/alerts/history",async()=>t.alerts.getHistory()),e.delete("/api/alerts/history",async()=>(t.alerts.clearHistory(),{success:!0}))}var fY=fr(()=>{"use strict";Bu()});function gY(e,t,i){let r=[],n=!1,s="",o="",a={},c=null;function l(y){if(i){if(y==="out"&&i.out)return i.out;if(y==="err"&&i.err)return i.err}let b=process.env.HOME||process.env.USERPROFILE||"",v=mY.default.join(b,".pm2","logs",sY(t)),x=`${v}-${y}-${e}.log`;if(Ms.default.existsSync(x))return x;if(y==="err"){let C=`${v}-error-${e}.log`;if(Ms.default.existsSync(C))return C}let _=[`${v}-${y}.log`];y==="err"&&_.push(`${v}-error.log`);for(let C=0;C<16;C++)_.push(`${v}-${y}-${C}.log`),y==="err"&&_.push(`${v}-error-${C}.log`);for(let C of _)if(Ms.default.existsSync(C))return C;return _[0]}function u(y,b){try{if(!Ms.default.existsSync(y))return;let v=Ms.default.statSync(y),x=a[y]||0;if(v.size<x&&(a[y]=0,c=null),v.size<=(a[y]||0))return;let _=Ms.default.openSync(y,"r"),C=Buffer.alloc(v.size-(a[y]||0));Ms.default.readSync(_,C,0,C.length,a[y]||0),Ms.default.closeSync(_),a[y]=v.size;let E=C.toString("utf-8");if(c!==null&&(E=c+E,c=null),!E.endsWith(`
885
885
  `)){let R=E.lastIndexOf(`
886
886
  `);if(R>=0)c=E.slice(R+1),E=E.slice(0,R+1);else{c=E;return}}let T=E.split(`
887
887
  `);T.pop();let O=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORa-z]/g;for(let R of T){let k=R.replace(/\r$/,"").replace(O,"");k.length!==0&&r.push({ts:Date.now(),stream:b,message:k})}r.length>hY&&r.splice(0,r.length-hY)}catch{}}function p(){s=l("out"),o=l("err"),Tt.debug(`[tailer] processId=${e} name=${t} out=${s} err=${o}`),u(s,"stdout"),u(o,"stderr"),Tt.debug(`[tailer] buffer after init: ${r.length} entries`)}function f(){n||(u(s,"stdout"),u(o,"stderr"))}function d(){return r}function h(y){return y>=r.length?{entries:[],total:r.length}:y<=0?{entries:r.slice(),total:r.length}:{entries:r.slice(y),total:r.length}}function m(){n=!0}function g(){return n}return p(),{processId:e,processName:t,poll:f,getBuffer:d,getNewEntries:h,close:m,isClosed:g}}var Ms,mY,hY,yY=fr(()=>{"use strict";Ms=dt(require("fs")),mY=dt(require("path"));Bu();Ja();hY=parseInt(process.env.PM2_ORBIT_LOG_BUFFER||"2000",10)});function M$e(){xh||(xh=setInterval(()=>{for(let[,e]of zu)e.tailer.poll()},N$e))}function D$e(){xh!==null&&(clearInterval(xh),xh=null)}function xY(e,t,i){let r=zu.get(e);if(r)return r.refs++,r.tailer;let n=gY(e,t,i);return zu.set(e,{tailer:n,refs:1,name:t}),M$e(),n}function vY(e){let t=zu.get(e);t&&(t.refs--,t.refs<=0&&(t.tailer.close(),zu.delete(e),zu.size===0&&D$e()))}var N$e,zu,xh,bY=fr(()=>{"use strict";yY();N$e=2e3,zu=new Map,xh=null});var _Y={};qs(_Y,{registerLogRoutes:()=>j$e});async function j$e(e,t){e.get("/api/logs/:id",async(i,r)=>{let{id:n}=i.params,s=Qo(n);if(s===null)return r.code(400).send({error:"Invalid process ID"});let o=t.bridge,a=o.getLogBuffer(s),c=a.length;r.raw.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),r.raw.write(`retry: 2000
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm2-orbit",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "files": [
5
5
  "dist/",
6
6
  "dist-ui/",