@ebowwa/pkg-ops 0.1.18 → 0.1.19

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
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA6kCH,OAAO,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,+BAA+B,EAC/B,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA+kCH,OAAO,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,+BAA+B,EAC/B,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,21 +1,21 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{readFileSync as a0,existsSync as e0}from"fs";import{constants as I,mkdirSync as L0,readFileSync as F0,writeFileSync as V0,existsSync as s}from"node:fs";import{dirname as y0}from"node:path";var v={packages:{},healthPort:8914,workDir:"/root",logLevel:"info"},x0="/etc/pkg-ops",I0=`${x0}/config.json`;function S(){return process.env.PKG_OPS_CONFIG??I0}function a(){let $=y0(S());if(!s($))L0($,{recursive:!0,mode:I.S_IRWXU|I.S_IRGRP|I.S_IXGRP})}function E(){let $=S();try{if(!s($))return{...v};let Y=F0($,"utf-8"),W=JSON.parse(Y);return{...v,...W}}catch(Y){return console.error(`Failed to load config from ${$}:`,Y),{...v}}}function b($){let Y=S();a();let W=JSON.stringify($,null,2);V0(Y,W,{encoding:"utf-8",mode:I.S_IRUSR|I.S_IWUSR|I.S_IRGRP})}function M($,Y){let W=E();return W.packages[$]=Y,b(W),W}function b0($){let Y=E();return delete Y.packages[$],b(Y),Y}function O($){return E().packages[$]}function d(){let $=E();return Object.entries($.packages).map(([Y,W])=>({name:Y,config:W}))}function T($){return $.startsWith("@ebowwa/")}function D($){let Y=$.lastIndexOf("@");if(Y<=0)return{name:$,version:"latest"};let W=$.slice(0,Y),X=$.slice(Y+1);if(!X)return{name:W,version:"latest"};return{name:W,version:X}}function G0($){let W=E().packages[$];if(!W?.versions)return[];return Object.entries(W.versions).map(([X,Z])=>({version:X,...Z}))}function M0($,Y){return!!E().packages[$]?.versions?.[Y]}function D0($){return E().packages[$]?.version??null}function P0($,Y,W){let X=E();if(!X.packages[$])X.packages[$]={version:Y,versions:{},service:$.replace("@ebowwa/",""),autoStart:!0};X.packages[$].versions[Y]={installedAt:W.installedAt??new Date().toISOString(),distSizeBytes:W.distSizeBytes??null,fileCount:W.fileCount??null},b(X)}function S0($,Y){let W=E(),X=W.packages[$];if(!X?.versions?.[Y])return!1;if(delete X.versions[Y],X.version===Y){let Z=Object.keys(X.versions).sort((q,Q)=>{let H=X.versions[q]?.installedAt??"";return(X.versions[Q]?.installedAt??"").localeCompare(H)});if(Z.length>0)X.version=Z[0];else delete W.packages[$]}return b(W),!0}function z0($,Y){let W=E(),X=W.packages[$];if(!X?.versions?.[Y])return!1;return X.version=Y,b(W),!0}function C0($){let W=E().packages[$];return Object.keys(W?.versions??{}).length}function h0(){let $=E(),Y=[];for(let[W,X]of Object.entries($.packages)){let Z=Object.keys(X.versions??{});if(Z.length>1)Y.push({name:W,activeVersion:X.version,totalVersions:Z.length,versions:Z.sort((q,Q)=>Q.localeCompare(q,void 0,{numeric:!0}))})}return Y}var{getPrototypeOf:b1,defineProperty:B0,getOwnPropertyNames:G1,getOwnPropertyDescriptor:M1}=Object;var N0=($,Y)=>{for(var W in Y)B0($,W,{get:Y[W],enumerable:!0,configurable:!0,set:(X)=>Y[W]=()=>X})},u0=($,Y)=>()=>($&&(Y=$($=0)),Y),e={};N0(e,{writeFile:()=>f0,sudo:()=>P,pkgInstall:()=>k0,exec:()=>$0});async function P($,Y){let W=Array.isArray($)?$:$.split(/\s+/),X=["sudo",...Y.env?Object.entries(Y.env).map(([Z,q])=>`${Z}=${j(q)}`):[],...W];return $0(X,Y)}async function k0($,Y){let W=Y.pm??"apt",X={...Y.env,...Y.nonInteractive!==!1?{DEBIAN_FRONTEND:"noninteractive"}:{}};return await P(X0[W],{...Y,env:X,quiet:!0}),P([...W0[W],...$],{...Y,env:X})}async function f0($,Y,W){let X=`tee ${W.append?"-a":""} ${j($)}`.trim(),Z=await v0(Y,["sudo",X],W);if(Z.ok&&W.mode)await P(["chmod",W.mode,$],W);if(Z.ok&&W.owner)await P(["chown",W.owner,$],W);return Z}function Y0($){let Y=["ssh","-F","/dev/null","-o","StrictHostKeyChecking=no","-o","UserKnownHostsFile=/dev/null"];if($.keyPath)Y.push("-i",$.keyPath);else if($.key)Y.push("-i",$.key);if($.port)Y.push("-p",String($.port));return Y.push(`${$.user??"root"}@${$.host}`),Y}async function $0($,Y){let W=Y.context??{type:"local"},X=W.type==="ssh"?[...Y0(W),$.map(j).join(" ")]:$,Z=Bun.spawn(X,{stdout:"pipe",stderr:"pipe",timeout:Y.timeout??30000}),q=await Z.exited,Q=Y.quiet?"":await new Response(Z.stdout).text(),H=await new Response(Z.stderr).text();return{stdout:Q,stderr:H,exitCode:q,ok:q===0}}async function v0($,Y,W){let X=W.context??{type:"local"};if(X.type==="ssh"){let K=Y0(X),V=Y.join(" "),y=[...K,V],w=Bun.spawn(y,{stdin:new TextEncoder().encode($),stdout:"pipe",stderr:"pipe",timeout:W.timeout??30000}),x=await w.exited,A=W.quiet?"":await new Response(w.stdout).text(),R=await new Response(w.stderr).text();return{stdout:A,stderr:R,exitCode:x,ok:x===0}}let Z=Bun.spawn(["sh","-c",Y.join(" ")],{stdin:new TextEncoder().encode($),stdout:"pipe",stderr:"pipe",timeout:W.timeout??30000}),q=await Z.exited,Q=W.quiet?"":await new Response(Z.stdout).text(),H=await new Response(Z.stderr).text();return{stdout:Q,stderr:H,exitCode:q,ok:q===0}}function j($){if(/^[a-zA-Z0-9._\-\/=:@]+$/.test($))return $;return`'${$.replace(/'/g,"'\\''")}'`}var W0,X0,d0=u0(()=>{W0={apt:["apt-get","install","-y"],dnf:["dnf","install","-y"],apk:["apk","add","--no-cache"]},X0={apt:["apt-get","update","-qq"],dnf:["dnf","check-update"],apk:["apk","update"]}});async function L($,Y){let{sudo:W}=await Promise.resolve().then(()=>(d0(),e));return W($,Y)}async function z($,Y){return L(["systemctl","enable",$],Y)}async function C($,Y){return L(["systemctl","disable",$],Y)}async function h($,Y){return L(["systemctl","start",$],Y)}async function B($,Y){return L(["systemctl","stop",$],Y)}async function N($,Y){return L(["systemctl","restart",$],Y)}async function u($,Y){let W=await L(["systemctl","show",$,"--property=LoadState,ActiveState,SubState,MainPID,Description"],{...Y});if(!W.ok)return{loaded:!1,active:!1,subState:"unknown",mainPid:0,description:""};let X=(Z)=>{return W.stdout.match(new RegExp(`^${Z}=(.+)$`,"m"))?.[1]?.trim()??""};return{loaded:X("LoadState")==="loaded",active:X("ActiveState")==="active",subState:X("SubState"),mainPid:parseInt(X("MainPID")||"0",10),description:X("Description")}}async function k($,Y){let W=await L(["systemctl","list-unit-files",$+".service"],Y);return W.ok&&W.stdout.includes($)}async function f($,Y={}){let W=["journalctl","-u",$,"-n",String(Y.lines??100)];if(Y.since)W.push("--since",Y.since);if(!Y.follow)W.push("-n",String(Y.lines??100));return(await L(W,Y)).stdout}class l{sudoOptions;constructor($){this.sudoOptions=$??{context:{type:"local"}}}async start($){let Y=await h($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} started`:Y.stderr||Y.stdout}}async stop($){let Y=await B($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} stopped`:Y.stderr||Y.stdout}}async restart($){let Y=await N($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} restarted`:Y.stderr||Y.stdout}}async status($){return u($,this.sudoOptions)}async enable($){let Y=await z($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} enabled`:Y.stderr||Y.stdout}}async disable($){let Y=await C($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} disabled`:Y.stderr||Y.stdout}}async exists($){return k($,this.sudoOptions)}async logs($,Y){return f($,{...this.sudoOptions,lines:Y?.lines??100,since:Y?.since})}async info($){let[Y,W]=await Promise.all([this.exists($),this.status($)]);return{name:$,exists:Y,status:W}}async isHealthy($){let Y=await this.status($);return Y.active&&Y.subState==="running"}async waitForHealthy($,Y){let W=Y?.timeout??30000,X=Y?.interval??1000,Z=Date.now();while(Date.now()-Z<W){if(await this.isHealthy($))return!0;await new Promise((Q)=>setTimeout(Q,X))}return!1}}var p=null;function _(){if(!p)p=new l;return p}import{spawn as j0}from"child_process";import{accessSync as Z0,constants as q0}from"fs";import{join as m,dirname as p0}from"path";import{fileURLToPath as l0}from"url";var m0=30000;class c{process=null;pendingRequests=new Map;requestId=0;buffer="";async start(){if(this.process)return;let $=this.getBinaryPath();try{Z0($,q0.X_OK)}catch{throw Error(`Rust binary not found at ${$}. Run 'bun run build:rust' in the pkg-ops package.`)}if(this.process=j0($,[],{stdio:["pipe","pipe","pipe"]}),!this.process.stdin||!this.process.stdout)throw Error("Failed to create stdin/stdout pipes");this.process.stdout.on("data",(Y)=>{this.buffer+=Y.toString("utf-8"),this.processBuffer()}),this.process.stderr?.on("data",(Y)=>{console.error("[rust-worker]",Y.toString("utf-8").trim())}),this.process.on("exit",(Y)=>{console.error(`Rust worker exited with code ${Y}`),this.process=null})}async stop(){if(!this.process)return;try{await this.sendRequest("shutdown",{})}catch{}if(await new Promise(($)=>setTimeout($,1000)),this.process)this.process.kill("SIGTERM"),this.process=null;for(let[$,Y]of this.pendingRequests)clearTimeout(Y.timeout),Y.reject(Error("Bridge shutdown"));this.pendingRequests.clear()}async install($,Y){return this.sendRequest("install",{packageName:$,version:Y})}async update($){return this.sendRequest("update",{packageName:$})}async updateAll(){return this.sendRequest("updateAll",{})}async list(){return this.sendRequest("list",{})}async rollback($){return this.sendRequest("rollback",{packageName:$})}async health(){return this.sendRequest("health",{})}async verify($){return this.sendRequest("verify",{packageName:$})}async audit(){return this.sendRequest("audit",{})}async getBundleSizes(){return this.sendRequest("sizes",{})}async getInstalledInfo(){return this.sendRequest("installedInfo",{})}async listVersions($){return this.sendRequest("listVersions",{packageName:$})}async switchVersion($,Y){return this.sendRequest("switchVersion",{packageName:$,version:Y})}async pruneVersions($,Y){return this.sendRequest("pruneVersions",{packageName:$,keepCount:Y})}async removeVersion($,Y){return this.sendRequest("removeVersion",{packageName:$,version:Y})}async getMultiVersionPackages(){return this.sendRequest("getMultiVersionPackages",{})}getBinaryPath(){let $=p0(l0(import.meta.url)),Y=[m($,"..","rust","target","release","pkg-ops-core"),m($,"..","rust","pkg-ops-core"),m($,"..","rust","target","x86_64-unknown-linux-gnu","release","pkg-ops-core")];for(let W of Y)try{return Z0(W,q0.X_OK),W}catch{}throw Error(`Rust binary not found. Tried:
4
- ${Y.map((W)=>` - ${W}`).join(`
3
+ import{readFileSync as l0,existsSync as m0}from"fs";import{constants as I,mkdirSync as U0,readFileSync as J0,writeFileSync as K0,existsSync as d}from"fs";import{dirname as F0}from"path";var C={packages:{},healthPort:8914,workDir:"/root",logLevel:"info"},A0="/etc/pkg-ops",L0=`${A0}/config.json`;function S(){return process.env.PKG_OPS_CONFIG??L0}function p(){let Y=F0(S());if(!d(Y))U0(Y,{recursive:!0,mode:I.S_IRWXU|I.S_IRGRP|I.S_IXGRP})}function _(){let Y=S();try{if(!d(Y))return{...C};let $=J0(Y,"utf-8"),W=JSON.parse($);return{...C,...W}}catch($){return console.error(`Failed to load config from ${Y}:`,$),{...C}}}function b(Y){let $=S();p();let W=JSON.stringify(Y,null,2);K0($,W,{encoding:"utf-8",mode:I.S_IRUSR|I.S_IWUSR|I.S_IRGRP})}function M(Y,$){let W=_();return W.packages[Y]=$,b(W),W}function R0(Y){let $=_();return delete $.packages[Y],b($),$}function J(Y){return _().packages[Y]}function z(){let Y=_();return Object.entries(Y.packages).map(([$,W])=>({name:$,config:W}))}function K(Y){return Y.startsWith("@ebowwa/")}function D(Y){let $=Y.lastIndexOf("@");if($<=0)return{name:Y,version:"latest"};let W=Y.slice(0,$),X=Y.slice($+1);if(!X)return{name:W,version:"latest"};return{name:W,version:X}}function y0(Y){let W=_().packages[Y];if(!W?.versions)return[];return Object.entries(W.versions).map(([X,Z])=>({version:X,...Z}))}function x0(Y,$){return!!_().packages[Y]?.versions?.[$]}function V0(Y){return _().packages[Y]?.version??null}function I0(Y,$,W){let X=_();if(!X.packages[Y])X.packages[Y]={version:$,versions:{},service:Y.replace("@ebowwa/",""),autoStart:!0};X.packages[Y].versions[$]={installedAt:W.installedAt??new Date().toISOString(),distSizeBytes:W.distSizeBytes??null,fileCount:W.fileCount??null},b(X)}function b0(Y,$){let W=_(),X=W.packages[Y];if(!X?.versions?.[$])return!1;if(delete X.versions[$],X.version===$){let Z=Object.keys(X.versions).sort((q,Q)=>{let H=X.versions[q]?.installedAt??"";return(X.versions[Q]?.installedAt??"").localeCompare(H)});if(Z.length>0)X.version=Z[0];else delete W.packages[Y]}return b(W),!0}function G0(Y,$){let W=_(),X=W.packages[Y];if(!X?.versions?.[$])return!1;return X.version=$,b(W),!0}function M0(Y){let W=_().packages[Y];return Object.keys(W?.versions??{}).length}function D0(){let Y=_(),$=[];for(let[W,X]of Object.entries(Y.packages)){let Z=Object.keys(X.versions??{});if(Z.length>1)$.push({name:W,activeVersion:X.version,totalVersions:Z.length,versions:Z.sort((q,Q)=>Q.localeCompare(q,void 0,{numeric:!0}))})}return $}var{getPrototypeOf:K1,defineProperty:P0,getOwnPropertyNames:F1,getOwnPropertyDescriptor:A1}=Object;var S0=(Y,$)=>{for(var W in $)P0(Y,W,{get:$[W],enumerable:!0,configurable:!0,set:(X)=>$[W]=()=>X})},C0=(Y,$)=>()=>(Y&&($=Y(Y=0)),$),j={};S0(j,{writeFile:()=>N0,sudo:()=>P,pkgInstall:()=>z0,exec:()=>m});async function P(Y,$){let W=Array.isArray(Y)?Y:Y.split(/\s+/),X=["sudo",...$.env?Object.entries($.env).map(([Z,q])=>`${Z}=${N(q)}`):[],...W];return m(X,$)}async function z0(Y,$){let W=$.pm??"apt",X={...$.env,...$.nonInteractive!==!1?{DEBIAN_FRONTEND:"noninteractive"}:{}};return await P(o[W],{...$,env:X,quiet:!0}),P([...c[W],...Y],{...$,env:X})}async function N0(Y,$,W){let X=`tee ${W.append?"-a":""} ${N(Y)}`.trim(),Z=await h0($,["sudo",X],W);if(Z.ok&&W.mode)await P(["chmod",W.mode,Y],W);if(Z.ok&&W.owner)await P(["chown",W.owner,Y],W);return Z}function l(Y){let $=["ssh","-F","/dev/null","-o","StrictHostKeyChecking=no","-o","UserKnownHostsFile=/dev/null"];if(Y.keyPath)$.push("-i",Y.keyPath);else if(Y.key)$.push("-i",Y.key);if(Y.port)$.push("-p",String(Y.port));return $.push(`${Y.user??"root"}@${Y.host}`),$}async function m(Y,$){let W=$.context??{type:"local"},X=W.type==="ssh"?[...l(W),Y.map(N).join(" ")]:Y,Z=Bun.spawn(X,{stdout:"pipe",stderr:"pipe",timeout:$.timeout??30000}),q=await Z.exited,Q=$.quiet?"":await new Response(Z.stdout).text(),H=await new Response(Z.stderr).text();return{stdout:Q,stderr:H,exitCode:q,ok:q===0}}async function h0(Y,$,W){let X=W.context??{type:"local"};if(X.type==="ssh"){let w=l(X),y=$.join(" "),x=[...w,y],E=Bun.spawn(x,{stdin:new TextEncoder().encode(Y),stdout:"pipe",stderr:"pipe",timeout:W.timeout??30000}),V=await E.exited,F=W.quiet?"":await new Response(E.stdout).text(),A=await new Response(E.stderr).text();return{stdout:F,stderr:A,exitCode:V,ok:V===0}}let Z=Bun.spawn(["sh","-c",$.join(" ")],{stdin:new TextEncoder().encode(Y),stdout:"pipe",stderr:"pipe",timeout:W.timeout??30000}),q=await Z.exited,Q=W.quiet?"":await new Response(Z.stdout).text(),H=await new Response(Z.stderr).text();return{stdout:Q,stderr:H,exitCode:q,ok:q===0}}function N(Y){if(/^[a-zA-Z0-9._\-\/=:@]+$/.test(Y))return Y;return`'${Y.replace(/'/g,"'\\''")}'`}var c,o,f0=C0(()=>{c={apt:["apt-get","install","-y"],dnf:["dnf","install","-y"],apk:["apk","add","--no-cache"]},o={apt:["apt-get","update","-qq"],dnf:["dnf","check-update"],apk:["apk","update"]}});async function L(Y,$){let{sudo:W}=await Promise.resolve().then(()=>(f0(),j));return W(Y,$)}async function t(Y,$){return L(["systemctl","enable",Y],$)}async function i(Y,$){return L(["systemctl","disable",Y],$)}async function n(Y,$){return L(["systemctl","start",Y],$)}async function g(Y,$){return L(["systemctl","stop",Y],$)}async function s(Y,$){return L(["systemctl","restart",Y],$)}async function r(Y,$){let W=await L(["systemctl","show",Y,"--property=LoadState,ActiveState,SubState,MainPID,Description"],{...$});if(!W.ok)return{loaded:!1,active:!1,subState:"unknown",mainPid:0,description:""};let X=(Z)=>{return W.stdout.match(new RegExp(`^${Z}=(.+)$`,"m"))?.[1]?.trim()??""};return{loaded:X("LoadState")==="loaded",active:X("ActiveState")==="active",subState:X("SubState"),mainPid:parseInt(X("MainPID")||"0",10),description:X("Description")}}async function a(Y,$){let W=await L(["systemctl","list-unit-files",Y+".service"],$);return W.ok&&W.stdout.includes(Y)}async function e(Y,$={}){let W=["journalctl","-u",Y,"-n",String($.lines??100)];if($.since)W.push("--since",$.since);if(!$.follow)W.push("-n",String($.lines??100));return(await L(W,$)).stdout}class f{sudoOptions;constructor(Y){this.sudoOptions=Y??{context:{type:"local"}}}async start(Y){let $=await n(Y,this.sudoOptions);return{success:$.ok,message:$.ok?`Service ${Y} started`:$.stderr||$.stdout}}async stop(Y){let $=await g(Y,this.sudoOptions);return{success:$.ok,message:$.ok?`Service ${Y} stopped`:$.stderr||$.stdout}}async restart(Y){let $=await s(Y,this.sudoOptions);return{success:$.ok,message:$.ok?`Service ${Y} restarted`:$.stderr||$.stdout}}async status(Y){return r(Y,this.sudoOptions)}async enable(Y){let $=await t(Y,this.sudoOptions);return{success:$.ok,message:$.ok?`Service ${Y} enabled`:$.stderr||$.stdout}}async disable(Y){let $=await i(Y,this.sudoOptions);return{success:$.ok,message:$.ok?`Service ${Y} disabled`:$.stderr||$.stdout}}async exists(Y){return a(Y,this.sudoOptions)}async logs(Y,$){return e(Y,{...this.sudoOptions,lines:$?.lines??100,since:$?.since})}async info(Y){let[$,W]=await Promise.all([this.exists(Y),this.status(Y)]);return{name:Y,exists:$,status:W}}async isHealthy(Y){let $=await this.status(Y);return $.active&&$.subState==="running"}async waitForHealthy(Y,$){let W=$?.timeout??30000,X=$?.interval??1000,Z=Date.now();while(Date.now()-Z<W){if(await this.isHealthy(Y))return!0;await new Promise((Q)=>setTimeout(Q,X))}return!1}}var h=null;function T(){if(!h)h=new f;return h}import{spawn as B0}from"child_process";import{accessSync as Y0,constants as $0}from"fs";import{join as B,dirname as u0}from"path";import{fileURLToPath as k0}from"url";var v0=30000;class u{process=null;pendingRequests=new Map;requestId=0;buffer="";async start(){if(this.process)return;let Y=this.getBinaryPath();try{Y0(Y,$0.X_OK)}catch{throw Error(`Rust binary not found at ${Y}. Run 'bun run build:rust' in the pkg-ops package.`)}if(this.process=B0(Y,[],{stdio:["pipe","pipe","pipe"]}),!this.process.stdin||!this.process.stdout)throw Error("Failed to create stdin/stdout pipes");this.process.stdout.on("data",($)=>{this.buffer+=$.toString("utf-8"),this.processBuffer()}),this.process.stderr?.on("data",($)=>{console.error("[rust-worker]",$.toString("utf-8").trim())}),this.process.on("exit",($)=>{console.error(`Rust worker exited with code ${$}`),this.process=null})}async stop(){if(!this.process)return;try{await this.sendRequest("shutdown",{})}catch{}if(await new Promise((Y)=>setTimeout(Y,1000)),this.process)this.process.kill("SIGTERM"),this.process=null;for(let[Y,$]of this.pendingRequests)clearTimeout($.timeout),$.reject(Error("Bridge shutdown"));this.pendingRequests.clear()}async install(Y,$){return this.sendRequest("install",{packageName:Y,version:$})}async update(Y){return this.sendRequest("update",{packageName:Y})}async updateAll(){return this.sendRequest("updateAll",{})}async list(){return this.sendRequest("list",{})}async rollback(Y){return this.sendRequest("rollback",{packageName:Y})}async health(){return this.sendRequest("health",{})}async verify(Y){return this.sendRequest("verify",{packageName:Y})}async audit(){return this.sendRequest("audit",{})}async getBundleSizes(){return this.sendRequest("sizes",{})}async getInstalledInfo(){return this.sendRequest("installedInfo",{})}async listVersions(Y){return this.sendRequest("listVersions",{packageName:Y})}async switchVersion(Y,$){return this.sendRequest("switchVersion",{packageName:Y,version:$})}async pruneVersions(Y,$){return this.sendRequest("pruneVersions",{packageName:Y,keepCount:$})}async removeVersion(Y,$){return this.sendRequest("removeVersion",{packageName:Y,version:$})}async getMultiVersionPackages(){return this.sendRequest("getMultiVersionPackages",{})}getBinaryPath(){let Y=u0(k0(import.meta.url)),$=[B(Y,"..","rust","target","release","pkg-ops-core"),B(Y,"..","rust","pkg-ops-core"),B(Y,"..","rust","target","x86_64-unknown-linux-gnu","release","pkg-ops-core")];for(let W of $)try{return Y0(W,$0.X_OK),W}catch{}throw Error(`Rust binary not found. Tried:
4
+ ${$.map((W)=>` - ${W}`).join(`
5
5
  `)}
6
- Run 'bun run build:rust' or 'cargo build --release' in the pkg-ops package.`)}sendRequest($,Y){return new Promise((W,X)=>{if(!this.process?.stdin){X(Error("Rust worker not started"));return}let Z=String(++this.requestId),q={jsonrpc:"2.0",id:Z,method:$,params:Y},Q=setTimeout(()=>{this.pendingRequests.delete(Z),X(Error(`Request timeout: ${$}`))},m0);this.pendingRequests.set(Z,{resolve:W,reject:X,timeout:Q});let H=JSON.stringify(q)+`
7
- `;this.process.stdin.write(H,"utf-8",(K)=>{if(K)this.pendingRequests.delete(Z),clearTimeout(Q),X(K)})})}processBuffer(){let $=this.buffer.split(`
8
- `);this.buffer=$.pop()??"";for(let Y of $){if(!Y.trim())continue;try{let W=JSON.parse(Y),X=this.pendingRequests.get(W.id);if(X)if(clearTimeout(X.timeout),this.pendingRequests.delete(W.id),W.error)X.reject(Error(W.error.message));else X.resolve(W.result)}catch(W){console.error("Failed to parse response:",Y,W)}}}}var G=null;function Q0(){if(!G)G=new c;return G}async function U(){let $=Q0();return await $.start(),$}async function J(){if(G)await G.stop(),G=null}import{createServer as n0}from"http";class H0{sudoOptions;constructor($){this.sudoOptions=$??{context:{type:"local"}}}async start($){let Y=await h($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} started`:Y.stderr||Y.stdout}}async stop($){let Y=await B($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} stopped`:Y.stderr||Y.stdout}}async restart($){let Y=await N($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} restarted`:Y.stderr||Y.stdout}}async status($){return u($,this.sudoOptions)}async enable($){let Y=await z($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} enabled`:Y.stderr||Y.stdout}}async disable($){let Y=await C($,this.sudoOptions);return{success:Y.ok,message:Y.ok?`Service ${$} disabled`:Y.stderr||Y.stdout}}async exists($){return k($,this.sudoOptions)}async logs($,Y){return f($,{...this.sudoOptions,lines:Y?.lines??100,since:Y?.since})}async info($){let[Y,W]=await Promise.all([this.exists($),this.status($)]);return{name:$,exists:Y,status:W}}async isHealthy($){let Y=await this.status($);return Y.active&&Y.subState==="running"}async waitForHealthy($,Y){let W=Y?.timeout??30000,X=Y?.interval??1000,Z=Date.now();while(Date.now()-Z<W){if(await this.isHealthy($))return!0;await new Promise((Q)=>setTimeout(Q,X))}return!1}}var o=null;function t(){if(!o)o=new H0;return o}import{constants as d1,mkdirSync as j1,readFileSync as c0,writeFileSync as p1,existsSync as o0}from"node:fs";var i={packages:{},healthPort:8914,workDir:"/root",logLevel:"info"},t0="/etc/pkg-ops",i0=`${t0}/config.json`;function g0(){return process.env.PKG_OPS_CONFIG??i0}function g(){let $=g0();try{if(!o0($))return{...i};let Y=c0($,"utf-8"),W=JSON.parse(Y);return{...i,...W}}catch(Y){return console.error(`Failed to load config from ${$}:`,Y),{...i}}}class n{server=null;checks=new Map;startTime=Date.now();port;constructor($=8914){this.port=$}async start(){if(this.server)return;return new Promise(($,Y)=>{this.server=n0((W,X)=>this.handleRequest(W,X)),this.server.on("error",Y),this.server.listen(this.port,()=>{console.log(`Health server listening on port ${this.port}`),this.server?.off("error",Y),$()})})}async stop(){if(!this.server)return;return new Promise(($)=>{this.server?.close(()=>{this.server=null,$()})})}addCheck($,Y){this.checks.set($,Y)}removeCheck($){this.checks.delete($)}async checkHealth($){if($)return this.getServiceHealth($);return this.getSystemHealth()}async handleRequest($,Y){let W=$.url??"/",X=$.method??"GET";try{if(X==="GET"&&W==="/health"){let Z=await this.getSystemHealth();this.sendJson(Y,200,Z)}else if(X==="GET"&&W.startsWith("/health/")){let Z=W.slice(8).replace(".service",""),q=await this.getServiceHealth(Z);this.sendJson(Y,q?200:404,q??{error:"Service not found"})}else if(X==="GET"&&W==="/ready"){let Z=await this.getSystemHealth();this.sendJson(Y,Z.healthy?200:503,{ready:Z.healthy})}else if(X==="GET"&&W==="/live")this.sendJson(Y,200,{alive:!0});else this.sendJson(Y,404,{error:"Not found"})}catch(Z){console.error("Health check error:",Z),this.sendJson(Y,500,{error:"Internal server error"})}}async getSystemHealth(){let $=g(),Y=t(),W=[];for(let[q,Q]of Object.entries($.packages)){if(!Q.service)continue;let H=await Y.status(Q.service),K=H.active&&H.subState==="running";W.push({name:Q.service,healthy:K,status:H,checkedAt:new Date().toISOString()})}let X={};for(let[q,Q]of this.checks)try{X[q]=await Q()}catch(H){X[q]={healthy:!1,message:H instanceof Error?H.message:"Unknown error"}}return{healthy:W.every((q)=>q.healthy)&&Object.values(X).every((q)=>q.healthy),services:W,uptime:Math.floor((Date.now()-this.startTime)/1000),timestamp:new Date().toISOString()}}async getServiceHealth($){let Y=t();if(!await Y.exists($))return null;let X=await Y.status($),Z=X.active&&X.subState==="running";return{name:$,healthy:Z,status:X,checkedAt:new Date().toISOString()}}sendJson($,Y,W){$.statusCode=Y,$.setHeader("Content-Type","application/json"),$.end(JSON.stringify(W,null,2))}}var F=null;async function r0($){let Y=g(),W=$??Y.healthPort??8914;if(!F)F=new n(W);return await F.start(),F}async function s0(){if(F)await F.stop(),F=null}function r(){return F}async function Y1($){if($.length===0)console.error("Usage: pkg-ops install <package>[@version]"),process.exit(1);let Y=$[0],{name:W,version:X}=D(Y);if(!T(W))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Installing ${W}@${X}...`);try{let q=await(await U()).install(W,X);if(q.success){if(console.log(`Successfully installed ${W}@${q.version}`),q.previousVersion)console.log(` Previous version: ${q.previousVersion}`);let Q=O(W);M(W,{version:q.version,versions:{...Q?.versions,[q.version]:{installedAt:new Date().toISOString(),distSizeBytes:null,fileCount:null}},service:W.replace("@ebowwa/","")});let H=O(W);if(H?.service&&H.autoStart!==!1){let V=await _().start(H.service);if(V.success)console.log(` Service ${H.service} started`);else console.warn(` Failed to start service: ${V.message}`)}}else console.error(`Failed to install ${W}: ${q.message}`),process.exit(1)}catch(Z){console.error("Install failed:",Z),process.exit(1)}finally{await J()}}async function $1($){if($.length===0)console.error("Usage: pkg-ops update <package>"),process.exit(1);let Y=$[0];if(!T(Y))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Updating ${Y}...`);try{let X=await(await U()).update(Y);if(X.success){if(console.log(`Successfully updated ${Y} to ${X.version}`),X.previousVersion)console.log(` Previous version: ${X.previousVersion}`);let Z=O(Y);M(Y,{version:X.version,versions:{...Z?.versions,[X.version]:{installedAt:new Date().toISOString(),distSizeBytes:null,fileCount:null}},service:Y.replace("@ebowwa/","")});let q=_(),Q=O(Y);if(Q?.service){if((await q.status(Q.service)).active)await q.restart(Q.service),console.log(` Service ${Q.service} restarted`)}}else console.error(`Failed to update ${Y}: ${X.message}`),process.exit(1)}catch(W){console.error("Update failed:",W),process.exit(1)}finally{await J()}}async function W1($){console.log("Updating all managed packages...");try{let W=await(await U()).updateAll();for(let X of W)if(X.success)console.log(`Updated ${X.version}`);else console.error(`Failed to update: ${X.message}`)}catch(Y){console.error("Update all failed:",Y),process.exit(1)}finally{await J()}}async function X1($){console.log(`Installed packages:
9
- `);try{let W=await(await U()).list();if(W.length===0){console.log(" No packages installed");return}for(let X of W){let Z=X.installed?"installed":"not installed",q=X.service?` (service: ${X.service})`:"";console.log(` ${X.name}@${X.version} [${Z}]${q}`)}}catch(Y){console.error("Failed to list packages:",Y),process.exit(1)}finally{await J()}}async function Z1($){if($.length===0)console.error("Usage: pkg-ops rollback <package>"),process.exit(1);let Y=$[0];console.log(`Rolling back ${Y}...`);try{let X=await(await U()).rollback(Y);if(X.success){console.log(`Rolled back ${Y} from ${X.currentVersion} to ${X.previousVersion}`);let Z=_(),q=O(Y);if(q?.service){if((await Z.status(q.service)).active)await Z.restart(q.service),console.log(` Service ${q.service} restarted`)}}else console.error(`Rollback failed: ${X.message}`),process.exit(1)}catch(W){console.error("Rollback failed:",W),process.exit(1)}finally{await J()}}async function J0($){if($.length===0)console.error("Usage: pkg-ops service start <name>"),process.exit(1);let Y=$[0],W=_();console.log(`Starting ${Y}...`);let X=await W.start(Y);if(X.success)console.log(`Service ${Y} started`);else console.error(`Failed to start ${Y}: ${X.message}`),process.exit(1)}async function K0($){if($.length===0)console.error("Usage: pkg-ops service stop <name>"),process.exit(1);let Y=$[0],W=_();console.log(`Stopping ${Y}...`);let X=await W.stop(Y);if(X.success)console.log(`Service ${Y} stopped`);else console.error(`Failed to stop ${Y}: ${X.message}`),process.exit(1)}async function w0($){if($.length===0)console.error("Usage: pkg-ops service restart <name>"),process.exit(1);let Y=$[0],W=_();console.log(`Restarting ${Y}...`);let X=await W.restart(Y);if(X.success)console.log(`Service ${Y} restarted`);else console.error(`Failed to restart ${Y}: ${X.message}`),process.exit(1)}async function E0($){if($.length===0)console.error("Usage: pkg-ops service status <name>"),process.exit(1);let Y=$[0],X=await _().info(Y);if(!X.exists){console.log(`Service ${Y} not found`);return}console.log(`Service: ${Y}`),console.log(` Loaded: ${X.status.loaded}`),console.log(` Active: ${X.status.active}`),console.log(` State: ${X.status.subState}`),console.log(` PID: ${X.status.mainPid||"N/A"}`),console.log(` Description: ${X.status.description||"N/A"}`)}async function U0($){if($.length===0)console.error("Usage: pkg-ops service logs <name> [--lines N]"),process.exit(1);let Y=$[0],W=$.indexOf("--lines"),X=W>=0&&$[W+1]?parseInt($[W+1],10):100,q=await _().logs(Y,{lines:X});console.log(q)}async function _0($){if($.length===0)console.error("Usage: pkg-ops service enable <name>"),process.exit(1);let Y=$[0],W=_();console.log(`Enabling ${Y}...`);let X=await W.enable(Y);if(X.success)console.log(`Service ${Y} enabled on boot`);else console.error(`Failed to enable ${Y}: ${X.message}`),process.exit(1)}async function O0($){if($.length===0)console.error("Usage: pkg-ops service disable <name>"),process.exit(1);let Y=$[0],W=_();console.log(`Disabling ${Y}...`);let X=await W.disable(Y);if(X.success)console.log(`Service ${Y} disabled from boot`);else console.error(`Failed to disable ${Y}: ${X.message}`),process.exit(1)}async function q1($){let Y=$[0],W=r();if(!W)console.error("Health server not initialized"),process.exit(1);let X=await W.checkHealth(Y);if(!X){console.log("Service not found");return}if("services"in X){if(X.healthy)console.log("All services healthy");else console.log("Some services unhealthy");for(let Z of X.services){let q=Z.healthy?"OK":"FAIL";console.log(` [${q}] ${Z.name}: ${Z.status.subState}`)}}else{let Z=X.healthy?"OK":"FAIL";console.log(`[${Z}] ${X.name}: ${X.status.subState}`)}}async function T0($){let Y=E();console.log("PkgOps Configuration"),console.log("Config path: /etc/pkg-ops/config.json"),console.log(`Health port: ${Y.healthPort}`),console.log(`Work dir: ${Y.workDir}`),console.log(`Log level: ${Y.logLevel}`),console.log(`
10
- Packages:`);let W=d();if(W.length===0){console.log(" No packages configured");return}for(let{name:X,config:Z}of W){if(console.log(` ${X}:`),console.log(` Version: ${Z.version}`),Z.service)console.log(` Service: ${Z.service}`);if(Z.autoStart!==void 0)console.log(` Auto-start: ${Z.autoStart}`)}}async function A0($){if($.length<3)console.error("Usage: pkg-ops config set <package> <key> <value>"),process.exit(1);let Y=$[0],W=$[1],X=$[2];if(!T(Y))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);let Z=O(Y)??{version:"latest",versions:{}};switch(W){case"version":Z.version=X;break;case"service":Z.service=X;break;case"autoStart":Z.autoStart=X==="true";break;default:console.error(`Unknown config key: ${W}`),console.error("Valid keys: version, service, autoStart"),process.exit(1)}M(Y,Z),console.log(`Updated ${Y}.${W} = ${X}`)}async function Q1($){if($.length===0)console.error("Usage: pkg-ops verify <package>"),process.exit(1);let Y=$[0];if(!T(Y))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Verifying ${Y}...`);try{let X=await(await U()).verify(Y);if(console.log(`
11
- Package: ${X.packageName}@${X.version}`),console.log(` Status: ${X.success?"VALID":"INVALID"}`),console.log(` Dist exists: ${X.distExists?"Yes":"No"}`),X.checksum)console.log(` Checksum: ${X.checksum}`);console.log(` Message: ${X.message}`)}catch(W){console.error("Verification failed:",W),process.exit(1)}finally{await J()}}async function H1($){let Y=$.indexOf("--local"),W=$.indexOf("--local-path"),X="./package.json";if(W>=0&&$[W+1])X=$[W+1];let Z=Y>=0||W>=0;try{let Q=await(await U()).getInstalledInfo();if(console.log(`Sync Status: Local vs VPS
12
- `),Z&&e0(X)){let H=a0(X,"utf-8"),K=JSON.parse(H),V={...K.dependencies,...K.devDependencies},y=new Map;for(let w of Q)y.set(w.packageName,w.version);for(let[w,x]of Object.entries(V)){if(!w.startsWith("@ebowwa/"))continue;let A=y.get(w),R=x.replace(/^[\^~]/,"");if(A){if(R===A)console.log(` ${w}: local=${R}, vps=${A} (in sync)`);else if(R>A)console.log(` ${w}: local=${R}, vps=${A} (VPS behind)`);else console.log(` ${w}: local=${R}, vps=${A} (local behind)`);y.delete(w)}else console.log(` ${w}: local=${R}, vps=not installed`)}for(let[w,x]of y)console.log(` ${w}: local=not in package.json, vps=${x}`)}else if(Q.length===0)console.log(" No packages installed on VPS");else for(let H of Q){let K=H.distSizeBytes?` (${(H.distSizeBytes/1024).toFixed(1)} KB)`:"";console.log(` ${H.packageName}@${H.version}${K}`)}}catch(q){console.error("Failed to get sync status:",q),process.exit(1)}finally{await J()}}async function R0($){console.log(`Running vulnerability scan...
6
+ Run 'bun run build:rust' or 'cargo build --release' in the pkg-ops package.`)}sendRequest(Y,$){return new Promise((W,X)=>{if(!this.process?.stdin){X(Error("Rust worker not started"));return}let Z=String(++this.requestId),q={jsonrpc:"2.0",id:Z,method:Y,params:$},Q=setTimeout(()=>{this.pendingRequests.delete(Z),X(Error(`Request timeout: ${Y}`))},v0);this.pendingRequests.set(Z,{resolve:W,reject:X,timeout:Q});let H=JSON.stringify(q)+`
7
+ `;this.process.stdin.write(H,"utf-8",(w)=>{if(w)this.pendingRequests.delete(Z),clearTimeout(Q),X(w)})})}processBuffer(){let Y=this.buffer.split(`
8
+ `);this.buffer=Y.pop()??"";for(let $ of Y){if(!$.trim())continue;try{let W=JSON.parse($),X=this.pendingRequests.get(W.id);if(X)if(clearTimeout(X.timeout),this.pendingRequests.delete(W.id),W.error)X.reject(Error(W.error.message));else X.resolve(W.result)}catch(W){console.error("Failed to parse response:",$,W)}}}}var G=null;function W0(){if(!G)G=new u;return G}async function U(){let Y=W0();return await Y.start(),Y}async function O(){if(G)await G.stop(),G=null}import{createServer as d0}from"http";class k{server=null;checks=new Map;startTime=Date.now();port;constructor(Y=8914){this.port=Y}async start(){if(this.server)return;return new Promise((Y,$)=>{this.server=d0((W,X)=>this.handleRequest(W,X)),this.server.on("error",$),this.server.listen(this.port,()=>{console.log(`Health server listening on port ${this.port}`),this.server?.off("error",$),Y()})})}async stop(){if(!this.server)return;return new Promise((Y)=>{this.server?.close(()=>{this.server=null,Y()})})}addCheck(Y,$){this.checks.set(Y,$)}removeCheck(Y){this.checks.delete(Y)}async checkHealth(Y){if(Y)return this.getServiceHealth(Y);return this.getSystemHealth()}async handleRequest(Y,$){let W=Y.url??"/",X=Y.method??"GET";try{if(X==="GET"&&W==="/health"){let Z=await this.getSystemHealth();this.sendJson($,200,Z)}else if(X==="GET"&&W.startsWith("/health/")){let Z=W.slice(8).replace(".service",""),q=await this.getServiceHealth(Z);this.sendJson($,q?200:404,q??{error:"Service not found"})}else if(X==="GET"&&W==="/ready"){let Z=await this.getSystemHealth();this.sendJson($,Z.healthy?200:503,{ready:Z.healthy})}else if(X==="GET"&&W==="/live")this.sendJson($,200,{alive:!0});else this.sendJson($,404,{error:"Not found"})}catch(Z){console.error("Health check error:",Z),this.sendJson($,500,{error:"Internal server error"})}}async getSystemHealth(){let Y=_(),$=T(),W=[];for(let[q,Q]of Object.entries(Y.packages)){if(!Q.service)continue;let H=await $.status(Q.service),w=H.active&&H.subState==="running";W.push({name:Q.service,healthy:w,status:H,checkedAt:new Date().toISOString()})}let X={};for(let[q,Q]of this.checks)try{X[q]=await Q()}catch(H){X[q]={healthy:!1,message:H instanceof Error?H.message:"Unknown error"}}return{healthy:W.every((q)=>q.healthy)&&Object.values(X).every((q)=>q.healthy),services:W,uptime:Math.floor((Date.now()-this.startTime)/1000),timestamp:new Date().toISOString()}}async getServiceHealth(Y){let $=T();if(!await $.exists(Y))return null;let X=await $.status(Y),Z=X.active&&X.subState==="running";return{name:Y,healthy:Z,status:X,checkedAt:new Date().toISOString()}}sendJson(Y,$,W){Y.statusCode=$,Y.setHeader("Content-Type","application/json"),Y.end(JSON.stringify(W,null,2))}}var R=null;async function p0(Y){let $=_(),W=Y??$.healthPort??8914;if(!R)R=new k(W);return await R.start(),R}async function j0(){if(R)await R.stop(),R=null}function v(){return R}async function c0(Y){if(Y.length===0)console.error("Usage: pkg-ops install <package>[@version]"),process.exit(1);let $=Y[0],{name:W,version:X}=D($);if(!K(W))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Installing ${W}@${X}...`);try{let q=await(await U()).install(W,X);if(q.success){if(console.log(`Successfully installed ${W}@${q.version}`),q.previousVersion)console.log(` Previous version: ${q.previousVersion}`);let Q=J(W);M(W,{version:q.version,versions:{...Q?.versions,[q.version]:{installedAt:new Date().toISOString(),distSizeBytes:null,fileCount:null}},service:W.replace("@ebowwa/","")});let H=J(W);if(H?.service&&H.autoStart!==!1){let y=await T().start(H.service);if(y.success)console.log(` Service ${H.service} started`);else console.warn(` Failed to start service: ${y.message}`)}}else console.error(`Failed to install ${W}: ${q.message}`),process.exit(1)}catch(Z){console.error("Install failed:",Z),process.exit(1)}finally{await O()}}async function o0(Y){if(Y.length===0)console.error("Usage: pkg-ops update <package>"),process.exit(1);let $=Y[0];if(!K($))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Updating ${$}...`);try{let X=await(await U()).update($);if(X.success){if(console.log(`Successfully updated ${$} to ${X.version}`),X.previousVersion)console.log(` Previous version: ${X.previousVersion}`);let Z=J($);M($,{version:X.version,versions:{...Z?.versions,[X.version]:{installedAt:new Date().toISOString(),distSizeBytes:null,fileCount:null}},service:$.replace("@ebowwa/","")});let q=T(),Q=J($);if(Q?.service){if((await q.status(Q.service)).active)await q.restart(Q.service),console.log(` Service ${Q.service} restarted`)}}else console.error(`Failed to update ${$}: ${X.message}`),process.exit(1)}catch(W){console.error("Update failed:",W),process.exit(1)}finally{await O()}}async function t0(Y){console.log("Updating all managed packages...");try{let W=await(await U()).updateAll();for(let X of W)if(X.success)console.log(`Updated ${X.version}`);else console.error(`Failed to update: ${X.message}`)}catch($){console.error("Update all failed:",$),process.exit(1)}finally{await O()}}async function i0(Y){console.log(`Installed packages:
9
+ `);try{let W=await(await U()).list();if(W.length===0){console.log(" No packages installed");return}for(let X of W){let Z=X.installed?"installed":"not installed",q=X.service?` (service: ${X.service})`:"";console.log(` ${X.name}@${X.version} [${Z}]${q}`)}}catch($){console.error("Failed to list packages:",$),process.exit(1)}finally{await O()}}async function n0(Y){if(Y.length===0)console.error("Usage: pkg-ops rollback <package>"),process.exit(1);let $=Y[0];console.log(`Rolling back ${$}...`);try{let X=await(await U()).rollback($);if(X.success){console.log(`Rolled back ${$} from ${X.currentVersion} to ${X.previousVersion}`);let Z=T(),q=J($);if(q?.service){if((await Z.status(q.service)).active)await Z.restart(q.service),console.log(` Service ${q.service} restarted`)}}else console.error(`Rollback failed: ${X.message}`),process.exit(1)}catch(W){console.error("Rollback failed:",W),process.exit(1)}finally{await O()}}async function X0(Y){if(Y.length===0)console.error("Usage: pkg-ops service start <name>"),process.exit(1);let $=Y[0],W=T();console.log(`Starting ${$}...`);let X=await W.start($);if(X.success)console.log(`Service ${$} started`);else console.error(`Failed to start ${$}: ${X.message}`),process.exit(1)}async function Z0(Y){if(Y.length===0)console.error("Usage: pkg-ops service stop <name>"),process.exit(1);let $=Y[0],W=T();console.log(`Stopping ${$}...`);let X=await W.stop($);if(X.success)console.log(`Service ${$} stopped`);else console.error(`Failed to stop ${$}: ${X.message}`),process.exit(1)}async function q0(Y){if(Y.length===0)console.error("Usage: pkg-ops service restart <name>"),process.exit(1);let $=Y[0],W=T();console.log(`Restarting ${$}...`);let X=await W.restart($);if(X.success)console.log(`Service ${$} restarted`);else console.error(`Failed to restart ${$}: ${X.message}`),process.exit(1)}async function Q0(Y){if(Y.length===0)console.error("Usage: pkg-ops service status <name>"),process.exit(1);let $=Y[0],X=await T().info($);if(!X.exists){console.log(`Service ${$} not found`);return}console.log(`Service: ${$}`),console.log(` Loaded: ${X.status.loaded}`),console.log(` Active: ${X.status.active}`),console.log(` State: ${X.status.subState}`),console.log(` PID: ${X.status.mainPid||"N/A"}`),console.log(` Description: ${X.status.description||"N/A"}`)}async function H0(Y){if(Y.length===0)console.error("Usage: pkg-ops service logs <name> [--lines N]"),process.exit(1);let $=Y[0],W=Y.indexOf("--lines"),X=W>=0&&Y[W+1]?parseInt(Y[W+1],10):100,q=await T().logs($,{lines:X});console.log(q)}async function O0(Y){if(Y.length===0)console.error("Usage: pkg-ops service enable <name>"),process.exit(1);let $=Y[0],W=T();console.log(`Enabling ${$}...`);let X=await W.enable($);if(X.success)console.log(`Service ${$} enabled on boot`);else console.error(`Failed to enable ${$}: ${X.message}`),process.exit(1)}async function _0(Y){if(Y.length===0)console.error("Usage: pkg-ops service disable <name>"),process.exit(1);let $=Y[0],W=T();console.log(`Disabling ${$}...`);let X=await W.disable($);if(X.success)console.log(`Service ${$} disabled from boot`);else console.error(`Failed to disable ${$}: ${X.message}`),process.exit(1)}async function g0(Y){let $=Y[0],W=v();if(!W)console.error("Health server not initialized"),process.exit(1);let X=await W.checkHealth($);if(!X){console.log("Service not found");return}if("services"in X){if(X.healthy)console.log("All services healthy");else console.log("Some services unhealthy");for(let Z of X.services){let q=Z.healthy?"OK":"FAIL";console.log(` [${q}] ${Z.name}: ${Z.status.subState}`)}}else{let Z=X.healthy?"OK":"FAIL";console.log(`[${Z}] ${X.name}: ${X.status.subState}`)}}async function w0(Y){let $=_();console.log("PkgOps Configuration"),console.log("Config path: /etc/pkg-ops/config.json"),console.log(`Health port: ${$.healthPort}`),console.log(`Work dir: ${$.workDir}`),console.log(`Log level: ${$.logLevel}`),console.log(`
10
+ Packages:`);let W=z();if(W.length===0){console.log(" No packages configured");return}for(let{name:X,config:Z}of W){if(console.log(` ${X}:`),console.log(` Version: ${Z.version}`),Z.service)console.log(` Service: ${Z.service}`);if(Z.autoStart!==void 0)console.log(` Auto-start: ${Z.autoStart}`)}}async function E0(Y){if(Y.length<3)console.error("Usage: pkg-ops config set <package> <key> <value>"),process.exit(1);let $=Y[0],W=Y[1],X=Y[2];if(!K($))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);let Z=J($)??{version:"latest",versions:{}};switch(W){case"version":Z.version=X;break;case"service":Z.service=X;break;case"autoStart":Z.autoStart=X==="true";break;default:console.error(`Unknown config key: ${W}`),console.error("Valid keys: version, service, autoStart"),process.exit(1)}M($,Z),console.log(`Updated ${$}.${W} = ${X}`)}async function s0(Y){if(Y.length===0)console.error("Usage: pkg-ops verify <package>"),process.exit(1);let $=Y[0];if(!K($))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Verifying ${$}...`);try{let X=await(await U()).verify($);if(console.log(`
11
+ Package: ${X.packageName}@${X.version}`),console.log(` Status: ${X.success?"VALID":"INVALID"}`),console.log(` Dist exists: ${X.distExists?"Yes":"No"}`),X.checksum)console.log(` Checksum: ${X.checksum}`);console.log(` Message: ${X.message}`)}catch(W){console.error("Verification failed:",W),process.exit(1)}finally{await O()}}async function r0(Y){let $=Y.indexOf("--local"),W=Y.indexOf("--local-path"),X="./package.json";if(W>=0&&Y[W+1])X=Y[W+1];let Z=$>=0||W>=0;try{let Q=await(await U()).getInstalledInfo();if(console.log(`Sync Status: Local vs VPS
12
+ `),Z&&m0(X)){let H=l0(X,"utf-8"),w=JSON.parse(H),y={...w.dependencies,...w.devDependencies},x=new Map;for(let E of Q)x.set(E.packageName,E.version);for(let[E,V]of Object.entries(y)){if(!E.startsWith("@ebowwa/"))continue;let F=x.get(E),A=V.replace(/^[\^~]/,"");if(F){if(A===F)console.log(` ${E}: local=${A}, vps=${F} (in sync)`);else if(A>F)console.log(` ${E}: local=${A}, vps=${F} (VPS behind)`);else console.log(` ${E}: local=${A}, vps=${F} (local behind)`);x.delete(E)}else console.log(` ${E}: local=${A}, vps=not installed`)}for(let[E,V]of x)console.log(` ${E}: local=not in package.json, vps=${V}`)}else if(Q.length===0)console.log(" No packages installed on VPS");else for(let H of Q){let w=H.distSizeBytes?` (${(H.distSizeBytes/1024).toFixed(1)} KB)`:"";console.log(` ${H.packageName}@${H.version}${w}`)}}catch(q){console.error("Failed to get sync status:",q),process.exit(1)}finally{await O()}}async function T0(Y){console.log(`Running vulnerability scan...
13
13
  `);try{let W=await(await U()).audit();if(W.length===0){console.log("No vulnerabilities found.");return}console.log(`Found ${W.length} vulnerability(es):
14
- `);for(let X of W)console.log(`[${X.severity.toUpperCase()}] ${X.packageName}`),console.log(` Vulnerability: ${X.vulnerability}`),console.log(` Description: ${X.description}`),console.log("")}catch(Y){console.error("Audit failed:",Y),process.exit(1)}finally{await J()}}async function J1($){await R0($)}async function K1($){console.log(`Bundle sizes:
15
- `);try{let W=await(await U()).getBundleSizes();if(W.length===0){console.log(" No packages installed");return}console.log(" Package | Version | Dist Size"),console.log(" --------------------------------|----------|-----------");for(let X of W){let Z=X.packageName.padEnd(32),q=X.version.padEnd(9),Q=(X.distSizeBytes/1024).toFixed(1)+" KB",H=X.fileCount?` (${X.fileCount} files)`:"";console.log(` ${Z} | ${q} | ${Q}${H}`)}}catch(Y){console.error("Failed to get bundle sizes:",Y),process.exit(1)}finally{await J()}}async function w1($){if($.length===0)console.error("Usage: pkg-ops versions <package>"),process.exit(1);let Y=$[0];if(!T(Y))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);try{let X=await(await U()).listVersions(Y);if(await J(),X.length===0){console.log(`No versions of ${Y} installed.`);return}console.log(`Installed versions for ${Y}:
16
- `);let Z=[...X].sort((q,Q)=>Q.installedAt.localeCompare(q.installedAt));for(let q of Z){let Q=q.active?" [ACTIVE]":"",H=q.distSizeBytes?` (${(q.distSizeBytes/1024).toFixed(1)} KB)`:"",K=new Date(q.installedAt).toLocaleString();if(console.log(` ${q.version}${Q}${H}`),console.log(` Installed: ${K}`),q.fileCount)console.log(` Files: ${q.fileCount}`)}console.log(`
17
- Total: ${X.length} version(s)`)}catch(W){console.error("Failed to list versions:",W),process.exit(1)}finally{await J()}}async function E1($){if($.length===0)console.error("Usage: pkg-ops switch <package>@<version>"),process.exit(1);let Y=$[0],{name:W,version:X}=D(Y);if(!T(W))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);if(!X||X==="latest")console.error("Error: Must specify a version to switch to (e.g., @ebowwa/stack@0.7.12)"),process.exit(1);console.log(`Switching ${W} to version ${X}...`);try{let q=await(await U()).switchVersion(W,X);if(q.success){console.log(`Switched ${W} from ${q.fromVersion} to ${q.toVersion}`);let Q=_(),H=O(W);if(H?.service){if((await Q.status(H.service)).active)await Q.restart(H.service),console.log(` Service ${H.service} restarted`)}}else console.error(`Switch failed: ${q.message}`),process.exit(1)}catch(Z){console.error("Switch failed:",Z),process.exit(1)}finally{await J()}}async function U1($){if($.length===0)console.error("Usage: pkg-ops prune <package> [--keep N]"),process.exit(1);let Y=$[0],W=$.indexOf("--keep"),X=W>=0&&$[W+1]?parseInt($[W+1],10):2;if(!T(Y))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Pruning ${Y}, keeping ${X} most recent version(s)...`);try{let q=await(await U()).pruneVersions(Y,X);if(await J(),q.success)if(q.removedVersions.length===0)console.log(`No versions to remove (only ${q.keptVersions.length} installed).`);else{console.log(`Removed ${q.removedVersions.length} version(s):`);for(let Q of q.removedVersions)console.log(` - ${Q}`);console.log(`Freed: ${(q.freedBytes/1024).toFixed(1)} KB`),console.log(`Kept: ${q.keptVersions.join(", ")}`)}else console.error(`Prune failed: ${q.message}`),process.exit(1)}catch(Z){console.error("Prune failed:",Z),process.exit(1)}finally{await J()}}async function _1($){if($.length===0)console.error("Usage: pkg-ops remove-version <package>@<version>"),process.exit(1);let Y=$[0],{name:W,version:X}=D(Y);if(!T(W))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);if(!X||X==="latest")console.error("Error: Must specify a version to remove (e.g., @ebowwa/stack@0.7.12)"),process.exit(1);if(O(W)?.version===X)console.error(`Error: Cannot remove active version ${X}. Switch to another version first.`),process.exit(1);console.log(`Removing ${W}@${X}...`);try{let Q=await(await U()).removeVersion(W,X);if(await J(),Q.success)console.log(`Removed ${W}@${X}`);else console.error(`Remove failed: ${Q.message}`),process.exit(1)}catch(q){console.error("Remove failed:",q),process.exit(1)}finally{await J()}}async function O1($){try{let W=await(await U()).getMultiVersionPackages();if(await J(),W.length===0){console.log("No packages with multiple versions installed.");return}console.log(`Packages with multiple versions:
18
- `);for(let X of W)console.log(` ${X.packageName}:`),console.log(` Active: ${X.activeVersion}`),console.log(` Total: ${X.totalVersions} version(s)`),console.log(` Versions: ${X.versions.join(", ")}`),console.log("")}catch(Y){console.error("Failed to list multi-version packages:",Y),process.exit(1)}finally{await J()}}var T1=[{name:"install",description:"Install an @ebowwa/* package",usage:"pkg-ops install <package>[@version]",handler:Y1},{name:"update",description:"Update a package to latest version",usage:"pkg-ops update <package>",handler:$1},{name:"update-all",description:"Update all managed packages",usage:"pkg-ops update-all",handler:W1},{name:"list",description:"List installed packages",usage:"pkg-ops list",handler:X1},{name:"rollback",description:"Rollback a package to previous version",usage:"pkg-ops rollback <package>",handler:Z1},{name:"versions",description:"List all installed versions of a package",usage:"pkg-ops versions <package>",handler:w1},{name:"switch",description:"Switch to a specific installed version",usage:"pkg-ops switch <package>@<version>",handler:E1},{name:"prune",description:"Remove old versions, keeping N most recent",usage:"pkg-ops prune <package> [--keep N]",handler:U1},{name:"remove-version",description:"Remove a specific version",usage:"pkg-ops remove-version <package>@<version>",handler:_1},{name:"multi",description:"List packages with multiple versions",usage:"pkg-ops multi",handler:O1},{name:"start",description:"Start a systemd service",usage:"pkg-ops service start <name>",handler:J0},{name:"stop",description:"Stop a systemd service",usage:"pkg-ops service stop <name>",handler:K0},{name:"restart",description:"Restart a systemd service",usage:"pkg-ops service restart <name>",handler:w0},{name:"status",description:"Get service status",usage:"pkg-ops service status <name>",handler:E0},{name:"logs",description:"View service logs",usage:"pkg-ops service logs <name> [--lines N]",handler:U0},{name:"enable",description:"Enable service on boot",usage:"pkg-ops service enable <name>",handler:_0},{name:"disable",description:"Disable service from boot",usage:"pkg-ops service disable <name>",handler:O0},{name:"health",description:"Check health of all services",usage:"pkg-ops health [service]",handler:q1},{name:"config",description:"Show configuration",usage:"pkg-ops config show",handler:T0},{name:"set-config",description:"Set a config value",usage:"pkg-ops config set <package> <key> <value>",handler:A0},{name:"verify",description:"Verify package integrity",usage:"pkg-ops verify <package>",handler:Q1},{name:"sync-status",description:"Show local vs VPS version sync",usage:"pkg-ops sync-status [--local-path path]",handler:H1},{name:"audit",description:"Check for vulnerabilities",usage:"pkg-ops audit",handler:R0},{name:"scan",description:"Alias for audit",usage:"pkg-ops scan",handler:J1},{name:"sizes",description:"Show bundle sizes",usage:"pkg-ops sizes",handler:K1}],A1=[{name:"start",description:"Start a systemd service",usage:"pkg-ops service start <name>",handler:J0},{name:"stop",description:"Stop a systemd service",usage:"pkg-ops service stop <name>",handler:K0},{name:"restart",description:"Restart a systemd service",usage:"pkg-ops service restart <name>",handler:w0},{name:"status",description:"Get service status",usage:"pkg-ops service status <name>",handler:E0},{name:"logs",description:"View service logs",usage:"pkg-ops service logs <name> [--lines N]",handler:U0},{name:"enable",description:"Enable service on boot",usage:"pkg-ops service enable <name>",handler:_0},{name:"disable",description:"Disable service from boot",usage:"pkg-ops service disable <name>",handler:O0}],R1=[{name:"show",description:"Show configuration",usage:"pkg-ops config show",handler:T0},{name:"set",description:"Set a config value",usage:"pkg-ops config set <package> <key> <value>",handler:A0}];function L1(){console.log(`
14
+ `);for(let X of W)console.log(`[${X.severity.toUpperCase()}] ${X.packageName}`),console.log(` Vulnerability: ${X.vulnerability}`),console.log(` Description: ${X.description}`),console.log("")}catch($){console.error("Audit failed:",$),process.exit(1)}finally{await O()}}async function a0(Y){await T0(Y)}async function e0(Y){console.log(`Bundle sizes:
15
+ `);try{let W=await(await U()).getBundleSizes();if(W.length===0){console.log(" No packages installed");return}console.log(" Package | Version | Dist Size"),console.log(" --------------------------------|----------|-----------");for(let X of W){let Z=X.packageName.padEnd(32),q=X.version.padEnd(9),Q=(X.distSizeBytes/1024).toFixed(1)+" KB",H=X.fileCount?` (${X.fileCount} files)`:"";console.log(` ${Z} | ${q} | ${Q}${H}`)}}catch($){console.error("Failed to get bundle sizes:",$),process.exit(1)}finally{await O()}}async function Y1(Y){if(Y.length===0)console.error("Usage: pkg-ops versions <package>"),process.exit(1);let $=Y[0];if(!K($))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);try{let X=await(await U()).listVersions($);if(await O(),X.length===0){console.log(`No versions of ${$} installed.`);return}console.log(`Installed versions for ${$}:
16
+ `);let Z=[...X].sort((q,Q)=>Q.installedAt.localeCompare(q.installedAt));for(let q of Z){let Q=q.active?" [ACTIVE]":"",H=q.distSizeBytes?` (${(q.distSizeBytes/1024).toFixed(1)} KB)`:"",w=new Date(q.installedAt).toLocaleString();if(console.log(` ${q.version}${Q}${H}`),console.log(` Installed: ${w}`),q.fileCount)console.log(` Files: ${q.fileCount}`)}console.log(`
17
+ Total: ${X.length} version(s)`)}catch(W){console.error("Failed to list versions:",W),process.exit(1)}finally{await O()}}async function $1(Y){if(Y.length===0)console.error("Usage: pkg-ops switch <package>@<version>"),process.exit(1);let $=Y[0],{name:W,version:X}=D($);if(!K(W))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);if(!X||X==="latest")console.error("Error: Must specify a version to switch to (e.g., @ebowwa/stack@0.7.12)"),process.exit(1);console.log(`Switching ${W} to version ${X}...`);try{let q=await(await U()).switchVersion(W,X);if(q.success){console.log(`Switched ${W} from ${q.fromVersion} to ${q.toVersion}`);let Q=T(),H=J(W);if(H?.service){if((await Q.status(H.service)).active)await Q.restart(H.service),console.log(` Service ${H.service} restarted`)}}else console.error(`Switch failed: ${q.message}`),process.exit(1)}catch(Z){console.error("Switch failed:",Z),process.exit(1)}finally{await O()}}async function W1(Y){if(Y.length===0)console.error("Usage: pkg-ops prune <package> [--keep N]"),process.exit(1);let $=Y[0],W=Y.indexOf("--keep"),X=W>=0&&Y[W+1]?parseInt(Y[W+1],10):2;if(!K($))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);console.log(`Pruning ${$}, keeping ${X} most recent version(s)...`);try{let q=await(await U()).pruneVersions($,X);if(await O(),q.success)if(q.removedVersions.length===0)console.log(`No versions to remove (only ${q.keptVersions.length} installed).`);else{console.log(`Removed ${q.removedVersions.length} version(s):`);for(let Q of q.removedVersions)console.log(` - ${Q}`);console.log(`Freed: ${(q.freedBytes/1024).toFixed(1)} KB`),console.log(`Kept: ${q.keptVersions.join(", ")}`)}else console.error(`Prune failed: ${q.message}`),process.exit(1)}catch(Z){console.error("Prune failed:",Z),process.exit(1)}finally{await O()}}async function X1(Y){if(Y.length===0)console.error("Usage: pkg-ops remove-version <package>@<version>"),process.exit(1);let $=Y[0],{name:W,version:X}=D($);if(!K(W))console.error("Invalid package name. Only @ebowwa/* packages are supported."),process.exit(1);if(!X||X==="latest")console.error("Error: Must specify a version to remove (e.g., @ebowwa/stack@0.7.12)"),process.exit(1);if(J(W)?.version===X)console.error(`Error: Cannot remove active version ${X}. Switch to another version first.`),process.exit(1);console.log(`Removing ${W}@${X}...`);try{let Q=await(await U()).removeVersion(W,X);if(await O(),Q.success)console.log(`Removed ${W}@${X}`);else console.error(`Remove failed: ${Q.message}`),process.exit(1)}catch(q){console.error("Remove failed:",q),process.exit(1)}finally{await O()}}async function Z1(Y){try{let W=await(await U()).getMultiVersionPackages();if(await O(),W.length===0){console.log("No packages with multiple versions installed.");return}console.log(`Packages with multiple versions:
18
+ `);for(let X of W)console.log(` ${X.packageName}:`),console.log(` Active: ${X.activeVersion}`),console.log(` Total: ${X.totalVersions} version(s)`),console.log(` Versions: ${X.versions.join(", ")}`),console.log("")}catch($){console.error("Failed to list multi-version packages:",$),process.exit(1)}finally{await O()}}var q1=[{name:"install",description:"Install an @ebowwa/* package",usage:"pkg-ops install <package>[@version]",handler:c0},{name:"update",description:"Update a package to latest version",usage:"pkg-ops update <package>",handler:o0},{name:"update-all",description:"Update all managed packages",usage:"pkg-ops update-all",handler:t0},{name:"list",description:"List installed packages",usage:"pkg-ops list",handler:i0},{name:"rollback",description:"Rollback a package to previous version",usage:"pkg-ops rollback <package>",handler:n0},{name:"versions",description:"List all installed versions of a package",usage:"pkg-ops versions <package>",handler:Y1},{name:"switch",description:"Switch to a specific installed version",usage:"pkg-ops switch <package>@<version>",handler:$1},{name:"prune",description:"Remove old versions, keeping N most recent",usage:"pkg-ops prune <package> [--keep N]",handler:W1},{name:"remove-version",description:"Remove a specific version",usage:"pkg-ops remove-version <package>@<version>",handler:X1},{name:"multi",description:"List packages with multiple versions",usage:"pkg-ops multi",handler:Z1},{name:"start",description:"Start a systemd service",usage:"pkg-ops service start <name>",handler:X0},{name:"stop",description:"Stop a systemd service",usage:"pkg-ops service stop <name>",handler:Z0},{name:"restart",description:"Restart a systemd service",usage:"pkg-ops service restart <name>",handler:q0},{name:"status",description:"Get service status",usage:"pkg-ops service status <name>",handler:Q0},{name:"logs",description:"View service logs",usage:"pkg-ops service logs <name> [--lines N]",handler:H0},{name:"enable",description:"Enable service on boot",usage:"pkg-ops service enable <name>",handler:O0},{name:"disable",description:"Disable service from boot",usage:"pkg-ops service disable <name>",handler:_0},{name:"health",description:"Check health of all services",usage:"pkg-ops health [service]",handler:g0},{name:"config",description:"Show configuration",usage:"pkg-ops config show",handler:w0},{name:"set-config",description:"Set a config value",usage:"pkg-ops config set <package> <key> <value>",handler:E0},{name:"verify",description:"Verify package integrity",usage:"pkg-ops verify <package>",handler:s0},{name:"sync-status",description:"Show local vs VPS version sync",usage:"pkg-ops sync-status [--local-path path]",handler:r0},{name:"audit",description:"Check for vulnerabilities",usage:"pkg-ops audit",handler:T0},{name:"scan",description:"Alias for audit",usage:"pkg-ops scan",handler:a0},{name:"sizes",description:"Show bundle sizes",usage:"pkg-ops sizes",handler:e0}],Q1=[{name:"start",description:"Start a systemd service",usage:"pkg-ops service start <name>",handler:X0},{name:"stop",description:"Stop a systemd service",usage:"pkg-ops service stop <name>",handler:Z0},{name:"restart",description:"Restart a systemd service",usage:"pkg-ops service restart <name>",handler:q0},{name:"status",description:"Get service status",usage:"pkg-ops service status <name>",handler:Q0},{name:"logs",description:"View service logs",usage:"pkg-ops service logs <name> [--lines N]",handler:H0},{name:"enable",description:"Enable service on boot",usage:"pkg-ops service enable <name>",handler:O0},{name:"disable",description:"Disable service from boot",usage:"pkg-ops service disable <name>",handler:_0}],H1=[{name:"show",description:"Show configuration",usage:"pkg-ops config show",handler:w0},{name:"set",description:"Set a config value",usage:"pkg-ops config set <package> <key> <value>",handler:E0}];function O1(){console.log(`
19
19
  PkgOps - Package operations CLI for VPS
20
20
 
21
21
  Usage:
@@ -69,7 +69,7 @@ Examples:
69
69
  pkg-ops sync-status --local-path ./package.json
70
70
  pkg-ops verify @ebowwa/stack
71
71
  pkg-ops audit
72
- `)}async function F1(){let $=process.argv.slice(2);if($.length===0||$[0]==="--help"||$[0]==="-h")L1(),process.exit(0);if($[0]==="--version"||$[0]==="-v"){let Z=E();console.log(`pkg-ops ${Z.packages?.["@ebowwa/pkg-ops"]?.version??"0.1.0"}`),process.exit(0)}let Y=$[0],W=$.slice(1);if(Y==="service"){if(W.length===0)console.error("Missing service subcommand"),console.error("Usage: pkg-ops service <start|stop|restart|status|logs|enable|disable> <name>"),process.exit(1);let Z=W[0],q=A1.find((Q)=>Q.name===Z);if(!q)console.error(`Unknown service subcommand: ${Z}`),process.exit(1);await q.handler(W.slice(1));return}if(Y==="config"){if(W.length===0)console.error("Missing config subcommand"),console.error("Usage: pkg-ops config <show|set> [args...]"),process.exit(1);let Z=W[0],q=R1.find((Q)=>Q.name===Z);if(!q)console.error(`Unknown config subcommand: ${Z}`),process.exit(1);await q.handler(W.slice(1));return}let X=T1.find((Z)=>Z.name===Y);if(!X)console.error(`Unknown command: ${Y}`),console.error("Run 'pkg-ops --help' for usage"),process.exit(1);await X.handler(W)}if(__require.main==__require.module)F1().catch(($)=>{console.error("Fatal error:",$),process.exit(1)});export{M as updatePackageConfig,s0 as stopHealthServer,J as stopBridge,r0 as startHealthServer,U as startBridge,z0 as setActiveVersion,b as saveConfig,S0 as removePackageVersion,b0 as removePackageConfig,D as parsePackageSpec,E as loadConfig,d as listManagedPackages,M0 as isVersionInstalled,T as isValidPackageName,C0 as getVersionCount,_ as getServiceManager,h0 as getPackagesWithMultipleVersions,O as getPackageConfig,G0 as getInstalledVersions,r as getHealthServer,S as getConfigPath,Q0 as getBridge,D0 as getActiveVersion,a as ensureConfigDir,P0 as addPackageVersion,l as ServiceManager,c as RustBridge,n as HealthServer};
72
+ `)}async function _1(){let Y=process.argv.slice(2);if(Y.length===0||Y[0]==="--help"||Y[0]==="-h")O1(),process.exit(0);if(Y[0]==="--version"||Y[0]==="-v"){let Z=_();console.log(`pkg-ops ${Z.packages?.["@ebowwa/pkg-ops"]?.version??"0.1.0"}`),process.exit(0)}let $=Y[0],W=Y.slice(1);if($==="service"){if(W.length===0)console.error("Missing service subcommand"),console.error("Usage: pkg-ops service <start|stop|restart|status|logs|enable|disable> <name>"),process.exit(1);let Z=W[0],q=Q1.find((Q)=>Q.name===Z);if(!q)console.error(`Unknown service subcommand: ${Z}`),process.exit(1);await q.handler(W.slice(1));return}if($==="config"){if(W.length===0)console.error("Missing config subcommand"),console.error("Usage: pkg-ops config <show|set> [args...]"),process.exit(1);let Z=W[0],q=H1.find((Q)=>Q.name===Z);if(!q)console.error(`Unknown config subcommand: ${Z}`),process.exit(1);await q.handler(W.slice(1));return}let X=q1.find((Z)=>Z.name===$);if(!X)console.error(`Unknown command: ${$}`),console.error("Run 'pkg-ops --help' for usage"),process.exit(1);await X.handler(W)}var w1=process.argv[1]?.includes("pkg-ops");if(w1)_1().catch((Y)=>{console.error("Fatal error:",Y),process.exit(1)});export{M as updatePackageConfig,j0 as stopHealthServer,O as stopBridge,p0 as startHealthServer,U as startBridge,G0 as setActiveVersion,b as saveConfig,b0 as removePackageVersion,R0 as removePackageConfig,D as parsePackageSpec,_ as loadConfig,z as listManagedPackages,x0 as isVersionInstalled,K as isValidPackageName,M0 as getVersionCount,T as getServiceManager,D0 as getPackagesWithMultipleVersions,J as getPackageConfig,y0 as getInstalledVersions,v as getHealthServer,S as getConfigPath,W0 as getBridge,V0 as getActiveVersion,p as ensureConfigDir,I0 as addPackageVersion,f as ServiceManager,u as RustBridge,k as HealthServer};
73
73
 
74
- //# debugId=C2965CBF167A76D764756E2164756E21
74
+ //# debugId=94261EB445BE021464756E2164756E21
75
75
  //# sourceMappingURL=index.js.map