shellbell 0.12.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +35 -96
- package/dist/doctor-D2Hd_mqM.js +86 -0
- package/dist/native-controller.js +2 -2
- package/dist/native-service.js +2 -2
- package/dist/service-entry-Dz0BLRLS.js +11 -0
- package/dist/service-lifecycle-CCOIXXFm.js +29 -0
- package/package.json +1 -1
- package/dist/service-entry-BBSp8-ir.js +0 -11
- package/dist/service-lifecycle-De-Hj3Tl.js +0 -29
package/package.json
CHANGED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{A as e,C as t,D as n,Dt as r,E as i,O as a,Ot as o,T as s,Tt as c,c as l,dt as u,f as d,i as f,k as p,kt as m,m as h,p as g,pt as _,ut as v,v as y,x as b,y as x}from"./service-lifecycle-De-Hj3Tl.js";import{createRequire as S}from"node:module";import{closeSync as C,constants as w,fstatSync as T,mkdirSync as E,openSync as ee,readdirSync as D,realpathSync as O,unlinkSync as k}from"node:fs";import{basename as te,dirname as A,join as j}from"node:path";import{z as M}from"zod";const N=`sh.bilal.shellbell.host.manual`;function P(e){(!s.safeParse(e).success||e!==j(e))&&F();for(let t=e;;t=A(t)){let e=r(t);if(e&&(!e.isDirectory()||e.isSymbolicLink())&&F(),A(t)===t)break}}function F(){throw new h(`unsafe-state`)}function I(e){return(!s.safeParse(e).success||[...e].some(e=>e.charCodeAt(0)<32||e.charCodeAt(0)===127))&&F(),e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function L(e){return(e!==j(e)||!e.endsWith(`/Shellbell.app/Contents/MacOS/Shellbell`))&&F(),Buffer.from(`<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
-
<plist version="1.0"><dict>
|
|
4
|
-
<key>Label</key><string>${N}</string>
|
|
5
|
-
<key>ProgramArguments</key><array><string>${I(e)}</string><string>--service-run</string><string>manual</string></array>
|
|
6
|
-
<key>RunAtLoad</key><true/>
|
|
7
|
-
<key>KeepAlive</key><true/>
|
|
8
|
-
<key>ThrottleInterval</key><integer>10</integer>
|
|
9
|
-
</dict></plist>
|
|
10
|
-
`)}function R(e,t){return e===null||t===null?e===t:m(e.stat,t.stat)&&e.stat.mode===t.stat.mode&&e.stat.uid===t.stat.uid&&e.stat.size===t.stat.size&&e.stat.mtimeMs===t.stat.mtimeMs&&e.stat.ctimeMs===t.stat.ctimeMs&&e.raw.equals(t.raw)}function z(e,t){let n=j(e,`manual.plist`),i,a=i=>{try{if(P(e),!r(e))return null;o(e,t);let a=r(n);if(!a)return null;let s=c(n,65536,t);return s.equals(L(i))||F(),{stat:a,raw:s}}catch{return F()}},s=e=>{let t=a(e);return i!==void 0&&!R(i,t)&&F(),i=t,t};return{path:n,inspect(e){return s(e)!==null},write(c){let l=L(c),u=s(c);P(e),r(e)||E(e,{recursive:!0,mode:448});let d=o(e,t);_(n,l,()=>{P(e),(!m(d,o(e,t))||!R(u,a(c)))&&F()}),i=a(c),i?.raw.equals(l)||F()},remove(e){let t=s(e);t&&(R(t,a(e))||F(),k(n),i=null)}}}const B=`sh.bilal.shellbell.host.agent`,V=65536;function H(){throw new h(`unsafe-state`)}function U(e){(!s.safeParse(e).success||e!==j(e)||te(e)!==`Shellbell.app`)&&H();let t=j(e,`Contents`,`MacOS`,`Shellbell`);return s.safeParse(t).success||H(),t}async function W(e,t,n,r,i=!1,a=1e4){try{let i=await e(t,n,{input:r,timeoutMs:a,maxOutputBytes:V,captureOutput:!0});if(!Number.isInteger(i.exitCode)||i.exitCode<0||i.exitCode>255||!Buffer.isBuffer(i.stdout)||i.stdout.length>V)throw Error(`invalid command result`);return i}catch{throw new h(i?`delivery-unknown`:`unavailable`)}}function G(e,t){return m(e,t)&&e.mode===t.mode&&e.uid===t.uid&&e.size===t.size&&e.mtimeMs===t.mtimeMs&&e.ctimeMs===t.ctimeMs}async function K(e,t,i=n){let a=U(e),o=j(e,`Contents`,`Info.plist`),s=new Map,l=()=>{P(A(e));for(let n of[e,j(e,`Contents`),j(e,`Contents`,`MacOS`),o,a]){let e=r(n),i=n===o||n===a;(!e||e.isSymbolicLink()||(i?!e.isFile():!e.isDirectory())||e.uid!==t&&e.uid!==0||e.mode&3602||n===a&&!(e.mode&73))&&H();let c=s.get(n);c&&!G(c,e)&&H(),s.set(n,e)}};try{l();let e=await W(i,`/usr/bin/plutil`,[`-convert`,`json`,`-o`,`-`,`-`],c(o,V));e.exitCode!==0&&H();let t=JSON.parse(new TextDecoder(`utf-8`,{fatal:!0}).decode(e.stdout));return(t?.CFBundleIdentifier!==`sh.bilal.shellbell.host`||t?.CFBundleExecutable!==`Shellbell`)&&H(),l(),{executable:a,revalidate:l}}catch{return H()}}function q(e,t,n,r){let i;try{i=new TextDecoder(`utf-8`,{fatal:!0}).decode(e)}catch{return H()}let a=i.trim().split(/\r?\n/).map(e=>e.trim());(a.shift()!==`${t} = {`||a.pop()!==`}`)&&H();let o=1,s,c=null,l=!1,u,d=!1;for(let e of a)if(e){if(e===`}`){o<=1&&H(),d&&o===2&&(d=!1),o--;continue}if(o===1&&e.startsWith(`program = `)){s!==void 0&&H(),s=e.slice(10);continue}if(o===1&&e.startsWith(`pid = `)){(l||!/^pid = [1-9][0-9]*$/.test(e))&&H(),l=!0,c=Number(e.slice(6)),(!Number.isSafeInteger(c)||c>2147483647)&&H();continue}if(o===1&&/^(?:pid|program|arguments)(?:\s|=)/.test(e)&&e!==`arguments = {`&&H(),e.endsWith(`= {`)){o===1&&e===`arguments = {`?(u!==void 0&&H(),u=[],d=!0):d&&H(),o++;continue}d&&o===2?u.push(e):(e.includes(`{`)||e.includes(`}`))&&H()}return(o!==1||s!==n||!u||u.length!==3||u[0]!==(r===`persistent`?`Shellbell`:n)||u[1]!==`--service-run`||u[2]!==r)&&H(),c}function J(e){let{root:o,uid:c,homeDir:l}=e;(!Number.isSafeInteger(c)||c<=0||!s.safeParse(o).success||!s.safeParse(l).success||o!==j(o)||l!==j(l))&&H();let u=j(l,`Library`,`LaunchAgents`);(o===u||o.startsWith(`${u}/`))&&H();let d=e.run??n,p=z(o,c),m=()=>e.legacy??i({run:d,uid:c,homeDir:l}),g=`gui/${c}`,_=e=>`${g}/${e===`manual`?N:B}`,v=e=>{b.safeParse(e).success||H()};async function x(e,t,n,r=`service`){let i=await K(e,c,d);await n?.(),i.revalidate();let a=t!==`status`,o=await W(d,i.executable,[r===`login`?`--login-api`:`--service-api`,t],void 0,a);i.revalidate();let s;try{s=y.parse(JSON.parse(new TextDecoder(`utf-8`,{fatal:!0}).decode(o.stdout)))}catch{throw new h(a?`delivery-unknown`:`unavailable`)}if(!s.ok)throw new h(s.error.code===`denied`?`approval-required`:s.error.code===`invalid-bundle`?`unsafe-state`:`operation-failed`);if(o.exitCode!==0)throw new h(a?`delivery-unknown`:`unavailable`);return s.status}async function S(e,t,n=1e4){let r=await W(d,`/bin/launchctl`,[`print`,_(e)],void 0,!1,n);if(r.exitCode===113)return{loaded:!1,pid:null};if(r.exitCode!==0)throw new h(`unavailable`);return{loaded:!0,pid:q(r.stdout,_(e),U(t),e)}}let C={loginStatus:e=>x(e,`status`,void 0,`login`),async setLogin(e,t){let n=await K(e,c,d),r=await W(d,`/usr/bin/codesign`,[`--verify`,`--strict`,e]);if(n.revalidate(),r.exitCode!==0)throw new h(`startup-unavailable`);let i=await x(e,`status`,void 0,`login`);if(i===`not-found`&&!t||i===`unknown`)throw new h(`startup-unavailable`);if(t?i===`enabled`||i===`requires-approval`:i===`not-registered`)return i;try{await x(e,t?`register`:`unregister`,void 0,`login`)}catch(n){if(!(t&&n instanceof h&&n.code===`approval-required`&&await x(e,`status`,void 0,`login`)===`requires-approval`))throw n}let a=await x(e,`status`,void 0,`login`);if(t?a!==`enabled`&&a!==`requires-approval`:a!==`not-registered`)throw new h(`operation-failed`);return a},async preflight(e,t){await a(d,c,l);let n=await K(t,c,d);if(e===`persistent`){let e=await W(d,`/usr/bin/codesign`,[`--verify`,`--strict`,t]);if(n.revalidate(),e.exitCode!==0||await x(t,`status`)===`not-found`)throw new h(`startup-unavailable`)}},async prepareManualRecovery(e){if(await a(d,c,l),v(e),t(e.mode)!==`persistent`&&H(),(await C.inspect(`persistent`,e.bundlePath)).loaded)throw new h(`conflict`);if((await W(d,`/bin/launchctl`,[`disable`,_(`persistent`)],void 0,!0)).exitCode!==0)throw new h(`operation-failed`);let n=await W(d,`/bin/launchctl`,[`print-disabled`,g]),r=new TextDecoder(`utf-8`,{fatal:!0}).decode(n.stdout).trim().split(/\r?\n/).map(e=>e.trim());if(n.exitCode!==0||r.shift()!==`disabled services = {`||r.pop()!==`}`||r.filter(e=>e.includes(`"${B}"`)).join(`
|
|
11
|
-
`)!==`"${B}" => disabled`)throw new h(`operation-failed`);let i=await C.inspect(`persistent`,e.bundlePath);if(i.loaded)throw new h(`conflict`);i.registration!==`not-registered`&&i.registration!==`not-found`&&await C.stop(e,i)},inspectLegacy:()=>m().inspect(),async inspect(e,t){e!==`manual`&&e!==`persistent`&&H();let n=U(t),i;e===`manual`?i=p.inspect(n)?`enabled`:`not-registered`:(P(A(t)),i=r(t)?await x(t,`status`):`not-found`);let a=await S(e,t);return e===`manual`&&a.loaded&&i!==`enabled`&&H(),{registration:i,...a,bundlePath:t}},async start(e){if(v(e),await C.preflight(t(e.mode),e.bundlePath),(await C.inspect(t(e.mode),e.bundlePath)).loaded)throw new h(`conflict`);if(t(e.mode)===`persistent`){if((await W(d,`/bin/launchctl`,[`enable`,_(`persistent`)],void 0,!0)).exitCode!==0)throw new h(`operation-failed`);return{registration:await x(e.bundlePath,`register`,async()=>{if((await S(`persistent`,e.bundlePath)).loaded)throw new h(`conflict`)}),...await S(t(e.mode),e.bundlePath),bundlePath:e.bundlePath}}let n=await K(e.bundlePath,c,d);if(p.write(n.executable),(await S(`manual`,e.bundlePath)).loaded)throw new h(`conflict`);if(p.inspect(n.executable),n.revalidate(),(await W(d,`/bin/launchctl`,[`bootstrap`,g,p.path],void 0,!0)).exitCode!==0)throw new h(`operation-failed`);return C.inspect(`manual`,e.bundlePath)},async stop(e,n){v(e),n.bundlePath!==e.bundlePath&&H();let r=await C.inspect(t(e.mode),e.bundlePath);if(r.loaded!==n.loaded||r.pid!==n.pid||r.registration!==n.registration)throw new h(`conflict`);if(t(e.mode)===`persistent`){if(await x(e.bundlePath,`unregister`,async()=>{let t=await S(`persistent`,e.bundlePath);if(t.loaded!==r.loaded||t.pid!==r.pid)throw new h(`conflict`)})!==`not-registered`)throw new h(`operation-failed`)}else if(r.loaded&&(p.inspect(U(e.bundlePath)),(await W(d,`/bin/launchctl`,[`bootout`,_(`manual`)],void 0,!0)).exitCode!==0))throw new h(`operation-failed`);let i=performance.now()+1e4;for(;;){let n=i-performance.now();if(n<=0)throw new h(`operation-failed`);let a=await S(t(e.mode),e.bundlePath,n);if(!a.loaded)break;if(a.pid!==null&&a.pid!==r.pid)throw new h(`conflict`);let o=Math.min(100,i-performance.now());if(o<=0)throw new h(`operation-failed`);await new Promise(e=>setTimeout(e,o))}},async remove(e){v(e);let n=await C.inspect(t(e.mode),e.bundlePath);if(n.loaded||t(e.mode)===`persistent`&&n.registration!==`not-registered`)throw new h(`conflict`);t(e.mode)===`manual`&&p.remove(U(e.bundlePath))},withLegacyGuard(e){return f(m(),!0,e)}};return C}const Y=()=>{throw new h(`unsafe-state`)};async function X(e,t={}){try{(O(e)!==e||[...e].some(e=>e.charCodeAt(0)<32||e.charCodeAt(0)===127))&&Y();let i=t.run??n,a=await K(e,process.getuid(),i),o=j(e,`Contents`),s=j(o,`Resources`),l=j(o,`Helpers/node`),u=j(s,`agent/dist/native-controller.js`),d=j(s,`agent/dist/native-service.js`),f=[l,u,d,j(s,`runtime/LICENSE`),j(s,`agent/package.json`),j(s,`agent/dist/cli.js`)],p=()=>{for(let t of f){for(let n=A(t);n!==e;n=A(n)){let e=r(n);(!e?.isDirectory()||e.isSymbolicLink()||e.mode&3602||e.uid!==0&&e.uid!==process.getuid())&&Y()}let n=r(t);(!n?.isFile()||n.isSymbolicLink()||n.mode&3602||n.uid!==0&&n.uid!==process.getuid()||t===l&&!(n.mode&73))&&Y()}let t=0,n=new Set,i=e=>{++t>1e5&&Y();let a=r(e);if(!a)throw new h(`unsafe-state`);let o=O(e);if(o.startsWith(`${s}/`)||Y(),a.isSymbolicLink()){i(o);return}if(!n.has(o)){if(n.add(o),(a.uid!==0&&a.uid!==process.getuid()||a.mode&3602)&&Y(),a.isDirectory())for(let t of D(e))i(j(e,t));else a.isFile()||Y()}};for(let e of[`agent`,`runtime`])i(j(s,e))};p();let m=JSON.parse(c(j(s,`agent/package.json`),65536).toString(`utf8`));(m.name!==`shellbell`||typeof m.version!=`string`||!m.version||m.type!==`module`)&&Y();let g=S(j(s,`agent/package.json`));for(let e of Object.keys(m.dependencies??{}))O(g.resolve(e)).startsWith(`${s}/agent/`)||Y();let _=await i(`/usr/bin/plutil`,[`-convert`,`json`,`-o`,`-`,j(o,`Info.plist`)],{timeoutMs:1e4,maxOutputBytes:65536,captureOutput:!0});(_.exitCode!==0||JSON.parse(_.stdout.toString(`utf8`)).CFBundleShortVersionString!==m.version)&&Y();let v=await i(l,[`--version`],{timeoutMs:1e4,maxOutputBytes:65536,captureOutput:!0});(v.exitCode!==0||v.stdout.toString(`utf8`).trim()!==`v22.23.1`)&&Y();let y=await i(l,[`-p`,`process.platform + ':' + process.arch`],{timeoutMs:1e4,maxOutputBytes:65536,captureOutput:!0});(y.exitCode!==0||y.stdout.toString(`utf8`).trim()!==`${process.platform}:${process.arch}`)&&Y();for(let e of[j(s,`agent/dist/cli.js`),u,d]){let t=await i(l,[e,`--version`],{timeoutMs:1e4,maxOutputBytes:65536,captureOutput:!0});(t.exitCode!==0||t.stdout.toString(`utf8`).trim()!==m.version)&&Y()}return a.revalidate(),p(),{executable:a.executable,nodePath:l,controllerPath:u,servicePath:d,agentVersion:m.version}}catch(e){if(e instanceof h)throw e;return Y()}}const Z=M.strictObject({v:M.literal(1),instance:M.uuid()});function ne(e,t){let n,r,i=new Promise((e,t)=>{n=e,r=t}),a=!1,o=!1,s=Buffer.alloc(0),c=setTimeout(()=>u(),t.timeoutMs??5e3),l=()=>{clearTimeout(c),e.off(`data`,d),e.off(`end`,u),e.off(`close`,u),e.off(`error`,u)},u=()=>{o||(o=!0,l(),r(new h(`unavailable`)),Promise.resolve().then(()=>t.onLost()).catch(()=>{}))},d=e=>{if(o)return;let r=Buffer.isBuffer(e)?e:Buffer.from(e);if(a||s.length+r.length>1024){u();return}s=Buffer.concat([s,r]);let i=s.indexOf(10);if(!(i<0))try{let e=Z.parse(JSON.parse(new TextDecoder(`utf-8`,{fatal:!0}).decode(s.subarray(0,i))));if(i!==s.length-1||e.instance!==t.instance)throw Error();a=!0,s=Buffer.alloc(0),clearTimeout(c),n()}catch{u()}};return e.on(`data`,d),e.once(`end`,u),e.once(`close`,u),e.once(`error`,u),(e.destroyed||e.readableEnded)&&u(),{ready:i,close:u}}var Q=class extends d{constructor(e){super({...e,filename:`controller.json`,maxBytes:g,schema:x})}};function re(e,t,n){if(n.NODE_OPTIONS||n.NODE_PATH||!b.safeParse(e).success||!s.safeParse(t).success)throw new h(`unsafe-state`);return{...e.environment,HOME:t}}function $(t,n,i=!1){try{if(n<=0||!s.safeParse(t).success||[...t].some(e=>e.charCodeAt(0)<32||e.charCodeAt(0)===127))throw Error();for(let e=t;;e=A(e)){let t=r(e);if(t&&(!t.isDirectory()||t.isSymbolicLink()))throw Error();if(A(e)===e)break}if(!r(t)){if(!i)return null;E(t,{recursive:!0,mode:448})}if(o(t,n),O(t)!==t)throw Error();let a=v(t);for(let e of[a.identity,a.pairings,a.config,a.pid])r(e)&&c(e,65536,n);ie(a.log,n);let l=r(a.sock);if(l&&(!l.isSocket()||l.uid!==n||(l.mode&4095)!=384))throw Error();return u(a),i?p(a):e(a)}catch{throw new h(`unsafe-state`)}}function ie(e,t){let n=r(e);if(!n)return;let i=e=>{if(!e.isFile()||e.isSymbolicLink()||e.uid!==t||(e.mode&4095)!=384)throw Error()};i(n);let a=ee(e,w.O_RDONLY|w.O_NOFOLLOW|w.O_NONBLOCK);try{let t=T(a);i(t);let o=r(e);if(!o||(i(o),!m(n,t)||!m(t,o)))throw Error()}finally{C(a)}}async function ae(e,t){let n=new Q(t).inspect()?.selection;if(!n||n.mode!==e||n.bundlePath!==t.bundlePath)throw new h(`conflict`);let r=$(n.stateDir,t.uid);if(!r||r.fp!==n.computerFp)throw new h(`unsafe-state`);if(e!==`desktop`)return t.start(n);let i=new l({stateDir:n.stateDir,uid:t.uid}).inspect();if(!t.ownerInput||i?.mode!==`desktop`||!i.consented||i.transition&&(i.transition.target!==`desktop`||![`source-stopped`,`destination-started`].includes(i.transition.phase)))throw new h(`conflict`);let a=!1,o,s,c=()=>s??=(async()=>{o&&await(await o).stop()})(),u=ne(t.ownerInput,{instance:n.serviceInstance,onLost:async()=>{a=!0;try{await c(),t.onOwnerLost?.(null)}catch(e){t.onOwnerLost?.(e)}}});try{if(await u.ready,a)throw new h(`unavailable`);if(o=t.start(n),await o,a)throw await c(),new h(`unavailable`);return{stop:async()=>{await c(),u.close()}}}catch(e){throw u.close(),e}}export{X as a,Q as i,ae as n,J as o,re as r,$ as t};
|