badgerclaw 0.3.8 → 0.3.10
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/index.js +3 -3
- 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.
|
|
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.10",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.10"}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)+`
|
|
@@ -142,7 +142,7 @@ ${_} Bot ${p}: ${u} \u2014 removing from OpenClaw config...`));try{let{changed:R
|
|
|
142
142
|
\u26A1 SSE command received: ${l.command_type} (${l.command_id})`));try{let u=B();await u.post(`/api/v1/dashboard/commands/${l.command_id}/ack`);let p=await ge({id:l.command_id,command_type:l.command_type,payload:l.payload});console.log(p.success?k.default.green(` \u2705 ${p.message}`):k.default.red(` \u274C ${p.message}`)),await u.post(`/api/v1/dashboard/commands/${l.command_id}/result`,{status:p.success?"success":"failed",result:p.message,new_version:p.newVersion||null});try{await U()}catch{}l.command_type==="update_cli"&&p.success&&(console.log(k.default.cyan(" CLI updated \u2014 restarting in 2s...")),setTimeout(()=>process.exit(0),2e3))}catch(u){console.log(k.default.red(` Command ${l.command_id} error: ${u.message}`))}}}catch{}}};s(),await new Promise(()=>{})});var ka=require("commander"),d=m(require("chalk")),ue=require("child_process"),L=m(require("fs")),Ft=m(require("os")),he=m(require("path")),Ra=m(require("readline"));ie();Ye();var Bt=m(require("fs")),it=m(require("path")),xn=require("child_process"),mc=["request","request-promise"];function pc(e){let t=e.match(/^(\s*)(?:"([^"]+)"|'([^']+)'|([^:#\s][^:]*?))\s*:/);return t?{indent:t[1].length,key:(t[2]??t[3]??t[4]??"").trim()}:null}function gc(e){let t=e.split(`
|
|
143
143
|
`),n=[],o=!1,r=-1,s=!1,a=new Set(mc);for(let i of t){let c=pc(i);if(!o){c&&c.indent===0&&c.key==="overrides"&&(o=!0,r=c.indent),n.push(i);continue}if(c&&c.indent<=r){o=!1,n.push(i);continue}if(c&&c.indent>r&&a.has(c.key)){s=!0;continue}n.push(i)}return s?n.join(`
|
|
144
144
|
`):null}function fc(){let e=[],t=(0,xn.spawnSync)("npm",["root","-g"],{encoding:"utf-8",shell:!0});t.status===0&&t.stdout?.trim()&&e.push(it.default.join(t.stdout.trim(),"openclaw","pnpm-workspace.yaml"));let n=(0,xn.spawnSync)("npm",["prefix","-g"],{encoding:"utf-8",shell:!0});n.status===0&&n.stdout?.trim()&&e.push(it.default.join(n.stdout.trim(),"lib","node_modules","openclaw","pnpm-workspace.yaml"));let o=(0,xn.spawnSync)("which",["openclaw"],{encoding:"utf-8"});if(o.status===0&&o.stdout?.trim()){let r=it.default.dirname(it.default.dirname(o.stdout.trim()));e.push(it.default.join(r,"lib","node_modules","openclaw","pnpm-workspace.yaml"))}for(let r of e)try{if(Bt.default.existsSync(r))return r}catch{}return null}function Ys(){let e=fc();if(!e)return null;let t;try{t=Bt.default.readFileSync(e,"utf-8")}catch{return null}let n=gc(t);if(n===null)return null;try{Bt.default.writeFileSync(e,n)}catch{return null}return{yamlPath:e,original:t}}function zs(e){if(!e)return!1;try{return Bt.default.writeFileSync(e.yamlPath,e.original),!0}catch{return!1}}Me();var ct=require("child_process"),Xs=m(require("fs")),D=m(require("chalk")),J={alreadyUp:!1,install:null,start:null,requiresRoot:!1,networkHostRequired:!1,guidance:null},Qs='On this distro the bare "docker" package is the podman shim (no dockerd). Install Docker Engine from the official docker-ce repository (https://docs.docker.com/engine/install/), then re-run `badgerclaw setup --hermes`.';function hc(e){return e.daemonUp?{...J,alreadyUp:!0}:e.host==="darwin"?e.hasDockerApp?{...J,start:"docker-app"}:e.hasColima?{...J,start:"colima"}:e.binaryPresent?{...J,guidance:"A `docker` CLI is present but no engine we can start (Docker.app / colima) was found and the daemon is not answering. Start your Docker daemon (or `colima start`), then re-run `badgerclaw setup --hermes`."}:e.hasBrew?{...J,install:{tool:"colima",via:"brew"},start:"colima"}:{...J,guidance:"No container engine found and Homebrew is absent. Install Docker Desktop (https://www.docker.com/products/docker-desktop) or Homebrew (https://brew.sh) then colima, and re-run `badgerclaw setup --hermes`."}:e.host==="linux-systemd"?e.binaryPresent?{...J,start:"systemctl",requiresRoot:!0}:e.pkgManager==="apt"?{...J,install:{tool:"docker",via:"apt"},start:"systemctl",requiresRoot:!0}:{...J,guidance:e.pkgManager?Qs:"Docker is not installed and no supported package manager (apt) was found. Install Docker, then re-run."}:e.host==="linux-nosystemd"?e.binaryPresent?{...J,start:"dockerd-restricted",requiresRoot:!0,networkHostRequired:!0}:e.pkgManager==="apt"?{...J,install:{tool:"docker",via:"apt"},start:"dockerd-restricted",requiresRoot:!0,networkHostRequired:!0}:{...J,guidance:e.pkgManager?Qs:"Docker is not installed and no supported package manager (apt) was found. Install Docker (e.g. `apt-get install -y docker.io`), then re-run."}:{...J,guidance:`Automatic Docker setup isn't supported on this platform (${process.platform}). Install + start Docker manually, then re-run.`}}function Zs(e,t,n=8e3){return(0,ct.spawnSync)(e,t,{encoding:"utf-8",timeout:n})}function Uo(){let e=Zs("docker",["version","--format","{{.Server.Version}}"],4e3);return e.status===0&&!!(e.stdout||"").trim()}function yc(){return Zs("docker",["--version"],4e3).status===0}function lt(e){return(0,ct.spawnSync)("sh",["-c",`command -v ${e}`],{encoding:"utf-8"}).status===0}function bc(){return lt("apt-get")?"apt":lt("dnf")?"dnf":lt("yum")?"yum":null}function wc(){let e=(0,ct.spawnSync)("systemctl",["is-system-running"],{encoding:"utf-8",timeout:4e3});if(e.error)return!1;let t=`${e.stdout||""}${e.stderr||""}`.toLowerCase();return!/failed to connect to bus|not been booted with systemd|no such file/.test(t)}function _c(){return process.platform==="darwin"?"darwin":process.platform==="linux"?wc()?"linux-systemd":"linux-nosystemd":"unsupported"}function vc(){return typeof process.getuid=="function"?process.getuid()===0:!1}function Ie(e,t){return t(D.default.dim(` $ ${e}`)),(0,ct.spawnSync)("sh",["-c",e],{stdio:"inherit"}).status===0}function Sc(e,t,n){let o=t?"sudo ":"";switch(e.via){case"brew":return n(D.default.dim(" Installing colima + docker CLI via Homebrew...")),Ie("brew install colima docker",n);case"apt":return n(D.default.dim(" Installing Docker via apt...")),Ie(`${o}apt-get update`,n),Ie(`${o}apt-get install -y docker.io`,n);default:return!1}}function kc(e,t,n){let o=t?"sudo ":"";switch(e){case"docker-app":return Ie("open -a Docker",n);case"colima":return Ie("colima start",n);case"systemctl":return Ie(`${o}systemctl enable --now docker`,n);case"dockerd-restricted":{if(!lt("dockerd"))return n(D.default.red(" \u274C `dockerd` is not installed (the docker CLI alone is not enough on a no-systemd host).")),!1;if(t&&!Ie("sudo -v",n))return n(D.default.red(" \u274C root is required to start dockerd here, but sudo is unavailable.")),!1;Ie(`${o}sh -c 'mount -t cgroup2 none /sys/fs/cgroup 2>/dev/null || true'`,n);let r="/tmp/badgerclaw-dockerd.log";n(D.default.dim(` Starting dockerd (restricted: --bridge=none --iptables=false) \u2192 ${r}`));let s=`nohup dockerd --storage-driver=overlay2 --iptables=false --bridge=none > ${r} 2>&1 &`,a=t?`sudo sh -c ${JSON.stringify(s)}`:`sh -c ${JSON.stringify(s)}`;return(0,ct.spawnSync)("sh",["-c",a],{stdio:"ignore"}).status===0}}}async function Rc(e,t,n){let o=Date.now()+t;for(;;){if(e())return!0;if(Date.now()>=o)return!1;await new Promise(r=>setTimeout(r,n))}}async function ea(e={}){let t=e.log??(a=>console.log(a));if(process.env.BADGERCLAW_NO_AUTO_DEPS==="1"){let a=Uo();return a||(t(D.default.yellow(" BADGERCLAW_NO_AUTO_DEPS=1 \u2014 skipping automatic Docker setup.")),t(D.default.dim(" Start the Docker daemon yourself, then re-run `badgerclaw setup --hermes`."))),{ok:a,daemonUp:a,networkHostRequired:!1}}let n={daemonUp:Uo(),binaryPresent:yc(),host:_c(),hasBrew:lt("brew"),hasDockerApp:Xs.default.existsSync("/Applications/Docker.app"),hasColima:lt("colima"),pkgManager:bc(),isRoot:vc()},o=hc(n);if(o.alreadyUp)return{ok:!0,daemonUp:!0,networkHostRequired:!1};if(o.guidance)return t(D.default.red(` \u274C ${o.guidance}`)),{ok:!1,daemonUp:!1,networkHostRequired:o.networkHostRequired};let r=o.requiresRoot&&!n.isRoot;return r&&t(D.default.dim(" (some steps need root \u2014 using sudo; you may be prompted for your password)")),o.install&&!Sc(o.install,r,t)?(t(D.default.red(" \u274C Docker install failed (see output above). Install it manually, then re-run.")),{ok:!1,daemonUp:!1,networkHostRequired:o.networkHostRequired}):kc(o.start,r,t)?(t(D.default.dim(" Waiting for the Docker daemon to answer...")),await Rc(Uo,12e4,1500)?(t(D.default.green(" \u2705 Docker daemon is up.")),{ok:!0,daemonUp:!0,networkHostRequired:o.networkHostRequired}):(t(D.default.red(" \u274C Docker did not become ready in time.")),o.start==="dockerd-restricted"?t(D.default.dim(" Check /tmp/badgerclaw-dockerd.log for the daemon output.")):o.start==="docker-app"&&t(D.default.dim(" Docker Desktop can take a minute to boot \u2014 re-run once its menu-bar icon is steady.")),{ok:!1,daemonUp:!1,networkHostRequired:o.networkHostRequired})):(t(D.default.red(" \u274C Could not start Docker (see output above). Resolve it, then re-run.")),{ok:!1,daemonUp:!1,networkHostRequired:o.networkHostRequired})}function ta(e){let t=e.minMajor??18;if(!Number.isFinite(e.nodeMajor)||e.nodeMajor<t){let n=Number.isFinite(e.nodeMajor)?`Node v${e.nodeMajor}`:"an unknown Node version";return`badgerclaw requires Node.js >= ${t} (this is ${n}). Upgrade Node \u2014 nodesource (https://github.com/nodesource/distributions) or nvm (\`nvm install ${t}\`) \u2014 then re-run \`badgerclaw setup --hermes\`.`}return e.npmPresent?null:`npm was not found on PATH. badgerclaw is installed and updated via npm \u2014 install Node.js ${t}+ (which bundles npm) and re-run \`badgerclaw setup --hermes\`.`}function na(e=process.versions.node){return parseInt(String(e).split(".")[0],10)}var Ho=require("child_process"),$n=m(require("fs")),oa=m(require("os")),In=m(require("path"));Me();De();function Cc(){let e=ra();for(let t of e)if($n.default.existsSync(t))return t;return null}function ra(){return[In.default.resolve(__dirname,"..","assets","hermes-agent-bc.Dockerfile"),In.default.resolve(__dirname,"..","..","assets","hermes-agent-bc.Dockerfile")]}var xc="nousresearch/hermes-agent";function $c(e){let t=(process.env.HERMES_UPSTREAM||e?.upstream||"").trim();if(!t)return;if(t.includes("/"))return t;let n=t.includes(":")?t.split(":").pop():t;return`${xc}:${n}`}var Ic={run:e=>{let t=(0,Ho.spawnSync)("docker",e,{encoding:"utf-8"});return{status:t.status,stdout:t.stdout||"",stderr:t.stderr||""}}};function Ac(e){return["build",...e.hostNetwork?["--network","host"]:[],...e.upstreamRef?["--build-arg",`UPSTREAM=${e.upstreamRef}`]:[],"-t",e.image,"-f",e.dockerfile,e.ctxDir]}function sa(e){let t=en();if(!t.installed)return{status:"no-docker"};let n=process.env.HERMES_IMAGE||ze;if(tn(t).installed)return{status:"already-present",image:n};let r=Cc();if(!r)return{status:"no-dockerfile",expectedPaths:ra()};let s=$c(e),a=sn({bridgeUsable:()=>Ct(Ic)}),i=$n.default.mkdtempSync(In.default.join(oa.default.tmpdir(),"bc-hermes-build-"));try{let c=(0,Ho.spawnSync)("docker",Ac({hostNetwork:a,upstreamRef:s,image:n,dockerfile:r,ctxDir:i}),{stdio:"inherit",timeout:6e5});return c.status===0?{status:"built",image:n}:{status:"build-failed",image:n,stderr:`docker build exited ${c.status??"<no-status>"}`}}finally{try{$n.default.rmSync(i,{recursive:!0,force:!0})}catch{}}}H();var Go=m(require("os")),dt=require("child_process"),Fo="https://ollama.com/download",Ec={run:(e,t)=>{let n=(0,dt.spawnSync)(e,t,{encoding:"utf-8",timeout:1e4});return{status:n.status,stdout:n.stdout||"",stderr:n.stderr||""}}};function ut(e={}){let t=e.runner??Ec,n=t.run("ollama",["--version"]);if(n.status!==0)return{installed:!1,serving:!1};let o=(n.stdout||"").match(/(\d+\.\d+\.\d+)/),r=o?o[1]:void 0;return{installed:!0,serving:t.run("ollama",["list"]).status===0,version:r}}function aa(e){return e.installed?e.serving?"Ollama is installed and serving.":"Ollama is installed but its server isn't running. Start it with `ollama serve` (or open the Ollama app), then re-run setup.":`Ollama is not installed. Install it from ${Fo}, then re-run setup.`}function An(e,t={}){if(t.runner){let o=t.runner.run("ollama",["pull",e]);return o.status===0?{ok:!0}:{ok:!1,error:(o.stderr||o.stdout||`exit ${o.status}`).trim()}}let n=(0,dt.spawnSync)("ollama",["pull",e],{stdio:t.inheritStdio===!1?"pipe":"inherit",encoding:"utf-8"});return n.status===0?{ok:!0}:{ok:!1,error:(n.stderr||`ollama pull ${e} failed (exit ${n.status})`).toString().trim()}}function Oc(e,t){return t?t.run("sh",["-c",`command -v ${e}`]).status===0:(0,dt.spawnSync)("sh",["-c",`command -v ${e}`],{encoding:"utf-8"}).status===0}function Pc(e={}){let t=Go.default.platform();if(t!=="darwin"&&t!=="linux")return{ok:!1,error:`Automatic install isn't supported on ${t}. Install from ${Fo}.`};let n=e.log??(()=>{}),o=t==="darwin"&&Oc("brew",e.runner),r=o?"brew install ollama":"curl -fsSL https://ollama.com/install.sh | sh";return n(`Installing Ollama via ${o?"Homebrew":"the official installer"}\u2026`),e.runner?e.runner.run("sh",["-c",r]):(0,dt.spawnSync)("sh",["-c",r],{stdio:"inherit"}),ut({runner:e.runner}).installed?{ok:!0}:{ok:!1,error:`Ollama still not detected after install \u2014 install it manually from ${Fo}.`}}function Lc(e={}){((r,s)=>e.runner?e.runner.run(r,s):(0,dt.spawnSync)(r,s,{stdio:"ignore",timeout:1e4}))("sh",["-c",Go.default.platform()==="darwin"?"(brew services start ollama 2>/dev/null) || (nohup ollama serve >/dev/null 2>&1 &)":"(systemctl start ollama 2>/dev/null) || (nohup ollama serve >/dev/null 2>&1 &)"])}var Tc=e=>new Promise(t=>setTimeout(t,e));async function ia(e){let t=e.log??(()=>{}),n=e.sleepImpl??Tc,o=ut({runner:e.runner});if(!o.installed){if(!(e.assumeYes||(e.confirmInstall?await e.confirmInstall(" Ollama is not installed. Install it now? [Y/n] "):!1)))return{ready:!1,installed:!1,reason:"install declined"};let s=Pc({runner:e.runner,log:t});if(!s.ok)return{ready:!1,installed:!1,reason:s.error};o=ut({runner:e.runner})}if(o.installed&&!o.serving){t(" Starting the Ollama server\u2026"),Lc({runner:e.runner});let r=e.pollAttempts??20;for(let s=0;s<r&&!o.serving;s++)await n(1e3),o=ut({runner:e.runner})}return{ready:o.installed&&o.serving,installed:o.installed,reason:o.installed&&o.serving?void 0:"ollama not serving"}}var ha=m(require("os")),ya=m(require("readline"));ie();De();var fe=m(require("os")),ua=require("child_process");Oe();var la=[1,2,4,6,8,12,16];function ca(e){if(e>16)return"16GB+";let t=la[0];for(let n of la)e>=n&&(t=n);return`${t}GB`}var da={run:(e,t)=>{let n=(0,ua.spawnSync)(e,t,{encoding:"utf-8",timeout:5e3});return{status:n.status,stdout:n.stdout||""}}};function En(){return Math.round(fe.default.totalmem()/1024/1024/1024)}function ma(e){return e==="x64"?"x86_64":e}function pa(e,t){if(e==="darwin")return t.run("sysctl",["-n","machdep.cpu.brand_string"]).stdout.trim()||null;if(e==="linux")return t.run("sh",["-c","grep -m1 'model name' /proc/cpuinfo | cut -d: -f2"]).stdout.trim()||null;let n=fe.default.cpus();return n.length?n[0].model.trim():null}function ga(e,t,n,o){if(e==="darwin"&&t==="arm64")return{accelerator:n?`${n} GPU`:"Apple GPU",vram_gb:null,unified_memory:!0};let r=o.run("nvidia-smi",["--query-gpu=name,memory.total","--format=csv,noheader,nounits"]);if(r.status===0&&r.stdout.trim()){let s=r.stdout.trim().split(`
|
|
145
|
-
`)[0],[a,i]=s.split(",").map(l=>l.trim()),c=Number.parseFloat(i);return{accelerator:a||"NVIDIA GPU",vram_gb:Number.isFinite(c)?Math.round(c/1024*10)/10:null,unified_memory:!1}}return{accelerator:null,vram_gb:null,unified_memory:!1}}function On(e={}){let t=e.runner??da,n=fe.default.platform(),o=ma(fe.default.arch()),r=pa(n,t);return ga(n,o,r,t).accelerator}function fa(e={}){let t=e.runner??da,n=fe.default.platform(),o=ma(fe.default.arch()),r=e.ramTotalGbOverride!=null&&Number.isFinite(e.ramTotalGbOverride)&&e.ramTotalGbOverride>0?e.ramTotalGbOverride:null,s=r??En(),a=pa(n,t),{accelerator:i,vram_gb:c,unified_memory:l}=ga(n,o,a,t);return{machine_fingerprint:yt(),ram_total_gb:r!=null?Math.round(r*10)/10:Math.round(fe.default.totalmem()/1024/1024/1024*10)/10,ram_tier:ca(s),cpu_model:a,core_count:fe.default.cpus().length||null,accelerator:i,vram_gb:c,unified_memory:l,os:n,arch:o}}function qo(){return Math.round(ha.default.totalmem()/1024/1024/1024)}async function Ut(e,t,n={}){let o=n.apiBase??N,r=n.fetchImpl??fetch,s=n.accelerator&&n.accelerator.trim(),a=`${o}/api/v1/dashboard/recommended-models?ram_gb=${encodeURIComponent(e)}&runtime=${encodeURIComponent(t)}`+(s?`&accelerator=${encodeURIComponent(s)}`:"");try{let i=await r(a,{headers:{Accept:"application/json"}});if(!i.ok)return null;let c=await i.json(),l=c.result&&typeof c.result=="object"?c.result:c;return Array.isArray(l.recommended)?l:null}catch{return null}}async function Mc(e){let t=ya.default.createInterface({input:process.stdin,output:process.stdout});try{return await new Promise(n=>t.question(e,n))}finally{t.close()}}function Dc(e){let t=e.verdict==="great"?"great":e.verdict==="usable"?"usable":e.verdict,n=e.decode_tps!=null?`${e.decode_tps} tok/s`:"speed not yet benchmarked",o=e.is_top_pick?" (recommended)":"";return`${e.model_name} [${e.ollama_tag}] \u2014 ${t}, ${n}. ${e.why}${
|
|
145
|
+
`)[0],[a,i]=s.split(",").map(l=>l.trim()),c=Number.parseFloat(i);return{accelerator:a||"NVIDIA GPU",vram_gb:Number.isFinite(c)?Math.round(c/1024*10)/10:null,unified_memory:!1}}return{accelerator:null,vram_gb:null,unified_memory:!1}}function On(e={}){let t=e.runner??da,n=fe.default.platform(),o=ma(fe.default.arch()),r=pa(n,t);return ga(n,o,r,t).accelerator}function fa(e={}){let t=e.runner??da,n=fe.default.platform(),o=ma(fe.default.arch()),r=e.ramTotalGbOverride!=null&&Number.isFinite(e.ramTotalGbOverride)&&e.ramTotalGbOverride>0?e.ramTotalGbOverride:null,s=r??En(),a=pa(n,t),{accelerator:i,vram_gb:c,unified_memory:l}=ga(n,o,a,t);return{machine_fingerprint:yt(),ram_total_gb:r!=null?Math.round(r*10)/10:Math.round(fe.default.totalmem()/1024/1024/1024*10)/10,ram_tier:ca(s),cpu_model:a,core_count:fe.default.cpus().length||null,accelerator:i,vram_gb:c,unified_memory:l,os:n,arch:o}}function qo(){return Math.round(ha.default.totalmem()/1024/1024/1024)}async function Ut(e,t,n={}){let o=n.apiBase??N,r=n.fetchImpl??fetch,s=n.accelerator&&n.accelerator.trim(),a=`${o}/api/v1/dashboard/recommended-models?ram_gb=${encodeURIComponent(e)}&runtime=${encodeURIComponent(t)}`+(s?`&accelerator=${encodeURIComponent(s)}`:"");try{let i=await r(a,{headers:{Accept:"application/json"}});if(!i.ok)return null;let c=await i.json(),l=c.result&&typeof c.result=="object"?c.result:c;return Array.isArray(l.recommended)?l:null}catch{return null}}async function Mc(e){let t=ya.default.createInterface({input:process.stdin,output:process.stdout});try{return await new Promise(n=>t.question(e,n))}finally{t.close()}}function Dc(e){let t=e.verdict==="great"?"great":e.verdict==="usable"?"usable":e.verdict,n=e.decode_tps!=null?`${e.decode_tps} tok/s`:"speed not yet benchmarked",o=e.reliability_label?`${e.reliability_label} hallucination`:"hallucination untested",r=e.is_top_pick?" (recommended)":"";return`${e.model_name} [${e.ollama_tag}] \u2014 ${t}, ${n}, ${o}. ${e.why}${r}`}async function Nc(e,t){let n=e.recommended;if(!n||n.length===0)return{tag:null,note:e.note,model:null};let o=n.find(l=>l.is_top_pick)??n[0];if(t.preferredTag){let l=n.find(u=>u.ollama_tag===t.preferredTag);return l?{tag:l.ollama_tag,note:e.note,model:l}:{tag:t.preferredTag,note:e.note,model:null}}if(!t.interactive)return{tag:o.ollama_tag,note:e.note,model:o};let r=t.log??(l=>console.log(l)),s=t.prompt??Mc;r(`
|
|
146
146
|
Local models that fit ${e.ram_gb} GB (${e.ram_tier}):`),n.forEach((l,u)=>{r(` ${l===o?"*":" "} ${u+1}) ${Dc(l)}`)});let a=n.indexOf(o)+1,i=(await s(` Pick a model [${a}]: `)).trim();if(!i)return{tag:o.ollama_tag,note:e.note,model:o};let c=Number.parseInt(i,10);if(Number.isInteger(c)&&c>=1&&c<=n.length){let l=n[c-1];return{tag:l.ollama_tag,note:e.note,model:l}}return{tag:o.ollama_tag,note:e.note,model:o}}async function Pn(e){let t=e.ramGb??qo(),n=e.accelerator===void 0?On():e.accelerator,o=await Ut(t,e.runtime,{apiBase:e.apiBase,fetchImpl:e.fetchImpl,accelerator:n});if(!o)return{tag:e.preferredTag||Rt("ollama"),note:"Could not reach the model-recommendation service \u2014 using a safe default model.",ramGb:t,fellBack:!0};let r=await Nc(o,{interactive:e.interactive,preferredTag:e.preferredTag,prompt:e.prompt,log:e.log});return{tag:r.tag,note:r.note,ramGb:t,fellBack:!1}}De();var ne=he.default.join(Ft.default.homedir(),".openclaw","openclaw.json"),Ht=ne+".badgerclaw-stash",Ca=he.default.join(Ft.default.homedir(),".openclaw","npm"),jc=he.default.join(Ca,"package.json");async function ba(){try{let e=await fetch(`${N}/api/v1/dashboard/versions/latest`,{headers:{Accept:"application/json"}});if(!e.ok)return{cli:null,plugin:null,openclaw:null,hermes:null};let t=await e.json(),n=t.result&&typeof t.result=="object"?t.result:t,o=r=>typeof r!="string"||!r||r==="unknown"?null:r;return{cli:o(n.cli),plugin:o(n.plugin),openclaw:o(n.supported_openclaw),hermes:o(n.supported_hermes)}}catch{return{cli:null,plugin:null,openclaw:null,hermes:null}}}function Bc(){if(!L.default.existsSync(ne))return null;try{let e=JSON.parse(L.default.readFileSync(ne,"utf-8")),t=e.channels?.badgerclaw;return t?(delete e.channels.badgerclaw,e.plugins?.entries?.badgerclaw&&delete e.plugins.entries.badgerclaw,L.default.writeFileSync(ne,JSON.stringify(e,null,2)),L.default.writeFileSync(Ht,JSON.stringify(t,null,2)),t):null}catch{return null}}function Uc(){if(!L.default.existsSync(ne))return null;try{let e=JSON.parse(L.default.readFileSync(ne,"utf-8"));return!e.gateway||typeof e.gateway!="object"?null:JSON.parse(JSON.stringify(e.gateway))}catch{return null}}function Hc(e){if(e&&L.default.existsSync(ne))try{let t=JSON.parse(L.default.readFileSync(ne,"utf-8"));t.gateway={...e,...t.gateway||{}},L.default.writeFileSync(ne,JSON.stringify(t,null,2))}catch(t){console.log(d.default.yellow(` \u26A0\uFE0F Could not restore gateway block: ${t.message}`)),console.log(d.default.yellow(" Run `openclaw config set gateway.mode local` manually if the gateway fails to start."))}}function Fc(){if(L.default.existsSync(Ht))try{let e=JSON.parse(L.default.readFileSync(Ht,"utf-8")),t=JSON.parse(L.default.readFileSync(ne,"utf-8"));t.channels=t.channels||{},t.channels.badgerclaw=e,L.default.writeFileSync(ne,JSON.stringify(t,null,2)),L.default.unlinkSync(Ht)}catch(e){console.log(d.default.yellow(` \u26A0\uFE0F Could not restore config: ${e.message}`)),console.log(d.default.yellow(` Your bot credentials are backed up at: ${Ht}`))}}async function wa(e){return new Promise(t=>{let n=(0,ue.spawn)("openclaw",["plugins","install",e,"--force","--dangerously-force-unsafe-install"],{stdio:["ignore","pipe","pipe"],shell:!0}),o="",r=!1,s=!1,a=/Installed plugin:|Restart the gateway to load plugins/,i=()=>{r||s||(r=!0,setTimeout(()=>{if(!s){try{n.kill("SIGTERM")}catch{}setTimeout(()=>{if(!s)try{n.kill("SIGKILL")}catch{}},1e3)}},3e3))},c=(l,u)=>{u.write(l),o+=l.toString("utf-8"),a.test(o)&&i()};n.stdout.on("data",l=>c(l,process.stdout)),n.stderr.on("data",l=>c(l,process.stderr)),n.on("exit",l=>{s=!0,t({status:r?0:l??1})}),n.on("error",l=>{s||(s=!0,console.error(d.default.red(` openclaw spawn error: ${l.message}`)),t({status:1}))})})}function _a(e){if(!L.default.existsSync(e))return!1;let t;try{t=JSON.parse(L.default.readFileSync(e,"utf-8"))}catch{return!1}let n=!1;return t.overrides&&typeof t.overrides=="object"&&"uuid"in t.overrides&&(delete t.overrides.uuid,n=!0),t.openclaw&&Array.isArray(t.openclaw.managedOverrides)&&t.openclaw.managedOverrides.includes("uuid")&&(t.openclaw.managedOverrides=t.openclaw.managedOverrides.filter(o=>o!=="uuid"),n=!0),n?(L.default.writeFileSync(e,JSON.stringify(t,null,2)+`
|
|
147
147
|
`),!0):!1}function Gc(){let e=[];_a(jc)&&e.push(Ca);for(let t of Xt())_a(he.default.join(t,"package.json"))&&e.push(t);return e}async function qc(){let{detectCapabilities:e}=await Promise.resolve().then(()=>(Me(),Dr)),{pushHeartbeat:t}=await Promise.resolve().then(()=>(rt(),Mo));console.log(d.default.green(`
|
|
148
148
|
\u{1F9A1} BadgerClaw \u2014 capability refresh
|
|
@@ -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.
|
|
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.10"),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)});
|