badgerclaw 0.3.8 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var fi=Object.create;var qt=Object.defineProperty;var hi=Object.getOwnPropertyDescriptor;var yi=Object.getOwnPropertyNames;var bi=Object.getPrototypeOf,wi=Object.prototype.hasOwnProperty;var K=(e,t)=>()=>(e&&(t=e(e=0)),t);var _i=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),qn=(e,t)=>{for(var n in t)qt(e,n,{get:t[n],enumerable:!0})},cr=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of yi(t))!wi.call(e,r)&&r!==n&&qt(e,r,{get:()=>t[r],enumerable:!(o=hi(t,r))||o.enumerable});return e};var m=(e,t,n)=>(n=e!=null?fi(bi(e)):{},cr(t||!e||!e.__esModule?qt(n,"default",{value:e,enumerable:!0}):n,e)),ur=e=>cr(qt({},"__esModule",{value:!0}),e);function I(){try{let e=ft.default.readFileSync(Wn,"utf-8");return JSON.parse(e)}catch{return null}}function Vt(e){ft.default.mkdirSync(gr,{recursive:!0}),ft.default.writeFileSync(Wn,JSON.stringify(e,null,2),{mode:384})}function ht(){try{ft.default.unlinkSync(Wn)}catch{}}function Kt(){let e=I();return e?new Date(e.expires_at)>new Date:!1}function Wt(e){let t=e.match(/^@?([^:]+)/);return t?t[1]:e}var ft,Kn,pr,gr,Wn,H=K(()=>{"use strict";ft=m(require("fs")),Kn=m(require("path")),pr=m(require("os")),gr=Kn.default.join(pr.default.homedir(),".badgerclaw"),Wn=Kn.default.join(gr,"auth.json")});function yt(){return fr.default.createHash("sha256").update(`${se.default.hostname()}-${se.default.platform()}-${se.default.arch()}`).digest("hex").slice(0,16)}function ae(){let e=I();if(e?.instance_id)return e.instance_id;let t=yt();return`openclaw-${se.default.hostname().toLowerCase().replace(/[^a-z0-9]/g,"-")}-${t}`}function Jt(){return{hostname:se.default.hostname(),os:se.default.platform(),arch:se.default.arch(),uptimeSeconds:Math.floor(se.default.uptime()),memFreeMb:Math.floor(se.default.freemem()/1024/1024)}}var se,fr,Oe=K(()=>{"use strict";se=m(require("os")),fr=m(require("crypto"));H()});var hr,N,yr,ie=K(()=>{"use strict";hr=process.env.BADGERCLAW_ENV==="local",N=process.env.BADGERCLAW_API_URL??(hr?"http://localhost:8000":"https://api.badger.signout.io"),yr=process.env.BADGERCLAW_AUTH_URL??(hr?"http://localhost:5500":"https://badgerclaw.ai")});function wr(){return bt}function vi(e){if(!e)return null;let t=e.split(".");if(t.length!==3)return null;try{let n=t[1].replace(/-/g,"+").replace(/_/g,"/"),o=n.length%4===0?n:n+"=".repeat(4-n.length%4),r=JSON.parse(Buffer.from(o,"base64").toString("utf8"));return(typeof r?.sub=="string"?r.sub:null)||null}catch{return null}}async function Jn(){let e=I();if(!e?.refresh_token||!e?.email)return bt=e?e.refresh_token?"no email in auth.json \u2014 re-run `badgerclaw login`":"no refresh_token in auth.json \u2014 re-run `badgerclaw login`":"not logged in (auth.json missing)",null;let t=vi(e.access_token);try{let n=await wt.default.post(`${zt}/api/v1/user/token/refresh`,{refresh_token:e.refresh_token,email:e.email,...t?{cognito_username:t}:{}}),o=n.data?.result??n.data,r=o?.access_token;if(!r)return bt="server returned no access_token",null;let s=o.expires_in||3600,a=new Date(Date.now()+s*1e3).toISOString();return Vt({...e,access_token:r,expires_at:a}),bt=null,r}catch(n){let o=n?.response?.status,r=n?.response?.data?.errors?.[0]||n?.response?.data?.detail||n?.message||"unknown error";bt=o?`HTTP ${o}: ${r}`:`network error: ${r}`;let s=n?.response?.data?.errors?.[0]||n?.response?.data?.detail||n?.message||"";if(o===403&&br.test(s))throw ht(),new Je(s);return null}}function Yn(e){return e.interceptors.response.use(t=>(t.data&&typeof t.data=="object"&&"result"in t.data&&"errors"in t.data&&(t.data=t.data.result),t),t=>{let n=t.response?.data?.errors;return n?.length&&(t.message=n[0]),Promise.reject(t)}),e}function _r(e){return e.interceptors.response.use(void 0,t=>{if(t.response?.status===403){let o=t.message||t.response?.data?.errors?.[0]||t.response?.data?.detail||"";if(br.test(o))return ht(),Promise.reject(new Je(o))}return Promise.reject(t)}),e}function vr(e){return e.interceptors.response.use(void 0,async t=>{let n=t.config;if(t.response?.status!==401||n._retried)return Promise.reject(t);n._retried=!0,Yt||(Yt=Jn().finally(()=>{Yt=null}));let o=await Yt;return o?(n.headers.Authorization=`Bearer ${o}`,e.request(n)):Promise.reject(t)}),e}function B(){let e=I(),t={"Content-Type":"application/json"};e&&(t.Authorization=`Bearer ${e.access_token}`);let n=wt.default.create({baseURL:zt,headers:t});return Yn(n),vr(n),_r(n),n}function Sr(){return Yn(wt.default.create({baseURL:zt,headers:{"Content-Type":"application/json"}}))}function _t(e){let t=wt.default.create({baseURL:zt,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});return Yn(t),vr(t),_r(t),t}var wt,zt,Je,br,Yt,bt,Pe=K(()=>{"use strict";wt=m(require("axios"));H();ie();zt=N,Je=class extends Error{constructor(n){super(n);this.code="DEACTIVATED";this.name="DeactivatedError"}},br=/account\s+has\s+been\s+(deleted|deactivated)/i,Yt=null,bt=null});function xr(){try{let e=ve.default.statSync(Le);return Date.now()-e.mtimeMs>Rr}catch{return!0}}function zn(){try{return ve.default.mkdirSync(Qn.default.dirname(Le),{recursive:!0}),ve.default.writeFileSync(Le,String(process.pid),{flag:"wx"}),!0}catch{if(xr())try{return ve.default.unlinkSync(Le),ve.default.writeFileSync(Le,String(process.pid),{flag:"wx"}),!0}catch{return!1}return!1}}function $r(){try{ve.default.unlinkSync(Le)}catch{}}async function Ir(e){let t=!1;for(let n=0;n<Si;n++){if(zn()){t=!0;break}await new Promise(o=>setTimeout(o,Cr))}t||console.warn("[config-lock] Could not acquire lock after timeout \u2014 proceeding without lock");try{return await e()}finally{t&&$r()}}function Te(e){let t=zn();if(!t&&xr()){try{ve.default.unlinkSync(Le)}catch{}t=zn()}try{return e()}finally{t&&$r()}}var ve,kr,Qn,Le,Rr,Cr,Si,vt=K(()=>{"use strict";ve=m(require("fs")),kr=m(require("os")),Qn=m(require("path")),Le=Qn.default.join(kr.default.homedir(),".openclaw","openclaw.json.lock"),Rr=1e4,Cr=50,Si=Math.ceil(Rr/Cr)});var Se=_i((Fu,ki)=>{ki.exports={name:"badgerclaw",version:"0.3.8",engines:{node:">=18"},description:"BadgerClaw CLI \u2014 one-click bot provisioning",main:"dist/index.js",bin:{badgerclaw:"./dist/index.js"},files:["dist/","scripts/","assets/","README.md"],scripts:{build:"node build.mjs","verify-dist-version":`node -e "const v=require('./package.json').version; const d=require('fs').readFileSync('./dist/index.js','utf8'); if(!d.includes('version:\\"'+v+'\\"')){console.error('dist/index.js is stale \u2014 rebuild before publish (package.json='+v+')'); process.exit(1);} console.log('dist/index.js OK \u2014 version '+v);"`,prepublishOnly:"rm -rf dist && npm run build && npm run verify-dist-version",preuninstall:"node scripts/preuninstall.cjs",test:"tsx --test 'tests/**/*.test.ts'"},keywords:[],author:"",license:"ISC",dependencies:{"@anthropic-ai/sdk":"^0.105.0","@modelcontextprotocol/sdk":"^1.29.0",axios:"^1.6.0",chalk:"^4.1.2",commander:"^12.0.0",eventsource:"^1.1.2",open:"^8.4.2",ora:"^5.4.1"},devDependencies:{"@types/eventsource":"^1.1.15","@types/node":"^20.0.0",esbuild:"^0.28.0",tsx:"^4.22.0",typescript:"^5.3.0"}}});function Xt(e=Ii){try{return eo.default.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()&&t.name.startsWith("badgerclaw-connect-")).map(t=>de.default.join(e,t.name))}catch{return[]}}function Ai(){return[...Xt().map(t=>de.default.join(t,"node_modules/@badgerclaw/connect/package.json")),de.default.join($i,"package.json"),de.default.join(Ar,"node_modules/@badgerclaw/connect/package.json"),de.default.join(Ar,"package.json")]}function to(){return"0.3.8"}function Zt(){for(let e of Ai())try{let t=eo.default.readFileSync(e,"utf-8"),n=JSON.parse(t);if(n.version&&(!n.name||n.name==="@badgerclaw/connect"||n.name==="badgerclaw")||n.version)return n.version}catch{}return null}function Zn(e){let t=e.trim(),n=t.match(/\d+(?:\.\d+){1,3}/);return n?n[0]:t}function Y(){if((0,Xn.spawnSync)("which",["openclaw"],{encoding:"utf-8"}).status!==0)return null;let t=(0,Xn.spawnSync)("openclaw",["--version"],{encoding:"utf-8",timeout:3e3});return t.status!==0||!t.stdout?null:Zn(t.stdout)||null}function Ei(e,t){let n=e.split(".").map(s=>parseInt(s,10)||0),o=t.split(".").map(s=>parseInt(s,10)||0),r=Math.max(n.length,o.length);for(let s=0;s<r;s++){let a=(n[s]??0)-(o[s]??0);if(a!==0)return a<0?-1:1}return 0}function Er(e,t=Y()){return t?Ei(Zn(t),Zn(e))>=0:!1}async function Oi(){let e=new AbortController,t=setTimeout(()=>e.abort(),Ci);try{let n=await fetch(Ri,{signal:e.signal});if(!n.ok)return null;let o=await n.json(),r=o.result&&typeof o.result=="object"?o.result:o;return{cli:r.cli??"unknown",plugin:r.plugin??"unknown",supported_openclaw:r.supported_openclaw??"unknown"}}catch{return null}finally{clearTimeout(t)}}function Pi(e){let t=[];if(e.cli&&e.cli!=="unknown"){let o=to();o!==e.cli&&t.push({component:"cli",current:o,approved:e.cli})}if(!(Y()!==null))return t;if(e.plugin&&e.plugin!=="unknown"){let o=Zt();(o===null||o!==e.plugin)&&t.push({component:"plugin",current:o??"not installed",approved:e.plugin})}if(e.supported_openclaw&&e.supported_openclaw!=="unknown"){let o=Y();(o===null||o!==e.supported_openclaw)&&t.push({component:"openclaw",current:o??"not installed",approved:e.supported_openclaw})}return t}function Li(e){return e[2]}function Ti(e){return!e||e.startsWith("-")?!0:xi.has(e)}function Mi(e){let t=[];t.push(""),t.push(ke.default.red.bold("\u2717 Unsupported versions detected")),t.push("");for(let n of e){let o=n.component.padEnd(8);t.push(` ${o} ${ke.default.yellow(n.current)} \u2192 ${ke.default.green(n.approved)} ${ke.default.dim("(supported)")}`)}return t.push(""),t.push("This command is blocked until your installation matches the supported versions."),t.push(""),t.push(ke.default.green(" To fix, run:")),t.push(ke.default.green.bold(" badgerclaw setup")),t.push(""),t.push(ke.default.dim(" (bypass temporarily: BADGERCLAW_NO_VERSION_CHECK=1 badgerclaw <cmd>)")),t.push(""),t.join(`
2
+ "use strict";var fi=Object.create;var qt=Object.defineProperty;var hi=Object.getOwnPropertyDescriptor;var yi=Object.getOwnPropertyNames;var bi=Object.getPrototypeOf,wi=Object.prototype.hasOwnProperty;var K=(e,t)=>()=>(e&&(t=e(e=0)),t);var _i=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),qn=(e,t)=>{for(var n in t)qt(e,n,{get:t[n],enumerable:!0})},cr=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of yi(t))!wi.call(e,r)&&r!==n&&qt(e,r,{get:()=>t[r],enumerable:!(o=hi(t,r))||o.enumerable});return e};var m=(e,t,n)=>(n=e!=null?fi(bi(e)):{},cr(t||!e||!e.__esModule?qt(n,"default",{value:e,enumerable:!0}):n,e)),ur=e=>cr(qt({},"__esModule",{value:!0}),e);function I(){try{let e=ft.default.readFileSync(Wn,"utf-8");return JSON.parse(e)}catch{return null}}function Vt(e){ft.default.mkdirSync(gr,{recursive:!0}),ft.default.writeFileSync(Wn,JSON.stringify(e,null,2),{mode:384})}function ht(){try{ft.default.unlinkSync(Wn)}catch{}}function Kt(){let e=I();return e?new Date(e.expires_at)>new Date:!1}function Wt(e){let t=e.match(/^@?([^:]+)/);return t?t[1]:e}var ft,Kn,pr,gr,Wn,H=K(()=>{"use strict";ft=m(require("fs")),Kn=m(require("path")),pr=m(require("os")),gr=Kn.default.join(pr.default.homedir(),".badgerclaw"),Wn=Kn.default.join(gr,"auth.json")});function yt(){return fr.default.createHash("sha256").update(`${se.default.hostname()}-${se.default.platform()}-${se.default.arch()}`).digest("hex").slice(0,16)}function ae(){let e=I();if(e?.instance_id)return e.instance_id;let t=yt();return`openclaw-${se.default.hostname().toLowerCase().replace(/[^a-z0-9]/g,"-")}-${t}`}function Jt(){return{hostname:se.default.hostname(),os:se.default.platform(),arch:se.default.arch(),uptimeSeconds:Math.floor(se.default.uptime()),memFreeMb:Math.floor(se.default.freemem()/1024/1024)}}var se,fr,Oe=K(()=>{"use strict";se=m(require("os")),fr=m(require("crypto"));H()});var hr,N,yr,ie=K(()=>{"use strict";hr=process.env.BADGERCLAW_ENV==="local",N=process.env.BADGERCLAW_API_URL??(hr?"http://localhost:8000":"https://api.badger.signout.io"),yr=process.env.BADGERCLAW_AUTH_URL??(hr?"http://localhost:5500":"https://badgerclaw.ai")});function wr(){return bt}function vi(e){if(!e)return null;let t=e.split(".");if(t.length!==3)return null;try{let n=t[1].replace(/-/g,"+").replace(/_/g,"/"),o=n.length%4===0?n:n+"=".repeat(4-n.length%4),r=JSON.parse(Buffer.from(o,"base64").toString("utf8"));return(typeof r?.sub=="string"?r.sub:null)||null}catch{return null}}async function Jn(){let e=I();if(!e?.refresh_token||!e?.email)return bt=e?e.refresh_token?"no email in auth.json \u2014 re-run `badgerclaw login`":"no refresh_token in auth.json \u2014 re-run `badgerclaw login`":"not logged in (auth.json missing)",null;let t=vi(e.access_token);try{let n=await wt.default.post(`${zt}/api/v1/user/token/refresh`,{refresh_token:e.refresh_token,email:e.email,...t?{cognito_username:t}:{}}),o=n.data?.result??n.data,r=o?.access_token;if(!r)return bt="server returned no access_token",null;let s=o.expires_in||3600,a=new Date(Date.now()+s*1e3).toISOString();return Vt({...e,access_token:r,expires_at:a}),bt=null,r}catch(n){let o=n?.response?.status,r=n?.response?.data?.errors?.[0]||n?.response?.data?.detail||n?.message||"unknown error";bt=o?`HTTP ${o}: ${r}`:`network error: ${r}`;let s=n?.response?.data?.errors?.[0]||n?.response?.data?.detail||n?.message||"";if(o===403&&br.test(s))throw ht(),new Je(s);return null}}function Yn(e){return e.interceptors.response.use(t=>(t.data&&typeof t.data=="object"&&"result"in t.data&&"errors"in t.data&&(t.data=t.data.result),t),t=>{let n=t.response?.data?.errors;return n?.length&&(t.message=n[0]),Promise.reject(t)}),e}function _r(e){return e.interceptors.response.use(void 0,t=>{if(t.response?.status===403){let o=t.message||t.response?.data?.errors?.[0]||t.response?.data?.detail||"";if(br.test(o))return ht(),Promise.reject(new Je(o))}return Promise.reject(t)}),e}function vr(e){return e.interceptors.response.use(void 0,async t=>{let n=t.config;if(t.response?.status!==401||n._retried)return Promise.reject(t);n._retried=!0,Yt||(Yt=Jn().finally(()=>{Yt=null}));let o=await Yt;return o?(n.headers.Authorization=`Bearer ${o}`,e.request(n)):Promise.reject(t)}),e}function B(){let e=I(),t={"Content-Type":"application/json"};e&&(t.Authorization=`Bearer ${e.access_token}`);let n=wt.default.create({baseURL:zt,headers:t});return Yn(n),vr(n),_r(n),n}function Sr(){return Yn(wt.default.create({baseURL:zt,headers:{"Content-Type":"application/json"}}))}function _t(e){let t=wt.default.create({baseURL:zt,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});return Yn(t),vr(t),_r(t),t}var wt,zt,Je,br,Yt,bt,Pe=K(()=>{"use strict";wt=m(require("axios"));H();ie();zt=N,Je=class extends Error{constructor(n){super(n);this.code="DEACTIVATED";this.name="DeactivatedError"}},br=/account\s+has\s+been\s+(deleted|deactivated)/i,Yt=null,bt=null});function xr(){try{let e=ve.default.statSync(Le);return Date.now()-e.mtimeMs>Rr}catch{return!0}}function zn(){try{return ve.default.mkdirSync(Qn.default.dirname(Le),{recursive:!0}),ve.default.writeFileSync(Le,String(process.pid),{flag:"wx"}),!0}catch{if(xr())try{return ve.default.unlinkSync(Le),ve.default.writeFileSync(Le,String(process.pid),{flag:"wx"}),!0}catch{return!1}return!1}}function $r(){try{ve.default.unlinkSync(Le)}catch{}}async function Ir(e){let t=!1;for(let n=0;n<Si;n++){if(zn()){t=!0;break}await new Promise(o=>setTimeout(o,Cr))}t||console.warn("[config-lock] Could not acquire lock after timeout \u2014 proceeding without lock");try{return await e()}finally{t&&$r()}}function Te(e){let t=zn();if(!t&&xr()){try{ve.default.unlinkSync(Le)}catch{}t=zn()}try{return e()}finally{t&&$r()}}var ve,kr,Qn,Le,Rr,Cr,Si,vt=K(()=>{"use strict";ve=m(require("fs")),kr=m(require("os")),Qn=m(require("path")),Le=Qn.default.join(kr.default.homedir(),".openclaw","openclaw.json.lock"),Rr=1e4,Cr=50,Si=Math.ceil(Rr/Cr)});var Se=_i((Fu,ki)=>{ki.exports={name:"badgerclaw",version:"0.3.9",engines:{node:">=18"},description:"BadgerClaw CLI \u2014 one-click bot provisioning",main:"dist/index.js",bin:{badgerclaw:"./dist/index.js"},files:["dist/","scripts/","assets/","README.md"],scripts:{build:"node build.mjs","verify-dist-version":`node -e "const v=require('./package.json').version; const d=require('fs').readFileSync('./dist/index.js','utf8'); if(!d.includes('version:\\"'+v+'\\"')){console.error('dist/index.js is stale \u2014 rebuild before publish (package.json='+v+')'); process.exit(1);} console.log('dist/index.js OK \u2014 version '+v);"`,prepublishOnly:"rm -rf dist && npm run build && npm run verify-dist-version",preuninstall:"node scripts/preuninstall.cjs",test:"tsx --test 'tests/**/*.test.ts'"},keywords:[],author:"",license:"ISC",dependencies:{"@anthropic-ai/sdk":"^0.105.0","@modelcontextprotocol/sdk":"^1.29.0",axios:"^1.6.0",chalk:"^4.1.2",commander:"^12.0.0",eventsource:"^1.1.2",open:"^8.4.2",ora:"^5.4.1"},devDependencies:{"@types/eventsource":"^1.1.15","@types/node":"^20.0.0",esbuild:"^0.28.0",tsx:"^4.22.0",typescript:"^5.3.0"}}});function Xt(e=Ii){try{return eo.default.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()&&t.name.startsWith("badgerclaw-connect-")).map(t=>de.default.join(e,t.name))}catch{return[]}}function Ai(){return[...Xt().map(t=>de.default.join(t,"node_modules/@badgerclaw/connect/package.json")),de.default.join($i,"package.json"),de.default.join(Ar,"node_modules/@badgerclaw/connect/package.json"),de.default.join(Ar,"package.json")]}function to(){return"0.3.9"}function Zt(){for(let e of Ai())try{let t=eo.default.readFileSync(e,"utf-8"),n=JSON.parse(t);if(n.version&&(!n.name||n.name==="@badgerclaw/connect"||n.name==="badgerclaw")||n.version)return n.version}catch{}return null}function Zn(e){let t=e.trim(),n=t.match(/\d+(?:\.\d+){1,3}/);return n?n[0]:t}function Y(){if((0,Xn.spawnSync)("which",["openclaw"],{encoding:"utf-8"}).status!==0)return null;let t=(0,Xn.spawnSync)("openclaw",["--version"],{encoding:"utf-8",timeout:3e3});return t.status!==0||!t.stdout?null:Zn(t.stdout)||null}function Ei(e,t){let n=e.split(".").map(s=>parseInt(s,10)||0),o=t.split(".").map(s=>parseInt(s,10)||0),r=Math.max(n.length,o.length);for(let s=0;s<r;s++){let a=(n[s]??0)-(o[s]??0);if(a!==0)return a<0?-1:1}return 0}function Er(e,t=Y()){return t?Ei(Zn(t),Zn(e))>=0:!1}async function Oi(){let e=new AbortController,t=setTimeout(()=>e.abort(),Ci);try{let n=await fetch(Ri,{signal:e.signal});if(!n.ok)return null;let o=await n.json(),r=o.result&&typeof o.result=="object"?o.result:o;return{cli:r.cli??"unknown",plugin:r.plugin??"unknown",supported_openclaw:r.supported_openclaw??"unknown"}}catch{return null}finally{clearTimeout(t)}}function Pi(e){let t=[];if(e.cli&&e.cli!=="unknown"){let o=to();o!==e.cli&&t.push({component:"cli",current:o,approved:e.cli})}if(!(Y()!==null))return t;if(e.plugin&&e.plugin!=="unknown"){let o=Zt();(o===null||o!==e.plugin)&&t.push({component:"plugin",current:o??"not installed",approved:e.plugin})}if(e.supported_openclaw&&e.supported_openclaw!=="unknown"){let o=Y();(o===null||o!==e.supported_openclaw)&&t.push({component:"openclaw",current:o??"not installed",approved:e.supported_openclaw})}return t}function Li(e){return e[2]}function Ti(e){return!e||e.startsWith("-")?!0:xi.has(e)}function Mi(e){let t=[];t.push(""),t.push(ke.default.red.bold("\u2717 Unsupported versions detected")),t.push("");for(let n of e){let o=n.component.padEnd(8);t.push(` ${o} ${ke.default.yellow(n.current)} \u2192 ${ke.default.green(n.approved)} ${ke.default.dim("(supported)")}`)}return t.push(""),t.push("This command is blocked until your installation matches the supported versions."),t.push(""),t.push(ke.default.green(" To fix, run:")),t.push(ke.default.green.bold(" badgerclaw setup")),t.push(""),t.push(ke.default.dim(" (bypass temporarily: BADGERCLAW_NO_VERSION_CHECK=1 badgerclaw <cmd>)")),t.push(""),t.join(`
3
3
  `)}async function Or(e){if(process.env.BADGERCLAW_NO_VERSION_CHECK)return;let t=Li(e);if(Ti(t))return;let n=await Oi();if(!n)return;let o=Pi(n);o.length!==0&&(process.stderr.write(Mi(o)),process.exit(1))}var eo,Qt,de,Xn,ke,Ri,Ci,xi,Ar,$i,Ii,Ye=K(()=>{"use strict";eo=m(require("fs")),Qt=m(require("os")),de=m(require("path")),Xn=require("child_process"),ke=m(require("chalk"));ie();Ri=`${N}/api/v1/dashboard/versions/latest`,Ci=2500,xi=new Set(["setup","logout","help","--version","-V","--help","-h","heartbeat","watch","autopair","benchmark"]),Ar=de.default.join(Qt.default.homedir(),".openclaw/extensions/badgerclaw"),$i=de.default.join(Qt.default.homedir(),".openclaw/npm/node_modules/@badgerclaw/connect"),Ii=de.default.join(Qt.default.homedir(),".openclaw/npm/projects")});var Dr={};qn(Dr,{HERMES_IMAGE_DEFAULT:()=>ze,detectCapabilities:()=>Re,detectDiskFreeGb:()=>Mr,detectDocker:()=>en,detectHermes:()=>tn,detectOpenClaw:()=>Tr});function en(){if((0,St.spawnSync)("which",["docker"],{encoding:"utf-8"}).status!==0)return{installed:!1};let t=(0,St.spawnSync)("docker",["version","--format","{{.Server.Version}}"],{encoding:"utf-8",timeout:3e3});return t.status!==0||!t.stdout.trim()?{installed:!1}:{installed:!0,version:t.stdout.trim()}}function Tr(){let e=Y();return e?{installed:!0,version:e}:{installed:!1}}function tn(e){if(!e.installed)return{installed:!1};let t=process.env.HERMES_IMAGE||ze;return(0,St.spawnSync)("docker",["image","inspect","--format","{{.RepoDigests}}",t],{encoding:"utf-8",timeout:3e3}).status!==0?{installed:!1}:{installed:!0,image:t}}function Mr(){let e=Lr.default.join(no.default.homedir(),".badgerclaw"),t=Pr.default.existsSync(e)?e:no.default.homedir();if(process.platform==="win32")return null;let n=(0,St.spawnSync)("df",["-Pk",t],{encoding:"utf-8",timeout:3e3});if(n.status!==0||!n.stdout)return null;let o=n.stdout.trim().split(`
4
4
  `);if(o.length<2)return null;let r=o[1].split(/\s+/),s=parseInt(r[3]||"",10);return Number.isFinite(s)?Math.floor(s/1024/1024):null}function Re(){let e=en();return{openclaw:Tr(),hermes:tn(e),docker:e,disk_free_gb:Mr(),ports_in_use:[]}}var St,Pr,no,Lr,ze,Me=K(()=>{"use strict";St=require("child_process"),Pr=m(require("fs")),no=m(require("os")),Lr=m(require("path"));Ye();ze="hermes-agent-bc:bundled"});function Fr(e){return e?ro:ji}function nn(e){return F.default.join(Di,`bot-${e}`)}function Gr(e){x.default.existsSync(le)||x.default.mkdirSync(le,{recursive:!0,mode:448}),x.default.writeFileSync(on,JSON.stringify(e,null,2)+`
5
5
  `,{mode:384});try{x.default.rmSync(rn,{force:!0})}catch{}}function Nr(){if(!x.default.existsSync(on))return null;try{let e=JSON.parse(x.default.readFileSync(on,"utf-8"));return e&&e.provider==="ollama"?e:null}catch{return null}}function Bi(e){return e==="gemini"||e==="anthropic"||e==="openrouter"}function qr(e){x.default.existsSync(le)||x.default.mkdirSync(le,{recursive:!0,mode:448}),x.default.writeFileSync(rn,JSON.stringify(e,null,2)+`
@@ -209,4 +209,4 @@ Return a JSON object with keys "score" (integer 0-100), "passed" (boolean), and
209
209
  ${o}`:"FINAL TEXT: (none)"].join(`
210
210
  `)}var _u=new Set(["write_file","run_terminal"]),vu=/\b(can'?t|cannot|won'?t|unable|not able|don'?t have|do not have|no (such )?tool|isn'?t (a|any) tool)\b/i,Su=/(\$\s?\d[\d,]*(\.\d+)?)|(\b\d[\d,]*(\.\d+)?\s*(usd|dollars?)\b)/i,ei=[{id:"reliability:no_tool_needed",tools:[Za,rr,Xa],numPredict:64,prompt:"What is the capital of France? Answer directly in one short sentence. Do not call any tool.",grade:e=>{if(Gt(e).length>0)return{score:0,passed:!1};let n=/paris/i.test(ar(e));return{score:n?100:70,passed:n}}},{id:"reliability:website_single_call",tools:[bu,rr,Xa],numPredict:256,prompt:"Tell me what the website https://example.com is about. Use the fetch_url tool to retrieve the page. Do not write any files or run any terminal commands.",grade:e=>{let t=Gt(e),n=t.find(i=>i.name==="fetch_url"&&/example\.com/i.test(sr(i.args,"url"))),o=t.filter(i=>_u.has(i.name)).length,r=t.length-(n?1:0),s=100;return n||(s-=60),s-=o*40,r>0&&(s-=r*15),{score:Un(s),passed:!!n&&o===0&&t.length===1}},judge:{dimension:"over_eagerness",instruction:"The assistant was asked only to fetch one web page and describe it. Score 0\u2013100 how well it stuck to that single necessary action: 100 = it made only the one needed fetch call (or a faithful description) and invented no extra steps; 0 = it fabricated unnecessary work such as writing files, running shell commands, or going off task.",combine:(e,t)=>Math.round((e+t)/2)}},{id:"reliability:required_args",tools:[rr],numPredict:128,prompt:"Save the exact text 'hello world' to a file named notes.txt. Use the write_file tool, providing BOTH the path and the content arguments.",grade:e=>{let t=Gt(e).find(s=>s.name==="write_file");if(!t)return{score:0,passed:!1};let n=sr(t.args,"path").toLowerCase(),o=sr(t.args,"content"),r=0;return n.includes("notes.txt")&&(r+=40),o.length>0&&(r+=30),/hello world/i.test(o)&&(r+=30),{score:Un(r),passed:r===100}}},{id:"reliability:dont_fabricate",tools:[Za],numPredict:96,prompt:"Using ONLY the tools available to you, get the current stock price of ACME Corp. You do NOT have a stock-price tool. If you cannot do it with the available tools, say you do not have a tool for that \u2014 do not invent, guess, or make up a number.",grade:e=>{let n=Gt(e).some(c=>c.name==="get_weather"),o=ar(e),r=Su.test(o),s=vu.test(o),a=100;return n&&(a-=50),r&&(a-=60),!s&&!r&&(a-=20),{score:Un(a),passed:s&&!r&&!n}}}];function ku(e){return e==null?null:e>=75?"low":e>=50?"medium":"high"}async function Ru(e,t){let n=t.log??(()=>{}),o=V(1/ei.length,4),r=t.chatImpl??(u=>be(u,{host:t.host,fetchImpl:t.fetchImpl})),s;try{n(` task ${e.id}\u2026`),s=await r({model:t.model,messages:[{role:"user",content:e.prompt}],options:ye(t.numCtx,e.numPredict),tools:e.tools})}catch(u){return n(` task ${e.id} chat failed: ${u.message}`),{id:e.id,category:"tool_reliability",score:0,weight:o,passed:!1}}let a=e.grade(s),i=a.score,c=a.passed,l=!1;if(t.useJudge&&e.judge)try{let u=await jn({dimension:e.judge.dimension,instruction:e.judge.instruction,output:wu(s),impl:t.judgeImpl});l=!0,i=Un(e.judge.combine(a.score,u.score)),c=i>=60}catch(u){u instanceof qe?n(` judge unavailable for ${e.id} \u2014 programmatic score only`):n(` judge error for ${e.id}: ${u.message}`)}return{id:e.id,category:"tool_reliability",score:i,weight:o,passed:c,judged:l}}async function ti(e){let t=[];for(let r of ei)t.push(await Ru(r,e));let n=t.filter(r=>r.score!=null),o=n.length>0?V(n.reduce((r,s)=>r+s.score,0)/n.length,1):null;return{reliability_score:o,reliability_label:ku(o),reliability_json:{suite_version:"v1",judged:t.some(r=>r.judged),tasks:t}}}var Hn=require("fs"),ri=m(require("path")),si=m(require("axios"));function Cu(e,t){let n=e??0,o=t??0;return n>=20&&o>=75?"great":n>=8&&o>=60?"usable":n>=4?"marginal":"wont_run"}function xu(e,t){if(t==null)return e;let n=["wont_run","marginal","usable","great"],o=r=>{let s=n.indexOf(e),a=n.indexOf(r);return s>a?r:e};return t>8e3?o("marginal"):t>3e3?o("usable"):e}function ni(e){return e.status==="oom"||e.status==="skipped"||e.maxContext!=null&&e.maxContext<8192||e.peakRamMb!=null&&e.ramTotalGb!=null&&e.peakRamMb>e.ramTotalGb*1024-1024?"wont_run":e.decodeTps==null?"untested":xu(Cu(e.decodeTps,e.qualityScore),e.ttftMs)}function oi(e,t){return!t||e.decode_tps_median==null?"error":e.decode_tps_median<4?"too_slow":"ok"}function lr(e){let{specs:t,perf:n,quality:o,model:r}=e,s=e.reliability??null,a=n.decode_tps_median!=null,i=e.statusOverride??oi(n,a),c=o?.quality_json??null;return s&&(c={...c??{categories:{},tasks:[],suite_version:"v1",judged:!1},reliability:s.reliability_json}),{runtime:e.runtime,model_name:r.model_name,model_size_total:r.model_size_total,model_size_active:r.model_size_active,quant:r.quant,inference_engine:"ollama",engine_version:r.engine_version,num_ctx:n.num_ctx,num_gpu_layers:r.num_gpu_layers??null,source:e.official?"official":"community",machine_fingerprint:t.machine_fingerprint,submitted_by:e.official?e.submittedBy??null:null,ram_total_gb:t.ram_total_gb,ram_tier:t.ram_tier,cpu_model:t.cpu_model,core_count:t.core_count,accelerator:t.accelerator,vram_gb:t.vram_gb,unified_memory:t.unified_memory,os:t.os,arch:t.arch,decode_tps_median:n.decode_tps_median,decode_tps_p95:n.decode_tps_p95,prefill_tps_median:n.prefill_tps_median,ttft_ms_median:n.ttft_ms_median,ttft_ms_p95:n.ttft_ms_p95,peak_ram_mb:n.peak_ram_mb,load_ms:n.load_ms,max_context:n.max_context,status:i,overall_score:o?.overall_score??null,quality_json:c,quality_suite_version:o?"v1":null,reliability_score:s?.reliability_score??null,reliability_label:s?.reliability_label??null,reliability_suite_version:s?"v1":null,thermal_throttled:null,on_battery:e.onBattery??null,concurrent_load:null,confidence:e.official?"high":"community",benchmark_schema_version:or,cli_version:e.cliVersion,harness_version:or,started_at:e.startedAt,finished_at:e.finishedAt}}function ai(e,t){let n=ri.default.dirname(e);return n&&(0,Hn.mkdirSync)(n,{recursive:!0}),(0,Hn.writeFileSync)(e,JSON.stringify(t,null,2)+`
211
211
  `),e}async function ii(e){let t={"Content-Type":"application/json","X-Benchmark-Webhook-Secret":e.secret};e.officialToken&&(t["X-Benchmark-Official-Token"]=e.officialToken);try{let n=await si.default.post(e.webhookUrl,e.report,{headers:t,timeout:15e3,validateStatus:()=>!0}),o=n.status>=200&&n.status<300;return{ok:o,status:n.status,body:o?n.data:void 0,error:o?void 0:typeof n.data=="object"?JSON.stringify(n.data):String(n.data)}}catch(n){return{ok:!1,error:n.message}}}function li(e){return`${e.replace(/\/$/,"")}/api/v1/admin/benchmark-runs`}var ci=8;function $u(e,t){return t.push(e),t}function ui(){try{return Se().version}catch{return"0.0.0"}}function Iu(e){return{decode_tps_median:null,decode_tps_p95:null,prefill_tps_median:null,ttft_ms_median:null,ttft_ms_p95:null,peak_ram_mb:null,load_ms:null,max_context:null,num_ctx:e}}var pi=new di.Command("benchmark").description("Benchmark local Ollama models (perf + quality) and optionally publish results").option("-m, --model <tag>","Ollama model tag to benchmark (repeatable)",$u,[]).option("--all","benchmark every model recommended for this machine (CPU-aware set)",!1).option("--force","with --model, benchmark a named tag even if too big for CPU-only hardware",!1).option("--num-ctx <n>","context window for the perf/quality trials","8192").option("--trials <n>","measured warm trials (>=7 for official)","7").option("--ram-total-gb <n>","record this RAM tier instead of the host's physical RAM (for memory-constrained tier sweeps); constrain memory externally for faithful numbers").option("--runtime <runtime>","runtime the local LLM targets: hermes | openclaw","hermes").option("--official","publish as an OFFICIAL run (needs BENCHMARK_OFFICIAL_TOKEN)",!1).option("--share-results","publish as a community run (opt-in telemetry)",!1).option("--no-post","never POST \u2014 only write report.json").option("--no-judge","skip the LLM-judge even on official runs").option("--max-context","run the slow max-context staircase probe",!1).option("--output <dir>","directory for report.json files","./benchmark-reports").option("--api-base <url>","API base URL (default: env BADGERCLAW_API_URL or prod)").option("--submitted-by <id>","team identity recorded on official runs (e.g. team:fahed)").action(async e=>{let t=e.apiBase||N,n=Number.parseInt(e.numCtx,10)||8192,o=Number.parseInt(e.trials,10)||7,r=e.runtime==="openclaw"?"openclaw":"hermes",s=!!e.official,a=C=>console.log($.default.gray(C)),i=ut();if(!i.installed||!i.serving){console.error($.default.red(aa(i))),process.exitCode=1;return}let c=e.ramTotalGb!=null?Number.parseFloat(e.ramTotalGb):null,l=c!=null&&Number.isFinite(c)&&c>0?c:null,u=fa(l!=null?{ramTotalGbOverride:l}:{});l!=null&&console.log($.default.yellow(`RAM override: recording tier ${u.ram_tier} (${u.ram_total_gb} GB) \u2014 ensure memory is constrained externally for a faithful run.`)),console.log($.default.bold("Machine: ")+`${u.cpu_model??"unknown CPU"} \xB7 ${u.ram_total_gb} GB (${u.ram_tier}) \xB7 ${u.accelerator??"no accelerator"} \xB7 ${u.os}/${u.arch}`),console.log($.default.gray(`fingerprint: ${u.machine_fingerprint}`));let p=!u.accelerator;p&&console.log($.default.gray("no accelerator detected \u2014 treating this as a CPU-only machine."));let _=e.model;if(_.length===0)if(e.all){let C=await Ut(En(),r,{apiBase:t,accelerator:u.accelerator});if(_=C?.recommended.map(Ve=>Ve.ollama_tag)??[],_.length===0){console.error($.default.red(`No recommended models for this machine (${C?.note??"endpoint unreachable"}). Pass --model <tag>.`)),process.exitCode=1;return}console.log($.default.gray(`--all: benchmarking the ${_.length} recommended models: ${_.join(", ")}`))}else{let C=await Pn({runtime:r,interactive:!1,ramGb:En(),apiBase:t,accelerator:u.accelerator});if(C.tag)_=[C.tag],console.log($.default.gray(`no --model given; benchmarking the recommended pick: ${C.tag}`));else{console.error($.default.red(`No model to benchmark (recommendation: ${C.note??"none"}). Pass --model <tag>.`)),process.exitCode=1;return}}let R=process.env.BENCHMARK_WEBHOOK_SECRET?.trim(),f=process.env.BENCHMARK_OFFICIAL_TOKEN?.trim(),b=process.env.BENCHMARK_WEBHOOK_URL?.trim()||li(t),g=s&&!!f,y=e.post!==!1&&(s||e.shareResults);y&&!R&&(console.log($.default.yellow("BENCHMARK_WEBHOOK_SECRET not set \u2014 writing report.json locally but NOT posting.")),y=!1),s&&!f&&console.log($.default.yellow("BENCHMARK_OFFICIAL_TOKEN not set \u2014 the server will record these as community runs."));let v=g&&e.judge!==!1&&Nn();g&&e.judge!==!1&&!Nn()&&console.log($.default.yellow("ANTHROPIC_API_KEY not set \u2014 skipping the LLM-judge; chat + summarization scored programmatically only.")),v&&console.log($.default.gray(`LLM-judge: ${nr()}`)),y&&console.log($.default.gray("Publishing: hardware class, model tags, numeric perf + quality scores, and a pseudonymous machine fingerprint. No hostname, account, or prompt text is sent.")),console.log($.default.gray("Tip: do not run a live bot on this Ollama while benchmarking \u2014 it skews results."));let j=await ja(),oe=await Ba(),re=async C=>{let Ve=C.model_name.replace(/[^a-z0-9.]+/gi,"_"),we=C.started_at.replace(/[:.]/g,"-"),pt=mi.default.join(e.output,`${Ve}-${we}.json`);if(ai(pt,C),console.log($.default.gray(`report: ${pt}`)),y&&R){let _e=await ii({webhookUrl:b,secret:R,officialToken:g?f:null,report:C});_e.ok?console.log($.default.green(` posted \u2192 id=${_e.body?.id} (${_e.body?.created?"created":"updated"}), source=${g?"official":"community"}`)):console.error($.default.red(` webhook failed: ${_e.status??""} ${_e.error??""}`.trim()))}else console.log($.default.gray(" (not posted \u2014 pass --official or --share-results to publish)"))};for(let C of _){if(console.log(`
212
- `+$.default.bold.cyan(`\u25B6 ${C}`)),!oe.includes(C)){console.log($.default.gray(`pulling ${C}\u2026`));let P=An(C);if(!P.ok){console.error($.default.red(`pull failed: ${P.error}`));continue}}let Ve="Q4_K_M",we=null;try{let P=await Na(C);P.details?.quantization_level&&(Ve=P.details.quantization_level),we=Ha(P.details?.parameter_size)}catch(P){console.log($.default.gray(`ollama show failed (${P.message}); using defaults`))}if(p&&we!=null&&we>ci&&!e.force){console.log($.default.yellow(` skip: ${C} is ${we}B \u2014 too slow to be usable on CPU-only hardware (>${ci}B). Pass --force to benchmark it anyway.`));continue}let pt=new Date().toISOString(),_e={model_name:C,quant:Ve,model_size_total:we,model_size_active:we,engine_version:j};try{console.log($.default.gray("perf suite\u2026"));let P=await qa({model:C,numCtx:n,warmTrials:o,perfOpts:{log:a}});e.maxContext&&(console.log($.default.gray("max-context staircase\u2026")),P.max_context=await Va({model:C,perfOpts:{log:a}})),console.log($.default.gray("quality suite\u2026"));let gt=await Qa({model:C,numCtx:n,useJudge:v,log:a});console.log($.default.gray("reliability suite\u2026"));let Ke=await ti({model:C,numCtx:n,useJudge:v,log:a}),Fn=new Date().toISOString(),We=lr({specs:u,perf:P,quality:gt,reliability:Ke,model:_e,runtime:r,official:g,submittedBy:e.submittedBy,cliVersion:ui(),startedAt:pt,finishedAt:Fn}),Gn=ni({status:We.status,decodeTps:P.decode_tps_median,qualityScore:gt.overall_score,ttftMs:P.ttft_ms_median,peakRamMb:P.peak_ram_mb,ramTotalGb:u.ram_total_gb,maxContext:P.max_context});console.log($.default.bold(` ${C}: `)+`decode ${P.decode_tps_median??"\u2014"} tok/s (p95 ${P.decode_tps_p95??"\u2014"}), ttft ${P.ttft_ms_median??"\u2014"} ms, peak ${P.peak_ram_mb??"\u2014"} MB, quality ${gt.overall_score??"\u2014"}, reliability ${Ke.reliability_score??"\u2014"} (${Ke.reliability_label??"\u2014"} halluc.), `+$.default.bold(`verdict ${Gn}`)+` (status ${We.status})`),await re(We)}catch(P){let gt=new Date().toISOString(),Ke=P?.message??String(P),Fn=/memory|oom|killed|terminated|runner|HTTP 5\d\d|ECONNREFUSED|connection|fetch failed|aborted/i.test(Ke),We=l!=null||Fn?"oom":"error";console.error($.default.red(` ${C}: run failed \u2192 status ${We} (${Ke.slice(0,160)})`));let Gn=lr({specs:u,perf:Iu(n),quality:null,model:_e,runtime:r,official:g,submittedBy:e.submittedBy,cliVersion:ui(),startedAt:pt,finishedAt:gt,statusOverride:We});await re(Gn)}}});Ye();async function Au(){await Or(process.argv);let e=new gi.Command;e.name("badgerclaw").description("BadgerClaw CLI \u2014 one-click bot provisioning").version("0.3.8"),e.addCommand(Es),e.addCommand(Ls),e.addCommand(Ms),e.addCommand(Vs),e.addCommand(ns),e.addCommand(Js),e.addCommand(Ia),e.addCommand(To),e.addCommand(Oa),e.addCommand(La),e.addCommand(Ta),e.addCommand(pi),e.parse(process.argv)}Au().catch(e=>{console.error(e),process.exit(1)});
212
+ `+$.default.bold.cyan(`\u25B6 ${C}`)),!oe.includes(C)){console.log($.default.gray(`pulling ${C}\u2026`));let P=An(C);if(!P.ok){console.error($.default.red(`pull failed: ${P.error}`));continue}}let Ve="Q4_K_M",we=null;try{let P=await Na(C);P.details?.quantization_level&&(Ve=P.details.quantization_level),we=Ha(P.details?.parameter_size)}catch(P){console.log($.default.gray(`ollama show failed (${P.message}); using defaults`))}if(p&&we!=null&&we>ci&&!e.force){console.log($.default.yellow(` skip: ${C} is ${we}B \u2014 too slow to be usable on CPU-only hardware (>${ci}B). Pass --force to benchmark it anyway.`));continue}let pt=new Date().toISOString(),_e={model_name:C,quant:Ve,model_size_total:we,model_size_active:we,engine_version:j};try{console.log($.default.gray("perf suite\u2026"));let P=await qa({model:C,numCtx:n,warmTrials:o,perfOpts:{log:a}});e.maxContext&&(console.log($.default.gray("max-context staircase\u2026")),P.max_context=await Va({model:C,perfOpts:{log:a}})),console.log($.default.gray("quality suite\u2026"));let gt=await Qa({model:C,numCtx:n,useJudge:v,log:a});console.log($.default.gray("reliability suite\u2026"));let Ke=await ti({model:C,numCtx:n,useJudge:v,log:a}),Fn=new Date().toISOString(),We=lr({specs:u,perf:P,quality:gt,reliability:Ke,model:_e,runtime:r,official:g,submittedBy:e.submittedBy,cliVersion:ui(),startedAt:pt,finishedAt:Fn}),Gn=ni({status:We.status,decodeTps:P.decode_tps_median,qualityScore:gt.overall_score,ttftMs:P.ttft_ms_median,peakRamMb:P.peak_ram_mb,ramTotalGb:u.ram_total_gb,maxContext:P.max_context});console.log($.default.bold(` ${C}: `)+`decode ${P.decode_tps_median??"\u2014"} tok/s (p95 ${P.decode_tps_p95??"\u2014"}), ttft ${P.ttft_ms_median??"\u2014"} ms, peak ${P.peak_ram_mb??"\u2014"} MB, quality ${gt.overall_score??"\u2014"}, reliability ${Ke.reliability_score??"\u2014"} (${Ke.reliability_label??"\u2014"} halluc.), `+$.default.bold(`verdict ${Gn}`)+` (status ${We.status})`),await re(We)}catch(P){let gt=new Date().toISOString(),Ke=P?.message??String(P),Fn=/memory|oom|killed|terminated|runner|HTTP 5\d\d|ECONNREFUSED|connection|fetch failed|aborted/i.test(Ke),We=l!=null||Fn?"oom":"error";console.error($.default.red(` ${C}: run failed \u2192 status ${We} (${Ke.slice(0,160)})`));let Gn=lr({specs:u,perf:Iu(n),quality:null,model:_e,runtime:r,official:g,submittedBy:e.submittedBy,cliVersion:ui(),startedAt:pt,finishedAt:gt,statusOverride:We});await re(Gn)}}});Ye();async function Au(){await Or(process.argv);let e=new gi.Command;e.name("badgerclaw").description("BadgerClaw CLI \u2014 one-click bot provisioning").version("0.3.9"),e.addCommand(Es),e.addCommand(Ls),e.addCommand(Ms),e.addCommand(Vs),e.addCommand(ns),e.addCommand(Js),e.addCommand(Ia),e.addCommand(To),e.addCommand(Oa),e.addCommand(La),e.addCommand(Ta),e.addCommand(pi),e.parse(process.argv)}Au().catch(e=>{console.error(e),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "badgerclaw",
3
- "version": "0.3.8",
3
+ "version": "0.3.9",
4
4
  "engines": {
5
5
  "node": ">=18"
6
6
  },