clawdi 0.2.2 → 0.2.3
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 +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -135,7 +135,7 @@ ${z}
|
|
|
135
135
|
`);return""}class T8{agentType="openclaw";async detect(){if(!i6(hq()))return!1;if(i6(MT()))return!0;return oz().length>0}async getVersion(){let{execSync:$}=await import("node:child_process");try{return $("openclaw --version",{encoding:"utf-8",stdio:"pipe"}).trim().split(`
|
|
136
136
|
`)[0]||null}catch{try{return $("openclaw --help",{encoding:"utf-8",stdio:"pipe"}).trim().split(`
|
|
137
137
|
`)[0]||null}catch{return null}}}async collectSessions($,v){let U=oz();if(U.length===0)return[];let X=$?.getTime()??0,J=null;if(v){let{resolve:W}=await import("node:path");J=W(v)}let Q=[];for(let W of U){let G=j0(W,"sessions"),z=j0(G,"sessions.json");if(!i6(z))continue;let Y;try{Y=JSON.parse(dz(z,"utf-8"))}catch{continue}for(let[D,B]of Object.entries(Y)){let H=B.updatedAt??B.acp?.lastActivityAt;if(!H)continue;if(H<X)continue;let F=B.acp?.cwd??null;if(J){if(!F)continue;if(F!==J&&!F.startsWith(`${J}/`))continue}let V=B.sessionFile?j0(G,B.sessionFile):j0(G,`${D}.jsonl`),K=[],b=null,O=null,E=new Set;if(B.model)E.add(B.model);let M=B.model??null;if(i6(V))try{let r=dz(V,"utf-8").split(`
|
|
138
|
-
`).filter(Boolean);for(let d of r){let h;try{h=JSON.parse(d)}catch{continue}let T$=h.timestamp?new Date(typeof h.timestamp==="number"?h.timestamp:h.timestamp):null;if(T$&&!Number.isNaN(T$.getTime())){if(!b)b=T$;O=T$}if(h.type==="model_change"&&h.modelId){E.add(h.modelId),M=h.modelId;continue}if(h.type!=="message")continue;let m$=h.message?.role;if(m$!=="user"&&m$!=="assistant")continue;let Q0=ET(h.message?.content);if(!Q0)continue;K.push({role:m$,content:Q0,model:m$==="assistant"?M??void 0:void 0,timestamp:T$?.toISOString()})}}catch{}if(K.length===0)continue;b??=new Date(H),O??=new Date(H);let C=Math.floor((O.getTime()-b.getTime())/1000),w=B.displayName??B.subject??B.label??K.find((r)=>r.role==="user")?.content.slice(0,200)??null;Q.push({localSessionId:D,projectPath:F,startedAt:b,endedAt:O,messageCount:K.length,inputTokens:B.inputTokens??0,outputTokens:B.outputTokens??0,cacheReadTokens:B.cacheRead??0,model:M,modelsUsed:[...E],durationSeconds:C,summary:w,messages:K,rawFilePath:i6(V)?V:z})}}return Q}async collectSkills(){let $=[],v=new Map;for(let U of oz()){let X=j0(U,"skills");if(!i6(X))continue;for(let J of az(X,{withFileTypes:!0})){if(!J.isDirectory())continue;if(g4.has(J.name))continue;let Q=j0(X,J.name),W=j0(Q,"SKILL.md");if(!i6(W))continue;let G=v.get(J.name);if(G){console.warn(`[openclaw] skipping duplicate skill "${J.name}" at ${Q} (already collected from ${G}). Set OPENCLAW_AGENT_ID to scope explicitly.`);continue}let z=dz(W,"utf-8"),Y=az(Q,{recursive:!0}).length;v.set(J.name,Q),$.push({skillKey:J.name,name:J.name,content:z,filePath:W,directoryPath:Q,isDirectory:Y>1})}}return $}getSkillPath($){return j0(pz(),$,"SKILL.md")}async writeSkillArchive($,v){let U=j0(pz(),$);if(i6(U))jT(U,{recursive:!0,force:!0});LT(U,{recursive:!0}),await o4(pz(),v)}buildRunCommand($,v){return["openclaw",...$]}}var tz=q(()=>{n1();f4()});import{join as cq}from"node:path";function C8(){return Object.keys(j$).map(($)=>({agentType:$,...j$[$]}))}function nq($){return j$[$]??null}function z3($){let v=j$[$]?.home();if(!v)return null;if($==="openclaw"){let U=process.env.OPENCLAW_AGENT_ID||"main";return cq(v,"agents",U,"skills","clawdi")}if($==="claude_code"||$==="codex"||$==="hermes")return cq(v,"skills","clawdi");return null}var K4,j$;var e4=q(()=>{mz();iz();rz();tz();f4();K4=["claude_code","codex","openclaw","hermes"],j$={claude_code:{displayName:"Claude Code",envFileName:"claude_code.json",home:NJ,create:()=>new R8},codex:{displayName:"Codex",envFileName:"codex.json",home:IJ,create:()=>new _8},openclaw:{displayName:"OpenClaw",envFileName:"openclaw.json",home:qJ,create:()=>new T8},hermes:{displayName:"Hermes",envFileName:"hermes.json",home:x4,create:()=>new k8}}});function PT(){return!!(process.env.CI||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS||process.env.BUILDKITE||process.env.JENKINS_URL||process.env.TEAMCITY_VERSION)}function r6(){return Boolean(process.stdout.isTTY&&process.stdin.isTTY&&!PT())}var tq={};u$(tq,{setup:()=>ZT});import{execSync as D3}from"node:child_process";import{createHash as ST}from"node:crypto";import{cpSync as RT,existsSync as Y3,mkdirSync as aq,writeFileSync as _T}from"node:fs";import{hostname as iq}from"node:os";import{join as B3,resolve as rq}from"node:path";async function ZT($){if(!g$()){console.log(N.red("Not logged in. Run `clawdi auth login` first.")),process.exitCode=1;return}let v=ST("sha256").update(`${iq()}-${process.platform}-${process.arch}`).digest("hex").slice(0,16),U=iq(),X=new q$;if($.agent){if(!K4.includes($.agent)){console.log(N.red(`Unknown agent type: ${$.agent}`)),console.log(N.gray(`Valid types: ${K4.join(", ")}`)),process.exitCode=1;return}let W=$.agent;await dq(X,W,null,v,U),await oq(W),await pq(W);return}console.log(N.cyan("Detecting installed agents..."));let J=[];for(let W of C8()){let G=W.create();if(await G.detect()){let z=await G.getVersion();J.push({adapter:G,version:z})}}if(J.length===0){console.log(N.yellow(" No supported agents detected.")),console.log(N.gray(" Use --agent to specify manually."));return}let Q;if($.yes||!r6())Q=J;else{console.log();let W=await BJ({message:"Register which agents?",options:J.map((z)=>({value:z.adapter.agentType,label:`${j$[z.adapter.agentType].displayName}${z.version?` (${z.version})`:""}
|
|
138
|
+
`).filter(Boolean);for(let d of r){let h;try{h=JSON.parse(d)}catch{continue}let T$=h.timestamp?new Date(typeof h.timestamp==="number"?h.timestamp:h.timestamp):null;if(T$&&!Number.isNaN(T$.getTime())){if(!b)b=T$;O=T$}if(h.type==="model_change"&&h.modelId){E.add(h.modelId),M=h.modelId;continue}if(h.type!=="message")continue;let m$=h.message?.role;if(m$!=="user"&&m$!=="assistant")continue;let Q0=ET(h.message?.content);if(!Q0)continue;K.push({role:m$,content:Q0,model:m$==="assistant"?M??void 0:void 0,timestamp:T$?.toISOString()})}}catch{}if(K.length===0)continue;b??=new Date(H),O??=new Date(H);let C=Math.floor((O.getTime()-b.getTime())/1000),w=B.displayName??B.subject??B.label??K.find((r)=>r.role==="user")?.content.slice(0,200)??null;Q.push({localSessionId:D,projectPath:F,startedAt:b,endedAt:O,messageCount:K.length,inputTokens:B.inputTokens??0,outputTokens:B.outputTokens??0,cacheReadTokens:B.cacheRead??0,model:M,modelsUsed:[...E],durationSeconds:C,summary:w,messages:K,rawFilePath:i6(V)?V:z})}}return Q}async collectSkills(){let $=[],v=new Map;for(let U of oz()){let X=j0(U,"skills");if(!i6(X))continue;for(let J of az(X,{withFileTypes:!0})){if(!J.isDirectory())continue;if(g4.has(J.name))continue;let Q=j0(X,J.name),W=j0(Q,"SKILL.md");if(!i6(W))continue;let G=v.get(J.name);if(G){console.warn(`[openclaw] skipping duplicate skill "${J.name}" at ${Q} (already collected from ${G}). Set OPENCLAW_AGENT_ID to scope explicitly.`);continue}let z=dz(W,"utf-8"),Y=az(Q,{recursive:!0}).length;v.set(J.name,Q),$.push({skillKey:J.name,name:J.name,content:z,filePath:W,directoryPath:Q,isDirectory:Y>1})}}return $}getSkillPath($){return j0(pz(),$,"SKILL.md")}async writeSkillArchive($,v){let U=j0(pz(),$);if(i6(U))jT(U,{recursive:!0,force:!0});LT(U,{recursive:!0}),await o4(pz(),v)}buildRunCommand($,v){return["openclaw",...$]}}var tz=q(()=>{n1();f4()});import{join as cq}from"node:path";function C8(){return Object.keys(j$).map(($)=>({agentType:$,...j$[$]}))}function nq($){return j$[$]??null}function z3($){let v=j$[$]?.home();if(!v)return null;if($==="openclaw"){let U=process.env.OPENCLAW_AGENT_ID||"main";return cq(v,"agents",U,"skills","clawdi")}if($==="claude_code"||$==="codex"||$==="hermes")return cq(v,"skills","clawdi");return null}var K4,j$;var e4=q(()=>{mz();iz();rz();tz();f4();K4=["claude_code","codex","openclaw","hermes"],j$={claude_code:{displayName:"Claude Code",envFileName:"claude_code.json",home:NJ,create:()=>new R8},codex:{displayName:"Codex",envFileName:"codex.json",home:IJ,create:()=>new _8},openclaw:{displayName:"OpenClaw",envFileName:"openclaw.json",home:qJ,create:()=>new T8},hermes:{displayName:"Hermes",envFileName:"hermes.json",home:x4,create:()=>new k8}}});function PT(){return!!(process.env.CI||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS||process.env.BUILDKITE||process.env.JENKINS_URL||process.env.TEAMCITY_VERSION)}function r6(){return Boolean(process.stdout.isTTY&&process.stdin.isTTY&&!PT())}var tq={};u$(tq,{setup:()=>ZT});import{execSync as D3}from"node:child_process";import{createHash as ST}from"node:crypto";import{cpSync as RT,existsSync as Y3,mkdirSync as aq,writeFileSync as _T}from"node:fs";import{hostname as iq}from"node:os";import{join as B3,resolve as rq}from"node:path";async function ZT($){if(!g$()){console.log(N.red("Not logged in. Run `clawdi auth login` first.")),process.exitCode=1;return}let v=ST("sha256").update(`${iq()}-${process.platform}-${process.arch}`).digest("hex").slice(0,16),U=iq(),X=new q$;if($.agent){if(!K4.includes($.agent)){console.log(N.red(`Unknown agent type: ${$.agent}`)),console.log(N.gray(`Valid types: ${K4.join(", ")}`)),process.exitCode=1;return}let W=$.agent;await dq(X,W,null,v,U),await oq(W),await pq(W);return}console.log(N.cyan("Detecting installed agents..."));let J=[];for(let W of C8()){let G=W.create();if(await G.detect()){let z=await G.getVersion();J.push({adapter:G,version:z})}}if(J.length===0){console.log(N.yellow(" No supported agents detected.")),console.log(N.gray(" Use --agent to specify manually."));return}let Q;if($.yes||!r6())Q=J;else{console.log();let W=await BJ({message:"Register which agents?",options:J.map((z)=>({value:z.adapter.agentType,label:`${j$[z.adapter.agentType].displayName}${z.version?` (${z.version})`:""}`,...z.version?{}:{hint:"data only — binary not on PATH"}})),initialValues:J.filter((z)=>z.version!==null).map((z)=>z.adapter.agentType),required:!1});if(Z0(W)){I6("Cancelled.");return}let G=new Set(W);Q=J.filter((z)=>G.has(z.adapter.agentType))}if(Q.length===0){console.log(N.gray("No agents selected."));return}console.log();for(let{adapter:W,version:G}of Q)await dq(X,W.agentType,G,v,U),await oq(W.agentType),await pq(W.agentType)}async function dq($,v,U,X,J){try{let Q=H$(await $.POST("/api/environments",{body:{machine_id:X,machine_name:J,agent_type:v,agent_version:U,os:process.platform}})),W=B3(v0(),"environments");aq(W,{recursive:!0}),_T(B3(W,`${v}.json`),`${JSON.stringify({id:Q.id,agentType:v,machineId:X,machineName:J},null,2)}
|
|
139
139
|
`,{mode:384}),console.log(N.green(`✓ ${j$[v].displayName} registered`))}catch(Q){console.log(N.red(` Failed to register ${j$[v].displayName}: ${G0(Q)}`))}}async function pq($){let v=z3($);if(!v)return;let U=j$[$].displayName,X=rq(import.meta.dirname,"../../skills/clawdi");if(!Y3(X))X=rq(import.meta.dirname,"skills/clawdi");if(!Y3(X)){console.log(N.yellow("⚠ Built-in skill not found, skipping."));return}let J=Y3(B3(v,"SKILL.md"));try{aq(v,{recursive:!0}),RT(X,v,{recursive:!0,force:!0}),console.log(N.green(`✓ Clawdi skill ${J?"updated":"installed"} in ${U}`))}catch{console.log(N.yellow("⚠ Could not install Clawdi skill."))}}async function oq($){if($==="hermes")return kT();if($==="openclaw")return CT();if($==="codex")return TT();if($!=="claude_code")return;try{let U=D3("claude mcp list",{encoding:"utf-8",stdio:"pipe"});if(/^\s*clawdi:\s/m.test(U)){console.log(N.gray("✓ MCP server already registered"));return}}catch{}let v=JSON.stringify({type:"stdio",command:"clawdi",args:["mcp"]});try{D3(`claude mcp add-json clawdi '${v}' --scope user`,{stdio:"pipe"}),console.log(N.green("✓ MCP server registered in Claude Code"))}catch{console.log(N.yellow("⚠ Could not auto-register MCP server.")),console.log(N.gray(` Run manually: claude mcp add-json clawdi '${v}' --scope user`))}}async function kT(){let $=B3(x4(),"config.yaml");if(!Y3($)){console.log(N.yellow("⚠ Hermes config.yaml not found, skipping MCP registration."));return}let{readFileSync:v,writeFileSync:U}=await import("node:fs"),X=v($,"utf-8");if(/^mcp_servers:/m.test(X)&&/^\s+clawdi:/m.test(X)){console.log(N.gray("✓ MCP server already registered in Hermes"));return}let J=` clawdi:
|
|
140
140
|
command: "clawdi"
|
|
141
141
|
args: ["mcp"]`,Q=`mcp_servers:
|