badgerclaw 0.2.45 → 0.2.46

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,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var wn=Object.create;var Pe=Object.defineProperty;var yn=Object.getOwnPropertyDescriptor;var _n=Object.getOwnPropertyNames;var bn=Object.getPrototypeOf,Sn=Object.prototype.hasOwnProperty;var $n=(e,t)=>()=>(e&&(t=e(e=0)),t);var Cn=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),vn=(e,t)=>{for(var o in t)Pe(e,o,{get:t[o],enumerable:!0})},Ft=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of _n(t))!Sn.call(e,n)&&n!==o&&Pe(e,n,{get:()=>t[n],enumerable:!(s=yn(t,n))||s.enumerable});return e};var c=(e,t,o)=>(o=e!=null?wn(bn(e)):{},Ft(t||!e||!e.__esModule?Pe(o,"default",{value:e,enumerable:!0}):o,e)),Gt=e=>Ft(Pe({},"__esModule",{value:!0}),e);var oe=Cn((xr,Ln)=>{Ln.exports={name:"badgerclaw",version:"0.2.45",description:"BadgerClaw CLI \u2014 one-click bot provisioning",main:"dist/index.js",bin:{badgerclaw:"./dist/index.js"},files:["dist/","scripts/","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:'echo "Error: no test specified" && exit 1'},keywords:[],author:"",license:"ISC",dependencies:{"@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",typescript:"^5.3.0"}}});var Tt={};vn(Tt,{getActiveSessions:()=>Dt,launchClaudeCode:()=>Pt,launchMCPServer:()=>Rt,recordSession:()=>Et,stopSession:()=>Ot});function It(){try{if(R.default.existsSync(vt))return JSON.parse(R.default.readFileSync(vt,"utf-8"))}catch{}return[]}function xt(e){R.default.mkdirSync(ne,{recursive:!0}),R.default.writeFileSync(vt,JSON.stringify(e,null,2))}function Qe(e){try{return process.kill(e,0),!0}catch{return!1}}function Xn(){if(process.env.TMUX)return"tmux";try{if((0,G.execSync)(`osascript -e 'tell application "System Events" to (name of processes) contains "iTerm2"'`,{stdio:"pipe",timeout:3e3}),R.default.existsSync("/Applications/iTerm.app"))return"iterm2"}catch{}return process.platform==="darwin"?"terminal":"direct"}function kt(e,t){let o=D.default.join(ne,`claude-launcher-${t}.exp`),s=D.default.join(ne,`pending-input-${t}.txt`);R.default.writeFileSync(s,"","utf-8");let n=`#!/usr/bin/expect -f
2
+ "use strict";var wn=Object.create;var Pe=Object.defineProperty;var yn=Object.getOwnPropertyDescriptor;var _n=Object.getOwnPropertyNames;var bn=Object.getPrototypeOf,Sn=Object.prototype.hasOwnProperty;var $n=(e,t)=>()=>(e&&(t=e(e=0)),t);var Cn=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),vn=(e,t)=>{for(var o in t)Pe(e,o,{get:t[o],enumerable:!0})},Ft=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of _n(t))!Sn.call(e,n)&&n!==o&&Pe(e,n,{get:()=>t[n],enumerable:!(s=yn(t,n))||s.enumerable});return e};var c=(e,t,o)=>(o=e!=null?wn(bn(e)):{},Ft(t||!e||!e.__esModule?Pe(o,"default",{value:e,enumerable:!0}):o,e)),Gt=e=>Ft(Pe({},"__esModule",{value:!0}),e);var oe=Cn((xr,Ln)=>{Ln.exports={name:"badgerclaw",version:"0.2.46",description:"BadgerClaw CLI \u2014 one-click bot provisioning",main:"dist/index.js",bin:{badgerclaw:"./dist/index.js"},files:["dist/","scripts/","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:'echo "Error: no test specified" && exit 1'},keywords:[],author:"",license:"ISC",dependencies:{"@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",typescript:"^5.3.0"}}});var Tt={};vn(Tt,{getActiveSessions:()=>Dt,launchClaudeCode:()=>Pt,launchMCPServer:()=>Rt,recordSession:()=>Et,stopSession:()=>Ot});function It(){try{if(R.default.existsSync(vt))return JSON.parse(R.default.readFileSync(vt,"utf-8"))}catch{}return[]}function xt(e){R.default.mkdirSync(ne,{recursive:!0}),R.default.writeFileSync(vt,JSON.stringify(e,null,2))}function Qe(e){try{return process.kill(e,0),!0}catch{return!1}}function Xn(){if(process.env.TMUX)return"tmux";try{if((0,G.execSync)(`osascript -e 'tell application "System Events" to (name of processes) contains "iTerm2"'`,{stdio:"pipe",timeout:3e3}),R.default.existsSync("/Applications/iTerm.app"))return"iterm2"}catch{}return process.platform==="darwin"?"terminal":"direct"}function kt(e,t){let o=D.default.join(ne,`claude-launcher-${t}.exp`),s=D.default.join(ne,`pending-input-${t}.txt`);R.default.writeFileSync(s,"","utf-8");let n=`#!/usr/bin/expect -f
3
3
  set timeout -1
4
4
  set msgfile "${s}"
5
5
 
@@ -117,7 +117,7 @@ Keep responses concise and helpful.
117
117
  ${i} Bot ${a}: ${r} \u2014 removing from OpenClaw config...`));try{let{changed:l}=He(r);l?(console.log(g.default.green(" \u2705 Removed from openclaw.json")),Je()?console.log(g.default.green(" \u2705 Gateway restarted")):console.log(g.default.dim(" Gateway restart failed \u2014 restart manually"))):console.log(g.default.dim(" Account not found in openclaw.json \u2014 nothing to remove"))}catch(l){console.log(g.default.red(` Failed to update openclaw.json: ${l}`))}}else if(n.type==="claude_code.start"&&n.bot_id&&n.room_id){console.log(g.default.cyan(`
118
118
  \u{1F916} Claude Code START received: bot=${n.bot_id} room=${n.room_id}`));try{let r=await V({id:n.command_id||`cc-start-${Date.now()}`,command_type:"start_claude_code",payload:{bot_id:n.bot_id,room_id:n.room_id,session_id:n.session_id}});if(console.log(r.success?g.default.green(` \u2705 ${r.message}`):g.default.red(` \u274C ${r.message}`)),n.command_id)try{await I().post(`/api/v1/dashboard/commands/${n.command_id}/result`,{status:r.success?"success":"failed",result:r.message})}catch{}try{await E()}catch{}}catch(r){console.log(g.default.red(` Claude Code start error: ${r.message}`))}}else if(n.type==="claude_code.stop"&&n.bot_id&&n.room_id){console.log(g.default.cyan(`
119
119
  \u{1F916} Claude Code STOP received: bot=${n.bot_id} room=${n.room_id}`));try{let r=await V({id:n.command_id||`cc-stop-${Date.now()}`,command_type:"stop_claude_code",payload:{bot_id:n.bot_id,room_id:n.room_id,session_id:n.session_id}});if(console.log(r.success?g.default.green(` \u2705 ${r.message}`):g.default.red(` \u274C ${r.message}`)),n.command_id)try{await I().post(`/api/v1/dashboard/commands/${n.command_id}/result`,{status:r.success?"success":"failed",result:r.message})}catch{}try{await E()}catch{}}catch(r){console.log(g.default.red(` Claude Code stop error: ${r.message}`))}}else if(n.type==="command.execute"&&n.command_id){console.log(g.default.cyan(`
120
- \u26A1 SSE command received: ${n.command_type} (${n.command_id})`));try{let r=I();await r.post(`/api/v1/dashboard/commands/${n.command_id}/ack`);let a=await V({id:n.command_id,command_type:n.command_type,payload:n.payload});console.log(a.success?g.default.green(` \u2705 ${a.message}`):g.default.red(` \u274C ${a.message}`)),await r.post(`/api/v1/dashboard/commands/${n.command_id}/result`,{status:a.success?"success":"failed",result:a.message,new_version:a.newVersion||null});try{await E()}catch{}n.command_type==="update_cli"&&a.success&&(console.log(g.default.cyan(" CLI updated \u2014 restarting in 2s...")),setTimeout(()=>process.exit(0),2e3))}catch(r){console.log(g.default.red(` Command ${n.command_id} error: ${r.message}`))}}}catch{}},o.onerror=()=>{console.log(g.default.dim(" Reconnecting..."))},await new Promise(()=>{})});var sn=require("commander"),u=c(require("chalk")),Ae=require("child_process"),v=c(require("fs")),Bt=c(require("os")),Mt=c(require("path"));var tn=c(require("fs")),on=c(require("os")),nt=c(require("path")),jt=require("child_process"),J=c(require("chalk"));var Rs=`${O}/api/v1/dashboard/versions/latest`,Ps=2500,Es=new Set(["setup","logout","help","--version","-V","--help","-h","heartbeat","watch","autopair"]),en=nt.default.join(on.default.homedir(),".openclaw/extensions/badgerclaw"),Os=[nt.default.join(en,"node_modules/@badgerclaw/connect/package.json"),nt.default.join(en,"package.json")];function Lt(){return"0.2.45"}function Ds(){for(let e of Os)try{let t=tn.default.readFileSync(e,"utf-8"),o=JSON.parse(t);if(o.version&&(!o.name||o.name==="@badgerclaw/connect"||o.name==="badgerclaw")||o.version)return o.version}catch{}return null}function Ts(e){let t=e.trim(),o=t.match(/\d+(?:\.\d+){1,3}/);return o?o[0]:t}function st(){if((0,jt.spawnSync)("which",["openclaw"],{encoding:"utf-8"}).status!==0)return null;let t=(0,jt.spawnSync)("openclaw",["--version"],{encoding:"utf-8",timeout:3e3});return t.status!==0||!t.stdout?null:Ts(t.stdout)||null}async function Ns(){let e=new AbortController,t=setTimeout(()=>e.abort(),Ps);try{let o=await fetch(Rs,{signal:e.signal});if(!o.ok)return null;let s=await o.json(),n=s.result&&typeof s.result=="object"?s.result:s;return{cli:n.cli??"unknown",plugin:n.plugin??"unknown",supported_openclaw:n.supported_openclaw??"unknown"}}catch{return null}finally{clearTimeout(t)}}function js(e){let t=[];if(e.cli&&e.cli!=="unknown"){let o=Lt();o!==e.cli&&t.push({component:"cli",current:o,approved:e.cli})}if(e.plugin&&e.plugin!=="unknown"){let o=Ds();(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=st();(o===null||o!==e.supported_openclaw)&&t.push({component:"openclaw",current:o??"not installed",approved:e.supported_openclaw})}return t}function Ls(e){return e[2]}function Bs(e){return!e||e.startsWith("-")?!0:Es.has(e)}function Ms(e){let t=[];t.push(""),t.push(J.default.red.bold("\u2717 Unsupported versions detected")),t.push("");for(let o of e){let s=o.component.padEnd(8);t.push(` ${s} ${J.default.yellow(o.current)} \u2192 ${J.default.green(o.approved)} ${J.default.dim("(supported)")}`)}return t.push(""),t.push("This command is blocked until your installation matches the supported versions."),t.push(""),t.push(J.default.green(" To fix, run:")),t.push(J.default.green.bold(" badgerclaw setup")),t.push(""),t.push(J.default.dim(" (bypass temporarily: BADGERCLAW_NO_VERSION_CHECK=1 badgerclaw <cmd>)")),t.push(""),t.join(`
120
+ \u26A1 SSE command received: ${n.command_type} (${n.command_id})`));try{let r=I();await r.post(`/api/v1/dashboard/commands/${n.command_id}/ack`);let a=await V({id:n.command_id,command_type:n.command_type,payload:n.payload});console.log(a.success?g.default.green(` \u2705 ${a.message}`):g.default.red(` \u274C ${a.message}`)),await r.post(`/api/v1/dashboard/commands/${n.command_id}/result`,{status:a.success?"success":"failed",result:a.message,new_version:a.newVersion||null});try{await E()}catch{}n.command_type==="update_cli"&&a.success&&(console.log(g.default.cyan(" CLI updated \u2014 restarting in 2s...")),setTimeout(()=>process.exit(0),2e3))}catch(r){console.log(g.default.red(` Command ${n.command_id} error: ${r.message}`))}}}catch{}},o.onerror=()=>{console.log(g.default.dim(" Reconnecting..."))},await new Promise(()=>{})});var sn=require("commander"),u=c(require("chalk")),Ae=require("child_process"),v=c(require("fs")),Bt=c(require("os")),Mt=c(require("path"));var tn=c(require("fs")),on=c(require("os")),nt=c(require("path")),jt=require("child_process"),J=c(require("chalk"));var Rs=`${O}/api/v1/dashboard/versions/latest`,Ps=2500,Es=new Set(["setup","logout","help","--version","-V","--help","-h","heartbeat","watch","autopair"]),en=nt.default.join(on.default.homedir(),".openclaw/extensions/badgerclaw"),Os=[nt.default.join(en,"node_modules/@badgerclaw/connect/package.json"),nt.default.join(en,"package.json")];function Lt(){return"0.2.46"}function Ds(){for(let e of Os)try{let t=tn.default.readFileSync(e,"utf-8"),o=JSON.parse(t);if(o.version&&(!o.name||o.name==="@badgerclaw/connect"||o.name==="badgerclaw")||o.version)return o.version}catch{}return null}function Ts(e){let t=e.trim(),o=t.match(/\d+(?:\.\d+){1,3}/);return o?o[0]:t}function st(){if((0,jt.spawnSync)("which",["openclaw"],{encoding:"utf-8"}).status!==0)return null;let t=(0,jt.spawnSync)("openclaw",["--version"],{encoding:"utf-8",timeout:3e3});return t.status!==0||!t.stdout?null:Ts(t.stdout)||null}async function Ns(){let e=new AbortController,t=setTimeout(()=>e.abort(),Ps);try{let o=await fetch(Rs,{signal:e.signal});if(!o.ok)return null;let s=await o.json(),n=s.result&&typeof s.result=="object"?s.result:s;return{cli:n.cli??"unknown",plugin:n.plugin??"unknown",supported_openclaw:n.supported_openclaw??"unknown"}}catch{return null}finally{clearTimeout(t)}}function js(e){let t=[];if(e.cli&&e.cli!=="unknown"){let o=Lt();o!==e.cli&&t.push({component:"cli",current:o,approved:e.cli})}if(e.plugin&&e.plugin!=="unknown"){let o=Ds();(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=st();(o===null||o!==e.supported_openclaw)&&t.push({component:"openclaw",current:o??"not installed",approved:e.supported_openclaw})}return t}function Ls(e){return e[2]}function Bs(e){return!e||e.startsWith("-")?!0:Es.has(e)}function Ms(e){let t=[];t.push(""),t.push(J.default.red.bold("\u2717 Unsupported versions detected")),t.push("");for(let o of e){let s=o.component.padEnd(8);t.push(` ${s} ${J.default.yellow(o.current)} \u2192 ${J.default.green(o.approved)} ${J.default.dim("(supported)")}`)}return t.push(""),t.push("This command is blocked until your installation matches the supported versions."),t.push(""),t.push(J.default.green(" To fix, run:")),t.push(J.default.green.bold(" badgerclaw setup")),t.push(""),t.push(J.default.dim(" (bypass temporarily: BADGERCLAW_NO_VERSION_CHECK=1 badgerclaw <cmd>)")),t.push(""),t.join(`
121
121
  `)}async function nn(e){if(process.env.BADGERCLAW_NO_VERSION_CHECK)return;let t=Ls(e);if(Bs(t))return;let o=await Ns();if(!o)return;let s=js(o);s.length!==0&&(process.stderr.write(Ms(s)),process.exit(1))}var T=Mt.default.join(Bt.default.homedir(),".openclaw","openclaw.json"),Re=T+".badgerclaw-stash";async function Us(){try{let e=await fetch(`${O}/api/v1/dashboard/versions/latest`,{headers:{Accept:"application/json"}});if(!e.ok)return{cli:null,plugin:null,openclaw:null};let t=await e.json(),o=t.result&&typeof t.result=="object"?t.result:t,s=n=>typeof n!="string"||!n||n==="unknown"?null:n;return{cli:s(o.cli),plugin:s(o.plugin),openclaw:s(o.supported_openclaw)}}catch{return{cli:null,plugin:null,openclaw:null}}}function Fs(){if(!v.default.existsSync(T))return null;try{let e=JSON.parse(v.default.readFileSync(T,"utf-8")),t=e.channels?.badgerclaw;return t?(delete e.channels.badgerclaw,e.plugins?.entries?.badgerclaw&&delete e.plugins.entries.badgerclaw,v.default.writeFileSync(T,JSON.stringify(e,null,2)),v.default.writeFileSync(Re,JSON.stringify(t,null,2)),t):null}catch{return null}}function Gs(){if(!v.default.existsSync(T))return null;try{let e=JSON.parse(v.default.readFileSync(T,"utf-8"));return!e.gateway||typeof e.gateway!="object"?null:JSON.parse(JSON.stringify(e.gateway))}catch{return null}}function Vs(e){if(e&&v.default.existsSync(T))try{let t=JSON.parse(v.default.readFileSync(T,"utf-8"));t.gateway={...e,...t.gateway||{}},v.default.writeFileSync(T,JSON.stringify(t,null,2))}catch(t){console.log(u.default.yellow(` \u26A0\uFE0F Could not restore gateway block: ${t.message}`)),console.log(u.default.yellow(" Run `openclaw config set gateway.mode local` manually if the gateway fails to start."))}}function Ws(){if(v.default.existsSync(Re))try{let e=JSON.parse(v.default.readFileSync(Re,"utf-8")),t=JSON.parse(v.default.readFileSync(T,"utf-8"));t.channels=t.channels||{},t.channels.badgerclaw=e,v.default.writeFileSync(T,JSON.stringify(t,null,2)),v.default.unlinkSync(Re)}catch(e){console.log(u.default.yellow(` \u26A0\uFE0F Could not restore config: ${e.message}`)),console.log(u.default.yellow(` Your bot credentials are backed up at: ${Re}`))}}var rn=new sn.Command("setup").description("Install or update the OpenClaw BadgerClaw plugin safely (handles config automatically)").action(async()=>{console.log(u.default.green(`
122
122
  \u{1F9A1} BadgerClaw Setup
123
123
  `));let e=await Us();if(e.cli){let i=Lt();i!==e.cli?(console.log(u.default.dim(` Updating CLI: ${i} \u2192 ${e.cli} (supported)...`)),(0,Ae.spawnSync)("npm",["install","-g",`badgerclaw@${e.cli}`],{stdio:"inherit",shell:!0}).status!==0&&(console.log(u.default.red("\n\u274C CLI update failed. Fix the npm error above, then re-run `badgerclaw setup`.")),process.exit(1)),console.log(u.default.green(` \u2705 CLI updated to ${e.cli}`))):console.log(u.default.dim(` CLI already at approved version ${i}.`))}if(e.openclaw){let i=st();i!==e.openclaw?(console.log(i===null?u.default.dim(` Installing OpenClaw ${e.openclaw} (supported)...`):u.default.dim(` Updating OpenClaw: ${i} \u2192 ${e.openclaw} (supported)...`)),(0,Ae.spawnSync)("npm",["install","-g",`openclaw@${e.openclaw}`],{stdio:"inherit",shell:!0}).status!==0&&(console.log(u.default.red("\n\u274C OpenClaw install/update failed. Fix the npm error above, then re-run `badgerclaw setup`.")),process.exit(1)),console.log(u.default.green(` \u2705 OpenClaw at ${e.openclaw}`))):console.log(u.default.dim(` OpenClaw already at approved version ${i}.`))}else st()===null&&(console.log(u.default.yellow(" \u26A0\uFE0F No approved OpenClaw version and none installed \u2014 installing latest from npm.")),(0,Ae.spawnSync)("npm",["install","-g","openclaw"],{stdio:"inherit",shell:!0}).status!==0&&(console.log(u.default.red(`
@@ -128,4 +128,4 @@ ${i} Bot ${a}: ${r} \u2014 removing from OpenClaw config...`));try{let{changed:l
128
128
  BadgerClaw Dashboard
129
129
  `)),console.log(S.default.bold(" Instance")),console.log(` ID: ${L()}`),console.log(` CLI Version: ${t}`),console.log(` Plugin: ${s.pluginVersion}`),console.log(),console.log(S.default.bold(" Machine")),console.log(` Hostname: ${o.hostname}`),console.log(` OS: ${o.os} / ${o.arch}`),console.log(` Uptime: ${an(o.uptimeSeconds)}`),console.log(` Free Memory: ${o.memFreeMb} MB`),console.log();let n=s.status==="running"?S.default.green:s.status==="error"?S.default.red:S.default.yellow;if(console.log(S.default.bold(" Gateway")),console.log(` Status: ${n(s.status)}`),console.log(` PID: ${s.pid??"N/A"}`),console.log(` Last Restart: ${s.lastRestart??"N/A"}`),console.log(),s.bots.length===0)console.log(S.default.bold(" Bots")),console.log(S.default.dim(" No bots detected. Pair bots at https://badgerclaw.ai")),console.log();else{console.log(S.default.bold(` Bots (${s.bots.length})`)),console.log();for(let r of s.bots){let a=r.status==="running"?S.default.green:r.status==="error"?S.default.red:S.default.yellow;if(console.log(` ${S.default.bold(r.botUsername)} ${a(`[${r.status}]`)}`),console.log(` ID: ${r.botId}`),console.log(` Uptime: ${an(r.uptimeSeconds)}`),console.log(` Messages: ${r.messagesReceived} in / ${r.messagesSent} out`),r.chunkedMessages>0&&console.log(` Chunked: ${r.chunkedMessages} messages, ${r.totalChunksSent} chunks`),console.log(` Rooms: ${r.roomsActive} active`),console.log(` Errors: ${r.errors}`),r.lastError&&(console.log(` Last Error: ${S.default.red(r.lastError)}`),console.log(` Error At: ${r.lastErrorAt}`)),console.log(` Last Active: ${r.lastActivity??"N/A"}`),r.roomDetails&&r.roomDetails.length>0){console.log(S.default.dim(" Rooms:"));for(let i of r.roomDetails)console.log(S.default.dim(` ${i.roomName} \u2014 ${i.messagesInRoom} msgs, last: ${i.lastActivityInRoom??"N/A"}`))}console.log()}}console.log(S.default.dim(` Last checked: ${new Date().toISOString()}`)),console.log()});function an(e){if(e<60)return`${e}s`;if(e<3600)return`${Math.floor(e/60)}m ${e%60}s`;let t=Math.floor(e/3600),o=Math.floor(e%3600/60);return t<24?`${t}h ${o}m`:`${Math.floor(t/24)}d ${t%24}h ${o}m`}var Ut=require("commander"),ge=c(require("chalk")),dn=c(require("ora"));var qs=new Ut.Command("restart").description("Restart the OpenClaw gateway via the plugin probe endpoint").action(async()=>{h()||(console.log(ge.default.yellow("Not logged in. Run `badgerclaw login` first.")),process.exit(1));let t=(0,dn.default)("Restarting gateway...").start(),o=await ue();if(o.success){t.succeed(ge.default.green(`Gateway restarted: ${o.message}`));try{await E(),console.log(ge.default.dim(" Heartbeat pushed with updated status."))}catch{console.log(ge.default.dim(" Could not push heartbeat \u2014 daemon may not be running."))}}else t.fail(ge.default.red(`Gateway restart failed: ${o.message}`)),process.exit(1)}),un=new Ut.Command("gateway").description("Manage the OpenClaw gateway").addCommand(qs);var Y=require("commander"),p=c(require("chalk")),re=c(require("ora")),z=c(require("axios"));Ze();var se="http://localhost:7331",Hs=new Y.Command("start").description("Start a Claude Code session for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").option("--session-id <id>","Session ID (default: auto-generated)").option("--port <port>","MCP server port (default: 7332)","7332").option("--project <dir>","Project directory",process.cwd()).action(async e=>{h()||(console.log(p.default.yellow("Not logged in. Run `badgerclaw login` first.")),process.exit(1));let o=e.sessionId||`session-${Date.now()}`,s=parseInt(e.port,10),n=e.project.replace(/^~/,process.env.HOME||""),r=(0,re.default)("Starting Claude Code session...").start();try{await z.default.post(`${se}/claude-code/toggle`,{botId:e.bot,roomId:e.room,enabled:!0,sessionId:o},{timeout:1e4}),r.text="Gateway toggled \u2014 launching MCP server...";let i=Rt({sessionId:o,port:s,projectDir:n}).pid||0;await new Promise(l=>setTimeout(l,1500)),r.text="MCP server running \u2014 launching Claude Code...",Pt({sessionId:o,port:s,projectDir:n}),Et(o,0,i,s,n),r.succeed(p.default.green("Claude Code session started")+p.default.dim(` (session: ${o}, port: ${s})`)),console.log(p.default.dim(` Bot: ${e.bot}`)),console.log(p.default.dim(` Room: ${e.room}`)),console.log(p.default.dim(` Project: ${n}`)),console.log(p.default.dim(" Claude Code should open in a new terminal window."))}catch(a){let i=a.response?.data?.message||a.message||"Unknown error";r.fail(p.default.red(`Failed to start Claude Code: ${i}`)),process.exit(1)}}),Js=new Y.Command("stop").description("Stop a Claude Code session").option("--bot <botId>","Bot ID or username").option("--room <roomId>","Matrix room ID").option("--session-id <id>","Session ID to stop").action(async e=>{h()||(console.log(p.default.yellow("Not logged in. Run `badgerclaw login` first.")),process.exit(1));let o=(0,re.default)("Stopping Claude Code session...").start();try{e.bot&&e.room&&await z.default.post(`${se}/claude-code/toggle`,{botId:e.bot,roomId:e.room,enabled:!1},{timeout:1e4});let s=e.sessionId;if(!s)try{let a=((await z.default.get(`${se}/claude-code/status`,{timeout:5e3})).data?.rooms||[]).find(i=>i.botId===e.bot&&i.roomId===e.room);a&&(s=a.sessionId)}catch{}s?(Ot(s),o.succeed(p.default.green(`Claude Code session stopped (${s})`))):(o.succeed(p.default.green("Claude Code toggled off at gateway")),console.log(p.default.dim(" No local session found to kill \u2014 may need to close Claude Code manually.")))}catch(s){let n=s.response?.data?.message||s.message||"Unknown error";o.fail(p.default.red(`Failed to stop Claude Code: ${n}`)),process.exit(1)}}),zs=new Y.Command("status").description("Show active Claude Code sessions").action(async()=>{h()||(console.log(p.default.yellow("Not logged in. Run `badgerclaw login` first.")),process.exit(1));let t=(0,re.default)("Fetching Claude Code status...").start();try{let o=[];try{o=(await z.default.get(`${se}/claude-code/status`,{timeout:5e3})).data?.rooms||[]}catch{}let s=Dt();if(t.stop(),o.length===0&&s.length===0){console.log(p.default.dim("No active Claude Code sessions."));return}if(o.length>0){console.log(p.default.bold(`
130
130
  Gateway Claude Code Rooms:`)),console.log(p.default.dim(" Bot".padEnd(30)+"Room".padEnd(30)+"Session".padEnd(20)+"Enabled")),console.log(p.default.dim(" "+"-".repeat(88)));for(let n of o){let r=n.enabled?p.default.green("ON"):p.default.dim("OFF");console.log(` ${(n.botId||"").padEnd(30)}${(n.roomName||n.roomId||"").padEnd(30)}${(n.sessionId||"-").padEnd(20)}${r}`)}}if(s.length>0){console.log(p.default.bold(`
131
- Local Sessions:`)),console.log(p.default.dim(" Session".padEnd(25)+"Port".padEnd(8)+"MCP PID".padEnd(10)+"Project".padEnd(40)+"Started")),console.log(p.default.dim(" "+"-".repeat(90)));for(let n of s)console.log(` ${n.sessionId.padEnd(25)}${String(n.port).padEnd(8)}${String(n.mcpPid).padEnd(10)}${n.projectDir.padEnd(40)}${n.startedAt}`)}console.log("")}catch(o){t.fail(p.default.red(`Failed to get status: ${o.message}`)),process.exit(1)}}),Ys=new Y.Command("group").description("Group bots/rooms into a shared Claude Code session").requiredOption("--session <id>","Session ID to group under").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").action(async e=>{let t=(0,re.default)("Grouping bot+room into session...").start();try{await z.default.post(`${se}/claude-code/toggle`,{botId:e.bot,roomId:e.room,enabled:!0,sessionId:e.session},{timeout:1e4}),t.succeed(p.default.green(`Grouped ${e.bot} + ${e.room} into session "${e.session}"`))}catch(o){let s=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to group: ${s}`)),process.exit(1)}}),Ks=new Y.Command("allow").description("Add a user to the Claude Code allowlist for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").requiredOption("--user <userId>","Matrix user ID to allow (e.g. @alice:server)").action(async e=>{let t=(0,re.default)("Adding user to allowlist...").start();try{await z.default.post(`${se}/claude-code/allow`,{botId:e.bot,roomId:e.room,userId:e.user},{timeout:1e4}),t.succeed(p.default.green(`Added ${e.user} to allowlist for ${e.bot} in ${e.room}`))}catch(o){let s=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to add user: ${s}`)),process.exit(1)}}),Qs=new Y.Command("revoke").description("Remove a user from the Claude Code allowlist for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").requiredOption("--user <userId>","Matrix user ID to revoke").action(async e=>{let t=(0,re.default)("Removing user from allowlist...").start();try{await z.default.post(`${se}/claude-code/revoke`,{botId:e.bot,roomId:e.room,userId:e.user},{timeout:1e4}),t.succeed(p.default.green(`Removed ${e.user} from allowlist for ${e.bot} in ${e.room}`))}catch(o){let s=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to revoke user: ${s}`)),process.exit(1)}}),mn=new Y.Command("claude-code").description("Manage Claude Code sessions (relay Matrix messages to local Claude Code)").addCommand(Hs).addCommand(Js).addCommand(zs).addCommand(Ys).addCommand(Ks).addCommand(Qs);async function Xs(){await nn(process.argv);let e=new gn.Command;e.name("badgerclaw").description("BadgerClaw CLI \u2014 one-click bot provisioning").version("0.2.45"),e.addCommand(xo),e.addCommand(Ro),e.addCommand(Eo),e.addCommand(Mo),e.addCommand(mo),e.addCommand(Zo),e.addCommand(rn),e.addCommand(Ko),e.addCommand(ln),e.addCommand(un),e.addCommand(mn),e.parse(process.argv)}Xs().catch(e=>{console.error(e),process.exit(1)});
131
+ Local Sessions:`)),console.log(p.default.dim(" Session".padEnd(25)+"Port".padEnd(8)+"MCP PID".padEnd(10)+"Project".padEnd(40)+"Started")),console.log(p.default.dim(" "+"-".repeat(90)));for(let n of s)console.log(` ${n.sessionId.padEnd(25)}${String(n.port).padEnd(8)}${String(n.mcpPid).padEnd(10)}${n.projectDir.padEnd(40)}${n.startedAt}`)}console.log("")}catch(o){t.fail(p.default.red(`Failed to get status: ${o.message}`)),process.exit(1)}}),Ys=new Y.Command("group").description("Group bots/rooms into a shared Claude Code session").requiredOption("--session <id>","Session ID to group under").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").action(async e=>{let t=(0,re.default)("Grouping bot+room into session...").start();try{await z.default.post(`${se}/claude-code/toggle`,{botId:e.bot,roomId:e.room,enabled:!0,sessionId:e.session},{timeout:1e4}),t.succeed(p.default.green(`Grouped ${e.bot} + ${e.room} into session "${e.session}"`))}catch(o){let s=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to group: ${s}`)),process.exit(1)}}),Ks=new Y.Command("allow").description("Add a user to the Claude Code allowlist for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").requiredOption("--user <userId>","Matrix user ID to allow (e.g. @alice:server)").action(async e=>{let t=(0,re.default)("Adding user to allowlist...").start();try{await z.default.post(`${se}/claude-code/allow`,{botId:e.bot,roomId:e.room,userId:e.user},{timeout:1e4}),t.succeed(p.default.green(`Added ${e.user} to allowlist for ${e.bot} in ${e.room}`))}catch(o){let s=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to add user: ${s}`)),process.exit(1)}}),Qs=new Y.Command("revoke").description("Remove a user from the Claude Code allowlist for a bot+room").requiredOption("--bot <botId>","Bot ID or username").requiredOption("--room <roomId>","Matrix room ID").requiredOption("--user <userId>","Matrix user ID to revoke").action(async e=>{let t=(0,re.default)("Removing user from allowlist...").start();try{await z.default.post(`${se}/claude-code/revoke`,{botId:e.bot,roomId:e.room,userId:e.user},{timeout:1e4}),t.succeed(p.default.green(`Removed ${e.user} from allowlist for ${e.bot} in ${e.room}`))}catch(o){let s=o.response?.data?.message||o.message||"Unknown error";t.fail(p.default.red(`Failed to revoke user: ${s}`)),process.exit(1)}}),mn=new Y.Command("claude-code").description("Manage Claude Code sessions (relay Matrix messages to local Claude Code)").addCommand(Hs).addCommand(Js).addCommand(zs).addCommand(Ys).addCommand(Ks).addCommand(Qs);async function Xs(){await nn(process.argv);let e=new gn.Command;e.name("badgerclaw").description("BadgerClaw CLI \u2014 one-click bot provisioning").version("0.2.46"),e.addCommand(xo),e.addCommand(Ro),e.addCommand(Eo),e.addCommand(Mo),e.addCommand(mo),e.addCommand(Zo),e.addCommand(rn),e.addCommand(Ko),e.addCommand(ln),e.addCommand(un),e.addCommand(mn),e.parse(process.argv)}Xs().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.2.45",
3
+ "version": "0.2.46",
4
4
  "description": "BadgerClaw CLI — one-click bot provisioning",
5
5
  "main": "dist/index.js",
6
6
  "bin": {