skill-atlas-cli 0.9.1 → 0.11.0

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/bin/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import e,{readFileSync as t}from"node:fs";import{cac as n}from"cac";import r from"chalk";import{agentRegister as i,checkForUpdate as a,logger as o}from"../lib/index.js";import{createHash as s,randomBytes as c,randomUUID as l}from"node:crypto";import u,{join as d}from"node:path";import f from"semver";import p from"node:os";import{spawn as m}from"node:child_process";import*as h from"@clack/prompts";import g from"axios";import _,{basename as v,dirname as y,join as b,normalize as x,relative as ee,resolve as S,sep as te}from"path";import{existsSync as C,writeFileSync as ne}from"fs";import re,{homedir as ie,platform as ae,tmpdir as oe}from"os";import*as se from"readline";import{Writable as ce}from"stream";import{cp as le,lstat as ue,mkdir as de,readFile as fe,readdir as pe,readlink as me,realpath as he,rename as ge,rm as w,stat as _e,symlink as ve,unlink as ye,writeFile as be}from"fs/promises";import{fileURLToPath as xe}from"url";import{info as Se}from"console";import{execFileSync as Ce}from"child_process";import{createConsola as we}from"consola";import Te from"secp256k1";var Ee=Object.create,De=Object.defineProperty,Oe=Object.getOwnPropertyDescriptor,ke=Object.getOwnPropertyNames,Ae=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty,Me=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Ne=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=ke(t),a=0,o=i.length,s;a<o;a++)s=i[a],!je.call(e,s)&&s!==n&&De(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=Oe(t,s))||r.enumerable});return e},Pe=(e,t,n)=>(n=e==null?{}:Ee(Ae(e)),Ne(t||!e||!e.__esModule?De(n,`default`,{value:e,enumerable:!0}):n,e));const T=process.env.SKILLATLAS_CONFIG_DIR||u.join(p.homedir(),`.skillatlas`),Fe=u.join(T,`auth.json`),E=u.join(T,`skillatlas-meta.json`),Ie={production:{apiBase:`https://skillatlas.cn/`},pre:{apiBase:`https://pre-skillhub.aliyun-inc.com/`}},Le=process.env.SKILLATLAS_ENV||`production`;let Re=process.env.SKILLATLAS_API_BASE||Ie[Le].apiBase;const D=process.env.OPENCLAW_STATE_DIR||u.join(p.homedir(),`.openclaw`),O=u.join(D,`seafood-lock.json`),ze=u.join(D,`identity`,`device.json`),Be={skill:`skills`,plugin:`plugins`,trigger:`triggers`,channel:`channels`,experience:`experiences`},Ve={project:`maas-skill-hub`,logStore:`cli`,endpoint:process.env.SKILLATLAS_SLS_ENDPOINT||`cn-hangzhou.log.aliyuncs.com`};function He(){let e=process.env.SKILLATLAS_DISABLE_TELEMETRY;return e===`1`||e===`true`}function Ue(){return Ve}function We(){return Le}function k(){e.existsSync(T)||e.mkdirSync(T,{recursive:!0})}function Ge(e){let t=Be[e];if(!t)throw Error(`Unknown asset type: ${e}. Valid types: ${Object.keys(Be).join(`, `)}`);return u.join(D,t)}function Ke(){return Re}function qe(e){Re=e.replace(/\/+$/,``)}function Je(){qe(Ie.pre.apiBase)}function Ye(){if(process.env.OPENCLAWMP_TOKEN)return process.env.OPENCLAWMP_TOKEN;if(k(),e.existsSync(Fe))try{let t=JSON.parse(e.readFileSync(Fe,`utf-8`));if(t.token)return t.token}catch{}return null}function Xe(t,n={}){k();let r={token:t,savedAt:new Date().toISOString(),...n};e.writeFileSync(Fe,JSON.stringify(r,null,2)+`
2
+ import e,{readFileSync as t}from"node:fs";import{cac as n}from"cac";import r from"chalk";import{agentRegister as i,checkForUpdate as a,logger as o}from"../lib/index.js";import{createHash as s,randomBytes as c,randomUUID as l}from"node:crypto";import u,{join as d}from"node:path";import f from"semver";import p from"node:os";import{spawn as m}from"node:child_process";import*as h from"@clack/prompts";import g from"axios";import _,{basename as v,dirname as y,join as b,normalize as x,relative as ee,resolve as S,sep as te}from"path";import{existsSync as C,writeFileSync as ne}from"fs";import re,{homedir as ie,platform as ae,tmpdir as oe}from"os";import*as se from"readline";import{Writable as ce}from"stream";import{cp as le,lstat as ue,mkdir as de,readFile as fe,readdir as pe,readlink as me,realpath as he,rename as ge,rm as w,stat as _e,symlink as ve,unlink as ye,writeFile as be}from"fs/promises";import{fileURLToPath as xe}from"url";import{info as Se}from"console";import{execFileSync as Ce}from"child_process";import{createConsola as we}from"consola";import Te from"secp256k1";var Ee=Object.create,De=Object.defineProperty,Oe=Object.getOwnPropertyDescriptor,ke=Object.getOwnPropertyNames,Ae=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty,Me=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Ne=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=ke(t),a=0,o=i.length,s;a<o;a++)s=i[a],!je.call(e,s)&&s!==n&&De(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=Oe(t,s))||r.enumerable});return e},Pe=(e,t,n)=>(n=e==null?{}:Ee(Ae(e)),Ne(t||!e||!e.__esModule?De(n,`default`,{value:e,enumerable:!0}):n,e));const T=process.env.SKILLATLAS_CONFIG_DIR||u.join(p.homedir(),`.skillatlas`),Fe=u.join(T,`auth.json`),E=u.join(T,`skillatlas-meta.json`),Ie={production:{apiBase:`https://skillhub.wanuai.cn/`},pre:{apiBase:`https://pre-skillhub.aliyun-inc.com/`}},Le=process.env.SKILLATLAS_ENV||`production`;let Re=process.env.SKILLATLAS_API_BASE||Ie[Le].apiBase;const D=process.env.OPENCLAW_STATE_DIR||u.join(p.homedir(),`.openclaw`),O=u.join(D,`seafood-lock.json`),ze=u.join(D,`identity`,`device.json`),Be={skill:`skills`,plugin:`plugins`,trigger:`triggers`,channel:`channels`,experience:`experiences`},Ve={project:`maas-skill-hub`,logStore:`cli`,endpoint:process.env.SKILLATLAS_SLS_ENDPOINT||`cn-hangzhou.log.aliyuncs.com`};function He(){let e=process.env.SKILLATLAS_DISABLE_TELEMETRY;return e===`1`||e===`true`}function Ue(){return Ve}function We(){return Le}function k(){e.existsSync(T)||e.mkdirSync(T,{recursive:!0})}function Ge(e){let t=Be[e];if(!t)throw Error(`Unknown asset type: ${e}. Valid types: ${Object.keys(Be).join(`, `)}`);return u.join(D,t)}function Ke(){return Re}function qe(e){Re=e.replace(/\/+$/,``)}function Je(){qe(Ie.pre.apiBase)}function Ye(){if(process.env.OPENCLAWMP_TOKEN)return process.env.OPENCLAWMP_TOKEN;if(k(),e.existsSync(Fe))try{let t=JSON.parse(e.readFileSync(Fe,`utf-8`));if(t.token)return t.token}catch{}return null}function Xe(t,n={}){k();let r={token:t,savedAt:new Date().toISOString(),...n};e.writeFileSync(Fe,JSON.stringify(r,null,2)+`
3
3
  `)}function Ze(){if(!e.existsSync(ze))return null;try{return JSON.parse(e.readFileSync(ze,`utf-8`)).deviceId||null}catch{return null}}function Qe(){k();let t={};if(e.existsSync(E))try{if(t=JSON.parse(e.readFileSync(E,`utf-8`)),t.agentId)return t.agentId}catch{}return null}function $e(t,n,r,i){k();let a={};if(e.existsSync(E))try{a=JSON.parse(e.readFileSync(E,`utf-8`))}catch{}a.agentId=t,a.token=n,r&&(a.registeredAt=r),i&&(a.expiresAt=i),a.credentialsSavedAt=new Date().toISOString(),e.writeFileSync(E,JSON.stringify(a,null,2)+`
4
4
  `)}function et(){if(!e.existsSync(E))return null;try{let t=JSON.parse(e.readFileSync(E,`utf-8`));return t.agentId&&t.token?{agentId:t.agentId,token:t.token,registeredAt:t.registeredAt,expiresAt:t.expiresAt}:null}catch{return null}}function tt(){if(!e.existsSync(O)){let t=u.dirname(O);e.existsSync(t)||e.mkdirSync(t,{recursive:!0}),e.writeFileSync(O,JSON.stringify({version:1,installed:{}},null,2)+`
5
5
  `)}}function nt(){tt();try{return JSON.parse(e.readFileSync(O,`utf-8`))}catch{return{version:1,installed:{}}}}function rt(t,n,r){let i=nt();i.installed[t]={version:n,installedAt:new Date().toISOString(),location:r},e.writeFileSync(O,JSON.stringify(i,null,2)+`
@@ -54,7 +54,7 @@ Example: skill-atlas install-batch weather search-tool`});let a=X.createProgress
54
54
  `),j.default.green(`上传记录 (第 ${t} 页,共 ${n} 条)`))}function Wr(e){if(e instanceof F)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var Gr={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas skill-upload-list`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=X.createProgressReporter(n);r.start(`正在查询上传记录...`);try{let n=await qt({slug:e.slug,status:e.status,page:e.page,pageSize:e.pageSize},t.token);n.success||(r.stop(`查询失败`),h.log.error(n.message||`查询上传记录失败`),process.exit(1)),r.stop(`查询完成`),Ur(n.data?.items??[],n.data?.page??1,n.data?.total??0),h.outro(j.default.green(`完成!`))}catch(e){r.stop(`查询失败`),h.log.error(Wr(e)),process.exit(1)}}};function Kr(e){return e.serviceCode?.trim()?e.payload?.trim()?{valid:!0}:{valid:!1,error:`缺少必需参数: --payload`}:{valid:!1,error:`缺少必需参数: --service-code`}}function qr(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{valid:!1,error:`payload 必须是有效的 JSON 对象`}:{valid:!0,payload:t}}catch{return{valid:!1,error:`payload 必须是有效的 JSON 格式`}}}function Jr(e,t){let n={payload:e};return t.clientRequestId?.trim()&&(n.clientRequestId=t.clientRequestId.trim()),t.skillExecutionId?.trim()&&(n.skillExecutionId=t.skillExecutionId.trim()),t.skillSlug?.trim()&&(n.skillSlug=t.skillSlug.trim()),n}function Yr(e){if(e instanceof F)switch(e.code){case`SERVICE_DISABLED`:return`服务凭据冷却中,请稍后重试`;case`UPSTREAM_ERROR`:return`第三方服务拒绝请求`;case`UPSTREAM_TIMEOUT_CHARGED`:return`上游服务超时,已按消费处理`;case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;case`INSUFFICIENT_CREDITS`:return`Credits 余额不足`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}function Xr(e,t){return`本次扣费: ${e} credits | 剩余: ${t} credits`}var Zr={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas service-gateway-invoke`));let n=Kr(e);if(!n.valid){h.log.error(n.error),process.exit(1);return}let r=qr(e.payload);if(!r.valid){h.log.error(r.error),process.exit(1);return}let i=Jr(r.payload,e),a=e.serviceCode.trim(),o=!process.stdout.isTTY||!process.stdin.isTTY,s=X.createProgressReporter(o);s.start(`正在调用服务: ${a}...`);let c;try{c=await Yt(a,i,t.token,void 0,18e4)}catch(e){s.stop(`调用失败`);let t=Yr(e);if(h.log.error(t),e instanceof F&&e.responseData){let t=e.responseData;t.data?.creditsCharged!==void 0&&t.data?.creditsBalance!==void 0&&h.log.info(Xr(t.data.creditsCharged,t.data.creditsBalance))}P.setLastError(e),process.exit(1);return}if(!c.success){s.stop(`调用失败`),h.log.error(c.message||`服务调用失败`),c.data?.creditsCharged!==void 0&&c.data?.creditsBalance!==void 0&&h.log.info(Xr(c.data.creditsCharged,c.data.creditsBalance)),P.setLastError(new F(c.message||`服务调用失败`,c.code,c)),process.exit(1);return}s.stop(`服务调用成功`);let l=c.data,u=[` ${j.default.green(`服务编码:`)} ${l.serviceCode}`,` ${j.default.green(`调用状态:`)} ${l.invokeStatus}`];l.creditsCharged!==void 0&&u.push(` ${j.default.green(`本次扣费:`)} ${l.creditsCharged} credits`),l.creditsBalance!==void 0&&u.push(` ${j.default.green(`剩余余额:`)} ${l.creditsBalance} credits`),h.note(u.join(`
55
55
  `),j.default.green(`调用结果`)),l.result!==void 0&&(console.log(`
56
56
  `+j.default.bold(`返回数据:`)),console.log(JSON.stringify(l.result,null,2))),h.outro(j.default.green(`完成!`))}};const Qr=process.env.SKILLATLAS_CONFIG_DIR||u.join(p.homedir(),`.skillatlas`),$r=u.join(Qr,`mail-config.json`);function ei(){e.existsSync(Qr)||e.mkdirSync(Qr,{recursive:!0})}function ti(){if(!e.existsSync($r))return{};try{let t=e.readFileSync($r,`utf-8`);return JSON.parse(t)}catch{return{}}}function ni(t){ei(),t.updatedAt=new Date().toISOString(),e.writeFileSync($r,JSON.stringify(t,null,2)+`
57
- `)}function ri(e,t){let n=ti();n[e]=t,ni(n)}function ii(e){let t=ti()[e];if(t!=null)return String(t)}function ai(){let e=ti(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function oi(e){return e in ti()&&e!==`updatedAt`}const si=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function ci(){return ii(`mailbox`)}const li={production:`xiaxiaobao.cn`};function ui(e,t){return`https://${li.production}/agents/${e}?token=${t}`}var di={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=ui(n,r),a=null,o=!1,s=X.createProgressReporter();s.start(`正在获取 Agent 信息...`);try{let e=await Zt(n,r);e.success&&e.data&&(a=e.data),s.stop(`获取成功`)}catch{o=!0,s.stop(`无法连接服务器,仅显示本地信息`)}let c=[];if(c.push(` ${j.default.green(`Agent ID:`)} ${n}`),c.push(` ${j.default.green(`环境:`)} 生产环境`),a?.metadata&&(c.push(` ${j.default.green(`名称:`)} ${a.metadata.name}`),a.metadata.avatar&&c.push(` ${j.default.green(`头像:`)} ${a.metadata.avatar}`)),a?.creditAccount){let e=a.creditAccount;c.push(``),c.push(` ${j.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),c.push(` ${j.default.green(`可用 Credits:`)} ${e.availableCredits}`),c.push(` ${j.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),c.push(` ${j.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),c.push(` ${j.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&c.push(` ${j.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let l=ii(`mailbox`);l&&(c.push(``),c.push(` ${j.default.cyan(`--- 邮箱信息 ---`)}`),c.push(` ${j.default.green(`默认邮箱 ID:`)} ${l}`)),c.push(``),c.push(` ${j.default.green(`虾小宝主页链接:`)}`),c.push(` [您的虾小宝Agent 主页](${i})`),h.note(c.join(`
57
+ `)}function ri(e,t){let n=ti();n[e]=t,ni(n)}function ii(e){let t=ti()[e];if(t!=null)return String(t)}function ai(){let e=ti(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function oi(e){return e in ti()&&e!==`updatedAt`}const si=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function ci(){return ii(`mailbox`)}const li={production:`skillhub.wanuai.cn`};function ui(e,t){return`https://${li.production}/agents/${e}?token=${t}`}var di={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=ui(n,r),a=null,o=!1,s=X.createProgressReporter();s.start(`正在获取 Agent 信息...`);try{let e=await Zt(n,r);e.success&&e.data&&(a=e.data),s.stop(`获取成功`)}catch{o=!0,s.stop(`无法连接服务器,仅显示本地信息`)}let c=[];if(c.push(` ${j.default.green(`Agent ID:`)} ${n}`),c.push(` ${j.default.green(`环境:`)} 生产环境`),a?.metadata&&(c.push(` ${j.default.green(`名称:`)} ${a.metadata.name}`),a.metadata.avatar&&c.push(` ${j.default.green(`头像:`)} ${a.metadata.avatar}`)),a?.creditAccount){let e=a.creditAccount;c.push(``),c.push(` ${j.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),c.push(` ${j.default.green(`可用 Credits:`)} ${e.availableCredits}`),c.push(` ${j.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),c.push(` ${j.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),c.push(` ${j.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&c.push(` ${j.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let l=ii(`mailbox`);l&&(c.push(``),c.push(` ${j.default.cyan(`--- 邮箱信息 ---`)}`),c.push(` ${j.default.green(`默认邮箱 ID:`)} ${l}`)),c.push(``),c.push(` ${j.default.green(`虾小宝主页链接:`)}`),c.push(` [您的虾小宝Agent 主页](${i})`),h.note(c.join(`
58
58
  `),j.default.green(`Agent 信息`)),o&&h.log.warn(`无法获取在线信息,部分数据可能不完整`),h.outro(j.default.green(`完成!`))}};function fi(e){switch(e){case`consume`:return j.default.red(e);case`grant`:return j.default.green(e);case`refund`:return j.default.yellow(e);default:return e}}function pi(e){return e>0?j.default.green(`+${e}`):e<0?j.default.red(`${e}`):`${e}`}function mi(e,t,n){if(e.length===0){h.log.info(`暂无流水记录`);return}let r=e.map((e,t)=>[`${j.default.bold(j.default.cyan(`${t+1}. #${e.id}`))} ${fi(e.changeType)}`,` ${j.default.dim(`变更额度:`)} ${pi(e.deltaCredits)} | ${j.default.dim(`变更后余额:`)} ${e.balanceAfter}`,` ${j.default.dim(`服务编码:`)} ${e.serviceCode||j.default.dim(`N/A`)}`,` ${j.default.dim(`时间:`)} ${Z(e.createdAt)}`].join(`
59
59
  `));h.note(r.join(`
60
60
 
package/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import e,{existsSync as t,mkdirSync as n,readFileSync as r,writeFileSync as i}from"node:fs";import a,{join as o}from"node:path";import s from"semver";import c from"node:os";import{spawn as l}from"node:child_process";import*as u from"@clack/prompts";import d from"chalk";import f from"axios";import p,{basename as ee,dirname as m,join as h,normalize as g,relative as _,resolve as v,sep as te}from"path";import{existsSync as y,writeFileSync as ne}from"fs";import re,{homedir as ie,platform as ae,tmpdir as oe}from"os";import*as se from"readline";import{Writable as ce}from"stream";import{cp as le,lstat as ue,mkdir as b,readFile as de,readdir as fe,readlink as pe,realpath as me,rename as he,rm as x,stat as ge,symlink as _e,unlink as ve,writeFile as ye}from"fs/promises";import{fileURLToPath as be}from"url";import{info as xe}from"console";import{execFileSync as Se}from"child_process";import{createConsola as Ce}from"consola";import{createHash as we,randomBytes as Te}from"node:crypto";import S from"secp256k1";var Ee=Object.create,De=Object.defineProperty,Oe=Object.getOwnPropertyDescriptor,ke=Object.getOwnPropertyNames,Ae=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty,Me=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Ne=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=ke(t),a=0,o=i.length,s;a<o;a++)s=i[a],!je.call(e,s)&&s!==n&&De(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=Oe(t,s))||r.enumerable});return e},Pe=(e,t,n)=>(n=e==null?{}:Ee(Ae(e)),Ne(t||!e||!e.__esModule?De(n,`default`,{value:e,enumerable:!0}):n,e));const C=process.env.SKILLATLAS_CONFIG_DIR||a.join(c.homedir(),`.skillatlas`),Fe=a.join(C,`auth.json`),w=a.join(C,`skillatlas-meta.json`),Ie={production:{apiBase:`https://skillatlas.cn/`},pre:{apiBase:`https://pre-skillhub.aliyun-inc.com/`}},Le=process.env.SKILLATLAS_ENV||`production`;let Re=process.env.SKILLATLAS_API_BASE||Ie[Le].apiBase;const ze=process.env.OPENCLAW_STATE_DIR||a.join(c.homedir(),`.openclaw`),T=a.join(ze,`seafood-lock.json`),Be=a.join(ze,`identity`,`device.json`),Ve={skill:`skills`,plugin:`plugins`,trigger:`triggers`,channel:`channels`,experience:`experiences`},He={project:`maas-skill-hub`,logStore:`cli`,endpoint:process.env.SKILLATLAS_SLS_ENDPOINT||`cn-hangzhou.log.aliyuncs.com`};function Ue(){let e=process.env.SKILLATLAS_DISABLE_TELEMETRY;return e===`1`||e===`true`}function We(){return He}function Ge(){return Le}function E(){e.existsSync(C)||e.mkdirSync(C,{recursive:!0})}function Ke(e){let t=Ve[e];if(!t)throw Error(`Unknown asset type: ${e}. Valid types: ${Object.keys(Ve).join(`, `)}`);return a.join(ze,t)}function qe(){return Re}function Je(e){Re=e.replace(/\/+$/,``)}function Ye(){Je(Ie.pre.apiBase)}function Xe(){if(process.env.OPENCLAWMP_TOKEN)return process.env.OPENCLAWMP_TOKEN;if(E(),e.existsSync(Fe))try{let t=JSON.parse(e.readFileSync(Fe,`utf-8`));if(t.token)return t.token}catch{}return null}function Ze(t,n={}){E();let r={token:t,savedAt:new Date().toISOString(),...n};e.writeFileSync(Fe,JSON.stringify(r,null,2)+`
1
+ import e,{existsSync as t,mkdirSync as n,readFileSync as r,writeFileSync as i}from"node:fs";import a,{join as o}from"node:path";import s from"semver";import c from"node:os";import{spawn as l}from"node:child_process";import*as u from"@clack/prompts";import d from"chalk";import f from"axios";import p,{basename as ee,dirname as m,join as h,normalize as g,relative as _,resolve as v,sep as te}from"path";import{existsSync as y,writeFileSync as ne}from"fs";import re,{homedir as ie,platform as ae,tmpdir as oe}from"os";import*as se from"readline";import{Writable as ce}from"stream";import{cp as le,lstat as ue,mkdir as b,readFile as de,readdir as fe,readlink as pe,realpath as me,rename as he,rm as x,stat as ge,symlink as _e,unlink as ve,writeFile as ye}from"fs/promises";import{fileURLToPath as be}from"url";import{info as xe}from"console";import{execFileSync as Se}from"child_process";import{createConsola as Ce}from"consola";import{createHash as we,randomBytes as Te}from"node:crypto";import S from"secp256k1";var Ee=Object.create,De=Object.defineProperty,Oe=Object.getOwnPropertyDescriptor,ke=Object.getOwnPropertyNames,Ae=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty,Me=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Ne=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=ke(t),a=0,o=i.length,s;a<o;a++)s=i[a],!je.call(e,s)&&s!==n&&De(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=Oe(t,s))||r.enumerable});return e},Pe=(e,t,n)=>(n=e==null?{}:Ee(Ae(e)),Ne(t||!e||!e.__esModule?De(n,`default`,{value:e,enumerable:!0}):n,e));const C=process.env.SKILLATLAS_CONFIG_DIR||a.join(c.homedir(),`.skillatlas`),Fe=a.join(C,`auth.json`),w=a.join(C,`skillatlas-meta.json`),Ie={production:{apiBase:`https://skillhub.wanuai.cn/`},pre:{apiBase:`https://pre-skillhub.aliyun-inc.com/`}},Le=process.env.SKILLATLAS_ENV||`production`;let Re=process.env.SKILLATLAS_API_BASE||Ie[Le].apiBase;const ze=process.env.OPENCLAW_STATE_DIR||a.join(c.homedir(),`.openclaw`),T=a.join(ze,`seafood-lock.json`),Be=a.join(ze,`identity`,`device.json`),Ve={skill:`skills`,plugin:`plugins`,trigger:`triggers`,channel:`channels`,experience:`experiences`},He={project:`maas-skill-hub`,logStore:`cli`,endpoint:process.env.SKILLATLAS_SLS_ENDPOINT||`cn-hangzhou.log.aliyuncs.com`};function Ue(){let e=process.env.SKILLATLAS_DISABLE_TELEMETRY;return e===`1`||e===`true`}function We(){return He}function Ge(){return Le}function E(){e.existsSync(C)||e.mkdirSync(C,{recursive:!0})}function Ke(e){let t=Ve[e];if(!t)throw Error(`Unknown asset type: ${e}. Valid types: ${Object.keys(Ve).join(`, `)}`);return a.join(ze,t)}function qe(){return Re}function Je(e){Re=e.replace(/\/+$/,``)}function Ye(){Je(Ie.pre.apiBase)}function Xe(){if(process.env.OPENCLAWMP_TOKEN)return process.env.OPENCLAWMP_TOKEN;if(E(),e.existsSync(Fe))try{let t=JSON.parse(e.readFileSync(Fe,`utf-8`));if(t.token)return t.token}catch{}return null}function Ze(t,n={}){E();let r={token:t,savedAt:new Date().toISOString(),...n};e.writeFileSync(Fe,JSON.stringify(r,null,2)+`
2
2
  `)}function Qe(){if(!e.existsSync(Be))return null;try{return JSON.parse(e.readFileSync(Be,`utf-8`)).deviceId||null}catch{return null}}function $e(){E();let t={};if(e.existsSync(w))try{if(t=JSON.parse(e.readFileSync(w,`utf-8`)),t.agentId)return t.agentId}catch{}return null}function et(t,n,r,i){E();let a={};if(e.existsSync(w))try{a=JSON.parse(e.readFileSync(w,`utf-8`))}catch{}a.agentId=t,a.token=n,r&&(a.registeredAt=r),i&&(a.expiresAt=i),a.credentialsSavedAt=new Date().toISOString(),e.writeFileSync(w,JSON.stringify(a,null,2)+`
3
3
  `)}function tt(){if(!e.existsSync(w))return null;try{let t=JSON.parse(e.readFileSync(w,`utf-8`));return t.agentId&&t.token?{agentId:t.agentId,token:t.token,registeredAt:t.registeredAt,expiresAt:t.expiresAt}:null}catch{return null}}function nt(){if(!e.existsSync(T)){let t=a.dirname(T);e.existsSync(t)||e.mkdirSync(t,{recursive:!0}),e.writeFileSync(T,JSON.stringify({version:1,installed:{}},null,2)+`
4
4
  `)}}function rt(){nt();try{return JSON.parse(e.readFileSync(T,`utf-8`))}catch{return{version:1,installed:{}}}}function it(t,n,r){let i=rt();i.installed[t]={version:n,installedAt:new Date().toISOString(),location:r},e.writeFileSync(T,JSON.stringify(i,null,2)+`
@@ -54,7 +54,7 @@ Example: skill-atlas install-batch weather search-tool`});let i=Z.createProgress
54
54
  `),O.default.green(`上传记录 (第 ${t} 页,共 ${n} 条)`))}function Jr(e){if(e instanceof M)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var Yr={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas skill-upload-list`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=Z.createProgressReporter(n);r.start(`正在查询上传记录...`);try{let n=await en({slug:e.slug,status:e.status,page:e.page,pageSize:e.pageSize},t.token);n.success||(r.stop(`查询失败`),u.log.error(n.message||`查询上传记录失败`),process.exit(1)),r.stop(`查询完成`),qr(n.data?.items??[],n.data?.page??1,n.data?.total??0),u.outro(O.default.green(`完成!`))}catch(e){r.stop(`查询失败`),u.log.error(Jr(e)),process.exit(1)}}};function Xr(e){return e.serviceCode?.trim()?e.payload?.trim()?{valid:!0}:{valid:!1,error:`缺少必需参数: --payload`}:{valid:!1,error:`缺少必需参数: --service-code`}}function Zr(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{valid:!1,error:`payload 必须是有效的 JSON 对象`}:{valid:!0,payload:t}}catch{return{valid:!1,error:`payload 必须是有效的 JSON 格式`}}}function Qr(e,t){let n={payload:e};return t.clientRequestId?.trim()&&(n.clientRequestId=t.clientRequestId.trim()),t.skillExecutionId?.trim()&&(n.skillExecutionId=t.skillExecutionId.trim()),t.skillSlug?.trim()&&(n.skillSlug=t.skillSlug.trim()),n}function $r(e){if(e instanceof M)switch(e.code){case`SERVICE_DISABLED`:return`服务凭据冷却中,请稍后重试`;case`UPSTREAM_ERROR`:return`第三方服务拒绝请求`;case`UPSTREAM_TIMEOUT_CHARGED`:return`上游服务超时,已按消费处理`;case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;case`INSUFFICIENT_CREDITS`:return`Credits 余额不足`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}function ei(e,t){return`本次扣费: ${e} credits | 剩余: ${t} credits`}var ti={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas service-gateway-invoke`));let n=Xr(e);if(!n.valid){u.log.error(n.error),process.exit(1);return}let r=Zr(e.payload);if(!r.valid){u.log.error(r.error),process.exit(1);return}let i=Qr(r.payload,e),a=e.serviceCode.trim(),o=!process.stdout.isTTY||!process.stdin.isTTY,s=Z.createProgressReporter(o);s.start(`正在调用服务: ${a}...`);let c;try{c=await nn(a,i,t.token,void 0,18e4)}catch(e){s.stop(`调用失败`);let t=$r(e);if(u.log.error(t),e instanceof M&&e.responseData){let t=e.responseData;t.data?.creditsCharged!==void 0&&t.data?.creditsBalance!==void 0&&u.log.info(ei(t.data.creditsCharged,t.data.creditsBalance))}j.setLastError(e),process.exit(1);return}if(!c.success){s.stop(`调用失败`),u.log.error(c.message||`服务调用失败`),c.data?.creditsCharged!==void 0&&c.data?.creditsBalance!==void 0&&u.log.info(ei(c.data.creditsCharged,c.data.creditsBalance)),j.setLastError(new M(c.message||`服务调用失败`,c.code,c)),process.exit(1);return}s.stop(`服务调用成功`);let l=c.data,d=[` ${O.default.green(`服务编码:`)} ${l.serviceCode}`,` ${O.default.green(`调用状态:`)} ${l.invokeStatus}`];l.creditsCharged!==void 0&&d.push(` ${O.default.green(`本次扣费:`)} ${l.creditsCharged} credits`),l.creditsBalance!==void 0&&d.push(` ${O.default.green(`剩余余额:`)} ${l.creditsBalance} credits`),u.note(d.join(`
55
55
  `),O.default.green(`调用结果`)),l.result!==void 0&&(console.log(`
56
56
  `+O.default.bold(`返回数据:`)),console.log(JSON.stringify(l.result,null,2))),u.outro(O.default.green(`完成!`))}};const ni=process.env.SKILLATLAS_CONFIG_DIR||a.join(c.homedir(),`.skillatlas`),ri=a.join(ni,`mail-config.json`);function ii(){e.existsSync(ni)||e.mkdirSync(ni,{recursive:!0})}function ai(){if(!e.existsSync(ri))return{};try{let t=e.readFileSync(ri,`utf-8`);return JSON.parse(t)}catch{return{}}}function oi(t){ii(),t.updatedAt=new Date().toISOString(),e.writeFileSync(ri,JSON.stringify(t,null,2)+`
57
- `)}function si(e,t){let n=ai();n[e]=t,oi(n)}function ci(e){let t=ai()[e];if(t!=null)return String(t)}function li(){let e=ai(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function ui(e){return e in ai()&&e!==`updatedAt`}const di=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function fi(){return ci(`mailbox`)}const pi={production:`xiaxiaobao.cn`};function mi(e,t){return`https://${pi.production}/agents/${e}?token=${t}`}var hi={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=mi(n,r),a=null,o=!1,s=Z.createProgressReporter();s.start(`正在获取 Agent 信息...`);try{let e=await an(n,r);e.success&&e.data&&(a=e.data),s.stop(`获取成功`)}catch{o=!0,s.stop(`无法连接服务器,仅显示本地信息`)}let c=[];if(c.push(` ${O.default.green(`Agent ID:`)} ${n}`),c.push(` ${O.default.green(`环境:`)} 生产环境`),a?.metadata&&(c.push(` ${O.default.green(`名称:`)} ${a.metadata.name}`),a.metadata.avatar&&c.push(` ${O.default.green(`头像:`)} ${a.metadata.avatar}`)),a?.creditAccount){let e=a.creditAccount;c.push(``),c.push(` ${O.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),c.push(` ${O.default.green(`可用 Credits:`)} ${e.availableCredits}`),c.push(` ${O.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),c.push(` ${O.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),c.push(` ${O.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&c.push(` ${O.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let l=ci(`mailbox`);l&&(c.push(``),c.push(` ${O.default.cyan(`--- 邮箱信息 ---`)}`),c.push(` ${O.default.green(`默认邮箱 ID:`)} ${l}`)),c.push(``),c.push(` ${O.default.green(`虾小宝主页链接:`)}`),c.push(` [您的虾小宝Agent 主页](${i})`),u.note(c.join(`
57
+ `)}function si(e,t){let n=ai();n[e]=t,oi(n)}function ci(e){let t=ai()[e];if(t!=null)return String(t)}function li(){let e=ai(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function ui(e){return e in ai()&&e!==`updatedAt`}const di=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function fi(){return ci(`mailbox`)}const pi={production:`skillhub.wanuai.cn`};function mi(e,t){return`https://${pi.production}/agents/${e}?token=${t}`}var hi={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=mi(n,r),a=null,o=!1,s=Z.createProgressReporter();s.start(`正在获取 Agent 信息...`);try{let e=await an(n,r);e.success&&e.data&&(a=e.data),s.stop(`获取成功`)}catch{o=!0,s.stop(`无法连接服务器,仅显示本地信息`)}let c=[];if(c.push(` ${O.default.green(`Agent ID:`)} ${n}`),c.push(` ${O.default.green(`环境:`)} 生产环境`),a?.metadata&&(c.push(` ${O.default.green(`名称:`)} ${a.metadata.name}`),a.metadata.avatar&&c.push(` ${O.default.green(`头像:`)} ${a.metadata.avatar}`)),a?.creditAccount){let e=a.creditAccount;c.push(``),c.push(` ${O.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),c.push(` ${O.default.green(`可用 Credits:`)} ${e.availableCredits}`),c.push(` ${O.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),c.push(` ${O.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),c.push(` ${O.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&c.push(` ${O.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let l=ci(`mailbox`);l&&(c.push(``),c.push(` ${O.default.cyan(`--- 邮箱信息 ---`)}`),c.push(` ${O.default.green(`默认邮箱 ID:`)} ${l}`)),c.push(``),c.push(` ${O.default.green(`虾小宝主页链接:`)}`),c.push(` [您的虾小宝Agent 主页](${i})`),u.note(c.join(`
58
58
  `),O.default.green(`Agent 信息`)),o&&u.log.warn(`无法获取在线信息,部分数据可能不完整`),u.outro(O.default.green(`完成!`))}};function gi(e){switch(e){case`consume`:return O.default.red(e);case`grant`:return O.default.green(e);case`refund`:return O.default.yellow(e);default:return e}}function _i(e){return e>0?O.default.green(`+${e}`):e<0?O.default.red(`${e}`):`${e}`}function vi(e,t,n){if(e.length===0){u.log.info(`暂无流水记录`);return}let r=e.map((e,t)=>[`${O.default.bold(O.default.cyan(`${t+1}. #${e.id}`))} ${gi(e.changeType)}`,` ${O.default.dim(`变更额度:`)} ${_i(e.deltaCredits)} | ${O.default.dim(`变更后余额:`)} ${e.balanceAfter}`,` ${O.default.dim(`服务编码:`)} ${e.serviceCode||O.default.dim(`N/A`)}`,` ${O.default.dim(`时间:`)} ${Q(e.createdAt)}`].join(`
59
59
  `));u.note(r.join(`
60
60
 
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "skill-atlas-cli",
3
- "version": "0.9.1",
3
+ "version": "0.11.0",
4
4
  "description": "skill-atlas CLI - 虾小宝 命令行工具",
5
- "homepage": "https://skillatlas.cn/",
5
+ "homepage": "https://skillhub.wanuai.cn/",
6
6
  "type": "module",
7
7
  "main": "bin/cli.js",
8
8
  "bin": {