badgerclaw 0.3.6 → 0.3.7

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 +3 -3
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var si=Object.create;var qt=Object.defineProperty;var ai=Object.getOwnPropertyDescriptor;var ii=Object.getOwnPropertyNames;var li=Object.getPrototypeOf,ci=Object.prototype.hasOwnProperty;var V=(e,t)=>()=>(e&&(t=e(e=0)),t);var ui=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Bn=(e,t)=>{for(var n in t)qt(e,n,{get:t[n],enumerable:!0})},tr=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ii(t))!ci.call(e,r)&&r!==n&&qt(e,r,{get:()=>t[r],enumerable:!(o=ai(t,r))||o.enumerable});return e};var m=(e,t,n)=>(n=e!=null?si(li(e)):{},tr(t||!e||!e.__esModule?qt(n,"default",{value:e,enumerable:!0}):n,e)),nr=e=>tr(qt({},"__esModule",{value:!0}),e);function $(){try{let e=pt.default.readFileSync(Fn,"utf-8");return JSON.parse(e)}catch{return null}}function Vt(e){pt.default.mkdirSync(ar,{recursive:!0}),pt.default.writeFileSync(Fn,JSON.stringify(e,null,2),{mode:384})}function gt(){try{pt.default.unlinkSync(Fn)}catch{}}function Kt(){let e=$();return e?new Date(e.expires_at)>new Date:!1}function Wt(e){let t=e.match(/^@?([^:]+)/);return t?t[1]:e}var pt,Hn,sr,ar,Fn,H=V(()=>{"use strict";pt=m(require("fs")),Hn=m(require("path")),sr=m(require("os")),ar=Hn.default.join(sr.default.homedir(),".badgerclaw"),Fn=Hn.default.join(ar,"auth.json")});function ft(){return ir.default.createHash("sha256").update(`${se.default.hostname()}-${se.default.platform()}-${se.default.arch()}`).digest("hex").slice(0,16)}function ae(){let e=$();if(e?.instance_id)return e.instance_id;let t=ft();return`openclaw-${se.default.hostname().toLowerCase().replace(/[^a-z0-9]/g,"-")}-${t}`}function Yt(){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,ir,Ae=V(()=>{"use strict";se=m(require("os")),ir=m(require("crypto"));H()});var lr,N,cr,ie=V(()=>{"use strict";lr=process.env.BADGERCLAW_ENV==="local",N=process.env.BADGERCLAW_API_URL??(lr?"http://localhost:8000":"https://api.badger.signout.io"),cr=process.env.BADGERCLAW_AUTH_URL??(lr?"http://localhost:5500":"https://badgerclaw.ai")});function dr(){return ht}function di(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 Gn(){let e=$();if(!e?.refresh_token||!e?.email)return ht=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=di(e.access_token);try{let n=await yt.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 ht="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}),ht=null,r}catch(n){let o=n?.response?.status,r=n?.response?.data?.errors?.[0]||n?.response?.data?.detail||n?.message||"unknown error";ht=o?`HTTP ${o}: ${r}`:`network error: ${r}`;let s=n?.response?.data?.errors?.[0]||n?.response?.data?.detail||n?.message||"";if(o===403&&ur.test(s))throw gt(),new Ve(s);return null}}function qn(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 mr(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(ur.test(o))return gt(),Promise.reject(new Ve(o))}return Promise.reject(t)}),e}function pr(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,Jt||(Jt=Gn().finally(()=>{Jt=null}));let o=await Jt;return o?(n.headers.Authorization=`Bearer ${o}`,e.request(n)):Promise.reject(t)}),e}function B(){let e=$(),t={"Content-Type":"application/json"};e&&(t.Authorization=`Bearer ${e.access_token}`);let n=yt.default.create({baseURL:zt,headers:t});return qn(n),pr(n),mr(n),n}function gr(){return qn(yt.default.create({baseURL:zt,headers:{"Content-Type":"application/json"}}))}function bt(e){let t=yt.default.create({baseURL:zt,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});return qn(t),pr(t),mr(t),t}var yt,zt,Ve,ur,Jt,ht,Ee=V(()=>{"use strict";yt=m(require("axios"));H();ie();zt=N,Ve=class extends Error{constructor(n){super(n);this.code="DEACTIVATED";this.name="DeactivatedError"}},ur=/account\s+has\s+been\s+(deleted|deactivated)/i,Jt=null,ht=null});function br(){try{let e=we.default.statSync(Pe);return Date.now()-e.mtimeMs>hr}catch{return!0}}function Vn(){try{return we.default.mkdirSync(Kn.default.dirname(Pe),{recursive:!0}),we.default.writeFileSync(Pe,String(process.pid),{flag:"wx"}),!0}catch{if(br())try{return we.default.unlinkSync(Pe),we.default.writeFileSync(Pe,String(process.pid),{flag:"wx"}),!0}catch{return!1}return!1}}function wr(){try{we.default.unlinkSync(Pe)}catch{}}async function _r(e){let t=!1;for(let n=0;n<mi;n++){if(Vn()){t=!0;break}await new Promise(o=>setTimeout(o,yr))}t||console.warn("[config-lock] Could not acquire lock after timeout \u2014 proceeding without lock");try{return await e()}finally{t&&wr()}}function Oe(e){let t=Vn();if(!t&&br()){try{we.default.unlinkSync(Pe)}catch{}t=Vn()}try{return e()}finally{t&&wr()}}var we,fr,Kn,Pe,hr,yr,mi,wt=V(()=>{"use strict";we=m(require("fs")),fr=m(require("os")),Kn=m(require("path")),Pe=Kn.default.join(fr.default.homedir(),".openclaw","openclaw.json.lock"),hr=1e4,yr=50,mi=Math.ceil(hr/yr)});var _e=ui((Cu,pi)=>{pi.exports={name:"badgerclaw",version:"0.3.6",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=bi){try{return Jn.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 wi(){return[...Xt().map(t=>de.default.join(t,"node_modules/@badgerclaw/connect/package.json")),de.default.join(yi,"package.json"),de.default.join(vr,"node_modules/@badgerclaw/connect/package.json"),de.default.join(vr,"package.json")]}function zn(){return"0.3.6"}function Zt(){for(let e of wi())try{let t=Jn.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 Yn(e){let t=e.trim(),n=t.match(/\d+(?:\.\d+){1,3}/);return n?n[0]:t}function Y(){if((0,Wn.spawnSync)("which",["openclaw"],{encoding:"utf-8"}).status!==0)return null;let t=(0,Wn.spawnSync)("openclaw",["--version"],{encoding:"utf-8",timeout:3e3});return t.status!==0||!t.stdout?null:Yn(t.stdout)||null}function _i(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 kr(e,t=Y()){return t?_i(Yn(t),Yn(e))>=0:!1}async function vi(){let e=new AbortController,t=setTimeout(()=>e.abort(),fi);try{let n=await fetch(gi,{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 ki(e){let t=[];if(e.cli&&e.cli!=="unknown"){let o=zn();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 Si(e){return e[2]}function Ri(e){return!e||e.startsWith("-")?!0:hi.has(e)}function Ci(e){let t=[];t.push(""),t.push(ve.default.red.bold("\u2717 Unsupported versions detected")),t.push("");for(let n of e){let o=n.component.padEnd(8);t.push(` ${o} ${ve.default.yellow(n.current)} \u2192 ${ve.default.green(n.approved)} ${ve.default.dim("(supported)")}`)}return t.push(""),t.push("This command is blocked until your installation matches the supported versions."),t.push(""),t.push(ve.default.green(" To fix, run:")),t.push(ve.default.green.bold(" badgerclaw setup")),t.push(""),t.push(ve.default.dim(" (bypass temporarily: BADGERCLAW_NO_VERSION_CHECK=1 badgerclaw <cmd>)")),t.push(""),t.join(`
2
+ "use strict";var si=Object.create;var qt=Object.defineProperty;var ai=Object.getOwnPropertyDescriptor;var ii=Object.getOwnPropertyNames;var li=Object.getPrototypeOf,ci=Object.prototype.hasOwnProperty;var V=(e,t)=>()=>(e&&(t=e(e=0)),t);var ui=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Bn=(e,t)=>{for(var n in t)qt(e,n,{get:t[n],enumerable:!0})},tr=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ii(t))!ci.call(e,r)&&r!==n&&qt(e,r,{get:()=>t[r],enumerable:!(o=ai(t,r))||o.enumerable});return e};var m=(e,t,n)=>(n=e!=null?si(li(e)):{},tr(t||!e||!e.__esModule?qt(n,"default",{value:e,enumerable:!0}):n,e)),nr=e=>tr(qt({},"__esModule",{value:!0}),e);function $(){try{let e=pt.default.readFileSync(Fn,"utf-8");return JSON.parse(e)}catch{return null}}function Vt(e){pt.default.mkdirSync(ar,{recursive:!0}),pt.default.writeFileSync(Fn,JSON.stringify(e,null,2),{mode:384})}function gt(){try{pt.default.unlinkSync(Fn)}catch{}}function Kt(){let e=$();return e?new Date(e.expires_at)>new Date:!1}function Wt(e){let t=e.match(/^@?([^:]+)/);return t?t[1]:e}var pt,Hn,sr,ar,Fn,H=V(()=>{"use strict";pt=m(require("fs")),Hn=m(require("path")),sr=m(require("os")),ar=Hn.default.join(sr.default.homedir(),".badgerclaw"),Fn=Hn.default.join(ar,"auth.json")});function ft(){return ir.default.createHash("sha256").update(`${se.default.hostname()}-${se.default.platform()}-${se.default.arch()}`).digest("hex").slice(0,16)}function ae(){let e=$();if(e?.instance_id)return e.instance_id;let t=ft();return`openclaw-${se.default.hostname().toLowerCase().replace(/[^a-z0-9]/g,"-")}-${t}`}function Yt(){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,ir,Ae=V(()=>{"use strict";se=m(require("os")),ir=m(require("crypto"));H()});var lr,N,cr,ie=V(()=>{"use strict";lr=process.env.BADGERCLAW_ENV==="local",N=process.env.BADGERCLAW_API_URL??(lr?"http://localhost:8000":"https://api.badger.signout.io"),cr=process.env.BADGERCLAW_AUTH_URL??(lr?"http://localhost:5500":"https://badgerclaw.ai")});function dr(){return ht}function di(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 Gn(){let e=$();if(!e?.refresh_token||!e?.email)return ht=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=di(e.access_token);try{let n=await yt.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 ht="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}),ht=null,r}catch(n){let o=n?.response?.status,r=n?.response?.data?.errors?.[0]||n?.response?.data?.detail||n?.message||"unknown error";ht=o?`HTTP ${o}: ${r}`:`network error: ${r}`;let s=n?.response?.data?.errors?.[0]||n?.response?.data?.detail||n?.message||"";if(o===403&&ur.test(s))throw gt(),new Ve(s);return null}}function qn(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 mr(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(ur.test(o))return gt(),Promise.reject(new Ve(o))}return Promise.reject(t)}),e}function pr(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,Jt||(Jt=Gn().finally(()=>{Jt=null}));let o=await Jt;return o?(n.headers.Authorization=`Bearer ${o}`,e.request(n)):Promise.reject(t)}),e}function B(){let e=$(),t={"Content-Type":"application/json"};e&&(t.Authorization=`Bearer ${e.access_token}`);let n=yt.default.create({baseURL:zt,headers:t});return qn(n),pr(n),mr(n),n}function gr(){return qn(yt.default.create({baseURL:zt,headers:{"Content-Type":"application/json"}}))}function bt(e){let t=yt.default.create({baseURL:zt,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});return qn(t),pr(t),mr(t),t}var yt,zt,Ve,ur,Jt,ht,Ee=V(()=>{"use strict";yt=m(require("axios"));H();ie();zt=N,Ve=class extends Error{constructor(n){super(n);this.code="DEACTIVATED";this.name="DeactivatedError"}},ur=/account\s+has\s+been\s+(deleted|deactivated)/i,Jt=null,ht=null});function br(){try{let e=we.default.statSync(Pe);return Date.now()-e.mtimeMs>hr}catch{return!0}}function Vn(){try{return we.default.mkdirSync(Kn.default.dirname(Pe),{recursive:!0}),we.default.writeFileSync(Pe,String(process.pid),{flag:"wx"}),!0}catch{if(br())try{return we.default.unlinkSync(Pe),we.default.writeFileSync(Pe,String(process.pid),{flag:"wx"}),!0}catch{return!1}return!1}}function wr(){try{we.default.unlinkSync(Pe)}catch{}}async function _r(e){let t=!1;for(let n=0;n<mi;n++){if(Vn()){t=!0;break}await new Promise(o=>setTimeout(o,yr))}t||console.warn("[config-lock] Could not acquire lock after timeout \u2014 proceeding without lock");try{return await e()}finally{t&&wr()}}function Oe(e){let t=Vn();if(!t&&br()){try{we.default.unlinkSync(Pe)}catch{}t=Vn()}try{return e()}finally{t&&wr()}}var we,fr,Kn,Pe,hr,yr,mi,wt=V(()=>{"use strict";we=m(require("fs")),fr=m(require("os")),Kn=m(require("path")),Pe=Kn.default.join(fr.default.homedir(),".openclaw","openclaw.json.lock"),hr=1e4,yr=50,mi=Math.ceil(hr/yr)});var _e=ui((Cu,pi)=>{pi.exports={name:"badgerclaw",version:"0.3.7",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=bi){try{return Jn.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 wi(){return[...Xt().map(t=>de.default.join(t,"node_modules/@badgerclaw/connect/package.json")),de.default.join(yi,"package.json"),de.default.join(vr,"node_modules/@badgerclaw/connect/package.json"),de.default.join(vr,"package.json")]}function zn(){return"0.3.7"}function Zt(){for(let e of wi())try{let t=Jn.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 Yn(e){let t=e.trim(),n=t.match(/\d+(?:\.\d+){1,3}/);return n?n[0]:t}function Y(){if((0,Wn.spawnSync)("which",["openclaw"],{encoding:"utf-8"}).status!==0)return null;let t=(0,Wn.spawnSync)("openclaw",["--version"],{encoding:"utf-8",timeout:3e3});return t.status!==0||!t.stdout?null:Yn(t.stdout)||null}function _i(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 kr(e,t=Y()){return t?_i(Yn(t),Yn(e))>=0:!1}async function vi(){let e=new AbortController,t=setTimeout(()=>e.abort(),fi);try{let n=await fetch(gi,{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 ki(e){let t=[];if(e.cli&&e.cli!=="unknown"){let o=zn();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 Si(e){return e[2]}function Ri(e){return!e||e.startsWith("-")?!0:hi.has(e)}function Ci(e){let t=[];t.push(""),t.push(ve.default.red.bold("\u2717 Unsupported versions detected")),t.push("");for(let n of e){let o=n.component.padEnd(8);t.push(` ${o} ${ve.default.yellow(n.current)} \u2192 ${ve.default.green(n.approved)} ${ve.default.dim("(supported)")}`)}return t.push(""),t.push("This command is blocked until your installation matches the supported versions."),t.push(""),t.push(ve.default.green(" To fix, run:")),t.push(ve.default.green.bold(" badgerclaw setup")),t.push(""),t.push(ve.default.dim(" (bypass temporarily: BADGERCLAW_NO_VERSION_CHECK=1 badgerclaw <cmd>)")),t.push(""),t.join(`
3
3
  `)}async function Sr(e){if(process.env.BADGERCLAW_NO_VERSION_CHECK)return;let t=Si(e);if(Ri(t))return;let n=await vi();if(!n)return;let o=ki(n);o.length!==0&&(process.stderr.write(Ci(o)),process.exit(1))}var Jn,Qt,de,Wn,ve,gi,fi,hi,vr,yi,bi,Ke=V(()=>{"use strict";Jn=m(require("fs")),Qt=m(require("os")),de=m(require("path")),Wn=require("child_process"),ve=m(require("chalk"));ie();gi=`${N}/api/v1/dashboard/versions/latest`,fi=2500,hi=new Set(["setup","logout","help","--version","-V","--help","-h","heartbeat","watch","autopair","benchmark"]),vr=de.default.join(Qt.default.homedir(),".openclaw/extensions/badgerclaw"),yi=de.default.join(Qt.default.homedir(),".openclaw/npm/node_modules/@badgerclaw/connect"),bi=de.default.join(Qt.default.homedir(),".openclaw/npm/projects")});var Ir={};Bn(Ir,{HERMES_IMAGE_DEFAULT:()=>We,detectCapabilities:()=>ke,detectDiskFreeGb:()=>$r,detectDocker:()=>en,detectHermes:()=>tn,detectOpenClaw:()=>xr});function en(){if((0,_t.spawnSync)("which",["docker"],{encoding:"utf-8"}).status!==0)return{installed:!1};let t=(0,_t.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 xr(){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||We;return(0,_t.spawnSync)("docker",["image","inspect","--format","{{.RepoDigests}}",t],{encoding:"utf-8",timeout:3e3}).status!==0?{installed:!1}:{installed:!0,image:t}}function $r(){let e=Cr.default.join(Qn.default.homedir(),".badgerclaw"),t=Rr.default.existsSync(e)?e:Qn.default.homedir();if(process.platform==="win32")return null;let n=(0,_t.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 ke(){let e=en();return{openclaw:xr(),hermes:tn(e),docker:e,disk_free_gb:$r(),ports_in_use:[]}}var _t,Rr,Qn,Cr,We,Le=V(()=>{"use strict";_t=require("child_process"),Rr=m(require("fs")),Qn=m(require("os")),Cr=m(require("path"));Ke();We="hermes-agent-bc:bundled"});function Tr(e){return e?Zn:Ii}function nn(e){return F.default.join(xi,`bot-${e}`)}function Mr(e){C.default.existsSync(le)||C.default.mkdirSync(le,{recursive:!0,mode:448}),C.default.writeFileSync(on,JSON.stringify(e,null,2)+`
5
5
  `,{mode:384});try{C.default.rmSync(rn,{force:!0})}catch{}}function Ar(){if(!C.default.existsSync(on))return null;try{let e=JSON.parse(C.default.readFileSync(on,"utf-8"));return e&&e.provider==="ollama"?e:null}catch{return null}}function Ai(e){return e==="gemini"||e==="anthropic"||e==="openrouter"}function Dr(e){C.default.existsSync(le)||C.default.mkdirSync(le,{recursive:!0,mode:448}),C.default.writeFileSync(rn,JSON.stringify(e,null,2)+`
6
6
  `,{mode:384});try{C.default.rmSync(on,{force:!0})}catch{}}function Ei(){if(!C.default.existsSync(rn))return null;try{let e=JSON.parse(C.default.readFileSync(rn,"utf-8"));return e&&Ai(e.provider)&&typeof e.apiKey=="string"&&e.apiKey?{provider:e.provider,apiKey:e.apiKey,model:e.model||void 0}:null}catch{return null}}function eo(e){return`badgerclaw-hermes-bot-${e}`}function me(){if(!C.default.existsSync(Xn))return{hermes_bots:{}};try{let e=C.default.readFileSync(Xn,"utf-8"),t=JSON.parse(e);return{hermes_bots:t.hermes_bots&&typeof t.hermes_bots=="object"?t.hermes_bots:{}}}catch{return{hermes_bots:{}}}}function Nr(e){C.default.existsSync(le)||C.default.mkdirSync(le,{recursive:!0,mode:448}),C.default.writeFileSync(Xn,JSON.stringify(e,null,2)+`
7
7
  `,{mode:384})}function Pi(e,t=$i){let n=new Set(Object.values(e.hermes_bots).map(r=>r.port)),o=t;for(;n.has(o)||!Oi(o);)if(o+=1,o-t>1e3)throw new Error(`Could not find a free port near ${t} after 1000 tries \u2014 host is unusually busy`);return o}function Oi(e){let t=Or.default.createServer(),n=!1;try{t.listen(e,"127.0.0.1"),n=!0}catch{n=!1}finally{try{t.close()}catch{}}return n}function Ye(e=process.env){let t=e.BADGERCLAW_LLM_PROVIDER?.toLowerCase(),n=e.BADGERCLAW_LLM_API_KEY;if(t==="ollama"){let a=Ar();return{provider:"ollama",apiKey:"",baseUrl:e.BADGERCLAW_LLM_BASE_URL||a?.base_url||void 0,model:e.BADGERCLAW_LLM_MODEL||a?.model||void 0}}if(t&&n){if(t!=="gemini"&&t!=="anthropic"&&t!=="openrouter")throw new Error(`BADGERCLAW_LLM_PROVIDER must be one of: gemini, anthropic, openrouter, ollama. Got '${t}'.`);return{provider:t,apiKey:n}}let o=Ar();if(o)return{provider:"ollama",apiKey:"",baseUrl:o.base_url||void 0,model:o.model||void 0};let r=Ei();if(r)return{provider:r.provider,apiKey:r.apiKey,model:r.model||void 0};let s=e.GOOGLE_API_KEY||e.GEMINI_API_KEY;if(s)return{provider:"gemini",apiKey:s};if(e.ANTHROPIC_API_KEY)return{provider:"anthropic",apiKey:e.ANTHROPIC_API_KEY};if(e.OPENROUTER_API_KEY)return{provider:"openrouter",apiKey:e.OPENROUTER_API_KEY}}function kt(e){switch(e){case"gemini":return"gemini-2.5-flash";case"anthropic":return"claude-sonnet-4-6";case"openrouter":return"anthropic/claude-sonnet-4-6";case"ollama":return"qwen2.5:3b"}}function Li(e){switch(e){case"gemini":return"GOOGLE_API_KEY";case"anthropic":return"ANTHROPIC_API_KEY";case"openrouter":return"OPENROUTER_API_KEY";case"ollama":return"OPENAI_API_KEY"}}function Ti(e,t){let n=[`# Generated by badgerclaw CLI for bot ${e.botId}.`,"# Edit at your own risk; subsequent pair operations may overwrite.","",`MATRIX_HOMESERVER=${e.matrixHomeserver}`,`MATRIX_ACCESS_TOKEN=${e.matrixAccessToken}`,`MATRIX_USER_ID=${e.matrixUserId}`,`MATRIX_DEVICE_ID=${e.matrixDeviceId}`,"MATRIX_ENCRYPTION=true",`MATRIX_ALLOWED_USERS=${e.ownerMatrixUserId}`];return e.homeRoomId&&n.push(`MATRIX_HOME_ROOM=${e.homeRoomId}`),e.llm&&(n.push(""),e.llm.provider==="ollama"?(n.push("# Local Ollama (OpenAI-compatible) \u2014 no real API key needed."),n.push(`OPENAI_BASE_URL=${e.llm.baseUrl||Zn}`),n.push("OPENAI_API_KEY=ollama")):(n.push("# LLM provider \u2014 set by the operator's environment at pair time."),n.push("# Hermes reads this directly; model selection lives in config.yaml."),n.push(`${Li(e.llm.provider)}=${e.llm.apiKey}`))),n.push("","# OpenAI-compatible API surface \u2014 localhost only by default so the","# CLI's daemon can health-check the container without exposing it","# beyond the host loopback.","API_SERVER_ENABLED=true","API_SERVER_HOST=127.0.0.1",`API_SERVER_PORT=${t}`,`API_SERVER_KEY=${(0,Pr.randomBytes)(24).toString("hex")}`),n.join(`
8
8
  `)+`
9
- `}function Mi(e){let t=[`# Hermes agent config for BadgerClaw bot ${e.botId}.`,"# Generated by badgerclaw CLI; secrets live in the sibling .env file.",""];if(e.llm){let n=e.llm.model||kt(e.llm.provider);t.push("model:",` default: ${n}`,` provider: ${e.llm.provider}`),e.llm.provider==="ollama"&&t.push(` base_url: ${e.llm.baseUrl||Zn}`," ollama_num_ctx: 65536"),t.push("")}return t.push("agent:",` name: ${e.botName||"BadgerClaw bot"}`,"terminal:"," backend: local","subagents:"," max_spawn_depth: 1","cron:"," enabled: false",""),t.join(`
9
+ `}function Mi(e){let t=[`# Hermes agent config for BadgerClaw bot ${e.botId}.`,"# Generated by badgerclaw CLI; secrets live in the sibling .env file.",""],n=e.llm?.provider==="ollama";if(e.llm){let o=e.llm.model||kt(e.llm.provider);t.push("model:",` default: ${o}`,` provider: ${e.llm.provider}`),n&&t.push(` base_url: ${e.llm.baseUrl||Zn}`," ollama_num_ctx: 65536"),t.push("")}return t.push("agent:",` name: ${e.botName||"BadgerClaw bot"}`),n&&t.push(" reasoning_effort: none"),t.push("terminal:"," backend: local","subagents:"," max_spawn_depth: 1","cron:"," enabled: false",""),t.join(`
10
10
  `)}function Di(e){return[`# ${e.botName||"BadgerClaw bot"}`,"","You are a helpful assistant connected to the BadgerClaw platform via Matrix.","Respond concisely. Honour @mentions. Decline to act on rooms you weren't added to.",""].join(`
11
11
  `)}function jr(e,t){let n=nn(e.botId);C.default.mkdirSync(n,{recursive:!0,mode:448});let o=F.default.join(n,".env"),r=F.default.join(n,"config.yaml"),s=F.default.join(n,"SOUL.md");return C.default.writeFileSync(o,Ti(e,t),{mode:384}),C.default.writeFileSync(r,Mi(e),{mode:384}),C.default.existsSync(s)||C.default.writeFileSync(s,Di(e),{mode:384}),{dataDir:n,envPath:o,configPath:r,soulPath:s}}function St(e){let t=e.run(["network","inspect","bridge","--format","{{range .IPAM.Config}}{{.Subnet}} {{end}}"]);return t.status===0&&!!(t.stdout||"").trim()}function sn(e={}){let t=e.env??process.env;if(t.BADGERCLAW_HERMES_NETWORK==="host")return!0;if(t.BADGERCLAW_HERMES_NETWORK==="bridge")return!1;let n=e.platform??process.platform;return e.localOllama&&n==="linux"?!0:!(e.bridgeUsable??(()=>St(vt)))()}function Br(e){return!!e&&e.provider==="ollama"&&!e.baseUrl}function Ur(e){let t=process.getuid?.()??0,n=process.getgid?.()??0,o=["run","-d","--name",e.containerName,"--restart","unless-stopped","-v",`${e.dataDir}:/opt/data`];return e.hostNetwork??process.env.BADGERCLAW_HERMES_NETWORK==="host"?o.push("--network","host"):o.push("-p",`127.0.0.1:${e.port}:${e.port}`),e.addHostGateway&&o.push("--add-host","host.docker.internal:host-gateway"),t>0&&o.push("-e",`HERMES_UID=${t}`),n>0&&o.push("-e",`HERMES_GID=${n}`),o.push("--env-file",`${e.dataDir}/.env`,e.image,"gateway","run"),o}function Hr(e,t={}){let n=t.docker??vt,o=e.image||process.env.HERMES_IMAGE||We;e.llm||console.warn(`[hermes] no LLM provider configured for bot ${e.botId}. Set BADGERCLAW_LLM_PROVIDER + BADGERCLAW_LLM_API_KEY (or one of GOOGLE_API_KEY / ANTHROPIC_API_KEY / OPENROUTER_API_KEY) and re-pair, or the bot will join rooms but be unable to reply.`);let r=me(),s=r.hermes_bots[e.botId],a=s?.port??Pi(r,t.portBase),i=s?.container_name??eo(e.botId),c=Br(e.llm),l=t.skipDocker?!1:sn({bridgeUsable:()=>St(n),localOllama:c});if(e.llm&&e.llm.provider==="ollama"&&!e.llm.baseUrl&&(e={...e,llm:{...e.llm,baseUrl:Tr(l)}}),jr(e,a),!t.skipDocker){n.run(["rm","-f",i]);let p=(e.llm?.baseUrl??"").includes("host.docker.internal"),_=Ur({containerName:i,dataDir:nn(e.botId),port:a,image:o,hostNetwork:l,addHostGateway:p}),R=n.run(_);if(R.status!==0)throw new Error(`docker run failed (exit ${R.status}): ${R.stderr||R.stdout}`)}let u={bot_id:e.botId,runtime:"hermes",container_name:i,port:a,data_dir:nn(e.botId),image:o,started_at:new Date().toISOString()};return r.hermes_bots[e.botId]=u,Nr(r),u}function Ni(e){let t={};for(let n of e.split(`
12
12
  `)){let o=n.trim();if(!o||o.startsWith("#"))continue;let r=o.indexOf("=");r<=0||(t[o.slice(0,r).trim()]=o.slice(r+1))}return t}function ji(e,t,n,o,r){let s=t.MATRIX_HOMESERVER,a=t.MATRIX_ACCESS_TOKEN,i=t.MATRIX_USER_ID,c=t.MATRIX_DEVICE_ID,l=t.MATRIX_ALLOWED_USERS;if(!s||!a||!i||!c||!l)return null;let u=l.trim(),p=n&&n.match(/^\s*name:\s*(.+)$/m)?.[1]?.trim()||void 0;return{botId:e,matrixHomeserver:s,matrixAccessToken:a,matrixUserId:i,matrixDeviceId:c,ownerMatrixUserId:u,homeRoomId:t.MATRIX_HOME_ROOM||void 0,image:o,botName:p,llm:r}}function Bi(e,t,n={}){let o=n.docker??vt,r=me(),s=r.hermes_bots[e];if(!s)return{bot_id:e,rerendered:!1,restarted:!1,skipped:"not in state.json"};if(!t)return{bot_id:e,rerendered:!1,restarted:!1,skipped:"no LLM configured"};let a=F.default.join(s.data_dir,".env");if(!C.default.existsSync(a))return{bot_id:e,rerendered:!1,restarted:!1,skipped:"no .env on disk"};let i=Ni(C.default.readFileSync(a,"utf-8")),c=F.default.join(s.data_dir,"config.yaml"),l=C.default.existsSync(c)?C.default.readFileSync(c,"utf-8"):null,u=ji(e,i,l,s.image,t);if(!u)return{bot_id:e,rerendered:!1,restarted:!1,skipped:"incomplete Matrix credentials in .env"};if(!n.skipDocker){let b=o.run(["inspect","--format","{{.State.Status}}",s.container_name]),g=b.status===0?b.stdout.trim():"missing";if(g==="exited"||g==="dead"||g==="created"||g==="paused")return{bot_id:e,rerendered:!1,restarted:!1,skipped:`container ${g} \u2014 left as-is (start it, then re-provision to apply)`}}let p=Br(u.llm),_=n.skipDocker?!1:sn({bridgeUsable:()=>St(o),localOllama:p});u.llm&&u.llm.provider==="ollama"&&!u.llm.baseUrl&&(u={...u,llm:{...u.llm,baseUrl:Tr(_)}});let R=i.MATRIX_RECOVERY_KEY;if(!R&&!n.skipDocker){let b=o.run(["logs",s.container_name]);R=Gr(`${b.stdout}
@@ -205,4 +205,4 @@ ${e.output}`,`
205
205
  Return a JSON object with keys "score" (integer 0-100), "passed" (boolean), and "reason" (one short sentence). Output only the JSON.`].filter(Boolean),r=(await t.messages.create({model:Qo(),max_tokens:1024,messages:[{role:"user",content:n.join(`
206
206
  `)}],output_config:{effort:"low",format:{type:"json_schema",schema:ou}}})).content.find(s=>s.type==="text");if(!r?.text)throw new Error("judge returned no text block");return su(r.text)}var Xo="badgerclaw.benchmark.v1";function au(){let e={tool_call:0,instruction:0,coding:0,summarization:0,chat:0};for(let t of Jo)e[t.category]++;return e}async function iu(e,t,n){let o=t.log??(()=>{}),r=t.chatImpl??(u=>Ge(u,{host:t.host,fetchImpl:t.fetchImpl})),s;try{o(` task ${e.id}\u2026`),s=await r({model:t.model,messages:e.messages,options:Fe(t.numCtx,e.numPredict),tools:e.tools})}catch(u){return o(` task ${e.id} chat failed: ${u.message}`),{id:e.id,category:e.category,score:0,weight:n,passed:!1}}let a=e.gradeProgrammatic(s),i=a.score,c=!1,l=a.passed;if(t.useJudge&&e.judge){let u=a.score===null&&a.passed===!1;try{let p=await Ga({dimension:e.judge.dimension,instruction:e.judge.instruction,source:e.judge.source,output:e.judge.getOutput(s),impl:t.judgeImpl});c=!0;let _=e.judge.combine??((R,f)=>f);i=u?0:_(a.score,p.score),l=i>=60}catch(p){p instanceof Ht?o(` judge unavailable for ${e.id} \u2014 using programmatic score only`):o(` judge error for ${e.id}: ${p.message}`),i=u?0:a.score}}return{id:e.id,category:e.category,score:i,weight:n,passed:l,judged:c}}async function qa(e){let t=au(),n=[];for(let l of Jo){let u=ne(Yo[l.category]/t[l.category],4);n.push(await iu(l,e,u))}let o={},r=new Map;for(let l of n){if(l.score==null)continue;let u=r.get(l.category)??[];u.push(l.score),r.set(l.category,u)}for(let[l,u]of r)o[l]=ne(u.reduce((p,_)=>p+_,0)/u.length,1);let s=0,a=0;for(let l of Object.keys(o)){let u=Yo[l];s+=o[l]*u,a+=u}let i=a>0?ne(s/a,1):null,c={categories:o,tasks:n,suite_version:"v1",judged:n.some(l=>l.judged)};return{overall_score:i,quality_json:c}}var jn=require("fs"),Wa=m(require("path")),Ya=m(require("axios"));function lu(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 cu(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 Va(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":cu(lu(e.decodeTps,e.qualityScore),e.ttftMs)}function Ka(e,t){return!t||e.decode_tps_median==null?"error":e.decode_tps_median<4?"too_slow":"ok"}function er(e){let{specs:t,perf:n,quality:o,model:r}=e,s=n.decode_tps_median!=null,a=e.statusOverride??Ka(n,s);return{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:a,overall_score:o?.overall_score??null,quality_json:o?.quality_json??null,quality_suite_version:o?"v1":null,thermal_throttled:null,on_battery:e.onBattery??null,concurrent_load:null,confidence:e.official?"high":"community",benchmark_schema_version:Xo,cli_version:e.cliVersion,harness_version:Xo,started_at:e.startedAt,finished_at:e.finishedAt}}function Ja(e,t){let n=Wa.default.dirname(e);return n&&(0,jn.mkdirSync)(n,{recursive:!0}),(0,jn.writeFileSync)(e,JSON.stringify(t,null,2)+`
207
207
  `),e}async function za(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 Ya.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 Qa(e){return`${e.replace(/\/$/,"")}/api/v1/admin/benchmark-runs`}var Xa=8;function uu(e,t){return t.push(e),t}function Za(){try{return _e().version}catch{return"0.0.0"}}function du(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 ni=new ei.Command("benchmark").description("Benchmark local Ollama models (perf + quality) and optionally publish results").option("-m, --model <tag>","Ollama model tag to benchmark (repeatable)",uu,[]).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=x=>console.log(I.default.gray(x)),i=it();if(!i.installed||!i.serving){console.error(I.default.red(Xs(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=ia(l!=null?{ramTotalGbOverride:l}:{});l!=null&&console.log(I.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(I.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(I.default.gray(`fingerprint: ${u.machine_fingerprint}`));let p=!u.accelerator;p&&console.log(I.default.gray("no accelerator detected \u2014 treating this as a CPU-only machine."));let _=e.model;if(_.length===0)if(e.all){let x=await jt(En(),r,{apiBase:t,accelerator:u.accelerator});if(_=x?.recommended.map(qe=>qe.ollama_tag)??[],_.length===0){console.error(I.default.red(`No recommended models for this machine (${x?.note??"endpoint unreachable"}). Pass --model <tag>.`)),process.exitCode=1;return}console.log(I.default.gray(`--all: benchmarking the ${_.length} recommended models: ${_.join(", ")}`))}else{let x=await On({runtime:r,interactive:!1,ramGb:En(),apiBase:t,accelerator:u.accelerator});if(x.tag)_=[x.tag],console.log(I.default.gray(`no --model given; benchmarking the recommended pick: ${x.tag}`));else{console.error(I.default.red(`No model to benchmark (recommendation: ${x.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()||Qa(t),g=s&&!!f,y=e.post!==!1&&(s||e.shareResults);y&&!R&&(console.log(I.default.yellow("BENCHMARK_WEBHOOK_SECRET not set \u2014 writing report.json locally but NOT posting.")),y=!1),s&&!f&&console.log(I.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(I.default.yellow("ANTHROPIC_API_KEY not set \u2014 skipping the LLM-judge; chat + summarization scored programmatically only.")),v&&console.log(I.default.gray(`LLM-judge: ${Qo()}`)),y&&console.log(I.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(I.default.gray("Tip: do not run a live bot on this Ollama while benchmarking \u2014 it skews results."));let j=await Ea(),oe=await Pa(),re=async x=>{let qe=x.model_name.replace(/[^a-z0-9.]+/gi,"_"),ye=x.started_at.replace(/[:.]/g,"-"),ut=ti.default.join(e.output,`${qe}-${ye}.json`);if(Ja(ut,x),console.log(I.default.gray(`report: ${ut}`)),y&&R){let be=await za({webhookUrl:b,secret:R,officialToken:g?f:null,report:x});be.ok?console.log(I.default.green(` posted \u2192 id=${be.body?.id} (${be.body?.created?"created":"updated"}), source=${g?"official":"community"}`)):console.error(I.default.red(` webhook failed: ${be.status??""} ${be.error??""}`.trim()))}else console.log(I.default.gray(" (not posted \u2014 pass --official or --share-results to publish)"))};for(let x of _){if(console.log(`
208
- `+I.default.bold.cyan(`\u25B6 ${x}`)),!oe.includes(x)){console.log(I.default.gray(`pulling ${x}\u2026`));let O=An(x);if(!O.ok){console.error(I.default.red(`pull failed: ${O.error}`));continue}}let qe="Q4_K_M",ye=null;try{let O=await Aa(x);O.details?.quantization_level&&(qe=O.details.quantization_level),ye=La(O.details?.parameter_size)}catch(O){console.log(I.default.gray(`ollama show failed (${O.message}); using defaults`))}if(p&&ye!=null&&ye>Xa&&!e.force){console.log(I.default.yellow(` skip: ${x} is ${ye}B \u2014 too slow to be usable on CPU-only hardware (>${Xa}B). Pass --force to benchmark it anyway.`));continue}let ut=new Date().toISOString(),be={model_name:x,quant:qe,model_size_total:ye,model_size_active:ye,engine_version:j};try{console.log(I.default.gray("perf suite\u2026"));let O=await Da({model:x,numCtx:n,warmTrials:o,perfOpts:{log:a}});e.maxContext&&(console.log(I.default.gray("max-context staircase\u2026")),O.max_context=await Na({model:x,perfOpts:{log:a}})),console.log(I.default.gray("quality suite\u2026"));let dt=await qa({model:x,numCtx:n,useJudge:v,log:a}),Ft=new Date().toISOString(),mt=er({specs:u,perf:O,quality:dt,model:be,runtime:r,official:g,submittedBy:e.submittedBy,cliVersion:Za(),startedAt:ut,finishedAt:Ft}),Gt=Va({status:mt.status,decodeTps:O.decode_tps_median,qualityScore:dt.overall_score,ttftMs:O.ttft_ms_median,peakRamMb:O.peak_ram_mb,ramTotalGb:u.ram_total_gb,maxContext:O.max_context});console.log(I.default.bold(` ${x}: `)+`decode ${O.decode_tps_median??"\u2014"} tok/s (p95 ${O.decode_tps_p95??"\u2014"}), ttft ${O.ttft_ms_median??"\u2014"} ms, peak ${O.peak_ram_mb??"\u2014"} MB, quality ${dt.overall_score??"\u2014"}, `+I.default.bold(`verdict ${Gt}`)+` (status ${mt.status})`),await re(mt)}catch(O){let dt=new Date().toISOString(),Ft=O?.message??String(O),mt=/memory|oom|killed|terminated|runner|HTTP 5\d\d|ECONNREFUSED|connection|fetch failed|aborted/i.test(Ft),Gt=l!=null||mt?"oom":"error";console.error(I.default.red(` ${x}: run failed \u2192 status ${Gt} (${Ft.slice(0,160)})`));let ri=er({specs:u,perf:du(n),quality:null,model:be,runtime:r,official:g,submittedBy:e.submittedBy,cliVersion:Za(),startedAt:ut,finishedAt:dt,statusOverride:Gt});await re(ri)}}});Ke();async function mu(){await Sr(process.argv);let e=new oi.Command;e.name("badgerclaw").description("BadgerClaw CLI \u2014 one-click bot provisioning").version("0.3.6"),e.addCommand(ks),e.addCommand(Cs),e.addCommand($s),e.addCommand(Ns),e.addCommand(Yr),e.addCommand(Us),e.addCommand(_a),e.addCommand(Ao),e.addCommand(Sa),e.addCommand(Ca),e.addCommand(xa),e.addCommand(ni),e.parse(process.argv)}mu().catch(e=>{console.error(e),process.exit(1)});
208
+ `+I.default.bold.cyan(`\u25B6 ${x}`)),!oe.includes(x)){console.log(I.default.gray(`pulling ${x}\u2026`));let O=An(x);if(!O.ok){console.error(I.default.red(`pull failed: ${O.error}`));continue}}let qe="Q4_K_M",ye=null;try{let O=await Aa(x);O.details?.quantization_level&&(qe=O.details.quantization_level),ye=La(O.details?.parameter_size)}catch(O){console.log(I.default.gray(`ollama show failed (${O.message}); using defaults`))}if(p&&ye!=null&&ye>Xa&&!e.force){console.log(I.default.yellow(` skip: ${x} is ${ye}B \u2014 too slow to be usable on CPU-only hardware (>${Xa}B). Pass --force to benchmark it anyway.`));continue}let ut=new Date().toISOString(),be={model_name:x,quant:qe,model_size_total:ye,model_size_active:ye,engine_version:j};try{console.log(I.default.gray("perf suite\u2026"));let O=await Da({model:x,numCtx:n,warmTrials:o,perfOpts:{log:a}});e.maxContext&&(console.log(I.default.gray("max-context staircase\u2026")),O.max_context=await Na({model:x,perfOpts:{log:a}})),console.log(I.default.gray("quality suite\u2026"));let dt=await qa({model:x,numCtx:n,useJudge:v,log:a}),Ft=new Date().toISOString(),mt=er({specs:u,perf:O,quality:dt,model:be,runtime:r,official:g,submittedBy:e.submittedBy,cliVersion:Za(),startedAt:ut,finishedAt:Ft}),Gt=Va({status:mt.status,decodeTps:O.decode_tps_median,qualityScore:dt.overall_score,ttftMs:O.ttft_ms_median,peakRamMb:O.peak_ram_mb,ramTotalGb:u.ram_total_gb,maxContext:O.max_context});console.log(I.default.bold(` ${x}: `)+`decode ${O.decode_tps_median??"\u2014"} tok/s (p95 ${O.decode_tps_p95??"\u2014"}), ttft ${O.ttft_ms_median??"\u2014"} ms, peak ${O.peak_ram_mb??"\u2014"} MB, quality ${dt.overall_score??"\u2014"}, `+I.default.bold(`verdict ${Gt}`)+` (status ${mt.status})`),await re(mt)}catch(O){let dt=new Date().toISOString(),Ft=O?.message??String(O),mt=/memory|oom|killed|terminated|runner|HTTP 5\d\d|ECONNREFUSED|connection|fetch failed|aborted/i.test(Ft),Gt=l!=null||mt?"oom":"error";console.error(I.default.red(` ${x}: run failed \u2192 status ${Gt} (${Ft.slice(0,160)})`));let ri=er({specs:u,perf:du(n),quality:null,model:be,runtime:r,official:g,submittedBy:e.submittedBy,cliVersion:Za(),startedAt:ut,finishedAt:dt,statusOverride:Gt});await re(ri)}}});Ke();async function mu(){await Sr(process.argv);let e=new oi.Command;e.name("badgerclaw").description("BadgerClaw CLI \u2014 one-click bot provisioning").version("0.3.7"),e.addCommand(ks),e.addCommand(Cs),e.addCommand($s),e.addCommand(Ns),e.addCommand(Yr),e.addCommand(Us),e.addCommand(_a),e.addCommand(Ao),e.addCommand(Sa),e.addCommand(Ca),e.addCommand(xa),e.addCommand(ni),e.parse(process.argv)}mu().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.6",
3
+ "version": "0.3.7",
4
4
  "engines": {
5
5
  "node": ">=18"
6
6
  },