@zuzjs/pm 0.0.12 → 0.0.13

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.
@@ -1 +1 @@
1
- import {d as d$1,e}from'./chunk-RDDVTRS6.js';import {spawn,exec}from'child_process';import y from'http';import S from'https';import W from'net';import R from'chokidar';import _ from'fs';import P from'os';import u from'path';import k from'ws';import E from'pidusage';function C(n,t){return new Promise(e=>{let o=(n.startsWith("https")?S:y).get(n,{timeout:t},i=>{e((i.statusCode??500)<500);});o.on("error",()=>e(false)),o.on("timeout",()=>{o.destroy(),e(false);});})}function $(n,t){let[e,r]=n.split(":"),o=Number(r);return new Promise(i=>{let a=W.createConnection({host:e,port:o},()=>{a.destroy(),i(true);});a.setTimeout(t),a.on("timeout",()=>{a.destroy(),i(false);}),a.on("error",()=>i(false));})}function F(n,t){return new Promise(e=>{let r=setTimeout(()=>e(false),t);exec(n,o=>{clearTimeout(r),e(!o);});})}async function b(n){let t=(n.timeoutSeconds??5)*1e3;switch(n.type){case "http":return C(n.target,t);case "tcp":return $(n.target,t);case "exec":return F(n.target,t);default:return false}}var m=5e3,L=16e3,d=1e3,A=5e3;async function N(n){return new Promise(t=>{W.createServer().once("error",()=>t(false)).once("listening",function(){this.close(()=>t(true));}).listen(n);})}async function D(n){if(await N(n))return;let t=P.platform()==="darwin"?`lsof -ti :${n} | xargs kill -9 2>/dev/null || true`:`fuser -k -9 ${n}/tcp 2>/dev/null; true`;await new Promise(e=>exec(t,()=>e())),await new Promise(e=>setTimeout(e,800));}async function p(n,t){let e=n.process?.pid??n.pid;if(e)return new Promise(r=>{let o=false,i=()=>{o||(o=true,clearTimeout(a),r());};n.once?.("exit",i),n.once?.("exit",i);try{process.kill(e,"SIGTERM");}catch{return i()}let a=setTimeout(()=>{try{process.kill(e,"SIGKILL"),setTimeout(i,100);}catch{i();}},t),l=setInterval(()=>{try{process.kill(e,0);}catch{clearInterval(l),i();}},500);})}var f=class{cfg;name;watcher=null;constructor(t){this.cfg={mode:"fork",instances:1,...t},this.name=t.name,this.initStore();}async start(){let t=this.mp();if(t.status==="running"||t.status==="starting"){d$1.warn(this.name,"Already running \u2013 ignoring start()");return}this.patch({status:"starting",isRestarting:false,children:[],restartCount:0,backoffTime:d,probeFailures:0,startTime:null}),this.clearTimers(),this.stopProbe(),d$1.info(this.name,"Initializing fresh start...");try{await this.spawnAll(),this.cfg.devMode&&this.watchFiles();}catch(e){this.patch({status:"errored"}),d$1.error(this.name,`Start failed: ${e.message}`);}}async stop(){let t=this.mp();if(t.status!=="stopping"){this.patch({status:"stopping",isRestarting:false}),d$1.info(this.name,`Stopping ${t.children.length} instances...`),this.clearTimers(),this.stopProbe(),this.stopWatcher();try{await Promise.race([Promise.all(t.children.map(e=>p(e,this.cfg.killTimeout??m))),new Promise((e,r)=>setTimeout(()=>r(new Error("Termination timeout")),1e4))]);}catch(e){d$1.error(this.name,`Stop timed out, forcing state reset: ${e.message||"UNKNOWN"}`);}this.patch({children:[],status:"stopped",startTime:null}),this.stopWatcher(),d$1.success(this.name,"Stopped.");}}async _stop(){let t=this.mp();this.patch({status:"stopping",isRestarting:false}),this.clearTimers(),this.stopProbe();for(let e of t.children)p(e,this.cfg.killTimeout??m);this.stopWatcher(),this.patch({children:[],status:"stopped",startTime:null}),d$1.info(this.name,"Stopped.");}async restart(){let t=this.mp();t.isRestarting||(d$1.info(this.name,"Restarting..."),this.patch({isRestarting:true,status:"stopping"}),this.clearTimers(),this.stopProbe(),await Promise.all(t.children.map(e=>p(e,this.cfg.killTimeout??m))),this.patch({isRestarting:false,children:[]}));}async _restart(){d$1.info(this.name,"Restarting...");let t=this.mp();this.patch({isRestarting:true}),this.clearTimers(),this.stopProbe();for(let e of t.children)p(e,this.cfg.killTimeout??m);}async getStats(){let t=this.mp(),e=t.children[0]?.pid??null,r=null,o=null,i=null;if(e&&t.status==="running")try{let a=await E(e);r=a.cpu,o=a.memory;}catch{}return {name:this.name,status:t.status,pid:e,uptime:t.startTime?Date.now()-t.startTime:null,restartCount:t.restartCount,cpu:r,memoryRss:o,memoryHeap:i,mode:this.cfg.mode??"fork",instances:t.children.length}}async spawnAll(){if(!_.existsSync(this.cfg.scriptPath)){d$1.error(this.name,`Script not found: ${this.cfg.scriptPath}. Waiting for build...`),this.patch({status:"errored"});return}this.cfg.port&&await D(this.cfg.port);let t=this.cfg.mode??"fork",e=t==="cluster"?this.cfg.instances??P.cpus().length:1,r=[];for(let i=0;i<e;i++){let a=this.forkChild();a&&r.push(a);}if(r.length===0){d$1.error(this.name,"Failed to spawn any instances."),this.patch({status:"stopped"});return}this.patch({children:r,startTime:Date.now(),status:"running"}),d$1.success(this.name,`Started ${r.length} instance(s) [${t}]`);let o=setTimeout(()=>{this.mp().status==="running"&&(this.patch({backoffTime:d,restartCount:0}),d$1.success(this.name,"Process is stable."));},A);this.patch({stabilityTimer:o}),this.cfg.probe&&this.startProbe();}forkChild(){try{let t=this.cfg.scriptPath.endsWith(".js")?"node":this.cfg.scriptPath,e=this.cfg.scriptPath.endsWith(".js")?[this.cfg.scriptPath,...this.cfg.args??[]]:[...this.cfg.args??[]],r=spawn(t,e,{cwd:u.dirname(u.resolve(this.cfg.scriptPath,"..")),stdio:["ignore","pipe","pipe"],env:{...process.env,...this.cfg.env??{},NODE_ENV:this.cfg.devMode?"development":"production"},detached:!1,shell:!1});this.setupLogging(r);let o=Date.now();return r.on("error",i=>{d$1.error(this.name,"Spawn error:",i);}),r.on("exit",(i,a)=>{let l=Date.now()-o;this.onChildExit(r,i,a,l);}),r}catch(t){return d$1.error(this.name,"Failed to fork child:",t),null}}onChildExit(t,e,r,o){let i=this.mp(),a=i.children.filter(l=>l!==t);if(this.patch({children:a}),i.status!=="stopping"){if(d$1.warn(this.name,`Process exited (code=${e}, signal=${r}, uptime=${o}ms)`),i.isRestarting){a.length===0&&(this.patch({isRestarting:false}),this.spawnAll());return}if(e!==0&&e!==null){if(this.patch({status:"crashed"}),o<1500){d$1.error(this.name,`Immediate crash (${o}ms) \u2013 likely a syntax/build error. Waiting for next file change.`);return}this.scheduleRestart();}}}scheduleRestart(){let t=this.mp(),e=t.backoffTime,r=this.cfg.maxBackoff??L;d$1.warn(this.name,`Scheduling restart in ${e}ms (attempt #${t.restartCount+1})`);let o=setTimeout(async()=>{this.patch({restartCount:t.restartCount+1,backoffTime:Math.min(e*2,r)}),await this.spawnAll();},e);this.patch({restartTimer:o});}startProbe(){let t=this.cfg.probe,e=(t.intervalSeconds??10)*1e3,r=t.failureThreshold??3,i=setInterval(async()=>{let a=this.mp();if(a.status!=="running")return;if(await b(t)){a.probeFailures>0&&this.patch({probeFailures:0});return}let h=a.probeFailures+1;this.patch({probeFailures:h}),d$1.warn(this.name,`Liveness probe failed (${h}/${r})`),h>=r&&(d$1.error(this.name,"Liveness probe threshold exceeded \u2013 restarting."),this.patch({probeFailures:0}),await this.restart());},e);this.patch({probeTimer:i});}stopProbe(){let{probeTimer:t}=this.mp();t&&(clearInterval(t),this.patch({probeTimer:null,probeFailures:0}));}watchFiles(){this.stopWatcher();let t=u.dirname(this.cfg.scriptPath);this.watcher=R.watch(t,{ignored:[/node_modules/,/\.pid$/],persistent:true,ignoreInitial:true,awaitWriteFinish:{stabilityThreshold:1500,pollInterval:500}}),this.watcher.on("all",(e,r)=>{(e==="change"||e==="add")&&(d$1.info(this.name,`File ${e}: ${u.basename(r)} \u2013 restarting`),this.restart());}),this.watcher.on("error",e=>d$1.error(this.name,"Watcher error:",e)),this.watcher.on("ready",()=>d$1.info(this.name,`Watching ${t}`));}stopWatcher(){this.watcher&&(this.watcher.close(),this.watcher=null);}initStore(){e.set(this.name,{config:this.cfg,children:[],status:"stopped",startTime:null,restartCount:0,backoffTime:d,restartTimer:null,stabilityTimer:null,probeTimer:null,probeFailures:0,isRestarting:false});}mp(){return e.get(this.name)}_patch(t){e.set(this.name,{...this.mp(),...t});}patch(t){let e$1=this.mp();t.status&&t.status!==e$1.status&&d$1.info(this.name,`[STATE] ${e$1.status} \u2794 ${t.status}${t.isRestarting?" (Restarting)":""}`),e.set(this.name,{...e$1,...t});}clearTimers(){let{restartTimer:t,stabilityTimer:e}=this.mp();t&&clearTimeout(t),e&&clearTimeout(e),this.patch({restartTimer:null,stabilityTimer:null});}setupLogging(t){let e=this.cfg.logs?.wsUrl,r=null;e&&(r=new k(e),r.on("open",()=>d$1.debug(this.name,"Connected to log collector")),r.on("error",i=>d$1.error(this.name,"Log Collector WS Error",i.message)));let o=i=>{let a=i.toString();this.cfg.devMode&&process.stdout.write(`[${this.name}] ${a}`),r&&r.readyState===k.OPEN&&r.send(JSON.stringify({app:this.name,timestamp:Date.now(),log:a}));};t.stdout?.on("data",o),t.stderr?.on("data",o);}};var T=class{workers=new Map;async start(t){if(this.workers.has(t.name)){d$1.warn("PM",`Worker "${t.name}" already registered \u2013 use restart()`);return}let e=new f(t);this.workers.set(t.name,e),await e.start();}async stop(t){let e=this.require(t);e&&await e.stop();}async restart(t){let e=this.require(t);e&&await e.restart();}async delete(t){let e$1=this.require(t);e$1&&(await e$1.stop(),this.workers.delete(t),e.delete(t),d$1.info("PM",`Deleted worker "${t}"`));}async getStats(t){if(t){let r=this.require(t);return r?[await r.getStats()]:[]}return await Promise.all([...this.workers.values()].map(r=>r.getStats()))}list(){return [...this.workers.keys()]}async stopAll(){d$1.info("PM","Stopping all workers..."),await Promise.all([...this.workers.values()].map(t=>t.stop())),d$1.info("PM","All workers stopped.");}getWorker(t){let e=this.workers.get(t);return e||(d$1.error(t,"Worker Not Found"),null)}require(t){let e=this.workers.get(t);return e||(d$1.error(t,"Worker Not Found"),null)}};export{b as a,f as b,T as c};
1
+ import {d as d$1,e}from'./chunk-USJACDTS.js';import {spawn,exec}from'child_process';import y from'http';import S from'https';import W from'net';import R from'chokidar';import _ from'fs';import P from'os';import u from'path';import k from'ws';import M from'pidusage';function C(n,t){return new Promise(e=>{let o=(n.startsWith("https")?S:y).get(n,{timeout:t},i=>{e((i.statusCode??500)<500);});o.on("error",()=>e(false)),o.on("timeout",()=>{o.destroy(),e(false);});})}function $(n,t){let[e,r]=n.split(":"),o=Number(r);return new Promise(i=>{let a=W.createConnection({host:e,port:o},()=>{a.destroy(),i(true);});a.setTimeout(t),a.on("timeout",()=>{a.destroy(),i(false);}),a.on("error",()=>i(false));})}function F(n,t){return new Promise(e=>{let r=setTimeout(()=>e(false),t);exec(n,o=>{clearTimeout(r),e(!o);});})}async function b(n){let t=(n.timeoutSeconds??5)*1e3;switch(n.type){case "http":return C(n.target,t);case "tcp":return $(n.target,t);case "exec":return F(n.target,t);default:return false}}var m=5e3,L=16e3,d=1e3,A=5e3;async function N(n){return new Promise(t=>{W.createServer().once("error",()=>t(false)).once("listening",function(){this.close(()=>t(true));}).listen(n);})}async function D(n){if(await N(n))return;let t=P.platform()==="darwin"?`lsof -ti :${n} | xargs kill -9 2>/dev/null || true`:`fuser -k -9 ${n}/tcp 2>/dev/null; true`;await new Promise(e=>exec(t,()=>e())),await new Promise(e=>setTimeout(e,800));}async function p(n,t){let e=n.process?.pid??n.pid;if(e)return new Promise(r=>{let o=false,i=()=>{o||(o=true,clearTimeout(a),r());};n.once?.("exit",i),n.once?.("exit",i);try{process.kill(e,"SIGTERM");}catch{return i()}let a=setTimeout(()=>{try{process.kill(e,"SIGKILL"),setTimeout(i,100);}catch{i();}},t),l=setInterval(()=>{try{process.kill(e,0);}catch{clearInterval(l),i();}},500);})}var f=class{cfg;name;watcher=null;constructor(t){this.cfg={mode:"fork",instances:1,...t},this.name=t.name,this.initStore();}async start(){let t=this.mp();if(t.status==="running"||t.status==="starting"){d$1.warn(this.name,"Already running \u2013 ignoring start()");return}this.patch({status:"starting",isRestarting:false,children:[],restartCount:0,backoffTime:d,probeFailures:0,startTime:null}),this.clearTimers(),this.stopProbe(),d$1.info(this.name,"Initializing fresh start...");try{await this.spawnAll(),this.cfg.devMode&&this.watchFiles();}catch(e){this.patch({status:"errored"}),d$1.error(this.name,`Start failed: ${e.message}`);}}async stop(){let t=this.mp();if(t.status!=="stopping"){this.patch({status:"stopping",isRestarting:false}),d$1.info(this.name,`Stopping ${t.children.length} instances...`),this.clearTimers(),this.stopProbe(),this.stopWatcher();try{await Promise.race([Promise.all(t.children.map(e=>p(e,this.cfg.killTimeout??m))),new Promise((e,r)=>setTimeout(()=>r(new Error("Termination timeout")),1e4))]);}catch(e){d$1.error(this.name,`Stop timed out, forcing state reset: ${e.message||"UNKNOWN"}`);}this.patch({children:[],status:"stopped",startTime:null}),this.stopWatcher(),d$1.success(this.name,"Stopped.");}}async _stop(){let t=this.mp();this.patch({status:"stopping",isRestarting:false}),this.clearTimers(),this.stopProbe();for(let e of t.children)p(e,this.cfg.killTimeout??m);this.stopWatcher(),this.patch({children:[],status:"stopped",startTime:null}),d$1.info(this.name,"Stopped.");}async restart(){let t=this.mp();t.isRestarting||(d$1.info(this.name,"Restarting..."),this.patch({isRestarting:true,status:"stopping"}),this.clearTimers(),this.stopProbe(),await Promise.all(t.children.map(e=>p(e,this.cfg.killTimeout??m))),this.patch({isRestarting:false,children:[]}));}async _restart(){d$1.info(this.name,"Restarting...");let t=this.mp();this.patch({isRestarting:true}),this.clearTimers(),this.stopProbe();for(let e of t.children)p(e,this.cfg.killTimeout??m);}async getStats(){let t=this.mp(),e=t.children[0]?.pid??null,r=null,o=null,i=null;if(e&&t.status==="running")try{let a=await M(e);r=a.cpu,o=a.memory;}catch{}return {name:this.name,status:t.status,pid:e,uptime:t.startTime?Date.now()-t.startTime:null,restartCount:t.restartCount,cpu:r,memoryRss:o,memoryHeap:i,mode:this.cfg.mode??"fork",instances:t.children.length}}async spawnAll(){if(!_.existsSync(this.cfg.scriptPath)){d$1.error(this.name,`Script not found: ${this.cfg.scriptPath}. Waiting for build...`),this.patch({status:"errored"});return}this.cfg.port&&await D(this.cfg.port);let t=this.cfg.mode??"fork",e=t==="cluster"?this.cfg.instances??P.cpus().length:1,r=[];for(let i=0;i<e;i++){let a=this.forkChild();a&&r.push(a);}if(r.length===0){d$1.error(this.name,"Failed to spawn any instances."),this.patch({status:"stopped"});return}this.patch({children:r,startTime:Date.now(),status:"running"}),d$1.success(this.name,`Started ${r.length} instance(s) [${t}]`);let o=setTimeout(()=>{this.mp().status==="running"&&(this.patch({backoffTime:d,restartCount:0}),d$1.success(this.name,"Process is stable."));},A);this.patch({stabilityTimer:o}),this.cfg.probe&&this.startProbe();}forkChild(){try{let t=this.cfg.scriptPath.endsWith(".js")?"node":this.cfg.scriptPath,e=this.cfg.scriptPath.endsWith(".js")?[this.cfg.scriptPath,...this.cfg.args??[]]:[...this.cfg.args??[]],r=spawn(t,e,{cwd:u.dirname(u.resolve(this.cfg.scriptPath,"..")),stdio:["ignore","pipe","pipe"],env:{...process.env,...this.cfg.env??{},NODE_ENV:this.cfg.devMode?"development":"production"},detached:!1,shell:!1});this.setupLogging(r);let o=Date.now();return r.on("error",i=>{d$1.error(this.name,"Spawn error:",i);}),r.on("exit",(i,a)=>{let l=Date.now()-o;this.onChildExit(r,i,a,l);}),r}catch(t){return d$1.error(this.name,"Failed to fork child:",t),null}}onChildExit(t,e,r,o){let i=this.mp(),a=i.children.filter(l=>l!==t);if(this.patch({children:a}),i.status!=="stopping"){if(d$1.warn(this.name,`Process exited (code=${e}, signal=${r}, uptime=${o}ms)`),i.isRestarting){a.length===0&&(this.patch({isRestarting:false}),this.spawnAll());return}if(e!==0&&e!==null){if(this.patch({status:"crashed"}),o<1500){d$1.error(this.name,`Immediate crash (${o}ms) \u2013 likely a syntax/build error. Waiting for next file change.`);return}this.scheduleRestart();}}}scheduleRestart(){let t=this.mp(),e=t.backoffTime,r=this.cfg.maxBackoff??L;d$1.warn(this.name,`Scheduling restart in ${e}ms (attempt #${t.restartCount+1})`);let o=setTimeout(async()=>{this.patch({restartCount:t.restartCount+1,backoffTime:Math.min(e*2,r)}),await this.spawnAll();},e);this.patch({restartTimer:o});}startProbe(){let t=this.cfg.probe,e=(t.intervalSeconds??10)*1e3,r=t.failureThreshold??3,i=setInterval(async()=>{let a=this.mp();if(a.status!=="running")return;if(await b(t)){a.probeFailures>0&&this.patch({probeFailures:0});return}let h=a.probeFailures+1;this.patch({probeFailures:h}),d$1.warn(this.name,`Liveness probe failed (${h}/${r})`),h>=r&&(d$1.error(this.name,"Liveness probe threshold exceeded \u2013 restarting."),this.patch({probeFailures:0}),await this.restart());},e);this.patch({probeTimer:i});}stopProbe(){let{probeTimer:t}=this.mp();t&&(clearInterval(t),this.patch({probeTimer:null,probeFailures:0}));}watchFiles(){this.stopWatcher();let t=u.dirname(this.cfg.scriptPath);this.watcher=R.watch(t,{ignored:[/node_modules/,/\.pid$/],persistent:true,ignoreInitial:true,awaitWriteFinish:{stabilityThreshold:1500,pollInterval:500}}),this.watcher.on("all",(e,r)=>{(e==="change"||e==="add")&&(d$1.info(this.name,`File ${e}: ${u.basename(r)} \u2013 restarting`),this.restart());}),this.watcher.on("error",e=>d$1.error(this.name,"Watcher error:",e)),this.watcher.on("ready",()=>d$1.info(this.name,`Watching ${t}`));}stopWatcher(){this.watcher&&(this.watcher.close(),this.watcher=null);}initStore(){e.set(this.name,{config:this.cfg,children:[],status:"stopped",startTime:null,restartCount:0,backoffTime:d,restartTimer:null,stabilityTimer:null,probeTimer:null,probeFailures:0,isRestarting:false});}mp(){return e.get(this.name)}_patch(t){e.set(this.name,{...this.mp(),...t});}patch(t){let e$1=this.mp();t.status&&t.status!==e$1.status&&d$1.info(this.name,`[STATE] ${e$1.status} \u2794 ${t.status}${t.isRestarting?" (Restarting)":""}`),t.lastError&&d$1.error(this.name,`[REASON] ${t.lastError}`),e.set(this.name,{...e$1,...t});}clearTimers(){let{restartTimer:t,stabilityTimer:e}=this.mp();t&&clearTimeout(t),e&&clearTimeout(e),this.patch({restartTimer:null,stabilityTimer:null});}setupLogging(t){let e=this.cfg.logs?.wsUrl,r=null;e&&(r=new k(e),r.on("open",()=>d$1.debug(this.name,"Connected to log collector")),r.on("error",i=>d$1.error(this.name,"Log Collector WS Error",i.message)));let o=i=>{let a=i.toString();this.cfg.devMode&&process.stdout.write(`[${this.name}] ${a}`),r&&r.readyState===k.OPEN&&r.send(JSON.stringify({app:this.name,timestamp:Date.now(),log:a}));};t.stdout?.on("data",o),t.stderr?.on("data",o);}};var T=class{workers=new Map;async start(t){if(this.workers.has(t.name)){d$1.warn("PM",`Worker "${t.name}" already registered \u2013 use restart()`);return}let e=new f(t);this.workers.set(t.name,e),await e.start();}async stop(t){let e=this.require(t);e&&await e.stop();}async restart(t){let e=this.require(t);e&&await e.restart();}async delete(t){let e$1=this.require(t);e$1&&(await e$1.stop(),this.workers.delete(t),e.delete(t),d$1.info("PM",`Deleted worker "${t}"`));}async getStats(t){if(t){let r=this.require(t);return r?[await r.getStats()]:[]}return await Promise.all([...this.workers.values()].map(r=>r.getStats()))}list(){return [...this.workers.keys()]}async stopAll(){d$1.info("PM","Stopping all workers..."),await Promise.all([...this.workers.values()].map(t=>t.stop())),d$1.info("PM","All workers stopped.");}getWorker(t){let e=this.workers.get(t);return e||(d$1.error(t,"Worker Not Found"),null)}require(t){let e=this.workers.get(t);return e||(d$1.error(t,"Worker Not Found"),null)}};export{b as a,f as b,T as c};
@@ -1,3 +1,3 @@
1
- import {a,d,f as f$1}from'./chunk-RDDVTRS6.js';import {spawn}from'child_process';import p from'fs';import y from'net';import w from'os';import f from'path';function s(d,n="zuz-pm"){return new Promise((t,e)=>{let r=y.createConnection(f$1(n)),o="";r.on("connect",()=>{r.write(JSON.stringify(d)+`
1
+ import {a,d,f as f$1}from'./chunk-USJACDTS.js';import {spawn}from'child_process';import p from'fs';import y from'net';import w from'os';import f from'path';function s(d,n="zuz-pm"){return new Promise((t,e)=>{let r=y.createConnection(f$1(n)),o="";r.on("connect",()=>{r.write(JSON.stringify(d)+`
2
2
  `);}),r.on("data",i=>{o+=i.toString();let m=o.split(`
3
3
  `);o=m.pop()??"";for(let l of m)if(l.trim())try{let a=JSON.parse(l);r.destroy(),a.ok?t(a.data):e(new Error(a.error));}catch(a){r.destroy(),e(a);}}),r.on("error",i=>e(i)),r.setTimeout(1e4,()=>{r.destroy(),e(new Error("IPC timeout"));});})}var u=class{daemonScript;namespace;constructor(n){this.namespace=n?.namespace??"zuz-pm",this.daemonScript=n?.daemonScript??f.join(a,"daemon.js");}async isDaemonRunning(){try{return d.info("[ZPM]","Daemon is Running :?"),await s({cmd:"ping"},this.namespace),!0}catch{return d.info("[ZPM]","Daemon is not running."),false}}async ensureDaemon(){if(await this.isDaemonRunning())return;d.info("Starting ZPM daemon...");let t=process.env.NODE_ENV!=="production";spawn(process.execPath,[this.daemonScript],{detached:true,stdio:t?"inherit":"ignore"}).unref(),await this.waitForDaemon(8e3);}async killDaemon(){let n=f.join(w.tmpdir(),"zuz-pm.pid");if(!p.existsSync(n))throw new Error("Daemon PID file not found \u2013 is the daemon running?");let t=Number(p.readFileSync(n,"utf8").trim());try{process.kill(t,"SIGTERM"),console.log(`[ZPM] Sent SIGTERM to daemon (PID ${t})`);}catch(e){throw new Error(`Failed to kill daemon: ${e.message}`)}finally{p.unlinkSync(n);}}async getStore(){return s({cmd:"get-store"},this.namespace)}async start(n){return s({cmd:"start",name:n.name,config:n},this.namespace)}async stop(n){return s({cmd:"stop",name:n},this.namespace)}async restart(n){return s({cmd:"restart",name:n},this.namespace)}async delete(n){return s({cmd:"delete",name:n},this.namespace)}async stats(n){return s({cmd:"stats",name:n},this.namespace)}async list(){return s({cmd:"list"},this.namespace)}waitForDaemon(n){let t=Date.now(),e=200;return new Promise((r,o)=>{let i=()=>{this.isDaemonRunning().then(m=>{if(m)return r();if(Date.now()-t>n)return o(new Error("Daemon did not start in time"));setTimeout(i,e);});};setTimeout(i,e);})}},v=new u;export{u as a,v as b};
@@ -1,4 +1,4 @@
1
- 'use strict';var chunkKWFTTT7E_cjs=require('./chunk-KWFTTT7E.cjs'),child_process=require('child_process'),p=require('fs'),h=require('net'),y=require('os'),P=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var p__default=/*#__PURE__*/_interopDefault(p);var h__default=/*#__PURE__*/_interopDefault(h);var y__default=/*#__PURE__*/_interopDefault(y);var P__default=/*#__PURE__*/_interopDefault(P);/* ZuzJS Process Manager */
2
- function s(d,n="zuz-pm"){return new Promise((t,e)=>{let r=h__default.default.createConnection(chunkKWFTTT7E_cjs.f(n)),o="";r.on("connect",()=>{r.write(JSON.stringify(d)+`
1
+ 'use strict';var chunkX4TWGCVL_cjs=require('./chunk-X4TWGCVL.cjs'),child_process=require('child_process'),p=require('fs'),h=require('net'),y=require('os'),P=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var p__default=/*#__PURE__*/_interopDefault(p);var h__default=/*#__PURE__*/_interopDefault(h);var y__default=/*#__PURE__*/_interopDefault(y);var P__default=/*#__PURE__*/_interopDefault(P);/* ZuzJS Process Manager */
2
+ function s(d,n="zuz-pm"){return new Promise((t,e)=>{let r=h__default.default.createConnection(chunkX4TWGCVL_cjs.f(n)),o="";r.on("connect",()=>{r.write(JSON.stringify(d)+`
3
3
  `);}),r.on("data",i=>{o+=i.toString();let m=o.split(`
4
- `);o=m.pop()??"";for(let l of m)if(l.trim())try{let a=JSON.parse(l);r.destroy(),a.ok?t(a.data):e(new Error(a.error));}catch(a){r.destroy(),e(a);}}),r.on("error",i=>e(i)),r.setTimeout(1e4,()=>{r.destroy(),e(new Error("IPC timeout"));});})}var u=class{daemonScript;namespace;constructor(n){this.namespace=n?.namespace??"zuz-pm",this.daemonScript=n?.daemonScript??P__default.default.join(__dirname,"daemon.js");}async isDaemonRunning(){try{return chunkKWFTTT7E_cjs.d.info("[ZPM]","Daemon is Running :?"),await s({cmd:"ping"},this.namespace),!0}catch{return chunkKWFTTT7E_cjs.d.info("[ZPM]","Daemon is not running."),false}}async ensureDaemon(){if(await this.isDaemonRunning())return;chunkKWFTTT7E_cjs.d.info("Starting ZPM daemon...");let t=process.env.NODE_ENV!=="production";child_process.spawn(process.execPath,[this.daemonScript],{detached:true,stdio:t?"inherit":"ignore"}).unref(),await this.waitForDaemon(8e3);}async killDaemon(){let n=P__default.default.join(y__default.default.tmpdir(),"zuz-pm.pid");if(!p__default.default.existsSync(n))throw new Error("Daemon PID file not found \u2013 is the daemon running?");let t=Number(p__default.default.readFileSync(n,"utf8").trim());try{process.kill(t,"SIGTERM"),console.log(`[ZPM] Sent SIGTERM to daemon (PID ${t})`);}catch(e){throw new Error(`Failed to kill daemon: ${e.message}`)}finally{p__default.default.unlinkSync(n);}}async getStore(){return s({cmd:"get-store"},this.namespace)}async start(n){return s({cmd:"start",name:n.name,config:n},this.namespace)}async stop(n){return s({cmd:"stop",name:n},this.namespace)}async restart(n){return s({cmd:"restart",name:n},this.namespace)}async delete(n){return s({cmd:"delete",name:n},this.namespace)}async stats(n){return s({cmd:"stats",name:n},this.namespace)}async list(){return s({cmd:"list"},this.namespace)}waitForDaemon(n){let t=Date.now(),e=200;return new Promise((r,o)=>{let i=()=>{this.isDaemonRunning().then(m=>{if(m)return r();if(Date.now()-t>n)return o(new Error("Daemon did not start in time"));setTimeout(i,e);});};setTimeout(i,e);})}},E=new u;exports.a=u;exports.b=E;
4
+ `);o=m.pop()??"";for(let l of m)if(l.trim())try{let a=JSON.parse(l);r.destroy(),a.ok?t(a.data):e(new Error(a.error));}catch(a){r.destroy(),e(a);}}),r.on("error",i=>e(i)),r.setTimeout(1e4,()=>{r.destroy(),e(new Error("IPC timeout"));});})}var u=class{daemonScript;namespace;constructor(n){this.namespace=n?.namespace??"zuz-pm",this.daemonScript=n?.daemonScript??P__default.default.join(__dirname,"daemon.js");}async isDaemonRunning(){try{return chunkX4TWGCVL_cjs.d.info("[ZPM]","Daemon is Running :?"),await s({cmd:"ping"},this.namespace),!0}catch{return chunkX4TWGCVL_cjs.d.info("[ZPM]","Daemon is not running."),false}}async ensureDaemon(){if(await this.isDaemonRunning())return;chunkX4TWGCVL_cjs.d.info("Starting ZPM daemon...");let t=process.env.NODE_ENV!=="production";child_process.spawn(process.execPath,[this.daemonScript],{detached:true,stdio:t?"inherit":"ignore"}).unref(),await this.waitForDaemon(8e3);}async killDaemon(){let n=P__default.default.join(y__default.default.tmpdir(),"zuz-pm.pid");if(!p__default.default.existsSync(n))throw new Error("Daemon PID file not found \u2013 is the daemon running?");let t=Number(p__default.default.readFileSync(n,"utf8").trim());try{process.kill(t,"SIGTERM"),console.log(`[ZPM] Sent SIGTERM to daemon (PID ${t})`);}catch(e){throw new Error(`Failed to kill daemon: ${e.message}`)}finally{p__default.default.unlinkSync(n);}}async getStore(){return s({cmd:"get-store"},this.namespace)}async start(n){return s({cmd:"start",name:n.name,config:n},this.namespace)}async stop(n){return s({cmd:"stop",name:n},this.namespace)}async restart(n){return s({cmd:"restart",name:n},this.namespace)}async delete(n){return s({cmd:"delete",name:n},this.namespace)}async stats(n){return s({cmd:"stats",name:n},this.namespace)}async list(){return s({cmd:"list"},this.namespace)}waitForDaemon(n){let t=Date.now(),e=200;return new Promise((r,o)=>{let i=()=>{this.isDaemonRunning().then(m=>{if(m)return r();if(Date.now()-t>n)return o(new Error("Daemon did not start in time"));setTimeout(i,e);});};setTimeout(i,e);})}},E=new u;exports.a=u;exports.b=E;
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkKWFTTT7E_cjs=require('./chunk-KWFTTT7E.cjs'),child_process=require('child_process'),v=require('http'),y=require('https'),S=require('net'),F=require('chokidar'),I=require('fs'),k=require('os'),u=require('path'),b=require('ws'),M=require('pidusage');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var v__default=/*#__PURE__*/_interopDefault(v);var y__default=/*#__PURE__*/_interopDefault(y);var S__default=/*#__PURE__*/_interopDefault(S);var F__default=/*#__PURE__*/_interopDefault(F);var I__default=/*#__PURE__*/_interopDefault(I);var k__default=/*#__PURE__*/_interopDefault(k);var u__default=/*#__PURE__*/_interopDefault(u);var b__default=/*#__PURE__*/_interopDefault(b);var M__default=/*#__PURE__*/_interopDefault(M);/* ZuzJS Process Manager */
2
- function W(n,t){return new Promise(e=>{let o=(n.startsWith("https")?y__default.default:v__default.default).get(n,{timeout:t},i=>{e((i.statusCode??500)<500);});o.on("error",()=>e(false)),o.on("timeout",()=>{o.destroy(),e(false);});})}function C(n,t){let[e,r]=n.split(":"),o=Number(r);return new Promise(i=>{let a=S__default.default.createConnection({host:e,port:o},()=>{a.destroy(),i(true);});a.setTimeout(t),a.on("timeout",()=>{a.destroy(),i(false);}),a.on("error",()=>i(false));})}function $(n,t){return new Promise(e=>{let r=setTimeout(()=>e(false),t);child_process.exec(n,o=>{clearTimeout(r),e(!o);});})}async function w(n){let t=(n.timeoutSeconds??5)*1e3;switch(n.type){case "http":return W(n.target,t);case "tcp":return C(n.target,t);case "exec":return $(n.target,t);default:return false}}var m=5e3,E=16e3,d=1e3,L=5e3;async function A(n){return new Promise(t=>{S__default.default.createServer().once("error",()=>t(false)).once("listening",function(){this.close(()=>t(true));}).listen(n);})}async function N(n){if(await A(n))return;let t=k__default.default.platform()==="darwin"?`lsof -ti :${n} | xargs kill -9 2>/dev/null || true`:`fuser -k -9 ${n}/tcp 2>/dev/null; true`;await new Promise(e=>child_process.exec(t,()=>e())),await new Promise(e=>setTimeout(e,800));}async function p(n,t){let e=n.process?.pid??n.pid;if(e)return new Promise(r=>{let o=false,i=()=>{o||(o=true,clearTimeout(a),r());};n.once?.("exit",i),n.once?.("exit",i);try{process.kill(e,"SIGTERM");}catch{return i()}let a=setTimeout(()=>{try{process.kill(e,"SIGKILL"),setTimeout(i,100);}catch{i();}},t),l=setInterval(()=>{try{process.kill(e,0);}catch{clearInterval(l),i();}},500);})}var f=class{cfg;name;watcher=null;constructor(t){this.cfg={mode:"fork",instances:1,...t},this.name=t.name,this.initStore();}async start(){let t=this.mp();if(t.status==="running"||t.status==="starting"){chunkKWFTTT7E_cjs.d.warn(this.name,"Already running \u2013 ignoring start()");return}this.patch({status:"starting",isRestarting:false,children:[],restartCount:0,backoffTime:d,probeFailures:0,startTime:null}),this.clearTimers(),this.stopProbe(),chunkKWFTTT7E_cjs.d.info(this.name,"Initializing fresh start...");try{await this.spawnAll(),this.cfg.devMode&&this.watchFiles();}catch(e){this.patch({status:"errored"}),chunkKWFTTT7E_cjs.d.error(this.name,`Start failed: ${e.message}`);}}async stop(){let t=this.mp();if(t.status!=="stopping"){this.patch({status:"stopping",isRestarting:false}),chunkKWFTTT7E_cjs.d.info(this.name,`Stopping ${t.children.length} instances...`),this.clearTimers(),this.stopProbe(),this.stopWatcher();try{await Promise.race([Promise.all(t.children.map(e=>p(e,this.cfg.killTimeout??m))),new Promise((e,r)=>setTimeout(()=>r(new Error("Termination timeout")),1e4))]);}catch(e){chunkKWFTTT7E_cjs.d.error(this.name,`Stop timed out, forcing state reset: ${e.message||"UNKNOWN"}`);}this.patch({children:[],status:"stopped",startTime:null}),this.stopWatcher(),chunkKWFTTT7E_cjs.d.success(this.name,"Stopped.");}}async _stop(){let t=this.mp();this.patch({status:"stopping",isRestarting:false}),this.clearTimers(),this.stopProbe();for(let e of t.children)p(e,this.cfg.killTimeout??m);this.stopWatcher(),this.patch({children:[],status:"stopped",startTime:null}),chunkKWFTTT7E_cjs.d.info(this.name,"Stopped.");}async restart(){let t=this.mp();t.isRestarting||(chunkKWFTTT7E_cjs.d.info(this.name,"Restarting..."),this.patch({isRestarting:true,status:"stopping"}),this.clearTimers(),this.stopProbe(),await Promise.all(t.children.map(e=>p(e,this.cfg.killTimeout??m))),this.patch({isRestarting:false,children:[]}));}async _restart(){chunkKWFTTT7E_cjs.d.info(this.name,"Restarting...");let t=this.mp();this.patch({isRestarting:true}),this.clearTimers(),this.stopProbe();for(let e of t.children)p(e,this.cfg.killTimeout??m);}async getStats(){let t=this.mp(),e=t.children[0]?.pid??null,r=null,o=null,i=null;if(e&&t.status==="running")try{let a=await M__default.default(e);r=a.cpu,o=a.memory;}catch{}return {name:this.name,status:t.status,pid:e,uptime:t.startTime?Date.now()-t.startTime:null,restartCount:t.restartCount,cpu:r,memoryRss:o,memoryHeap:i,mode:this.cfg.mode??"fork",instances:t.children.length}}async spawnAll(){if(!I__default.default.existsSync(this.cfg.scriptPath)){chunkKWFTTT7E_cjs.d.error(this.name,`Script not found: ${this.cfg.scriptPath}. Waiting for build...`),this.patch({status:"errored"});return}this.cfg.port&&await N(this.cfg.port);let t=this.cfg.mode??"fork",e=t==="cluster"?this.cfg.instances??k__default.default.cpus().length:1,r=[];for(let i=0;i<e;i++){let a=this.forkChild();a&&r.push(a);}if(r.length===0){chunkKWFTTT7E_cjs.d.error(this.name,"Failed to spawn any instances."),this.patch({status:"stopped"});return}this.patch({children:r,startTime:Date.now(),status:"running"}),chunkKWFTTT7E_cjs.d.success(this.name,`Started ${r.length} instance(s) [${t}]`);let o=setTimeout(()=>{this.mp().status==="running"&&(this.patch({backoffTime:d,restartCount:0}),chunkKWFTTT7E_cjs.d.success(this.name,"Process is stable."));},L);this.patch({stabilityTimer:o}),this.cfg.probe&&this.startProbe();}forkChild(){try{let t=this.cfg.scriptPath.endsWith(".js")?"node":this.cfg.scriptPath,e=this.cfg.scriptPath.endsWith(".js")?[this.cfg.scriptPath,...this.cfg.args??[]]:[...this.cfg.args??[]],r=child_process.spawn(t,e,{cwd:u__default.default.dirname(u__default.default.resolve(this.cfg.scriptPath,"..")),stdio:["ignore","pipe","pipe"],env:{...process.env,...this.cfg.env??{},NODE_ENV:this.cfg.devMode?"development":"production"},detached:!1,shell:!1});this.setupLogging(r);let o=Date.now();return r.on("error",i=>{chunkKWFTTT7E_cjs.d.error(this.name,"Spawn error:",i);}),r.on("exit",(i,a)=>{let l=Date.now()-o;this.onChildExit(r,i,a,l);}),r}catch(t){return chunkKWFTTT7E_cjs.d.error(this.name,"Failed to fork child:",t),null}}onChildExit(t,e,r,o){let i=this.mp(),a=i.children.filter(l=>l!==t);if(this.patch({children:a}),i.status!=="stopping"){if(chunkKWFTTT7E_cjs.d.warn(this.name,`Process exited (code=${e}, signal=${r}, uptime=${o}ms)`),i.isRestarting){a.length===0&&(this.patch({isRestarting:false}),this.spawnAll());return}if(e!==0&&e!==null){if(this.patch({status:"crashed"}),o<1500){chunkKWFTTT7E_cjs.d.error(this.name,`Immediate crash (${o}ms) \u2013 likely a syntax/build error. Waiting for next file change.`);return}this.scheduleRestart();}}}scheduleRestart(){let t=this.mp(),e=t.backoffTime,r=this.cfg.maxBackoff??E;chunkKWFTTT7E_cjs.d.warn(this.name,`Scheduling restart in ${e}ms (attempt #${t.restartCount+1})`);let o=setTimeout(async()=>{this.patch({restartCount:t.restartCount+1,backoffTime:Math.min(e*2,r)}),await this.spawnAll();},e);this.patch({restartTimer:o});}startProbe(){let t=this.cfg.probe,e=(t.intervalSeconds??10)*1e3,r=t.failureThreshold??3,i=setInterval(async()=>{let a=this.mp();if(a.status!=="running")return;if(await w(t)){a.probeFailures>0&&this.patch({probeFailures:0});return}let h=a.probeFailures+1;this.patch({probeFailures:h}),chunkKWFTTT7E_cjs.d.warn(this.name,`Liveness probe failed (${h}/${r})`),h>=r&&(chunkKWFTTT7E_cjs.d.error(this.name,"Liveness probe threshold exceeded \u2013 restarting."),this.patch({probeFailures:0}),await this.restart());},e);this.patch({probeTimer:i});}stopProbe(){let{probeTimer:t}=this.mp();t&&(clearInterval(t),this.patch({probeTimer:null,probeFailures:0}));}watchFiles(){this.stopWatcher();let t=u__default.default.dirname(this.cfg.scriptPath);this.watcher=F__default.default.watch(t,{ignored:[/node_modules/,/\.pid$/],persistent:true,ignoreInitial:true,awaitWriteFinish:{stabilityThreshold:1500,pollInterval:500}}),this.watcher.on("all",(e,r)=>{(e==="change"||e==="add")&&(chunkKWFTTT7E_cjs.d.info(this.name,`File ${e}: ${u__default.default.basename(r)} \u2013 restarting`),this.restart());}),this.watcher.on("error",e=>chunkKWFTTT7E_cjs.d.error(this.name,"Watcher error:",e)),this.watcher.on("ready",()=>chunkKWFTTT7E_cjs.d.info(this.name,`Watching ${t}`));}stopWatcher(){this.watcher&&(this.watcher.close(),this.watcher=null);}initStore(){chunkKWFTTT7E_cjs.e.set(this.name,{config:this.cfg,children:[],status:"stopped",startTime:null,restartCount:0,backoffTime:d,restartTimer:null,stabilityTimer:null,probeTimer:null,probeFailures:0,isRestarting:false});}mp(){return chunkKWFTTT7E_cjs.e.get(this.name)}_patch(t){chunkKWFTTT7E_cjs.e.set(this.name,{...this.mp(),...t});}patch(t){let e=this.mp();t.status&&t.status!==e.status&&chunkKWFTTT7E_cjs.d.info(this.name,`[STATE] ${e.status} \u2794 ${t.status}${t.isRestarting?" (Restarting)":""}`),chunkKWFTTT7E_cjs.e.set(this.name,{...e,...t});}clearTimers(){let{restartTimer:t,stabilityTimer:e}=this.mp();t&&clearTimeout(t),e&&clearTimeout(e),this.patch({restartTimer:null,stabilityTimer:null});}setupLogging(t){let e=this.cfg.logs?.wsUrl,r=null;e&&(r=new b__default.default(e),r.on("open",()=>chunkKWFTTT7E_cjs.d.debug(this.name,"Connected to log collector")),r.on("error",i=>chunkKWFTTT7E_cjs.d.error(this.name,"Log Collector WS Error",i.message)));let o=i=>{let a=i.toString();this.cfg.devMode&&process.stdout.write(`[${this.name}] ${a}`),r&&r.readyState===b__default.default.OPEN&&r.send(JSON.stringify({app:this.name,timestamp:Date.now(),log:a}));};t.stdout?.on("data",o),t.stderr?.on("data",o);}};var P=class{workers=new Map;async start(t){if(this.workers.has(t.name)){chunkKWFTTT7E_cjs.d.warn("PM",`Worker "${t.name}" already registered \u2013 use restart()`);return}let e=new f(t);this.workers.set(t.name,e),await e.start();}async stop(t){let e=this.require(t);e&&await e.stop();}async restart(t){let e=this.require(t);e&&await e.restart();}async delete(t){let e=this.require(t);e&&(await e.stop(),this.workers.delete(t),chunkKWFTTT7E_cjs.e.delete(t),chunkKWFTTT7E_cjs.d.info("PM",`Deleted worker "${t}"`));}async getStats(t){if(t){let r=this.require(t);return r?[await r.getStats()]:[]}return await Promise.all([...this.workers.values()].map(r=>r.getStats()))}list(){return [...this.workers.keys()]}async stopAll(){chunkKWFTTT7E_cjs.d.info("PM","Stopping all workers..."),await Promise.all([...this.workers.values()].map(t=>t.stop())),chunkKWFTTT7E_cjs.d.info("PM","All workers stopped.");}getWorker(t){let e=this.workers.get(t);return e||(chunkKWFTTT7E_cjs.d.error(t,"Worker Not Found"),null)}require(t){let e=this.workers.get(t);return e||(chunkKWFTTT7E_cjs.d.error(t,"Worker Not Found"),null)}};exports.a=w;exports.b=f;exports.c=P;
1
+ 'use strict';var chunkX4TWGCVL_cjs=require('./chunk-X4TWGCVL.cjs'),child_process=require('child_process'),v=require('http'),y=require('https'),S=require('net'),F=require('chokidar'),I=require('fs'),k=require('os'),u=require('path'),b=require('ws'),E=require('pidusage');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var v__default=/*#__PURE__*/_interopDefault(v);var y__default=/*#__PURE__*/_interopDefault(y);var S__default=/*#__PURE__*/_interopDefault(S);var F__default=/*#__PURE__*/_interopDefault(F);var I__default=/*#__PURE__*/_interopDefault(I);var k__default=/*#__PURE__*/_interopDefault(k);var u__default=/*#__PURE__*/_interopDefault(u);var b__default=/*#__PURE__*/_interopDefault(b);var E__default=/*#__PURE__*/_interopDefault(E);/* ZuzJS Process Manager */
2
+ function W(n,t){return new Promise(e=>{let o=(n.startsWith("https")?y__default.default:v__default.default).get(n,{timeout:t},i=>{e((i.statusCode??500)<500);});o.on("error",()=>e(false)),o.on("timeout",()=>{o.destroy(),e(false);});})}function C(n,t){let[e,r]=n.split(":"),o=Number(r);return new Promise(i=>{let a=S__default.default.createConnection({host:e,port:o},()=>{a.destroy(),i(true);});a.setTimeout(t),a.on("timeout",()=>{a.destroy(),i(false);}),a.on("error",()=>i(false));})}function $(n,t){return new Promise(e=>{let r=setTimeout(()=>e(false),t);child_process.exec(n,o=>{clearTimeout(r),e(!o);});})}async function w(n){let t=(n.timeoutSeconds??5)*1e3;switch(n.type){case "http":return W(n.target,t);case "tcp":return C(n.target,t);case "exec":return $(n.target,t);default:return false}}var m=5e3,M=16e3,d=1e3,L=5e3;async function A(n){return new Promise(t=>{S__default.default.createServer().once("error",()=>t(false)).once("listening",function(){this.close(()=>t(true));}).listen(n);})}async function N(n){if(await A(n))return;let t=k__default.default.platform()==="darwin"?`lsof -ti :${n} | xargs kill -9 2>/dev/null || true`:`fuser -k -9 ${n}/tcp 2>/dev/null; true`;await new Promise(e=>child_process.exec(t,()=>e())),await new Promise(e=>setTimeout(e,800));}async function p(n,t){let e=n.process?.pid??n.pid;if(e)return new Promise(r=>{let o=false,i=()=>{o||(o=true,clearTimeout(a),r());};n.once?.("exit",i),n.once?.("exit",i);try{process.kill(e,"SIGTERM");}catch{return i()}let a=setTimeout(()=>{try{process.kill(e,"SIGKILL"),setTimeout(i,100);}catch{i();}},t),l=setInterval(()=>{try{process.kill(e,0);}catch{clearInterval(l),i();}},500);})}var f=class{cfg;name;watcher=null;constructor(t){this.cfg={mode:"fork",instances:1,...t},this.name=t.name,this.initStore();}async start(){let t=this.mp();if(t.status==="running"||t.status==="starting"){chunkX4TWGCVL_cjs.d.warn(this.name,"Already running \u2013 ignoring start()");return}this.patch({status:"starting",isRestarting:false,children:[],restartCount:0,backoffTime:d,probeFailures:0,startTime:null}),this.clearTimers(),this.stopProbe(),chunkX4TWGCVL_cjs.d.info(this.name,"Initializing fresh start...");try{await this.spawnAll(),this.cfg.devMode&&this.watchFiles();}catch(e){this.patch({status:"errored"}),chunkX4TWGCVL_cjs.d.error(this.name,`Start failed: ${e.message}`);}}async stop(){let t=this.mp();if(t.status!=="stopping"){this.patch({status:"stopping",isRestarting:false}),chunkX4TWGCVL_cjs.d.info(this.name,`Stopping ${t.children.length} instances...`),this.clearTimers(),this.stopProbe(),this.stopWatcher();try{await Promise.race([Promise.all(t.children.map(e=>p(e,this.cfg.killTimeout??m))),new Promise((e,r)=>setTimeout(()=>r(new Error("Termination timeout")),1e4))]);}catch(e){chunkX4TWGCVL_cjs.d.error(this.name,`Stop timed out, forcing state reset: ${e.message||"UNKNOWN"}`);}this.patch({children:[],status:"stopped",startTime:null}),this.stopWatcher(),chunkX4TWGCVL_cjs.d.success(this.name,"Stopped.");}}async _stop(){let t=this.mp();this.patch({status:"stopping",isRestarting:false}),this.clearTimers(),this.stopProbe();for(let e of t.children)p(e,this.cfg.killTimeout??m);this.stopWatcher(),this.patch({children:[],status:"stopped",startTime:null}),chunkX4TWGCVL_cjs.d.info(this.name,"Stopped.");}async restart(){let t=this.mp();t.isRestarting||(chunkX4TWGCVL_cjs.d.info(this.name,"Restarting..."),this.patch({isRestarting:true,status:"stopping"}),this.clearTimers(),this.stopProbe(),await Promise.all(t.children.map(e=>p(e,this.cfg.killTimeout??m))),this.patch({isRestarting:false,children:[]}));}async _restart(){chunkX4TWGCVL_cjs.d.info(this.name,"Restarting...");let t=this.mp();this.patch({isRestarting:true}),this.clearTimers(),this.stopProbe();for(let e of t.children)p(e,this.cfg.killTimeout??m);}async getStats(){let t=this.mp(),e=t.children[0]?.pid??null,r=null,o=null,i=null;if(e&&t.status==="running")try{let a=await E__default.default(e);r=a.cpu,o=a.memory;}catch{}return {name:this.name,status:t.status,pid:e,uptime:t.startTime?Date.now()-t.startTime:null,restartCount:t.restartCount,cpu:r,memoryRss:o,memoryHeap:i,mode:this.cfg.mode??"fork",instances:t.children.length}}async spawnAll(){if(!I__default.default.existsSync(this.cfg.scriptPath)){chunkX4TWGCVL_cjs.d.error(this.name,`Script not found: ${this.cfg.scriptPath}. Waiting for build...`),this.patch({status:"errored"});return}this.cfg.port&&await N(this.cfg.port);let t=this.cfg.mode??"fork",e=t==="cluster"?this.cfg.instances??k__default.default.cpus().length:1,r=[];for(let i=0;i<e;i++){let a=this.forkChild();a&&r.push(a);}if(r.length===0){chunkX4TWGCVL_cjs.d.error(this.name,"Failed to spawn any instances."),this.patch({status:"stopped"});return}this.patch({children:r,startTime:Date.now(),status:"running"}),chunkX4TWGCVL_cjs.d.success(this.name,`Started ${r.length} instance(s) [${t}]`);let o=setTimeout(()=>{this.mp().status==="running"&&(this.patch({backoffTime:d,restartCount:0}),chunkX4TWGCVL_cjs.d.success(this.name,"Process is stable."));},L);this.patch({stabilityTimer:o}),this.cfg.probe&&this.startProbe();}forkChild(){try{let t=this.cfg.scriptPath.endsWith(".js")?"node":this.cfg.scriptPath,e=this.cfg.scriptPath.endsWith(".js")?[this.cfg.scriptPath,...this.cfg.args??[]]:[...this.cfg.args??[]],r=child_process.spawn(t,e,{cwd:u__default.default.dirname(u__default.default.resolve(this.cfg.scriptPath,"..")),stdio:["ignore","pipe","pipe"],env:{...process.env,...this.cfg.env??{},NODE_ENV:this.cfg.devMode?"development":"production"},detached:!1,shell:!1});this.setupLogging(r);let o=Date.now();return r.on("error",i=>{chunkX4TWGCVL_cjs.d.error(this.name,"Spawn error:",i);}),r.on("exit",(i,a)=>{let l=Date.now()-o;this.onChildExit(r,i,a,l);}),r}catch(t){return chunkX4TWGCVL_cjs.d.error(this.name,"Failed to fork child:",t),null}}onChildExit(t,e,r,o){let i=this.mp(),a=i.children.filter(l=>l!==t);if(this.patch({children:a}),i.status!=="stopping"){if(chunkX4TWGCVL_cjs.d.warn(this.name,`Process exited (code=${e}, signal=${r}, uptime=${o}ms)`),i.isRestarting){a.length===0&&(this.patch({isRestarting:false}),this.spawnAll());return}if(e!==0&&e!==null){if(this.patch({status:"crashed"}),o<1500){chunkX4TWGCVL_cjs.d.error(this.name,`Immediate crash (${o}ms) \u2013 likely a syntax/build error. Waiting for next file change.`);return}this.scheduleRestart();}}}scheduleRestart(){let t=this.mp(),e=t.backoffTime,r=this.cfg.maxBackoff??M;chunkX4TWGCVL_cjs.d.warn(this.name,`Scheduling restart in ${e}ms (attempt #${t.restartCount+1})`);let o=setTimeout(async()=>{this.patch({restartCount:t.restartCount+1,backoffTime:Math.min(e*2,r)}),await this.spawnAll();},e);this.patch({restartTimer:o});}startProbe(){let t=this.cfg.probe,e=(t.intervalSeconds??10)*1e3,r=t.failureThreshold??3,i=setInterval(async()=>{let a=this.mp();if(a.status!=="running")return;if(await w(t)){a.probeFailures>0&&this.patch({probeFailures:0});return}let h=a.probeFailures+1;this.patch({probeFailures:h}),chunkX4TWGCVL_cjs.d.warn(this.name,`Liveness probe failed (${h}/${r})`),h>=r&&(chunkX4TWGCVL_cjs.d.error(this.name,"Liveness probe threshold exceeded \u2013 restarting."),this.patch({probeFailures:0}),await this.restart());},e);this.patch({probeTimer:i});}stopProbe(){let{probeTimer:t}=this.mp();t&&(clearInterval(t),this.patch({probeTimer:null,probeFailures:0}));}watchFiles(){this.stopWatcher();let t=u__default.default.dirname(this.cfg.scriptPath);this.watcher=F__default.default.watch(t,{ignored:[/node_modules/,/\.pid$/],persistent:true,ignoreInitial:true,awaitWriteFinish:{stabilityThreshold:1500,pollInterval:500}}),this.watcher.on("all",(e,r)=>{(e==="change"||e==="add")&&(chunkX4TWGCVL_cjs.d.info(this.name,`File ${e}: ${u__default.default.basename(r)} \u2013 restarting`),this.restart());}),this.watcher.on("error",e=>chunkX4TWGCVL_cjs.d.error(this.name,"Watcher error:",e)),this.watcher.on("ready",()=>chunkX4TWGCVL_cjs.d.info(this.name,`Watching ${t}`));}stopWatcher(){this.watcher&&(this.watcher.close(),this.watcher=null);}initStore(){chunkX4TWGCVL_cjs.e.set(this.name,{config:this.cfg,children:[],status:"stopped",startTime:null,restartCount:0,backoffTime:d,restartTimer:null,stabilityTimer:null,probeTimer:null,probeFailures:0,isRestarting:false});}mp(){return chunkX4TWGCVL_cjs.e.get(this.name)}_patch(t){chunkX4TWGCVL_cjs.e.set(this.name,{...this.mp(),...t});}patch(t){let e=this.mp();t.status&&t.status!==e.status&&chunkX4TWGCVL_cjs.d.info(this.name,`[STATE] ${e.status} \u2794 ${t.status}${t.isRestarting?" (Restarting)":""}`),t.lastError&&chunkX4TWGCVL_cjs.d.error(this.name,`[REASON] ${t.lastError}`),chunkX4TWGCVL_cjs.e.set(this.name,{...e,...t});}clearTimers(){let{restartTimer:t,stabilityTimer:e}=this.mp();t&&clearTimeout(t),e&&clearTimeout(e),this.patch({restartTimer:null,stabilityTimer:null});}setupLogging(t){let e=this.cfg.logs?.wsUrl,r=null;e&&(r=new b__default.default(e),r.on("open",()=>chunkX4TWGCVL_cjs.d.debug(this.name,"Connected to log collector")),r.on("error",i=>chunkX4TWGCVL_cjs.d.error(this.name,"Log Collector WS Error",i.message)));let o=i=>{let a=i.toString();this.cfg.devMode&&process.stdout.write(`[${this.name}] ${a}`),r&&r.readyState===b__default.default.OPEN&&r.send(JSON.stringify({app:this.name,timestamp:Date.now(),log:a}));};t.stdout?.on("data",o),t.stderr?.on("data",o);}};var P=class{workers=new Map;async start(t){if(this.workers.has(t.name)){chunkX4TWGCVL_cjs.d.warn("PM",`Worker "${t.name}" already registered \u2013 use restart()`);return}let e=new f(t);this.workers.set(t.name,e),await e.start();}async stop(t){let e=this.require(t);e&&await e.stop();}async restart(t){let e=this.require(t);e&&await e.restart();}async delete(t){let e=this.require(t);e&&(await e.stop(),this.workers.delete(t),chunkX4TWGCVL_cjs.e.delete(t),chunkX4TWGCVL_cjs.d.info("PM",`Deleted worker "${t}"`));}async getStats(t){if(t){let r=this.require(t);return r?[await r.getStats()]:[]}return await Promise.all([...this.workers.values()].map(r=>r.getStats()))}list(){return [...this.workers.keys()]}async stopAll(){chunkX4TWGCVL_cjs.d.info("PM","Stopping all workers..."),await Promise.all([...this.workers.values()].map(t=>t.stop())),chunkX4TWGCVL_cjs.d.info("PM","All workers stopped.");}getWorker(t){let e=this.workers.get(t);return e||(chunkX4TWGCVL_cjs.d.error(t,"Worker Not Found"),null)}require(t){let e=this.workers.get(t);return e||(chunkX4TWGCVL_cjs.d.error(t,"Worker Not Found"),null)}};exports.a=w;exports.b=f;exports.c=P;
@@ -0,0 +1,6 @@
1
+ import C from'path';import {fileURLToPath}from'url';import y from'os';import g from'picocolors';import c from'winston';import D from'events';import w from'fs';import O from'net';var I=()=>fileURLToPath(import.meta.url),N=()=>C.dirname(I()),u=N();var R=(s=>(s.Fork="fork",s.Cluster="cluster",s))(R||{}),L=(o=>(o.Stopped="stopped",o.Starting="starting",o.Running="running",o.Stopping="stopping",o.Crashed="crashed",o.Errored="errored",o))(L||{});var F=C.join(y.homedir(),".zpm","logs"),J=c.format.combine(c.format.timestamp({format:"YYYY/MM/DD HH:mm:ss"}),c.format.splat(),c.format.printf(({timestamp:e,level:r,message:s,tag:t})=>{let n=g.gray(`[${e}]`),m=g.bold(`[ZPM/${(t||"SYS").toUpperCase()}]`);return `${n} [${r=="info"?g.cyan(r):r=="warn"?g.yellow(r):r=="error"?g.red(r):r=="success"?g.green(r):r=="debug"?g.gray(r):"debug"}] ${m} \u2192 ${s}`})),d=c.createLogger({levels:{error:0,warn:1,info:2,success:2,debug:3},transports:[new c.transports.Console({level:"debug",format:J}),new c.transports.File({filename:C.join(F,"daemon.log"),format:c.format.combine(c.format.timestamp(),c.format.json())})]}),l={info:(e,...r)=>d.info(r.join(" "),{tag:e}),warn:(e,...r)=>d.warn(r.join(" "),{tag:e}),error:(e,...r)=>d.error(r.join(" "),{tag:e}),debug:(e,...r)=>d.debug(r.join(" "),{tag:e}),success:(e,...r)=>d.log("success",r.join(" "),{tag:e})};var k=class extends D{map=new Map;set(r,s){this.map.set(r,s),this.emit("change",r,s);}get(r){return this.map.get(r)}has(r){return this.map.has(r)}delete(r){this.map.delete(r),this.emit("delete",r);}all(){return new Map(this.map)}onchange(r){return this.on("change",r)}offchange(r){return this.off("change",r)}},P=new k;function E(e="zuz-pm"){return y.platform()==="win32"?C.join("\\\\.\\pipe",e):C.join(y.tmpdir(),`${e}.sock`)}function ar(e){let r=E();w.existsSync(r)&&w.unlinkSync(r);let s=O.createServer(t=>{let n="";t.on("data",m=>{n+=m.toString();let o=n.split(`
2
+ `);n=o.pop()??"";for(let p of o)p.trim()&&W(e,t,p);}),t.on("error",m=>{l.error("IPC","Socket error:",m.message);});});return s.listen(r,()=>{if(y.platform()!=="win32")try{w.chmodSync(r,"777");}catch(t){console.error("Failed to set socket permissions:",t);}l.success("IPC",`Listening on ${r}`);}),s.on("error",t=>{l.error("IPC","Server error:",t);}),s}async function W(e,r,s){let t;try{t=JSON.parse(s);}catch{S(r,{ok:false,error:"Invalid JSON"});return}try{let n=null;switch(t.cmd){case "ping":n="pong";break;case "start":await e.start(t.config),n=`Started "${t.name}"`;break;case "stop":await e.stop(t.name),n=`Stopped "${t.name}"`;break;case "restart":await e.restart(t.name),n=`Restarted "${t.name}"`;break;case "delete":await e.delete(t.name),n=`Deleted "${t.name}"`;break;case "stats":n=await e.getStats(t.name);break;case "list":n=e.list();break;case "get-store":{n=Array.from(P.all()).map(([i,a])=>({name:i,status:a.status,childrenCount:a.children.length,restartCount:a.restartCount,backoffTime:a.backoffTime,isRestarting:a.isRestarting,probeFailures:a.probeFailures}));break}case "logs":let m=t.name,o=[];if(m){let i=e.getWorker(m);if(!i){r.write(JSON.stringify({ok:!1,error:`Worker "${m}" not found`})+`
3
+ `);return}o.push(i);}else {let i=e.list();for(let a of i){let f=e.getWorker(a);f&&o.push(f);}}if(o.length===0){r.write(JSON.stringify({ok:!1,error:"No active workers to stream logs from"})+`
4
+ `);return}let p=[];for(let i of o){let a=i.mp();for(let f of a.children){let b=x=>{let $=m?"":`[${i.name}] `;r.write(JSON.stringify({ok:!0,data:`${$}${x.toString()}`})+`
5
+ `);};f.stdout?.on("data",b),f.stderr?.on("data",b),p.push({child:f,onData:b});}}r.on("close",()=>{for(let{child:i,onData:a}of p)i.stdout?.off("data",a),i.stderr?.off("data",a);});break;default:l.error("ZPM",`Unknown command: ${t.cmd}`);}S(r,{ok:!0,data:n});}catch(n){S(r,{ok:false,error:String(n.message??n)});}}function S(e,r){e.writable&&e.write(JSON.stringify(r)+`
6
+ `);}export{u as a,R as b,L as c,l as d,P as e,E as f,ar as g};
@@ -0,0 +1,7 @@
1
+ 'use strict';var k=require('os'),y=require('path'),g=require('picocolors'),c=require('winston'),L=require('events'),S=require('fs'),j=require('net');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var k__default=/*#__PURE__*/_interopDefault(k);var y__default=/*#__PURE__*/_interopDefault(y);var g__default=/*#__PURE__*/_interopDefault(g);var c__default=/*#__PURE__*/_interopDefault(c);var L__default=/*#__PURE__*/_interopDefault(L);var S__default=/*#__PURE__*/_interopDefault(S);var j__default=/*#__PURE__*/_interopDefault(j);/* ZuzJS Process Manager */
2
+ var $=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,l=$();var I=(s=>(s.Fork="fork",s.Cluster="cluster",s))(I||{}),M=(o=>(o.Stopped="stopped",o.Starting="starting",o.Running="running",o.Stopping="stopping",o.Crashed="crashed",o.Errored="errored",o))(M||{});var R=y__default.default.join(k__default.default.homedir(),".zpm","logs"),N=c__default.default.format.combine(c__default.default.format.timestamp({format:"YYYY/MM/DD HH:mm:ss"}),c__default.default.format.splat(),c__default.default.format.printf(({timestamp:e,level:r,message:s,tag:t})=>{let n=g__default.default.gray(`[${e}]`),m=g__default.default.bold(`[ZPM/${(t||"SYS").toUpperCase()}]`);return `${n} [${r=="info"?g__default.default.cyan(r):r=="warn"?g__default.default.yellow(r):r=="error"?g__default.default.red(r):r=="success"?g__default.default.green(r):r=="debug"?g__default.default.gray(r):"debug"}] ${m} \u2192 ${s}`})),p=c__default.default.createLogger({levels:{error:0,warn:1,info:2,success:2,debug:3},transports:[new c__default.default.transports.Console({level:"debug",format:N}),new c__default.default.transports.File({filename:y__default.default.join(R,"daemon.log"),format:c__default.default.format.combine(c__default.default.format.timestamp(),c__default.default.format.json())})]}),d={info:(e,...r)=>p.info(r.join(" "),{tag:e}),warn:(e,...r)=>p.warn(r.join(" "),{tag:e}),error:(e,...r)=>p.error(r.join(" "),{tag:e}),debug:(e,...r)=>p.debug(r.join(" "),{tag:e}),success:(e,...r)=>p.log("success",r.join(" "),{tag:e})};var h=class extends L__default.default{map=new Map;set(r,s){this.map.set(r,s),this.emit("change",r,s);}get(r){return this.map.get(r)}has(r){return this.map.has(r)}delete(r){this.map.delete(r),this.emit("delete",r);}all(){return new Map(this.map)}onchange(r){return this.on("change",r)}offchange(r){return this.off("change",r)}},C=new h;function J(e="zuz-pm"){return k__default.default.platform()==="win32"?y__default.default.join("\\\\.\\pipe",e):y__default.default.join(k__default.default.tmpdir(),`${e}.sock`)}function rr(e){let r=J();S__default.default.existsSync(r)&&S__default.default.unlinkSync(r);let s=j__default.default.createServer(t=>{let n="";t.on("data",m=>{n+=m.toString();let o=n.split(`
3
+ `);n=o.pop()??"";for(let u of o)u.trim()&&U(e,t,u);}),t.on("error",m=>{d.error("IPC","Socket error:",m.message);});});return s.listen(r,()=>{if(k__default.default.platform()!=="win32")try{S__default.default.chmodSync(r,"777");}catch(t){console.error("Failed to set socket permissions:",t);}d.success("IPC",`Listening on ${r}`);}),s.on("error",t=>{d.error("IPC","Server error:",t);}),s}async function U(e,r,s){let t;try{t=JSON.parse(s);}catch{w(r,{ok:false,error:"Invalid JSON"});return}try{let n=null;switch(t.cmd){case "ping":n="pong";break;case "start":await e.start(t.config),n=`Started "${t.name}"`;break;case "stop":await e.stop(t.name),n=`Stopped "${t.name}"`;break;case "restart":await e.restart(t.name),n=`Restarted "${t.name}"`;break;case "delete":await e.delete(t.name),n=`Deleted "${t.name}"`;break;case "stats":n=await e.getStats(t.name);break;case "list":n=e.list();break;case "get-store":{n=Array.from(C.all()).map(([i,a])=>({name:i,status:a.status,childrenCount:a.children.length,restartCount:a.restartCount,backoffTime:a.backoffTime,isRestarting:a.isRestarting,probeFailures:a.probeFailures}));break}case "logs":let m=t.name,o=[];if(m){let i=e.getWorker(m);if(!i){r.write(JSON.stringify({ok:!1,error:`Worker "${m}" not found`})+`
4
+ `);return}o.push(i);}else {let i=e.list();for(let a of i){let f=e.getWorker(a);f&&o.push(f);}}if(o.length===0){r.write(JSON.stringify({ok:!1,error:"No active workers to stream logs from"})+`
5
+ `);return}let u=[];for(let i of o){let a=i.mp();for(let f of a.children){let b=T=>{let x=m?"":`[${i.name}] `;r.write(JSON.stringify({ok:!0,data:`${x}${T.toString()}`})+`
6
+ `);};f.stdout?.on("data",b),f.stderr?.on("data",b),u.push({child:f,onData:b});}}r.on("close",()=>{for(let{child:i,onData:a}of u)i.stdout?.off("data",a),i.stderr?.off("data",a);});break;default:d.error("ZPM",`Unknown command: ${t.cmd}`);}w(r,{ok:!0,data:n});}catch(n){w(r,{ok:false,error:String(n.message??n)});}}function w(e,r){e.writable&&e.write(JSON.stringify(r)+`
7
+ `);}exports.a=l;exports.b=I;exports.c=M;exports.d=d;exports.e=C;exports.f=J;exports.g=rr;
package/dist/cli.cjs CHANGED
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var chunkLREN53Z5_cjs=require('./chunk-LREN53Z5.cjs'),chunkKWFTTT7E_cjs=require('./chunk-KWFTTT7E.cjs'),commander=require('commander'),h=require('fs'),y=require('net'),m=require('path'),url=require('url'),n=require('picocolors');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var h__default=/*#__PURE__*/_interopDefault(h);var y__default=/*#__PURE__*/_interopDefault(y);var m__default=/*#__PURE__*/_interopDefault(m);var n__default=/*#__PURE__*/_interopDefault(n);/* ZuzJS Process Manager */
3
- var r=new commander.Command;r.option("-s, --namespace <name>","Internal daemon namespace","zuz-pm");r.parseOptions(process.argv);var x=r.opts(),b=x.namespace,a=new chunkLREN53Z5_cjs.a(b),S=m__default.default.dirname(url.fileURLToPath(chunkKWFTTT7E_cjs.a)),v=m__default.default.resolve(S,"../package.json"),P=JSON.parse(h__default.default.readFileSync(v,"utf8"));r.name("zpm").description("Production grade process manager for the @zuzjs ecosystem").version(P.version,"-v, --version","output the current version");r.command("start <script>").description("Start a new process").option("-n, --name <name>","Unique name for the process").option("-p, --port <port>","Port the app listens on",parseInt).option("-i, --instances <number>","Number of instances (cluster mode)",parseInt,1).option("-d, --dev","Enable development mode (auto-restart)",false).option("-c, --cluster","Use cluster mode instead of fork",false).option("--ws <url>","WebSocket URL to stream logs (e.g. for ZPanel)","http://127.0.0.1:2082/_/wss/zpm").option("--save-logs","Save logs to a local file",false).option("--args <string>",'Arguments to pass to the script (e.g. "dev -p 3000")').option("--probe-type <type>","Type of probe: http, tcp, or exec").option("--probe-target <target>","URL, host:port, or command").option("--probe-interval <sec>","Seconds between probes",parseInt,30).option("--probe-threshold <count>","Failures before restart",parseInt,3).action(async(o,e)=>{try{await a.ensureDaemon();let t=m__default.default.resolve(process.cwd(),o),s=await a.start({name:e.name??m__default.default.basename(o),scriptPath:t,port:e.port,instances:e.instances,devMode:e.dev,mode:e.cluster?"cluster":"fork",args:e.args?e.args.split(" "):[],probe:e.probeTarget?{type:e.probeType,target:e.probeTarget||(e.probeType==="http"?"http://localhost:3000":"localhost:3000"),intervalSeconds:e.probeInterval,failureThreshold:e.probeThreshold,timeoutSeconds:5}:void 0,logs:{wsUrl:e.ws,saveToFile:e.saveLogs}});console.log(n__default.default.cyan("[ZPM]"),s);}catch(t){console.log(n__default.default.cyan("[ZPM]"),n__default.default.red("[ERROR]"),t.message);}});r.command("logs [name]").description("Stream real-time logs (omit name for all logs)").action(async o=>{try{if(!await a.isDaemonRunning())throw new Error("Daemon is not running.");let t=o?`"${o}"`:"all workers";console.log(n__default.default.cyan("[ZPM]"),`Streaming logs for "${n__default.default.green(t)}" (Ctrl+C to stop)`);let s=y__default.default.createConnection(chunkKWFTTT7E_cjs.f(b));s.write(JSON.stringify({cmd:"logs",name:o})+`
4
- `),s.on("data",c=>{let u=c.toString().split(`
5
- `);for(let l of u)if(l.trim())try{let i=JSON.parse(l);i.ok?process.stdout.write(i.data):(console.error(`\x1B[31m${i.error}\x1B[0m`),process.exit(1));}catch{}}),s.on("error",c=>{console.error(`\x1B[31m[IPC Error]\x1B[0m ${c.message}`),process.exit(1);}),process.on("SIGINT",()=>{s.destroy(),console.log(`
6
- \x1B[90mDisconnected from logs.\x1B[0m`),process.exit();});}catch(e){console.error(`\x1B[31m[Error]\x1B[0m ${e.message}`);}});r.command("list").description("List all managed processes").action(async()=>{let o=await a.list();if(o.length===0){console.log("No workers registered.");return}console.log("\x1B[1mManaged Processes:\x1B[0m"),o.forEach(e=>console.log(` \u2022 ${e}`));});r.command("stats [name]").description("Show telemetry for processes").action(async o=>{let e=await a.stats(o);if(e.length===0){console.log("No stats available.");return}e.forEach(t=>{let s=t.uptime?`${Math.round(t.uptime/1e3)}s`:"0s",c=t.status==="running"?"\x1B[32m":"\x1B[31m";console.log(`${c}[${t.status.toUpperCase()}]\x1B[0m \x1B[1m${t.name.padEnd(15)}\x1B[0m PID: ${String(t.pid??"N/A").padEnd(6)} CPU: ${String(t.cpu??0).padStart(3)}% MEM: ${Math.round((t.memoryRss??0)/1024/1024)}MB Uptime: ${s}`);});});["stop","restart","delete"].forEach(o=>{r.command(`${o} <name>`).description(`${o.charAt(0).toUpperCase()+o.slice(1)} a process`).action(async e=>{try{let t=await a[o](e);console.log(`\x1B[32m[ZPM]\x1B[0m ${t}`);}catch(t){console.error(`\x1B[31m[Error]\x1B[0m ${t.message}`);}});});r.command("kill-daemon").description("Stop the background ZPM daemon").action(async()=>{await a.killDaemon(),console.log("\x1B[33mDaemon killed.\x1B[0m");});r.command("store").description("Show raw internal store state for debugging").action(async()=>{let o=await a.getStore();if(o.ok){let e=o.data;if(e.length===0){console.log(n__default.default.yellow("Store is empty."));return}console.log(n__default.default.magenta(`
7
- --- Internal Process Store ---`)),console.table(e),console.log(n__default.default.gray(`Total Managed Processes: ${e.length}
8
- `));}else console.log("StoreError",o);});r.parse(process.argv);
2
+ 'use strict';var chunkFXHHFO4C_cjs=require('./chunk-FXHHFO4C.cjs'),chunkX4TWGCVL_cjs=require('./chunk-X4TWGCVL.cjs'),commander=require('commander'),w=require('fs'),h=require('net'),m=require('path'),url=require('url'),s=require('picocolors');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var w__default=/*#__PURE__*/_interopDefault(w);var h__default=/*#__PURE__*/_interopDefault(h);var m__default=/*#__PURE__*/_interopDefault(m);var s__default=/*#__PURE__*/_interopDefault(s);/* ZuzJS Process Manager */
3
+ var n=new commander.Command;n.option("-s, --namespace <name>","Internal daemon namespace","zuz-pm");n.parseOptions(process.argv);var x=n.opts(),f=x.namespace,c=new chunkFXHHFO4C_cjs.a(f),v=m__default.default.dirname(url.fileURLToPath(chunkX4TWGCVL_cjs.a)),$=m__default.default.resolve(v,"../package.json"),P=JSON.parse(w__default.default.readFileSync($,"utf8"));async function k(o,e){if(!await c.isDaemonRunning())return;let a=e?`"${e}"`:"all workers";console.log(s__default.default.cyan("[ZPM]"),s__default.default.gray(`Attaching stream for ${a}...`));let r=h__default.default.createConnection(chunkX4TWGCVL_cjs.f(o));r.write(JSON.stringify({cmd:"logs",name:e})+`
4
+ `),r.on("data",l=>{let p=l.toString().split(`
5
+ `);for(let i of p)if(i.trim())try{let g=JSON.parse(i);g.ok&&process.stdout.write(g.data);}catch{}}),r.on("error",l=>{console.error(s__default.default.red(`[IPC Error] ${l.message}`));}),process.on("SIGINT",()=>{r.destroy(),console.log(s__default.default.gray(`
6
+ Disconnected from logs.`)),process.exit();});}n.name("zpm").description("Production grade process manager for the @zuzjs ecosystem").version(P.version,"-v, --version","output the current version");n.command("start <script>").description("Start a new process").option("-n, --name <name>","Unique name for the process").option("-p, --port <port>","Port the app listens on",parseInt).option("-i, --instances <number>","Number of instances (cluster mode)",parseInt,1).option("-d, --dev","Enable development mode (auto-restart)",false).option("-c, --cluster","Use cluster mode instead of fork",false).option("--ws <url>","WebSocket URL to stream logs (e.g. for ZPanel)","http://127.0.0.1:2082/_/wss/zpm").option("--save-logs","Save logs to a local file",false).option("--args <string>",'Arguments to pass to the script (e.g. "dev -p 3000")').option("--probe-type <type>","Type of probe: http, tcp, or exec").option("--probe-target <target>","URL, host:port, or command").option("--probe-interval <sec>","Seconds between probes",parseInt,30).option("--probe-threshold <count>","Failures before restart",parseInt,3).action(async(o,e)=>{try{await c.ensureDaemon();let t=m__default.default.resolve(process.cwd(),o),a=e.name??m__default.default.basename(o),r=await c.start({name:e.name??m__default.default.basename(o),scriptPath:t,port:e.port,instances:e.instances,devMode:e.dev,mode:e.cluster?"cluster":"fork",args:e.args?e.args.split(" "):[],probe:e.probeTarget?{type:e.probeType,target:e.probeTarget||(e.probeType==="http"?"http://localhost:3000":"localhost:3000"),intervalSeconds:e.probeInterval,failureThreshold:e.probeThreshold,timeoutSeconds:5}:void 0,logs:{wsUrl:e.ws,saveToFile:e.saveLogs}});console.log(s__default.default.cyan("[ZPM]"),r),e.dev?await k(f,a):process.exit(0);}catch(t){console.log(s__default.default.cyan("[ZPM]"),s__default.default.red("[ERROR]"),t.message);}});n.command("logs [name]").description("Stream real-time logs (omit name for all logs)").action(async o=>{try{if(!await c.isDaemonRunning())throw new Error("Daemon is not running.");let t=o?`"${o}"`:"all workers";console.log(s__default.default.cyan("[ZPM]"),`Streaming logs for "${s__default.default.green(t)}" (Ctrl+C to stop)`);let a=h__default.default.createConnection(chunkX4TWGCVL_cjs.f(f));a.write(JSON.stringify({cmd:"logs",name:o})+`
7
+ `),a.on("data",r=>{let l=r.toString().split(`
8
+ `);for(let p of l)if(p.trim())try{let i=JSON.parse(p);i.ok?process.stdout.write(i.data):(console.error(`\x1B[31m${i.error}\x1B[0m`),process.exit(1));}catch{}}),a.on("error",r=>{console.error(`\x1B[31m[IPC Error]\x1B[0m ${r.message}`),process.exit(1);}),process.on("SIGINT",()=>{a.destroy(),console.log(`
9
+ \x1B[90mDisconnected from logs.\x1B[0m`),process.exit();});}catch(e){console.error(`\x1B[31m[Error]\x1B[0m ${e.message}`);}});n.command("list").description("List all managed processes").action(async()=>{let o=await c.list();if(o.length===0){console.log("No workers registered.");return}console.log("\x1B[1mManaged Processes:\x1B[0m"),o.forEach(e=>console.log(` \u2022 ${e}`));});n.command("stats [name]").description("Show telemetry for processes").action(async o=>{let e=await c.stats(o);if(e.length===0){console.log("No stats available.");return}e.forEach(t=>{let a=t.uptime?`${Math.round(t.uptime/1e3)}s`:"0s",r=t.status==="running"?"\x1B[32m":"\x1B[31m";console.log(`${r}[${t.status.toUpperCase()}]\x1B[0m \x1B[1m${t.name.padEnd(15)}\x1B[0m PID: ${String(t.pid??"N/A").padEnd(6)} CPU: ${String(t.cpu??0).padStart(3)}% MEM: ${Math.round((t.memoryRss??0)/1024/1024)}MB Uptime: ${a}`);});});["stop","restart","delete"].forEach(o=>{n.command(`${o} <name>`).description(`${o.charAt(0).toUpperCase()+o.slice(1)} a process`).action(async e=>{try{let t=await c[o](e);console.log(`\x1B[32m[ZPM]\x1B[0m ${t}`);}catch(t){console.error(`\x1B[31m[Error]\x1B[0m ${t.message}`);}});});n.command("kill-daemon").description("Stop the background ZPM daemon").action(async()=>{await c.killDaemon(),console.log("\x1B[33mDaemon killed.\x1B[0m");});n.command("store").description("Show raw internal store state for debugging").action(async()=>{let o=await c.getStore();if(o.ok){let e=o.data;if(e.length===0){console.log(s__default.default.yellow("Store is empty."));return}console.log(s__default.default.magenta(`
10
+ --- Internal Process Store ---`)),console.table(e),console.log(s__default.default.gray(`Total Managed Processes: ${e.length}
11
+ `));}else console.log("StoreError",o);});n.parse(process.argv);
package/dist/cli.js CHANGED
@@ -1,7 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$1}from'./chunk-A7GJK4HB.js';import {f as f$1}from'./chunk-RDDVTRS6.js';import {Command}from'commander';import f from'fs';import h from'net';import m from'path';import {fileURLToPath}from'url';import n from'picocolors';var r=new Command;r.option("-s, --namespace <name>","Internal daemon namespace","zuz-pm");r.parseOptions(process.argv);var w=r.opts(),d=w.namespace,a=new a$1(d),x=m.dirname(fileURLToPath(import.meta.url)),S=m.resolve(x,"../package.json"),v=JSON.parse(f.readFileSync(S,"utf8"));r.name("zpm").description("Production grade process manager for the @zuzjs ecosystem").version(v.version,"-v, --version","output the current version");r.command("start <script>").description("Start a new process").option("-n, --name <name>","Unique name for the process").option("-p, --port <port>","Port the app listens on",parseInt).option("-i, --instances <number>","Number of instances (cluster mode)",parseInt,1).option("-d, --dev","Enable development mode (auto-restart)",false).option("-c, --cluster","Use cluster mode instead of fork",false).option("--ws <url>","WebSocket URL to stream logs (e.g. for ZPanel)","http://127.0.0.1:2082/_/wss/zpm").option("--save-logs","Save logs to a local file",false).option("--args <string>",'Arguments to pass to the script (e.g. "dev -p 3000")').option("--probe-type <type>","Type of probe: http, tcp, or exec").option("--probe-target <target>","URL, host:port, or command").option("--probe-interval <sec>","Seconds between probes",parseInt,30).option("--probe-threshold <count>","Failures before restart",parseInt,3).action(async(o,e)=>{try{await a.ensureDaemon();let t=m.resolve(process.cwd(),o),s=await a.start({name:e.name??m.basename(o),scriptPath:t,port:e.port,instances:e.instances,devMode:e.dev,mode:e.cluster?"cluster":"fork",args:e.args?e.args.split(" "):[],probe:e.probeTarget?{type:e.probeType,target:e.probeTarget||(e.probeType==="http"?"http://localhost:3000":"localhost:3000"),intervalSeconds:e.probeInterval,failureThreshold:e.probeThreshold,timeoutSeconds:5}:void 0,logs:{wsUrl:e.ws,saveToFile:e.saveLogs}});console.log(n.cyan("[ZPM]"),s);}catch(t){console.log(n.cyan("[ZPM]"),n.red("[ERROR]"),t.message);}});r.command("logs [name]").description("Stream real-time logs (omit name for all logs)").action(async o=>{try{if(!await a.isDaemonRunning())throw new Error("Daemon is not running.");let t=o?`"${o}"`:"all workers";console.log(n.cyan("[ZPM]"),`Streaming logs for "${n.green(t)}" (Ctrl+C to stop)`);let s=h.createConnection(f$1(d));s.write(JSON.stringify({cmd:"logs",name:o})+`
3
- `),s.on("data",c=>{let b=c.toString().split(`
4
- `);for(let l of b)if(l.trim())try{let i=JSON.parse(l);i.ok?process.stdout.write(i.data):(console.error(`\x1B[31m${i.error}\x1B[0m`),process.exit(1));}catch{}}),s.on("error",c=>{console.error(`\x1B[31m[IPC Error]\x1B[0m ${c.message}`),process.exit(1);}),process.on("SIGINT",()=>{s.destroy(),console.log(`
5
- \x1B[90mDisconnected from logs.\x1B[0m`),process.exit();});}catch(e){console.error(`\x1B[31m[Error]\x1B[0m ${e.message}`);}});r.command("list").description("List all managed processes").action(async()=>{let o=await a.list();if(o.length===0){console.log("No workers registered.");return}console.log("\x1B[1mManaged Processes:\x1B[0m"),o.forEach(e=>console.log(` \u2022 ${e}`));});r.command("stats [name]").description("Show telemetry for processes").action(async o=>{let e=await a.stats(o);if(e.length===0){console.log("No stats available.");return}e.forEach(t=>{let s=t.uptime?`${Math.round(t.uptime/1e3)}s`:"0s",c=t.status==="running"?"\x1B[32m":"\x1B[31m";console.log(`${c}[${t.status.toUpperCase()}]\x1B[0m \x1B[1m${t.name.padEnd(15)}\x1B[0m PID: ${String(t.pid??"N/A").padEnd(6)} CPU: ${String(t.cpu??0).padStart(3)}% MEM: ${Math.round((t.memoryRss??0)/1024/1024)}MB Uptime: ${s}`);});});["stop","restart","delete"].forEach(o=>{r.command(`${o} <name>`).description(`${o.charAt(0).toUpperCase()+o.slice(1)} a process`).action(async e=>{try{let t=await a[o](e);console.log(`\x1B[32m[ZPM]\x1B[0m ${t}`);}catch(t){console.error(`\x1B[31m[Error]\x1B[0m ${t.message}`);}});});r.command("kill-daemon").description("Stop the background ZPM daemon").action(async()=>{await a.killDaemon(),console.log("\x1B[33mDaemon killed.\x1B[0m");});r.command("store").description("Show raw internal store state for debugging").action(async()=>{let o=await a.getStore();if(o.ok){let e=o.data;if(e.length===0){console.log(n.yellow("Store is empty."));return}console.log(n.magenta(`
6
- --- Internal Process Store ---`)),console.table(e),console.log(n.gray(`Total Managed Processes: ${e.length}
7
- `));}else console.log("StoreError",o);});r.parse(process.argv);
2
+ import {a}from'./chunk-C2XMYYVX.js';import {f as f$1}from'./chunk-USJACDTS.js';import {Command}from'commander';import y from'fs';import b from'net';import m from'path';import {fileURLToPath}from'url';import s from'picocolors';var n=new Command;n.option("-s, --namespace <name>","Internal daemon namespace","zuz-pm");n.parseOptions(process.argv);var S=n.opts(),f=S.namespace,c=new a(f),x=m.dirname(fileURLToPath(import.meta.url)),v=m.resolve(x,"../package.json"),$=JSON.parse(y.readFileSync(v,"utf8"));async function P(o,e){if(!await c.isDaemonRunning())return;let a=e?`"${e}"`:"all workers";console.log(s.cyan("[ZPM]"),s.gray(`Attaching stream for ${a}...`));let r=b.createConnection(f$1(o));r.write(JSON.stringify({cmd:"logs",name:e})+`
3
+ `),r.on("data",l=>{let p=l.toString().split(`
4
+ `);for(let i of p)if(i.trim())try{let g=JSON.parse(i);g.ok&&process.stdout.write(g.data);}catch{}}),r.on("error",l=>{console.error(s.red(`[IPC Error] ${l.message}`));}),process.on("SIGINT",()=>{r.destroy(),console.log(s.gray(`
5
+ Disconnected from logs.`)),process.exit();});}n.name("zpm").description("Production grade process manager for the @zuzjs ecosystem").version($.version,"-v, --version","output the current version");n.command("start <script>").description("Start a new process").option("-n, --name <name>","Unique name for the process").option("-p, --port <port>","Port the app listens on",parseInt).option("-i, --instances <number>","Number of instances (cluster mode)",parseInt,1).option("-d, --dev","Enable development mode (auto-restart)",false).option("-c, --cluster","Use cluster mode instead of fork",false).option("--ws <url>","WebSocket URL to stream logs (e.g. for ZPanel)","http://127.0.0.1:2082/_/wss/zpm").option("--save-logs","Save logs to a local file",false).option("--args <string>",'Arguments to pass to the script (e.g. "dev -p 3000")').option("--probe-type <type>","Type of probe: http, tcp, or exec").option("--probe-target <target>","URL, host:port, or command").option("--probe-interval <sec>","Seconds between probes",parseInt,30).option("--probe-threshold <count>","Failures before restart",parseInt,3).action(async(o,e)=>{try{await c.ensureDaemon();let t=m.resolve(process.cwd(),o),a=e.name??m.basename(o),r=await c.start({name:e.name??m.basename(o),scriptPath:t,port:e.port,instances:e.instances,devMode:e.dev,mode:e.cluster?"cluster":"fork",args:e.args?e.args.split(" "):[],probe:e.probeTarget?{type:e.probeType,target:e.probeTarget||(e.probeType==="http"?"http://localhost:3000":"localhost:3000"),intervalSeconds:e.probeInterval,failureThreshold:e.probeThreshold,timeoutSeconds:5}:void 0,logs:{wsUrl:e.ws,saveToFile:e.saveLogs}});console.log(s.cyan("[ZPM]"),r),e.dev?await P(f,a):process.exit(0);}catch(t){console.log(s.cyan("[ZPM]"),s.red("[ERROR]"),t.message);}});n.command("logs [name]").description("Stream real-time logs (omit name for all logs)").action(async o=>{try{if(!await c.isDaemonRunning())throw new Error("Daemon is not running.");let t=o?`"${o}"`:"all workers";console.log(s.cyan("[ZPM]"),`Streaming logs for "${s.green(t)}" (Ctrl+C to stop)`);let a=b.createConnection(f$1(f));a.write(JSON.stringify({cmd:"logs",name:o})+`
6
+ `),a.on("data",r=>{let l=r.toString().split(`
7
+ `);for(let p of l)if(p.trim())try{let i=JSON.parse(p);i.ok?process.stdout.write(i.data):(console.error(`\x1B[31m${i.error}\x1B[0m`),process.exit(1));}catch{}}),a.on("error",r=>{console.error(`\x1B[31m[IPC Error]\x1B[0m ${r.message}`),process.exit(1);}),process.on("SIGINT",()=>{a.destroy(),console.log(`
8
+ \x1B[90mDisconnected from logs.\x1B[0m`),process.exit();});}catch(e){console.error(`\x1B[31m[Error]\x1B[0m ${e.message}`);}});n.command("list").description("List all managed processes").action(async()=>{let o=await c.list();if(o.length===0){console.log("No workers registered.");return}console.log("\x1B[1mManaged Processes:\x1B[0m"),o.forEach(e=>console.log(` \u2022 ${e}`));});n.command("stats [name]").description("Show telemetry for processes").action(async o=>{let e=await c.stats(o);if(e.length===0){console.log("No stats available.");return}e.forEach(t=>{let a=t.uptime?`${Math.round(t.uptime/1e3)}s`:"0s",r=t.status==="running"?"\x1B[32m":"\x1B[31m";console.log(`${r}[${t.status.toUpperCase()}]\x1B[0m \x1B[1m${t.name.padEnd(15)}\x1B[0m PID: ${String(t.pid??"N/A").padEnd(6)} CPU: ${String(t.cpu??0).padStart(3)}% MEM: ${Math.round((t.memoryRss??0)/1024/1024)}MB Uptime: ${a}`);});});["stop","restart","delete"].forEach(o=>{n.command(`${o} <name>`).description(`${o.charAt(0).toUpperCase()+o.slice(1)} a process`).action(async e=>{try{let t=await c[o](e);console.log(`\x1B[32m[ZPM]\x1B[0m ${t}`);}catch(t){console.error(`\x1B[31m[Error]\x1B[0m ${t.message}`);}});});n.command("kill-daemon").description("Stop the background ZPM daemon").action(async()=>{await c.killDaemon(),console.log("\x1B[33mDaemon killed.\x1B[0m");});n.command("store").description("Show raw internal store state for debugging").action(async()=>{let o=await c.getStore();if(o.ok){let e=o.data;if(e.length===0){console.log(s.yellow("Store is empty."));return}console.log(s.magenta(`
9
+ --- Internal Process Store ---`)),console.table(e),console.log(s.gray(`Total Managed Processes: ${e.length}
10
+ `));}else console.log("StoreError",o);});n.parse(process.argv);
package/dist/daemon.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunk3R63PPU4_cjs=require('./chunk-3R63PPU4.cjs'),chunkKWFTTT7E_cjs=require('./chunk-KWFTTT7E.cjs'),r=require('fs'),m=require('os'),p=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var r__default=/*#__PURE__*/_interopDefault(r);var m__default=/*#__PURE__*/_interopDefault(m);var p__default=/*#__PURE__*/_interopDefault(p);/* ZuzJS Process Manager */
2
- var i=p__default.default.join(m__default.default.tmpdir(),"zuz-pm.pid");function d(){r__default.default.writeFileSync(i,String(process.pid));}function u(){r__default.default.existsSync(i)&&r__default.default.unlinkSync(i);}var f=p__default.default.join(m__default.default.tmpdir(),"zuz-pm.snapshot.json");function l(o){try{let s=o.list();r__default.default.writeFileSync(f,JSON.stringify(s,null,2));}catch{}}async function S(){chunkKWFTTT7E_cjs.d.success("daemon",`Booting ZPM daemon (PID ${process.pid})`),d();let o=new chunk3R63PPU4_cjs.c,s=chunkKWFTTT7E_cjs.g(o);async function t(e){chunkKWFTTT7E_cjs.d.info("daemon",`Received ${e} \u2013 shutting down\u2026`),l(o),s.close(),await o.stopAll(),u(),process.exit(0);}process.on("SIGINT",()=>t("SIGINT")),process.on("SIGTERM",()=>t("SIGTERM")),process.on("uncaughtException",e=>chunkKWFTTT7E_cjs.d.error("daemon","Uncaught exception:",e)),process.on("unhandledRejection",e=>chunkKWFTTT7E_cjs.d.error("daemon","Unhandled rejection:",e)),chunkKWFTTT7E_cjs.d.success("daemon","Ready \u2013 waiting for IPC commands.");}S().catch(o=>{chunkKWFTTT7E_cjs.d.error("daemon","Fatal startup error:",o),process.exit(1);});
1
+ 'use strict';var chunkGPBCVUB7_cjs=require('./chunk-GPBCVUB7.cjs'),chunkX4TWGCVL_cjs=require('./chunk-X4TWGCVL.cjs'),r=require('fs'),m=require('os'),p=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var r__default=/*#__PURE__*/_interopDefault(r);var m__default=/*#__PURE__*/_interopDefault(m);var p__default=/*#__PURE__*/_interopDefault(p);/* ZuzJS Process Manager */
2
+ var i=p__default.default.join(m__default.default.tmpdir(),"zuz-pm.pid");function d(){r__default.default.writeFileSync(i,String(process.pid));}function u(){r__default.default.existsSync(i)&&r__default.default.unlinkSync(i);}var f=p__default.default.join(m__default.default.tmpdir(),"zuz-pm.snapshot.json");function l(o){try{let s=o.list();r__default.default.writeFileSync(f,JSON.stringify(s,null,2));}catch{}}async function S(){chunkX4TWGCVL_cjs.d.success("daemon",`Booting ZPM daemon (PID ${process.pid})`),d();let o=new chunkGPBCVUB7_cjs.c,s=chunkX4TWGCVL_cjs.g(o);async function t(e){chunkX4TWGCVL_cjs.d.info("daemon",`Received ${e} \u2013 shutting down\u2026`),l(o),s.close(),await o.stopAll(),u(),process.exit(0);}process.on("SIGINT",()=>t("SIGINT")),process.on("SIGTERM",()=>t("SIGTERM")),process.on("uncaughtException",e=>chunkX4TWGCVL_cjs.d.error("daemon","Uncaught exception:",e)),process.on("unhandledRejection",e=>chunkX4TWGCVL_cjs.d.error("daemon","Unhandled rejection:",e)),chunkX4TWGCVL_cjs.d.success("daemon","Ready \u2013 waiting for IPC commands.");}S().catch(o=>{chunkX4TWGCVL_cjs.d.error("daemon","Fatal startup error:",o),process.exit(1);});
package/dist/daemon.js CHANGED
@@ -1 +1 @@
1
- import {c}from'./chunk-26X45QS4.js';import {d as d$1,g}from'./chunk-RDDVTRS6.js';import r from'fs';import m from'os';import p from'path';var i=p.join(m.tmpdir(),"zuz-pm.pid");function d(){r.writeFileSync(i,String(process.pid));}function u(){r.existsSync(i)&&r.unlinkSync(i);}var f=p.join(m.tmpdir(),"zuz-pm.snapshot.json");function l(o){try{let s=o.list();r.writeFileSync(f,JSON.stringify(s,null,2));}catch{}}async function S(){d$1.success("daemon",`Booting ZPM daemon (PID ${process.pid})`),d();let o=new c,s=g(o);async function t(e){d$1.info("daemon",`Received ${e} \u2013 shutting down\u2026`),l(o),s.close(),await o.stopAll(),u(),process.exit(0);}process.on("SIGINT",()=>t("SIGINT")),process.on("SIGTERM",()=>t("SIGTERM")),process.on("uncaughtException",e=>d$1.error("daemon","Uncaught exception:",e)),process.on("unhandledRejection",e=>d$1.error("daemon","Unhandled rejection:",e)),d$1.success("daemon","Ready \u2013 waiting for IPC commands.");}S().catch(o=>{d$1.error("daemon","Fatal startup error:",o),process.exit(1);});
1
+ import {c}from'./chunk-BVPMXWDI.js';import {d as d$1,g}from'./chunk-USJACDTS.js';import r from'fs';import m from'os';import p from'path';var i=p.join(m.tmpdir(),"zuz-pm.pid");function d(){r.writeFileSync(i,String(process.pid));}function u(){r.existsSync(i)&&r.unlinkSync(i);}var f=p.join(m.tmpdir(),"zuz-pm.snapshot.json");function l(o){try{let s=o.list();r.writeFileSync(f,JSON.stringify(s,null,2));}catch{}}async function S(){d$1.success("daemon",`Booting ZPM daemon (PID ${process.pid})`),d();let o=new c,s=g(o);async function t(e){d$1.info("daemon",`Received ${e} \u2013 shutting down\u2026`),l(o),s.close(),await o.stopAll(),u(),process.exit(0);}process.on("SIGINT",()=>t("SIGINT")),process.on("SIGTERM",()=>t("SIGTERM")),process.on("uncaughtException",e=>d$1.error("daemon","Uncaught exception:",e)),process.on("unhandledRejection",e=>d$1.error("daemon","Unhandled rejection:",e)),d$1.success("daemon","Ready \u2013 waiting for IPC commands.");}S().catch(o=>{d$1.error("daemon","Fatal startup error:",o),process.exit(1);});
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var chunkLREN53Z5_cjs=require('./chunk-LREN53Z5.cjs'),chunk3R63PPU4_cjs=require('./chunk-3R63PPU4.cjs'),chunkKWFTTT7E_cjs=require('./chunk-KWFTTT7E.cjs');Object.defineProperty(exports,"ZPMClient",{enumerable:true,get:function(){return chunkLREN53Z5_cjs.a}});Object.defineProperty(exports,"zpm",{enumerable:true,get:function(){return chunkLREN53Z5_cjs.b}});Object.defineProperty(exports,"ProcessManager",{enumerable:true,get:function(){return chunk3R63PPU4_cjs.c}});Object.defineProperty(exports,"Worker",{enumerable:true,get:function(){return chunk3R63PPU4_cjs.b}});Object.defineProperty(exports,"runProbe",{enumerable:true,get:function(){return chunk3R63PPU4_cjs.a}});Object.defineProperty(exports,"WorkerMode",{enumerable:true,get:function(){return chunkKWFTTT7E_cjs.b}});Object.defineProperty(exports,"WorkerStatus",{enumerable:true,get:function(){return chunkKWFTTT7E_cjs.c}});Object.defineProperty(exports,"getSocketPath",{enumerable:true,get:function(){return chunkKWFTTT7E_cjs.f}});Object.defineProperty(exports,"logger",{enumerable:true,get:function(){return chunkKWFTTT7E_cjs.d}});Object.defineProperty(exports,"processStore",{enumerable:true,get:function(){return chunkKWFTTT7E_cjs.e}});
1
+ 'use strict';var chunkFXHHFO4C_cjs=require('./chunk-FXHHFO4C.cjs'),chunkGPBCVUB7_cjs=require('./chunk-GPBCVUB7.cjs'),chunkX4TWGCVL_cjs=require('./chunk-X4TWGCVL.cjs');Object.defineProperty(exports,"ZPMClient",{enumerable:true,get:function(){return chunkFXHHFO4C_cjs.a}});Object.defineProperty(exports,"zpm",{enumerable:true,get:function(){return chunkFXHHFO4C_cjs.b}});Object.defineProperty(exports,"ProcessManager",{enumerable:true,get:function(){return chunkGPBCVUB7_cjs.c}});Object.defineProperty(exports,"Worker",{enumerable:true,get:function(){return chunkGPBCVUB7_cjs.b}});Object.defineProperty(exports,"runProbe",{enumerable:true,get:function(){return chunkGPBCVUB7_cjs.a}});Object.defineProperty(exports,"WorkerMode",{enumerable:true,get:function(){return chunkX4TWGCVL_cjs.b}});Object.defineProperty(exports,"WorkerStatus",{enumerable:true,get:function(){return chunkX4TWGCVL_cjs.c}});Object.defineProperty(exports,"getSocketPath",{enumerable:true,get:function(){return chunkX4TWGCVL_cjs.f}});Object.defineProperty(exports,"logger",{enumerable:true,get:function(){return chunkX4TWGCVL_cjs.d}});Object.defineProperty(exports,"processStore",{enumerable:true,get:function(){return chunkX4TWGCVL_cjs.e}});
package/dist/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { ChildProcess } from 'node:child_process';
2
+ import winston from 'winston';
2
3
  import EventEmitter from 'node:events';
3
4
 
4
5
  declare enum WorkerMode {
@@ -114,6 +115,7 @@ interface ManagedProcess {
114
115
  probeTimer: NodeJS.Timeout | null;
115
116
  probeFailures: number;
116
117
  isRestarting: boolean;
118
+ lastError?: string;
117
119
  }
118
120
 
119
121
  /**
@@ -215,11 +217,11 @@ declare const zpm: ZPMClient;
215
217
  declare function getSocketPath(namespace?: string): string;
216
218
 
217
219
  declare const logger: {
218
- info: (tag: string, ...a: unknown[]) => void;
219
- warn: (tag: string, ...a: unknown[]) => void;
220
- error: (tag: string, ...a: unknown[]) => void;
221
- debug: (tag: string, ...a: unknown[]) => void;
222
- success: (tag: string, ...a: unknown[]) => void;
220
+ info: (tag: string, ...a: any[]) => winston.Logger;
221
+ warn: (tag: string, ...a: any[]) => winston.Logger;
222
+ error: (tag: string, ...a: any[]) => winston.Logger;
223
+ debug: (tag: string, ...a: any[]) => winston.Logger;
224
+ success: (tag: string, ...a: any[]) => winston.Logger;
223
225
  };
224
226
 
225
227
  /**
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { ChildProcess } from 'node:child_process';
2
+ import winston from 'winston';
2
3
  import EventEmitter from 'node:events';
3
4
 
4
5
  declare enum WorkerMode {
@@ -114,6 +115,7 @@ interface ManagedProcess {
114
115
  probeTimer: NodeJS.Timeout | null;
115
116
  probeFailures: number;
116
117
  isRestarting: boolean;
118
+ lastError?: string;
117
119
  }
118
120
 
119
121
  /**
@@ -215,11 +217,11 @@ declare const zpm: ZPMClient;
215
217
  declare function getSocketPath(namespace?: string): string;
216
218
 
217
219
  declare const logger: {
218
- info: (tag: string, ...a: unknown[]) => void;
219
- warn: (tag: string, ...a: unknown[]) => void;
220
- error: (tag: string, ...a: unknown[]) => void;
221
- debug: (tag: string, ...a: unknown[]) => void;
222
- success: (tag: string, ...a: unknown[]) => void;
220
+ info: (tag: string, ...a: any[]) => winston.Logger;
221
+ warn: (tag: string, ...a: any[]) => winston.Logger;
222
+ error: (tag: string, ...a: any[]) => winston.Logger;
223
+ debug: (tag: string, ...a: any[]) => winston.Logger;
224
+ success: (tag: string, ...a: any[]) => winston.Logger;
223
225
  };
224
226
 
225
227
  /**
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export{a as ZPMClient,b as zpm}from'./chunk-A7GJK4HB.js';export{c as ProcessManager,b as Worker,a as runProbe}from'./chunk-26X45QS4.js';export{b as WorkerMode,c as WorkerStatus,f as getSocketPath,d as logger,e as processStore}from'./chunk-RDDVTRS6.js';
1
+ export{a as ZPMClient,b as zpm}from'./chunk-C2XMYYVX.js';export{c as ProcessManager,b as Worker,a as runProbe}from'./chunk-BVPMXWDI.js';export{b as WorkerMode,c as WorkerStatus,f as getSocketPath,d as logger,e as processStore}from'./chunk-USJACDTS.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuzjs/pm",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "keywords": [
5
5
  "core",
6
6
  "zuz",
@@ -45,6 +45,7 @@
45
45
  "nanoid": "^5.1.6",
46
46
  "picocolors": "^1.1.1",
47
47
  "pidusage": "^4.0.1",
48
+ "winston": "^3.19.0",
48
49
  "ws": "^8.19.0"
49
50
  }
50
51
  }
@@ -1,7 +0,0 @@
1
- 'use strict';var R=require('events'),b=require('fs'),M=require('net'),k=require('os'),w=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var R__default=/*#__PURE__*/_interopDefault(R);var b__default=/*#__PURE__*/_interopDefault(b);var M__default=/*#__PURE__*/_interopDefault(M);var k__default=/*#__PURE__*/_interopDefault(k);var w__default=/*#__PURE__*/_interopDefault(w);/* ZuzJS Process Manager */
2
- var x=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,f=x();var T=(s=>(s.Fork="fork",s.Cluster="cluster",s))(T||{}),v=(o=>(o.Stopped="stopped",o.Starting="starting",o.Running="running",o.Stopping="stopping",o.Crashed="crashed",o.Errored="errored",o))(v||{});var y={info:"\x1B[36m",warn:"\x1B[33m",error:"\x1B[31m",debug:"\x1B[90m",success:"\x1B[32m"},$="\x1B[0m",I="\x1B[1m";function L(){return new Date().toISOString()}function g(r,e,...s){let t=y[r],n=`${I}${t}[ZPM/${e.toUpperCase()}]${$} ${L()}`;console[r==="success"?"log":r](`${n} \u2192`,...s);}var l={info:(r,...e)=>g("info",r,...e),warn:(r,...e)=>g("warn",r,...e),error:(r,...e)=>g("error",r,...e),debug:(r,...e)=>g("debug",r,...e),success:(r,...e)=>g("success",r,...e)};var p=class extends R__default.default{map=new Map;set(e,s){this.map.set(e,s),this.emit("change",e,s);}get(e){return this.map.get(e)}has(e){return this.map.has(e)}delete(e){this.map.delete(e),this.emit("delete",e);}all(){return new Map(this.map)}onchange(e){return this.on("change",e)}offchange(e){return this.off("change",e)}},S=new p;function N(r="zuz-pm"){return k__default.default.platform()==="win32"?w__default.default.join("\\\\.\\pipe",r):w__default.default.join(k__default.default.tmpdir(),`${r}.sock`)}function G(r){let e=N();b__default.default.existsSync(e)&&b__default.default.unlinkSync(e);let s=M__default.default.createServer(t=>{let n="";t.on("data",c=>{n+=c.toString();let o=n.split(`
3
- `);n=o.pop()??"";for(let u of o)u.trim()&&O(r,t,u);}),t.on("error",c=>{l.error("IPC","Socket error:",c.message);});});return s.listen(e,()=>{if(k__default.default.platform()!=="win32")try{b__default.default.chmodSync(e,"777");}catch(t){console.error("Failed to set socket permissions:",t);}l.success("IPC",`Listening on ${e}`);}),s.on("error",t=>{l.error("IPC","Server error:",t);}),s}async function O(r,e,s){let t;try{t=JSON.parse(s);}catch{h(e,{ok:false,error:"Invalid JSON"});return}try{let n=null;switch(t.cmd){case "ping":n="pong";break;case "start":await r.start(t.config),n=`Started "${t.name}"`;break;case "stop":await r.stop(t.name),n=`Stopped "${t.name}"`;break;case "restart":await r.restart(t.name),n=`Restarted "${t.name}"`;break;case "delete":await r.delete(t.name),n=`Deleted "${t.name}"`;break;case "stats":n=await r.getStats(t.name);break;case "list":n=r.list();break;case "get-store":{n=Array.from(S.all()).map(([a,i])=>({name:a,status:i.status,childrenCount:i.children.length,restartCount:i.restartCount,backoffTime:i.backoffTime,isRestarting:i.isRestarting,probeFailures:i.probeFailures}));break}case "logs":let c=t.name,o=[];if(c){let a=r.getWorker(c);if(!a){e.write(JSON.stringify({ok:!1,error:`Worker "${c}" not found`})+`
4
- `);return}o.push(a);}else {let a=r.list();for(let i of a){let m=r.getWorker(i);m&&o.push(m);}}if(o.length===0){e.write(JSON.stringify({ok:!1,error:"No active workers to stream logs from"})+`
5
- `);return}let u=[];for(let a of o){let i=a.mp();for(let m of i.children){let d=C=>{let P=c?"":`[${a.name}] `;e.write(JSON.stringify({ok:!0,data:`${P}${C.toString()}`})+`
6
- `);};m.stdout?.on("data",d),m.stderr?.on("data",d),u.push({child:m,onData:d});}}e.on("close",()=>{for(let{child:a,onData:i}of u)a.stdout?.off("data",i),a.stderr?.off("data",i);});break;default:l.error("ZPM",`Unknown command: ${t.cmd}`);}h(e,{ok:!0,data:n});}catch(n){h(e,{ok:false,error:String(n.message??n)});}}function h(r,e){r.writable&&r.write(JSON.stringify(e)+`
7
- `);}exports.a=f;exports.b=T;exports.c=v;exports.d=l;exports.e=S;exports.f=N;exports.g=G;
@@ -1,6 +0,0 @@
1
- import C from'path';import {fileURLToPath}from'url';import J from'events';import h from'fs';import D from'net';import w from'os';var y=()=>fileURLToPath(import.meta.url),$=()=>C.dirname(y()),f=$();var L=(s=>(s.Fork="fork",s.Cluster="cluster",s))(L||{}),I=(o=>(o.Stopped="stopped",o.Starting="starting",o.Running="running",o.Stopping="stopping",o.Crashed="crashed",o.Errored="errored",o))(I||{});var R={info:"\x1B[36m",warn:"\x1B[33m",error:"\x1B[31m",debug:"\x1B[90m",success:"\x1B[32m"},M="\x1B[0m",N="\x1B[1m";function O(){return new Date().toISOString()}function u(r,e,...s){let t=R[r],n=`${N}${t}[ZPM/${e.toUpperCase()}]${M} ${O()}`;console[r==="success"?"log":r](`${n} \u2192`,...s);}var l={info:(r,...e)=>u("info",r,...e),warn:(r,...e)=>u("warn",r,...e),error:(r,...e)=>u("error",r,...e),debug:(r,...e)=>u("debug",r,...e),success:(r,...e)=>u("success",r,...e)};var b=class extends J{map=new Map;set(e,s){this.map.set(e,s),this.emit("change",e,s);}get(e){return this.map.get(e)}has(e){return this.map.has(e)}delete(e){this.map.delete(e),this.emit("delete",e);}all(){return new Map(this.map)}onchange(e){return this.on("change",e)}offchange(e){return this.off("change",e)}},S=new b;function F(r="zuz-pm"){return w.platform()==="win32"?C.join("\\\\.\\pipe",r):C.join(w.tmpdir(),`${r}.sock`)}function ee(r){let e=F();h.existsSync(e)&&h.unlinkSync(e);let s=D.createServer(t=>{let n="";t.on("data",m=>{n+=m.toString();let o=n.split(`
2
- `);n=o.pop()??"";for(let g of o)g.trim()&&E(r,t,g);}),t.on("error",m=>{l.error("IPC","Socket error:",m.message);});});return s.listen(e,()=>{if(w.platform()!=="win32")try{h.chmodSync(e,"777");}catch(t){console.error("Failed to set socket permissions:",t);}l.success("IPC",`Listening on ${e}`);}),s.on("error",t=>{l.error("IPC","Server error:",t);}),s}async function E(r,e,s){let t;try{t=JSON.parse(s);}catch{k(e,{ok:false,error:"Invalid JSON"});return}try{let n=null;switch(t.cmd){case "ping":n="pong";break;case "start":await r.start(t.config),n=`Started "${t.name}"`;break;case "stop":await r.stop(t.name),n=`Stopped "${t.name}"`;break;case "restart":await r.restart(t.name),n=`Restarted "${t.name}"`;break;case "delete":await r.delete(t.name),n=`Deleted "${t.name}"`;break;case "stats":n=await r.getStats(t.name);break;case "list":n=r.list();break;case "get-store":{n=Array.from(S.all()).map(([a,i])=>({name:a,status:i.status,childrenCount:i.children.length,restartCount:i.restartCount,backoffTime:i.backoffTime,isRestarting:i.isRestarting,probeFailures:i.probeFailures}));break}case "logs":let m=t.name,o=[];if(m){let a=r.getWorker(m);if(!a){e.write(JSON.stringify({ok:!1,error:`Worker "${m}" not found`})+`
3
- `);return}o.push(a);}else {let a=r.list();for(let i of a){let c=r.getWorker(i);c&&o.push(c);}}if(o.length===0){e.write(JSON.stringify({ok:!1,error:"No active workers to stream logs from"})+`
4
- `);return}let g=[];for(let a of o){let i=a.mp();for(let c of i.children){let d=P=>{let x=m?"":`[${a.name}] `;e.write(JSON.stringify({ok:!0,data:`${x}${P.toString()}`})+`
5
- `);};c.stdout?.on("data",d),c.stderr?.on("data",d),g.push({child:c,onData:d});}}e.on("close",()=>{for(let{child:a,onData:i}of g)a.stdout?.off("data",i),a.stderr?.off("data",i);});break;default:l.error("ZPM",`Unknown command: ${t.cmd}`);}k(e,{ok:!0,data:n});}catch(n){k(e,{ok:false,error:String(n.message??n)});}}function k(r,e){r.writable&&r.write(JSON.stringify(e)+`
6
- `);}export{f as a,L as b,I as c,l as d,S as e,F as f,ee as g};